前言:

2018年8月25号webpack4正式发布,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 来代替 UglifyJs(Beta 版本引入了对 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

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

VUE项目Webpack3升级为webpack4总结的更多相关文章

  1. 老vue项目webpack3升级到webpack5全过程记录(一)

    背景 19年新建的vue项目,使用的是webpack3,随着项目的积累,组件的增多导致本地构建,线上打包等操作速度极慢,非常影响开发效率和部署效率,基于此问题,本次对webpack及相关插件进行了优化 ...

  2. webpack3升级为webpack4

    写在前面的话:为什么要升级,因为公司目前的项目使用webpack3,但是因为是多页应用,入口估计有一百多个,开发模式下慢得不像话,修改一个文件需要十几秒才编译好,之前的解决方案是减少入口,但是要调试其 ...

  3. 基于vue-cli 将webpack3 升级到 webpack4 配置

       升级webpack4前 先删除之前的webpack, babel-loader  下载 webpack npm i -D webpack@4 webpack-cli@3 webpack-dev- ...

  4. 记录一次webpack3升级到webpack4过程

    升级之前也参考了一些网上的教程.借鉴之,进行的自己的升级.一些版本为什么设为那个版本号也是参考别人的结果. 整体是按照先升级npm run dev:在升级npm run build的顺序. 首先升级w ...

  5. vue项目环境搭建(webpack4从零搭建)--仅个人记录

    一.nodejs环境搭建 首先需要下载node.js(推荐直接官网找最新的版本),下载完成后会自带npm包管理工具,打开cmd命令行界面,输入npm -v .node -v检查node.js与npm是 ...

  6. vue项目node升级后,node-saas报错解决办法

    ERROR in ./node_modules/_extract-text-webpack-plugin@3.0.2@extract-text-webpack-plugin/dist/loader.j ...

  7. 如何快速把 Vue 项目升级到 webpack3

    由于 webpack3升级后,新增了 Scope Hositing(作用域提升) 功能,据说是对 js的性能提升很大.因此,我们做了一个测试对比,就是 webpack3和 webpack1/2 的性能 ...

  8. prettier包升级后vue项目运行报错

    今天用vue-cli新建vue项目的时候,发现项目怎么都跑不起来. 最后通过与以前项目作比较,发现prettier这个依赖的版本从原来的1.12.0升级成了1.13.1.我也不太清楚为什么升级后项目跑 ...

  9. webpack4.x 从零开始配置vue 项目(三)

    目标 babel 转换ES6 语法 postCss 增强css功能,如自动增加前缀 vue-loader 解析vue 文件 实现基本的vue项目开发环境,打包等 Babel 由于浏览器对es6语法兼容 ...

  10. 原有vue项目接入typescript

    原有vue项目接入typescript 为什么要接入typescript javascript由于自身的弱类型,使用起来非常灵活. 这也就为大型项目.多人协作开发埋下了很多隐患.如果是自己的私有业务倒 ...

随机推荐

  1. 【每日一题】【第一个出现的值】【二分】2022年1月10日-NC105 二分查找-II

    描述请实现有重复数字的升序数组的二分查找给定一个 元素有序的(升序)长度为n的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的第一个出现的target,如果目标值存在返 ...

  2. Qt网络编程-书接上文,浅谈TCP文件收发,以及心跳包

    qt网络编程-书接上文,浅谈文件收发 上文Qt网络编程-从0到多线程编程中谈到 在qt中的qtcpsocket通讯的用法,接下来浅谈一下关于tcp通讯的实际应用,当然了由于是浅谈,也不能保证其功能的完 ...

  3. ping localhost时出现::1的原因以及解决办法

    ping localhost时出现: 在cmd中ping localhost解析出来的是ipv6的::1的原因是windows有个优先解析列表,当ipv6的优先级高于ipv4时,就会出现这种情况. 具 ...

  4. m3u8文件后缀jpg,png等处理方法及视频合并

    处理 # 解析伪装成png的ts def resolve_ts(src_path, dst_path): ''' 如果m3u8返回的ts文件地址为 https://p1.eckwai.com/ufil ...

  5. 用Echarts实现SpreadJS引用从属关系可视化

    在金融行业,我们经常会有审计审查的需求,对某个计算结果进行审查,但是这个计算结果可能依赖多个单元格,而且会有会有多级依赖的情况,如果让我们的从业人员靠眼睛找,工作量巨大,而且准确性存疑,基本上死路一条 ...

  6. linux系统一键开启root登陆

    服务器只能key登陆,用这个后直接可以root方式登陆 sudo -i echo root:要设置的密码 |sudo chpasswd root sudo sed -i 's/^#\?PermitRo ...

  7. 光速上手k8s(2023)(containerd)(未完待续)

    又过了好久没写了,主要是近来状况也无聊 一.了解概念(参考) 概念 Kubernetes 是一个可移植.可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化. Kubernete ...

  8. shell端口监听异常邮箱告警

    业务场景:应用发布监听服务是否正常启动,因为服务器资源不够上不了prometheus.grafana,所以写的shell脚本监听.此脚本适用于初创公司及小微企业使用. 准备工作 除了shell脚本这里 ...

  9. [WPF]创建系统栏小图标

    隐藏窗体任务栏图标 /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class Ma ...

  10. 《Effective C++》设计与声明章节

    Item18:让接口容易被正确使用,不易被误用 总结: 1.好的接口很容易被正确使用,不容易被误用.你应该在你的所有接口中努力达到这些性质. 2."促进正确使用"的办法包括接口的一 ...