Vue项目从webpack3.x升级webpack4不完全指南


Posted in Javascript onApril 28, 2019

前段时间,泡面将自己的一个Vue-cli构建的前端框架从webpack3.x升级到了4.x版本,现在才拉出来记录一下,已备忘之用,也和大家分享一下,以免大家采坑。

原先的环境

  • 项目原先通过Vue-cli 2.9.3 版本构建,原先使用的webpack 3.x版本
  • 首先需要对基础包进行更新(package.json)
  • webpack 更新到4.x版本,泡面这里更新到了4.28.3
  • 更新webpack-dev-server,泡面更新到了3.1.14版本,
  • 安装webpack-cli,泡面安装的是3.2.1版本

除了上面的这几个,还需要更新下面几个:

  • vue-loader 泡面直接升级到了15版本,
  • eslint-loader 升级到了1.7.1,这个当时在做启动的时候提示了一些错误,所以索性也就升级了.
  • happypack, 泡面使用了多线程加速,所以这个也必须要升级,否则会报错,泡面更新到了5.0.1
  • html-webpack-plugin, 这个也需要更新,否则会提示错误,泡面这里升级到了3.2.0

除了上面几个,还需要额外下载一个:

  • mini-css-extract-plugin, 该包是要替换掉extract-text-webpack-plugin来使用,所以后者就遗弃掉了.

接着我们修改一下webpack.base.conf.js,没有使用happypack的这步骤可略过...

泡面这里不知道为什么不能使用happypack来挂载vue-loader,否则会提示错误,所以泡面这里将原先的happypack的配置修改回了原先:

...
const vueLoaderConfig = require('./vue-loader.conf')
...
module.exports = {
 ...
  {
   test: /\.vue$/,
    // loader: 'happypack/loader?id=happy-vue'
    loader: 'vue-loader',
    options: vueLoaderConfig
  },
 ... 
}

接着来调整 webpack.dev.conf.js

首先在合并配置的地方引入mode

...
 // 开发环境引入
 mode: 'development',
 ...
 module: {
  ...
 }
 devServer: {
  ...
 }

webpack4需要手动引入vue-loader插件,因为泡面是从14版本升级到15版本,点我查看官方文档,如何从 v14 迁移,所以这里需要引入:

...
const VueLoaderPlugin = require('vue-loader/lib/plugin')
...
module.export = {
 ...
 plugins: [
  ...
  // 引入vue-loader插件
  new VueLoaderPlugin(),
  ...
  // 同时,泡面注释掉了vue-loader的happypack
  // new Happypack({
  //  id: 'happy-vue',
  //  loaders: [{
  //   loader: 'vue-loader',
  //   options: vueLoaderConfig
  //  }]
  // })
 ]
}

接着, 以下插件被废弃掉了,直接注释掉

  • webpack.DefinePlugin
  • webpack.NamedModulesPlugin
  • webpack.NoEmitOnErrorsPlugin

ok, 这个文件就改完了.

接着来修改webpack.prod.conf.js

同开发环境,需要引入mode和vue-loader,一模一样,所以这里不赘述了.

接着,我们需要在配置表里添加optimization选项:

...
output: { ...},
// 这里添加
optimization: {
  runtimeChunk: {
   name: 'manifest'
  },
  minimizer: [
   new UglifyJsPlugin({
    cache: true,
    parallel: true,
    sourceMap: config.build.productionSourceMap,
    uglifyOptions: {
     warnings: false
    }
   }),
   new OptimizeCSSPlugin({
   cssProcessorOptions: config.build.productionSourceMap
    ? { safe: true, map: { inline: false } }
    : { safe: true }
  }),
  ],
  splitChunks:{
   chunks: 'async',
   minSize: 30000,
   minChunks: 1,
   maxAsyncRequests: 5,
   maxInitialRequests: 3,
   name: false,
   cacheGroups: {
    vendor: {
     name: 'vendor',
     chunks: 'initial',
     priority: -10,
     reuseExistingChunk: false,
     test: /node_modules\/(.*)\.js/
    },
    styles: {
     name: 'styles',
     test: /\.(scss|css)$/,
     chunks: 'all',
     minChunks: 1,
     reuseExistingChunk: true,
     enforce: true
    }
   }
  }
 },
 plugins: [...]

接着,我们需要引入mini-css-extract-plugin插件,并添加到插件里:

...
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
...
plugins: [
 ...
 new MiniCssExtractPlugin({
  filename: utils.assetsPath('css/[name].[contenthash].css')
 }),
 ... 
]

然后, 我们需要把废弃掉的插件注释掉:

webpack.DefinePlugin
UglifyJsPlugin (放到optimization里了)
ExtractTextPlugin
OptimizeCSSPlugin (放到optimization里了)
CommonsChunkPlugin (所有的...)

ok, 至此该文件就调整完了.

最后一个utils.js

这里主要是需要添加mini-css-extract-plugin插件

...
// 注释掉原来的插件
// const ExtractTextPlugin = require("extract-text-webpack-plugin");
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
...
// 找到:
// return ExtractTextPlugin.extract({
//  use: loaders,
//  fallback: "vue-style-loader",
//  publicPath: '../../'
// });
// 改为:
return [MiniCssExtractPlugin.loader].concat(loaders)

ok, 大功告成! 至此webpack4的配置文件就全部修改完成了.

目前, 泡面至在此记录流水账,回头性能测试再发文章记录.

ps: 如果出现这种错误

error: [vue-loader] vue-template-compiler must be installed as a peer dependency, or a compatible compiler implementation must be passed via options.

请重新安装一下 vue-template-compiler

总结

以上所述是小编给大家介绍的Vue项目从webpack3.x升级webpack4不完全指南,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的

Javascript 相关文章推荐
jQuery autocomplate 自扩展插件、自动完成示例代码
Mar 28 Javascript
基于jQuery的输入框在光标位置插入内容, 并选中
Oct 29 Javascript
基于JQuery的模拟苹果桌面Dock效果(稳定版)
Oct 15 Javascript
JS去除右边逗号的简单方法
Jul 03 Javascript
JS获取鼠标坐标的实例方法
Jul 18 Javascript
jQuery多媒体插件jQuery Media Plugin使用详解
Dec 19 Javascript
JavaScript 定时器 SetTimeout之定时刷新窗口和关闭窗口(代码超简单)
Feb 26 Javascript
js仿微博动态栏功能
Feb 22 Javascript
JavaScript数据结构之二叉树的遍历算法示例
Apr 13 Javascript
JS中原始值和引用值的储存方式示例详解
Mar 23 Javascript
Javascript实现打鼓效果
Jan 29 Javascript
react中useState使用:如何实现在当前表格直接更改数据
Aug 05 Javascript
Easyui 关闭jquery-easui tab标签页前触发事件的解决方法
Apr 28 #jQuery
vue项目中在外部js文件中直接调用vue实例的方法比如说this
Apr 28 #Javascript
微信小程序--特定区域滚动到顶部时固定的方法
Apr 28 #Javascript
详解vue更改头像功能实现
Apr 28 #Javascript
Vue2(三)实现子菜单展开收缩,带动画效果实现方法
Apr 28 #Javascript
js+html5 canvas实现ps钢笔抠图
Apr 28 #Javascript
判断文字超过2行添加展开按钮,未超过则不显示,溢出部分显示省略号
Apr 28 #Javascript
You might like
介绍一些PHP判断变量的函数
2012/04/24 PHP
php跨域cookie共享使用方法
2014/02/20 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
php微信扫码支付 php公众号支付
2019/03/24 PHP
禁止JQuery中的load方法装载IE缓存中文件的方法
2009/09/11 Javascript
js客户端快捷键管理类的较完整实现和应用
2010/06/08 Javascript
js查找某元素中的所有图片地址的方法
2014/01/16 Javascript
js函数与php函数的区别实例浅析
2015/01/12 Javascript
使用mouse事件实现简单的鼠标经过特效
2015/01/30 Javascript
JavaScript和JQuery的鼠标mouse事件冒泡处理
2015/06/19 Javascript
JS实现动态增加和删除li标签行的实例代码
2016/10/16 Javascript
JS中实现函数return多个返回值的实例
2017/02/21 Javascript
JS解决移动web开发手机输入框弹出的问题
2017/03/31 Javascript
html5+canvas实现支持触屏的签名插件教程
2017/05/08 Javascript
nodejs开发微信小程序实现密码加密
2017/07/11 NodeJs
jQuery 实时保存页面动态添加的数据的示例
2017/08/14 jQuery
React.Js添加与删除onScroll事件的方法详解
2017/11/03 Javascript
详解超简单的react服务器渲染(ssr)入坑指南
2019/02/28 Javascript
selenium+java中用js来完成日期的修改
2019/10/31 Javascript
利用Python的Django框架生成PDF文件的教程
2015/07/22 Python
python如何定义带参数的装饰器
2018/03/20 Python
Django CSRF跨站请求伪造防护过程解析
2019/07/31 Python
Python如何实现远程方法调用
2020/08/07 Python
纯CSS实现的大小渐变、渐远效果
2014/04/15 HTML / CSS
纯CSS3大转盘抽奖示例代码(响应式、可配置)
2017/01/13 HTML / CSS
L*SPACE官网:比基尼、泳装和度假服装
2019/03/18 全球购物
欧姆龙医疗欧洲有限公司:Omron Healthcare Europe B.V
2020/06/13 全球购物
自荐信怎么写呢?
2013/12/09 职场文书
数学教育专业求职信
2014/07/22 职场文书
自我介绍演讲稿范文
2014/08/21 职场文书
单位租房协议书样本
2014/10/30 职场文书
暑期社会实践证明书
2014/11/17 职场文书
技术入股协议书
2016/03/22 职场文书
用Python爬虫破解滑动验证码的案例解析
2021/05/06 Python
Python 类,对象,数据分类,函数参数传递详解
2021/09/25 Python
JS函数式编程实现XDM一
2022/06/16 Javascript