让taro用上自定义webpack配置吧(taro的h5构建过程浅析)
Taro 是一套遵循 React 语法规范的多端开发解决方案。支持用 React 的开发方式编写一次代码,生成能运行在微信小程序和H5。
背景
事情的起源是因为需要对生成的H5应用高度个性化的 Webpack 配置,而 Taro 默认只提供了 webpack-chain 的方式来修改webpack,导致无法与组内通用的一份webpack config 直接合并(不能用webpack-merge)。不得已之下只好从taro源码寻求解决方案。
从入口开始
从运行的命令入手。查看 package.json, 可以看到与h5相关的是这两个命令:
于是我们去看看 taro build 到底干了什么。方法当然是先找到 taro 命令对应的文件,在Mac上直接执行 which taro
即可(windows下执行where taro
)
可以看到是在全局的node_modules下
马上就能发现同目录下有taro-build文件,打开看到里面的核心方法 build
看来关键就是src/h5.js
里面的代码
H5的“编译”过程
.h5.js
里的build
方法很简单,就两个关键方法:buildTemp
, buildDist
buildDist
这个比较好理解,就是常规的webpack打包过程。那`buildTemp``又干了什么呢?
|
|
可以发现, buildTemp
是在遍历源码,然后生成一份平台相关的代码(抹平API差异,根据平台引入不同的包),并放在项目下的.temp
文件夹。
这么看来,我们似乎直接对 .temp
文件夹执行 webpack
就能够进行自定义的webpack构建了!
就差一点点
当我兴高采烈地执行完webpack
,打开页面后,看到的是一个两倍大小的页面。样式出问题了,看来webpack配置还差了一些东西,果断把taro生成的webpack配置打印出来看看:
对比发现其实是少了postcss的loader。另外需要注意的是,taro还支持配置designWidth
,deviceRatio
,为了保证多端样式统一,我们的postcss配置也需要根据taro的配置来生成。至于怎么生成,直接搬@taro的代码(微改)就好:
最后放在你自己的webpack.config.js
文件里就好:
局限
因为目前 npm run dev:h5
命令一口气做了两件事:编译出.temp
文件夹和启动webpack-dev-server
。如果你的开发环境需要使用自己的dev-server,也许需要用到concurrently
这个npm包来并行执行多个npm script(已建议官方拆分多一个taro compile
的命令Feature Request taro-cli 能否多提供一个compile 命令, 仅生成.temp文件夹 · Issue #982 · NervJS/taro · GitHub)
最后
其实灵感来源于mpvue的同构配置。对于mpvue来说,只需要分别执行vue和mpvue的webpack就好了。对taro来说,关键就是找到编译后生成的平台相关代码(.temp
),然后就是熟悉的webpack构建流程了。
同时,taro多出来的这一次编译,能够在编译阶段根据环境变量来去掉平台无关的代码,大大提高了开发者对与多端兼容的控制能力。(相比于mpvue只能在运行时做判断,无法运行时判断的就只能修改mpvue-template-compiler
的代码了)
最后的最后,欢迎各位小伙伴一起来交流学习~