当前位置: 首页 > news >正文

weapp-vite - 微信小程序工具链的另一种选择

bg

weapp-vite - 微信小程序工具链的另一种选择

前言

weapp-vite 是由 笔者 icebreaker 开发的一个基于 vite 的现代化微信小程序开发工具链。我给它设定的目标初心是: 为小程序开发者带来笑容

自从在 2024 年的 8 月正式发布之后,到现在也过了将近 9 个月的时间。weapp-vite 在用户不断的反馈,以及我对代码方面不断的重构和优化下,也从 1.x 版本逐渐迭代到了 4.0 版本。

最近随着我对打包工具,以及编译的理解不断的加深,4.0 版本中,我也完全重构了 weapp-vite 的编译核心。这个版本是我相对来说,比较 满意 的一个版本。

所以我也心血来潮,写了这篇文章。同时这也是我之前,虽然发布了 2.x3.x 版本,但是却没有发表任何文章的一个主要原因。

之前版本遇到的一些困难

3.x 之前的版本,存在一些非常大的问题:

热更新与耦合问题

每次构建,weapp-vite 都会去扫描整个小程序目录,然后分析哪些是打包入口,哪些是 wxml 的依赖项。这套机制是纯 fs 实现的,并没有用到 vite(rollup) 的 chunk/asset 加载的机制。

这导致在插件的 options 阶段做的事情过多,热更新效率非常差,多个 Service 还有 Vite 插件存在严重耦合。

虽然普通的使用 weapp-vite 的开发者不会遇到这个情况,但是这却严重阻碍了 weapp-vite 的进一步发展。这让我如鲠在喉,夜不能寐。

于是,我详细阅读并调试了 uni-appTaro 的源代码,并最终走出了一条最适合 weapp-vite 路。

值得一提的是,uni-app 编译的中间产物比较有趣:

import './manifest-json-js'
if (!Math) {import('uniPage://cGFnZXMvaW5kZXgvaW5kZXgudnVl')import('uniPage://cGFnZXMvaXNzdWUvdGFpbHdpbmQtY2hpbGRyZW4udnVl')import('uniPage://cGFnZXMvaXNzdWUvY2FzZS1keW5hbWljLWNsYXNzLnZ1ZQ')
}

这种加载机制,有点类似于那种 rollup 虚拟模块的实现。而且这么写可以走 resolveDynamicImportrollup build hook,然后其余的小程序页面就走:

// uniPage
import MiniProgramPage from 'xxxx'
wx.createPage(MiniProgramPage)

虽然 uni-app / Taro 都改了运行时了。但我对我的 weapp-vite 的编译的目标是默认不会注入任何运行时的东西,这样才能保证打出来的包足够的小, 后续用户想要注入什么都通过 vite 插件的方式进行注入。

Taro 为了做运行时兼容,注入的运行时代码实在是太大了,需要在一开始的时候就做好分包的规划。uni-app 也有注入但是体积还能接受,没有 Taro 这么夸张。

自定义加载模块方式

然后另外在更改 weapp-vite 内核的时候,我曾经一度想要放弃使用 vite 改用 rspack 完全重写,因为我有高度自定义加载模块方式的需求。(假如真的这样做,那项目就改名叫 weapp-rspack)

因为默认情况下 rollup 就只支持 import ,import() 等等这种方式去做模块的分析和引入。cjs 那种都是需要依赖 @rollup/plugin-commonjs 这种去做转化 esm, 然后分析依赖。

但是小程序的模块加载方式是非标的,什么 require.async(id), require(id,callback) 这种都不是默认的标准,这时候就需要自定义加载模块方式。

当然扯到这就太技术了,读者没有遇到过这样的场景的话,也是很难理解的了的。毕竟技术都是,越往一个方向深入,同行的人就越少,想找个人做技术探讨和交流都困难。

主要特点

接下来我来总结一下 weapp-vite 的主要特点:

  1. 轻量级原生开发

    • 保持原生小程序的开发方式,无需学习新框架
    • 直接使用微信官方文档的写法
    • 对原生小程序开发提供更好的支持,包括 Skyline 等新特性
  2. 现代化开发体验

    • 开箱即用支持 TypeScriptSCSSLess
    • 基于 Vite 构建,享受极速的开发体验
    • 支持 Vite 生态的插件系统
  3. 增强功能

    • 自动构建 npm:支持两种 npm 构建策略
    • 自动引入组件:无需手动在 json 中注册
    • 完整的别名支持:可在任意 js/tsjson 文件中使用
    • 独立分包适配:自动处理分包场景

适用场景

weapp-vite 特别适合以下场景:

  1. 专注微信小程序开发

    • 如果你只需要开发微信小程序,不需要跨端
    • 想要使用微信小程序最新特性(如 Skyline
  2. 原生小程序迁移

    • 现有原生小程序项目想要现代化改造
    • 使用 gulpmina 方案的项目想要升级
  3. 轻量级需求

    • 不需要完整的跨端框架
    • 希望保持原生开发方式,但需要现代化工具支持

不适用的场景

同样,目前 weapp-vite 并不适合以下场景:

  • 需要完整跨端能力的框架
  • 需要使用 Vue/React 等前端框架的写法,来取代小程序原生写法

毕竟深入小程序原生开发的人,其实要比懂 Vue/React 的人数少很多。

而且小程序的编写范式和体验,实际上也要比 Vue/React 差,我自从做小程序方向的开源项目以来,听到了无数次群友这方面吐槽,早已听出老茧了。

对于这种场景,推荐使用 uni-appTaro 这种成熟的跨端框架。

快速开始

  1. 创建项目
# 使用 pnpm
pnpm create weapp-vite@latest# 或使用 npm
npm create weapp-vite@latest
  1. 安装依赖
pnpm i  # 或 npm install
  1. 开发命令
pnpm dev  # 启动开发服务器
pnpm dev -o  # 启动开发并打开微信开发者工具

当然对应的使用文档都在 官方文档 | 备用官方文档 中。

结尾

最后一定要感谢我的用户们,他们为这个项目提供了许多非常有价值的反馈。

助力这个项目从一个个人实验性质的想法,升级到了一个正式的项目。

当然,也非常欢迎大家提出任何的改进意见,除了在群里交流之外,我其实更加希望大家使用提 Issue 或 Pull Request 的方式。

另外,也希望看到这里的同学们,给 weapp-vite 点个 Star 吧! 大家的鼓励就是我继续前进的动力,Thanks!

http://www.xdnf.cn/news/303499.html

相关文章:

  • OpenGL超大分辨率图像显示
  • Windows玩游戏的时候,一按字符键就显示桌面
  • imapal sql优化之hint
  • Codeforces Round 1023 (Div. 2) (A-D)
  • USB学习【2】通讯的基础-反向不归零编码
  • 优势演员-评论家A2C详解:python从零实现
  • 【KWDB 创作者计划】一文掌握KWDB的时序表管理
  • 计算机中的逻辑运算
  • DVWA靶场保姆级通关教程--03CSRF跨站请求伪造
  • 碰一碰发视频源码搭建的定制化开发实践
  • 代码随想录算法训练营第九天 |【字符串】151.翻转字符串里的单词、卡码网55.右旋转字符串、28.实现strStr、459.重复的子字符串
  • Ubuntu 22.04 安装配置远程桌面环境指南
  • K8s 常用命令、对象名称缩写汇总
  • Mysql group by 用法
  • ResNet50应用于农业保险现场照片作物种类核验
  • 【coze】故事卡片(图片、音频、文字)
  • 【漫话机器学习系列】242.欠拟合(Underfitting)
  • 端口隔离 实验 讲解
  • UE5 GAS开发P47 游戏标签
  • Kotlin 中 List 和 MutableList 的区别
  • 网络自动化与可观测性:构建自愈型智能网络体系
  • 什么是进程,如何管理进程
  • 【2025】Visio 2024安装教程保姆级一键安装教程(附安装包)
  • Java基础学完,继续深耕(0506)SQL--多表关系
  • Kotlin-访问权限控制
  • unittest自动化测试实战
  • 文件上传漏洞篇:upload-labs靶场搭建
  • 栈与队列详解及模拟实现
  • 未来 CSS:变量、容器查询与新特性的探索
  • 硬件工程师面试常见问题(16)