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-runtime
和babel-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 編譯后被移除
- 原因:autoprefixer的issue: https://github.com/postcss/autoprefixer/issues/1141
根據(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>)