taro 升级遇见的坑

背景:公司的小程序UI库已经多年不更新了,部分UI 有bug,也懒得到原仓库修改,于是便有了这次的升级,将采用@antmjs/vantui 这个新的ui 库, 目前taro3.6.1

使用以下命令升级, 等待依赖下载完成。

taro update project

1. 遇到了平台不兼容问题

因为我们包里面使用已.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.config.js , 以及 package.jsonbrowserslist

babel 会根据你设置的浏览器,根据预设值,去使用对应的插件,将代码转换,算是打个补丁

// 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
},

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报错

相关issue

查找了下postcss-url 说可以忽略,但是没找到taro 的配置