前言:

2018825webpack4正式发布,webpack4引入了零配置的概念(实际配置下来还是要写不少配置),官方宣传能够提升构建速度

webpack3转webpack4官方说明

https://webpack.js.org/migrate/4/

涉及文件修改如下:

Build/util.js
Build/webpack.base.conf.js
Build/webpack.dev.conf.js
Build/webpack.prod.conf.js
Build/package.json
升级验证参照package.json:
升级真对测试运行:npm run dev2、npm run testing、npm run prod

涉及修改内容总结:

一、升级可升级的包

1、Webpack版本升级

2、升级包:extract-text-webpack-plugin、html-webpack-plugin

3、新增包:mini-css-extract-plugin、uglifyjs-webpack-plugin

二、Webpack 4.x 的破坏性变更

失效的插件或loader

类型

功能说明

webpack.optimize.CommonsChunkPlugin

内置插件

功能说明:分离Chunk。将多次出现的代码统一打包到一个文件中。Vue工程中用来打包vendor

webpack.optimize.UglifyJsPlugin

内置插件

功能:压缩JS

extract-text-webpack-plugin

Loader

功能:分离文件。将部分代码或文件提取到单独文件中。Vue工程里用来分离CSS到指定文件

三、具体相关改动描述

1、首先升级webpack4,我已经升级到4.46.0

npm uninstall webpack
npm install webpack@4 -D

PS:我们这里一步步升级测试,根据报错提示来更改对应配置。。。

-----------------------------------------------------------------------------------------------------------

运行测试:npm run dev2报错提示如图:

报错原因:html-webpack-plugin·版本不兼容问题

Webpack3.0

//会出现不兼容问题
"html-webpack-plugin":"^2.30.1"

Webpack4.0

解决方案:升级到最新版

npm i html-webpack-plugin@3-D

-----------------------------------------------------------------------------------------------------------

运行测试:npm run dev2

Ps:正常了,项目起来了

打开个页面看看:这里页面中的某个路由,没实际意义,只为证实项目起来了,这里得配置c盘的host哦。

 

 

参考文档:https://www.cnblogs.com/planetwithpig/p/11904870.html

在运行下打包命令

运行测试:npm run testing报错提示如图:

 

报错原因:报错的原因是webpack4已经升级不支持这种写法了,也就是说不在plugins里面进行操作。而是放在了optimization里面,写法不变下面贴代码

解决方法:运行  npm i -D uglifyjs-webpack-plugin@beta 安装uglifyjsPlugin

Ps:避免build打包出现(ERROR in static/js/vendor.xxxxx.js from UglifyJs)提示。

我们这里安装uglifyjs-webpack-plugin@beta版本。

原因:由于 UglifyJs 只支持 ES5 element-ui 可能引入了一部分 ES6 的写法,所以导致 webpack 打包失败。issue 里最后给出的解决方案是用 beta 版本的Uglify-es 来代替 UglifyJsBeta 版本引入了对 ES2015+)的支持。

 

Webpack3.0

 //Webpack.prod.conf.js原配置如下:

plugins: [
    ......
    new webpack.optimize.UglifyJsPlugin({
        compress: {
            warnings: false,
            drop_debugger: true,
            drop_console: true
        },

        sourceMap: true
    }),
    ......
]       

删除以上new webpack.optimize.UglifyJsPlugin{})代码

Webpack4.0

//Webpack.prod.conf.js修改配置如下:
......
const UglifyJsPlugin=require('uglifyjs-webpack-plugin');
const webpackConfig = merge(baseWebpackConfig, {
    //把plugins里原有的new webpack.optimize.UglifyJsPlugin({})删除掉
    Plugins:[
         ......
    ],
    optimization:{
    minimizer: [
      new UglifyJsPlugin({
        uglifyOptions: {
          output: {omments: false},
          compress: {
            warnings: false,
            drop_debugger: true,
            drop_console: true
          }
        },
        sourceMap: true
      }),
    ],
  }
})

-----------------------------------------------------------------------------------------------------------

再次运行测试打包命令:npm run testing

又报有新报错了如下:

报错原因:

webpack.optimize.CommonsChunkPlugin是原来的插件不能用了,得用config.optimization.splitChunk来代替了,改下配置

Webpack3.0 

//Webpack.prod.conf.js原配置如下:
Plugin:[
  ......
  

   

  ......
]

删除以上new webpack.optimize.CommonsChunkPlugin{})两处代码

Webpack4.0

//Webpack.prod.conf.js修改配置如下:
......
const UglifyJsPlugin=require('uglifyjs-webpack-plugin');
const webpackConfig = merge(baseWebpackConfig, {
//把plugins里原有的new webpack.optimize.UglifyJsPlugin({})删除掉
    Plugins:[
         ......
    ],
    optimization:{
//从webpack.optimize.CommonsChunkPlugin到config.optimization.splitChunk
       splitChunks: {
           chunks: 'async',
           // 大于30KB才单独分离成chunk
           minSize: 30000,
           maxAsyncRequests: 5,
           maxInitialRequests: 3,
           name: true,
           cacheGroups: {
               default: {
                   priority: -20,
                   reuseExistingChunk: true,
               },
               vendors: {
                   name: 'vendors',
                   test: /[\\/]node_modules[\\/]/,
                   priority: -10,
                   chunks: "all"
               },
               echarts: {
                   name: 'echarts',
                   chunks: 'all',
                   // 对echarts进行单独优化,优先级较高
                   priority: 20,
                   test: function(module) {
                       var context = module.context;
                       return context && (context.indexOf('echarts') >= 0 || context.indexOf('zrender') >=
                           0)
                   }
               }
           }
     },}
})

-----------------------------------------------------------------------------------------------------------

改完运行命令:npm run dev/dev2/dev3都正常,但运行npm run testing/prod打包报错了,如下:

Error: Path variable [contenthash] not implemented in this context: static/css/[name].[contenthash].css

报错原因:

extract-text-webpack-plugin插件废弃,使用mini-css-extract-plugin插件代替

在之前版本中我们使用extract-text-webpack-plugin提取CSS文件,不过在webpack 4.x中则应该使用mini-css-extract-plugin来提取CSS到单独文件中

解决方法:运行  npm i mini-css-extract-plugin@0.9.0 -D

Ps我认为最新的mini-css-extract-plugin版本有错误,所以下载版本0.9.0对我有用。

//提取CSS到单独文件相关代码

Webpack3.0 

//Webpack.prod.conf.js原配置如下:
const utils = require('./utils')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const webpackConfig = merge(baseWebpackConfig, {    
Plugins:[
    ......
       new ExtractTextPlugin({ 
      filename: utils.assetsPath('css/[name].[contenthash].css') 
    }),
    ......
]

删除以上new ExtractTextPlugin{})相关代码,替换成MiniCssExtractPlugin 

Webpack4.0

//Webpack.prod.conf.js修改配置如下:
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const webpackConfig = merge(baseWebpackConfig, {    
  Plugins:[
    ......
      new MiniCssExtractPlugin({
        filename: utils.assetsPath('css/[name].[contenthash].css')
      })
    ......
  ]
}
//utils.js和webpack.prod.conf.js中注释extract-text-webpack-plugin相关配置,并添加mini-css-extract-plugin配置

-----------------------------------------------------------------------------------------------------------

再次运行测试打包命令:npm run testing

成功了。

以前是webpack3升级webpack4的方法,已经实践完成整个过程。。。

--------------------------------------------------------------------------------------------------------

最后运行时还注意到有如下的提示:

提示1:

 

提示2:

No parser and no filepath given, using 'babel' the parser now but this will throw an error in t

he future. Please specify a parser or a filepath so one can be inferred.

可能原因:vue-loader的版本没跟上其他包的版本导致解析器不运行,还在持续更新。。。

--------------------------------------------------------------------------------------------------------

实测webpack4比webpack3打包文件大小略小一些。。。

速度上webpack4比webpack3快些

如左-3,右-4

 

 

 

 

 

以上为工作总结,实践亲测整理笔记。。。