Taro 1.x升级2.x 需要的配置和bug的解决

1. 版本:升级版本Taro 1.3.34 至 2.0.4

升级原因:由于项目刚开始时Taro还在1.x时代,后来Taro更新很快,在使用过程中也发现需要升级Taro版本来减小打包出来的小程序包的大小(微信小程序限制,每个包必须2M以下)。升级到2.x之后的Taro,对于微信小程序的打包使用了webpack,因此可以更方便地安装各种webpack plugins:比如 webpack-bundle-analyzer 来分析包大小。升级之后的Taro也会修复更多taro 原生的bug。

参考文章: https://aotu.io/notes/2020/01/08/taro-2-0/index.html,里面介绍了升级之后的优势,以及如何配置webpack plugin。

2. 升级必须的配置修改

加上目录结构

对于config/index.js文件中的配置,参考上面的文章配置:

  • 编译配置调整
  // 小程序配置从 weapp 改为 mini,可以删掉很多小配置
  • 异步编程调整

    Taro 2.0 中开启 async functions 支持不再需要安装 @tarojs/async-await,而是直接通过 babel 插件来获得支持。

    在项目根目录下安装包 babel-plugin-transform-runtimebabel-runtime

    $ yarn add babel-plugin-transform-runtime --dev
    $ yarn add babel-runtime
    

    随后修改项目 babel 配置,配置插件 babel-plugin-transform-runtime

    babel: {
      sourceMap: true,
      presets: [['env', { modules: false }]],
      plugins: [
        'transform-decorators-legacy',
        'transform-class-properties',
        'transform-object-rest-spread',
        ['transform-runtime', {
          "helpers": false,
          "polyfill": false,
          "regenerator": true,
          "moduleName": 'babel-runtime'
        }]
      ]
    }
    
  • 添加webpack-bundle-analyzer (optional)

  • 添加减少lodash包的plugin,因为lodash全部引入太大(optional)

  • 减小moment包(optional)

index.js文件如下:

/* eslint-disable */
const path = require('path')
const webpack = require('webpack') //减小moment包的时候用,不然不用加
const env = process.env.NODE_ENV

const settingsPath = `styles/${env}`

const config = {
  projectName: 'taro-upgrade',
  date: '2021-01-11',
  //这里设置taro屏幕大小,根据自己的需求,默认的是750;不是必须
  designWidth: 375,
  deviceRatio: {
    '375': 1 / 2,
    '640': 2.34 / 2,
    '750': 1,
    '828': 1.81 / 2
  },
  //根目录的别称;按需,不是必须
  alias: {
    '@': path.resolve(__dirname, '..', 'src'),
  },
  sourceRoot: 'src',
  outputRoot: 'dist',
  babel: {
    sourceMap: true,
    presets: [
      ['env', {
        modules: false
      }]
    ],
    plugins: [
      'lodash',
      'transform-decorators-legacy',
      'transform-class-properties',
      'transform-object-rest-spread',
      //添加transform-runtime,升级必须
      ['transform-runtime', {
        helpers: false,
        polyfill: false,
        regenerator: true,
        moduleName: 'babel-runtime'
      }
      ]
    ]
  },
  defineConstants: {
  },
  mini: {
    //按需引入plugins,不是必须
    webpackChain(chain) {
      process.env.analyzer && chain.plugin('analyzer')
        .use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin, [])
      //lodash减小size的plugin,在通常情况下可以加。但是如果使用了lodash中比较不常用的方法,压缩尺寸会导致某些方法不能正常工作;的确我们项目后续有一个bug就是因为这里用了这个插件减小了包,而导致方法报错。最终这个plugin被移除了。
      chain.plugin('LodashModuleReplacementPlugin')
        .use(require('lodash-webpack-plugin'), [{
          shorthands: true,
          cloning: true,
          collections: true,
          exotics: true,
          guards: true,
          coercions: true,
          paths: true
        }])
      //减小moment的包
        chain.plugin('momentReplacementPlugin')
        .use(new webpack.ContextReplacementPlugin(
          /moment[\\\/]locale$/,
          /^\.\/(zh-cn)$/
          ),
        )
    },
    postcss: {
      autoprefixer: {
        enable: true,
        config: {
          browsers: [
            'last 3 versions',
            'Android >= 4.1',
            'ios >= 8'
          ]
        }
      },
      pxtransform: {
        enable: true,
        config: {

        }
      },
      url: {
        enable: true,
        config: {
          limit: 10240 // 设定转换尺寸上限
        }
      },
      cssModules: {
        enable: false, // 默认为 false,如需使用 css modules 功能,则设为 true
        config: {
          namingPattern: 'module', // 转换模式,取值为 global/module
          generateScopedName: '[name]__[local]___[hash:base64:5]'
        }
      }
    },
    imageUrlLoaderOption: {
      //4.2中有个bug与这个配置有关。
    },
    sassLoaderOption: {
      includePaths: [
        //由于项目中,不同环境下部分style不同,所以这里按照环境load了样式。
        path.resolve(__dirname, '../src/styles'),
        path.resolve(__dirname, '../src/', settingsPath)
      ],
    }
  },
  //该项目是小程序only,所以h5的配置不需要了
}

//这里也是根据环境导出不同环境的配置。
module.exports = function (merge) {
  return merge({}, config, require(`./${env}`))
}

3. 测试需要加babel@7的包

Taro-UI 官方引入了babel 7用于UI测试,因为babel-jest需要babel7.x以上版本的支持。

但是,由于Taro本身使用的是babel 6.x,为了不混淆编译,需要配置babel.config.js 如下:

/* eslint-disable import/no-commonjs */
const apis = require('@tarojs/taro-h5/dist/taroApis')

module.exports = {
  presets: [
    [
      '@babel/env',
      {
        spec: true,
        useBuiltIns: false
      }
    ],
    [
      '@babel/preset-typescript',
      {
        isTSX: true,
        allExtensions: true,
        jsxPragma: 'Nerv.createElement'
      }
    ]
  ],
  plugins: [
    ['@babel/plugin-proposal-decorators', { 'legacy': true }],
    '@babel/plugin-proposal-class-properties',
    [
      '@babel/plugin-transform-react-jsx',
      {
        pragma: 'Nerv.createElement'
      }
    ],
    ['@babel/plugin-proposal-object-rest-spread'],
    [
      'babel-plugin-transform-taroapi',
      {
        apis,
        packageName: '@tarojs/taro-h5'
      }
    ]
  ]
}

其它参考:如果用ts-jest编译jsx会报错,只能用于简单的逻辑测试的编译(纯javascript),这里有UI测试,不能使用 https://github.com/kulshekhar/ts-jest/issues/937

4. 升级之后带来的bugs,逐一击破

4.1 有一个组件的样式不生效

  • 现象:升级之后发现一个在Taro1.x编译后有样式的组件,在新版本下不显示样式,查看dist发现也没有生成对应的.wxss文件,

  • 原因:后来排查原因发现,这个component的样式文件componentA.scss被两个不同的组件直接引用了(import了两个地方),而查看官方文档可以发现

某些组件样式失效了#

在升级到 2.x 后可能会遇到某些组件的样式失效了,这是因为 2.x 中默认将所有被超过 1 个文件引用的公共样式抽离到了 common 文件中,该文件默认会被 app 引入,而由于小程序组件默认不能接受公共,所以会导致样式失效,可以通过为组件配置 addGlobalClass 来解决,或者也可以通过自己配置 Webpack 禁止抽离公共样式。

  • 解决方法:保证component的样式不被多个组件重复调用。

4.2 TaroCanvasDrawer使用本地图片画图失败

  • 原因:由webpack url-loader转换图片为base64格式引起
import demoImage from '@/assets/demo.png'

export default class Demo extends component {
  state = {
    config: {
      width: 750,
      height: 1000,
      images: [
        {
          x: 0,
          y: 0,
          width: 375,
          height: 1000,
          //就是这里出错了!!!webpack url-loader把这个图片url变成了base64格式,导致taroCanvasDrawer无法识别这种格式。解决方法是禁用url-loader转换。
          url: demoImage
        }
      ]
    }
  }
  
  render() {
    return (
      <TaroCanvasDrawer
        config={this.state.config}
      />
    )
  }
}

  • 解决方法,在config/index.js中配置

    // more code config in mini: {}
      imageUrlLoaderOption: {
          limit: 0
        },
    

4.3 -webkit-box-orient: vertical 编译后被移除

根据上面的issue,解决方法是在样式中添加注释:

.demo-box {
  display: -webkit-box;
  -webkit-line-clamp: 3;
  /* autoprefixer: ignore next */
  -webkit-box-orient: vertical;
  overflow: hidden;
}

但是!!!添加注释的方法,在npm start之后是可行的,在npm run build之后依旧失效了!!!build

之后还是被移除了。

  • 解决方法:不放在scss中,把这个样式放在inline style里:

    return (
      <View style={'display': '-webkit-box',
      '-webkit-line-clamp': '2',
      '-webkit-box-orient': 'vertical',
      'overflow': 'hidden'}>
        text
      </View>)
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容