前言
早在Taro3.5
的版本发布时,Taro团队就表示将会在接下来的3.6
版本落地对Vite
的支持。
但在3.6
的版本中根本就没看到Vite
的身影,随着社区对Vite
的呼声越来越高,终于在Taro4.0beta
版本中支持了这一功能!
目前 Taro 在 Vite 编译系统适配方面,优先支持了小程序、H5 和鸿蒙三端。
但仔细一想🤔,H5支持使用Vite
编译可以理解,但小程序是只支持CommonJS
模块化规范并且不支持从不支持从网络中加载 JS 资源,而Vite
的优势是在于它基于ESM
的模块化规范从而实现的no-bundle
,极大地提升了前端项目的构建性能。
这么看来,Vite
在本地开发时直接利用ESM
实现的无打包(no-bundle
)构建优势,在小程序开发中难以直接发挥。那么Taro
团队又是如何处理的呢?
体验
由于该功能还处于测试阶段,所以我们现有的脚手架还暂时不能初始化vite
版本的taro
项目,需要安装4.0版本的脚手架工具
安装脚手架
npm i -g @tarojs/cli@beta
⚠️需要注意的是:从4.0版本开始,将 Node.js v18 设置为长期支持的最低 node 版本
创建项目
taro init taro_project
也可以跳过安装 CLI 工具使用 npx 创建项目
npx @tarojs/cli@beta init taro_project
运行项目
接着我们来把项目运行起来看看与之前的webpack
构建的有何不同
项目虽然是成功跑起来了,但感觉跟自己想象中的不太一样呀?
- 启动速度并没有想象中的那么快
- 编译产物看着跟
webpack
差不多,引以为傲的no_bundle
呢? - 怎么还是CommonJS,看来还是绕不开小程序的限制
对于Vite的支持Taro4到底做了什么?
在Taro的rfc中有着关于Vite
的记录:
那说白了Taro
支持Vite
最大的收益者是H5
而不是小程序,看到这里估计很多人都会失望了,大家使用Taro
的重心应该是在小程序
而不是H5
吧。
H5编译逻辑
为了兼容 Taro H5 的编译,只需要实现:编译配置对齐、设置编译 Entry、注入运行时代码。其余的工作交给浏览器和 Vite 处理,开发者就能拥有快速的项目启动和更新体验。
3.1 编译配置对齐
Taro H5 主要使用了 Webpack 的 Resolve 配置,如 alias
、mainFields
等,这些配置在 Vite 中都能找到对应。
3.2 设置编译 Entry
对于Vite
来说,开发环境下index.html
就是项目的入口文件,我们可以使用 Vite 插件的 transformIndexHtml
钩子在 index.html
中注入对 app.config
的引用:
<script type="module" src="./app.config.js"></script>
3.3 注入运行时代码
目前 Taro H5 使用了自定义的 Webpack Loader
去注入运行时代码,从而实现页面加载、组件渲染等功能。在 Vite 中可以使用 Vite 插件的 load
钩子达到同样的目的。
小程序编译逻辑
由于小程序不支持从网络中加载 JS 资源,只能使用 Vite 的lib
模式进行打包,输出小程序规范下的四种产物:js
xml
css
json
。
与H5 一样,使用 app.config
作为 Entry,输出产物则使用小程序支持的 CommonJS 格式:
{
"build": {
"lib": {
"entry": "./app.config.js",
"formats": ["cjs"],
"fileName": "app.js"
}
}
}
现在真相大白了吧,小程序只是使用了Vite
的lib
模式进行打包,那这跟直接使用rollup
也没啥区别😂
总结
从目前的版本来看,Taro
支持使用Vite
构建最大的受益者是H5
而不是小程序
,对于小程序的编译也并不会快多少,从原理上看,现在想要使用Vite
的核心功能似乎走不通,除非你能让小程序作出改变,让小程序支持从网络中加载JS资源,但估计也不太可能,毕竟这一限制是出于安全考虑。
所以想要提升本地构建速度,可以考虑下这个方案:减少单次构建构建目标,具体操作可以参考之前写的这篇文章:如何提升项目的本地构建效率?
Taro4.0
正式版预计会在今年的Q2阶段发布,到时候再看看会不会有惊喜吧!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。