Taro 1.x升級2.x 需要的配置和bug的解決

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

升級原因:由于項目剛開始時Taro還在1.x時代障陶,后來Taro更新很快,在使用過程中也發(fā)現(xiàn)需要升級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妈候,里面介紹了升級之后的優(yōu)勢敢靡,以及如何配置webpack plugin。

2. 升級必須的配置修改

加上目錄結構

對于config/index.js文件中的配置苦银,參考上面的文章配置:

  • 編譯配置調(diào)整
  // 小程序配置從 weapp 改為 mini啸胧,可以刪掉很多小配置
  • 異步編程調(diào)整

    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屏幕大小瑟蜈,根據(jù)自己的需求叭首,默認的是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中比較不常用的方法囤官,壓縮尺寸會導致某些方法不能正常工作冬阳;的確我們項目后續(xù)有一個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: [
        //由于項目中蹲堂,不同環(huán)境下部分style不同狼讨,所以這里按照環(huán)境load了樣式。
        path.resolve(__dirname, '../src/styles'),
        path.resolve(__dirname, '../src/', settingsPath)
      ],
    }
  },
  //該項目是小程序only柒竞,所以h5的配置不需要了
}

//這里也是根據(jù)環(huán)境導出不同環(huán)境的配置政供。
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 有一個組件的樣式不生效

  • 現(xiàn)象:升級之后發(fā)現(xiàn)一個在Taro1.x編譯后有樣式的組件计济,在新版本下不顯示樣式,查看dist發(fā)現(xiàn)也沒有生成對應的.wxss文件排苍,

  • 原因:后來排查原因發(fā)現(xiàn)沦寂,這個component的樣式文件componentA.scss被兩個不同的組件直接引用了(import了兩個地方),而查看官方文檔可以發(fā)現(xiàn)

某些組件樣式失效了#

在升級到 2.x 后可能會遇到某些組件的樣式失效了淘衙,這是因為 2.x 中默認將所有被超過 1 個文件引用的公共樣式抽離到了 common 文件中传藏,該文件默認會被 app 引入,而由于小程序組件默認不能接受公共彤守,所以會導致樣式失效毯侦,可以通過為組件配置 addGlobalClass 來解決,或者也可以通過自己配置 Webpack 禁止抽離公共樣式具垫。

  • 解決方法:保證component的樣式不被多個組件重復調(diào)用侈离。

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,
          //就是這里出錯了!s莶稀卦碾!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 編譯后被移除

根據(jù)上面的issue坯沪,解決方法是在樣式中添加注釋:

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

但是B逃场!腐晾!添加注釋的方法叉弦,在npm start之后是可行的,在npm run build之后依舊失效了8翱P斗睢钝诚!build

之后還是被移除了颖御。

  • 解決方法:不放在scss中,把這個樣式放在inline style里:

    return (
      <View style={'display': '-webkit-box',
      '-webkit-line-clamp': '2',
      '-webkit-box-orient': 'vertical',
      'overflow': 'hidden'}>
        text
      </View>)
    
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市潘拱,隨后出現(xiàn)的幾起案子疹鳄,更是在濱河造成了極大的恐慌,老刑警劉巖芦岂,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘪弓,死亡現(xiàn)場離奇詭異,居然都是意外死亡禽最,警方通過查閱死者的電腦和手機腺怯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來川无,“玉大人呛占,你說我怎么就攤上這事∨城鳎” “怎么了晾虑?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長仅叫。 經(jīng)常有香客問我帜篇,道長,這世上最難降的妖魔是什么诫咱? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任笙隙,我火速辦了婚禮,結果婚禮上坎缭,老公的妹妹穿的比我還像新娘逃沿。我一直安慰自己,他們只是感情好幻锁,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布凯亮。 她就那樣靜靜地躺著,像睡著了一般哄尔。 火紅的嫁衣襯著肌膚如雪假消。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天岭接,我揣著相機與錄音富拗,去河邊找鬼。 笑死鸣戴,一個胖子當著我的面吹牛啃沪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播窄锅,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼创千,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起追驴,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤械哟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后殿雪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暇咆,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年丙曙,在試婚紗的時候發(fā)現(xiàn)自己被綠了爸业。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出氓鄙,到底是詐尸還是另有隱情家肯,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏惰瓜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一汉矿、第九天 我趴在偏房一處隱蔽的房頂上張望崎坊。 院中可真熱鬧,春花似錦洲拇、人聲如沸奈揍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽男翰。三九已至,卻和暖如春纽乱,著一層夾襖步出監(jiān)牢的瞬間蛾绎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工鸦列, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留租冠,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓薯嗤,卻偏偏與公主長得像顽爹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子骆姐,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容