视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
webpack4的迁移的使用方法
2020-11-27 22:14:06 责编:小采
文档

感觉是突然之间,webpack4的消息就满天飞了,听说打包速度提高了很多,还有最大的噱头是实现了零配置,leader有一天就吩咐我说,有时间把我们的项目也升个级呗。好嘞。

1.x到2.x

这次升级跨度比较大,我们是从webpack1.x升级到4.x,因为1.x与2.x相差挺大,所以第一件事,就是先升到2.x,比较大的改动就是loader的配置方式

// 1.x
preLoaders: [
 {
 test: /\.vue$/,
 loader: 'eslint',
 exclude: /node_modules/
 }, {
 test: /\.js$/,
 loader: 'eslint',
 exclude: /node_modules/
 }
],
loaders: [
 { test: /\.vue$/, loader: 'vue' },
 { test: /\.json$/, loader: 'json' },
 { test: /\.html$/, loader: 'html' },
...
]
//2.x
module: {
 rules: [
 {
 test: /.vue$/,
 use: 'eslint-loader',
 enforce: 'pre', // 对应1.x的preLoaders
 exclude: /node_modules/
 }, {
 test: /.js$/,
 use: 'eslint-loader',
 enforce: 'pre',
 exclude: /node_modules/
 },
 { test: /\.vue$/, use: 'vue-loader' },
 { test: /\.json$/, use: 'json-loader' },
 { test: /\.html$/, use: 'html-loader' },
 ...
 ]
},

而且loader一定要写完整,vue-loader如果只写vue会报错。loader还可以通过options进行配置。

{
 loader: 'css-loader',
 options: {
 autoprefixer: false
 }
}

旧版的链式调用也用数组替代。

1.x

style!postcss!less

2.x

 use: [
 "style-loader",
 "css-loader",
 "less-loader"
 ]

webpack2.x默认支持es6的模块,所以在编译时候没有必要将它们先转换CommonJS模块再处理,babel-preset-es2015-webpack已经支持不转换模块中的importexport,只需要设置.babelrc

"presets": [
 ["es2015", { "modules": false }]
]

另外就是插件的升级,运行时哪个插件报错就升级哪个插件,屡试不爽。

2.x到4.x

第一步:版本升级

  1. 不再支持node 4,可以直接升级到8.x版本
  2. webpack升级
npm install webpack@4 --save

npm install webpack-cli --save // 不要忘记这一点,用来启动webpack的

插件升级,同理,哪个报错就升级哪个,除了html-webpack-plugin用下面的方法升级,原因是作者还未来得及升级

npm i webpack-contrib/html-webpack-plugin --save-dev

extract-text-webpack-plugin只有最新的beta版本才支持,所以npm install extract-text-webpack-plugin@next --save-dev

第二步 运行命令中添加 --mode development--mode production

PS:虽然说webpack 4是零配置,入口默认是src/index.js,出口是dist/,但由于项目是多页面的,所以这一步并没有省略,根据实际情况来。

第三步 移除CommonsChunkPlugin

//替代方案
module: {
 rules: [
 ...
 ]
},
optimization: {
 splitChunks: {
 chunks: "all", // 必须三选一:'initial' | 'all' | 'async'
 minSize: 0, 
 minChunks: 1,
 maxAsyncRequests: 1,
 maxInitialRequests: 1,
 name: () => {},
 cacheGroups: {
 vendor: {
 chunks: 'all',
 test: /node_modules/, // 正则规则验证,如果符合就提取chunks
 name: "vendor" // 要缓存的分割出来的chunk名称
 },
 default: {
 chunks: 'all',
 name: 'commons',
 reuseExistingChunks: true
 }
 }
 }
}

因为多个页面,所以结合了html-webpack-plugin

new HtmlWebpackPlugin({
 template: 'index.html',
 chunks: ['vendor', 'commons', 'index']
 })

刚开始一直出错,是因为我没有复写default,也没有default:false,所以其实默认配置有将所有的模块的公共部分分离到某个文件中,但我在HtmlWebpackPlugin中的chunks中又没有添加,所以要么覆写原来的默认配置,要么就关闭默认配置。

第四步:配置postcss autoprefixer

在根目录下创建一个文件`postcss.config.js`

module.exports = {
 plugins: [
 require('postcss-inline-svg')({
 removeFill: false
 }),
 require('postcss-pxtorem')({
 replace: process.env.NODE_ENV === 'production',
 rootValue: 750 / 16,
 minPixelValue: 1.1,
 propWhiteList: [],
 unitPrecision: 5
 }),
 require('autoprefixer')({browsers: ['iOS>7', 'Android>4']})
 ]
};

...
 {
 test: /\.(css|less)$/,
 use: ExtractTextPlugin.extract({
 fallback: 'style-loader',
 use:[{
 loader: 'css-loader',
 options: {
 autoprefixer: false
 }
 },
 {
 loader: 'postcss-loader',
 options: {
 sourceMap: true
 }
 },
 {
 loader: 'less-loader',
 options: {
 relativeUrls: true
 }
 }]
 })
 },
...

第五步:不需要UglifyJsPlugin插件

只需要设置optimization.minimize: true就行,production mode下面自动为true

以上只是在原有项目的基础上对webpack 4的升级,还有一些特性并没有用到,所以没有提及,比如sideEffectsjavascript/auto javascript/esm javascript/dynamicwebassembly/experimental等等,有机会再去探索。

下载本文
显示全文
专题