taro 升级遇见的坑
背景:小程序的主包已经超过2m,同事每次改bug,只加一行代码就超过2m了,于是惊呼怎么又超了。于是便有了这次的升级, 目前从3.0.0 升级taro 为 3.6.1
使用以下命令升级, 等待依赖下载完成。
taro update project
1. 遇到了平台不兼容问题
1.1 node版本兼容问题,需要升级 node 到 16.14.0 以上, 升级以后发现编译失败
因为我们包里面使用已.weapp.ts 表示微信小程序。 已.ts 表示pc 或者其他平台,升级后导致
MultiPlatformPlugin 这个插件 使用失败
原来的使用方法是
chain.resolve.plugin('MultiPlatformPlugin').tap((args) => {
return [
...args,
{
include: ['@gm-mobile', 'gm_api'],
},
]
})
需要更改成,即修改webpack extentions, 去除 MultiPlatformPlugin
chain.resolve.extensions.prepend('.weapp.ts')
chain.resolve.extensions.prepend('.weapp.tsx')
修改配置之后发现,babel编译失败了,是因为babel 的presets 有问题
修改了babel.config.js , 以及 package.json 的 browserslist
babel 会根据你设置的浏览器,根据预设值,去使用对应的插件,将代码转换,但是这里的预设插件转换不了,所以需要修改预设插件
// babel.config.js
presets: [
[
'gm-react-app',
{
closePolyfill: true,
},
],
],
// babel.config.js
presets: [
['taro', {
framework: 'react',
ts: true
}]
],
// package.json
"browserslist": [
"last 3 versions",
"Android >= 4.1",
"ios >= 8"
],
2. 升级后发现字体,padding 等分辨率 有很大差别
原因是: taro 后面基础设计图的尺寸修改成 750, 导致了样式偏大或偏小
解决方法: 参考 Taro 配置
designWidth(input) {
if (input.file && input.file.indexOf('@antmjs/vantui') > -1) {
return 750
}
return 375
},
deviceRatio: {
375: 2 / 1, // 之前已375 为基础尺寸
640: 2.34 / 2,
750: 1,
828: 1.81 / 2
},
但是发现项目中用了很多pxTransform,导致很多地方都出现了问题,所以需要修改pxTransform 方法
3. 升级后发现打包后的产物变大了
taro 默认使用webpack4 作为打包工具, 打包的产物包含了babel/helper 等
解决方法: 使用webpack5, 但你需要安装webpack5, 依赖里面没有,导致报错了,安装后正常
yarn add webpack
// cpnfig/index.js
compiler: {
type: 'webpack5',
prebundle: {
enable: false
},
},
4. 升级后发现moment 打包会把其他语言也打包进去
项目中之前是用了 ContextReplacementPlugin 去忽略其他语言的加载,但后面失效了。找了很久没找到解决方案,最后在issue 里面获得启发
解决方法:调用webpackChain(chain, webpack)
// config/index.js
chain
.plugin('IgnorePlugin')
.use(new webpack.ContextReplacementPlugin(/moment[/\\]locale$/, /zh-cn/))
// moment 需要过滤,表示package.json 引用的是main 字段
chain.resolve.mainFields.clear();
chain.merge({
resolve: {
mainFields: ['module', 'main', 'jsnext:main']
}
})
5. 引入本地含svg的iconfont报错
查找了下postcss-url 说可以忽略,但是没找到taro 的配置