vue升级webpack5
八月更文第二弹, 开始啦! 🍦
webpack5已经发布快一年了,其中有很多新功能让人跃跃欲试,身为技术热爱者的我们怎么能够停滞不前呢 🐶,今天就来学习一下用webpack5搭建项目和新特性了解。
升级vue-cli
在vue项目内升级webpack5是很便利的,直接升级本地vue-cli到5.0.0就可以使用了,但是注意这里是beta版本,线上环境请谨慎使用。
- 升级vue-cli 📃 First, install the latest Vue CLI globally:
npm install -g @vue/cli@next#
OR
yarn global add @vue/cli@next
- 升级所有插件 Upgrade All Plugins at Once
vue upgrade --next
- 检查 升级完成后查看package.json,如图所示即代表升级成功。示例项目为新建项目,不存在npm包不兼容情况,如果是旧项目升级,会遇到许多兼容问题,请移步vue升级webpack5官网查看。
webpack5新特性
具webpack官方介绍,v5版本主要有以下新增
过时功能移除
-
首先是去掉了在 Webpack4 里面已经 Warming 的功能。
-
其次是 IgnorePlugin 和 BannerPlugin 现在必须传入一个参数,参数可以是 Object、String或者Function。
require.include
语法被废弃,使用时会有 Warming。当然这个行为可以通过Rule.parser.requireInclude
来把这个语法改成 allowed, deprecated 或者 disabled。 -
还有就是去掉自动 Node.js Polyfills 。一开始的化 Webpack 的主要目的是让 Node.js 的模块能够在浏览器运行,但随着模块格局的改变,越来越多的模块只用于浏览器,这个时候再自动 Polyfills 一些 Node 模块(例如 crypto)无疑会增加打包体积,在 Webpack5 之后去掉了这个自动行为。
长期缓存
webpack5的长期缓存要处理什么问题呢,首先在webpack4中我们可以注意到这样的现象:
- 代码热更新速度快
- 代码运行run速度慢
- 代码打包build速度慢 这里的原因是webpack4的缓存只是在内存中的,当webpack程序重新建立时,内存就会丢失,从而造成了运行和打包慢的情况。
说到这里我想大家对webpack5的长期缓存已经猜到了,就是要解决webpack程序运行缓存丢失,从而造成运行打包慢的问题。
目前webpack5提供了一套持久化抽象,并提供了几个实现: IdleFileCachePlugin
:持久化到本地磁盘MemoryCachePlugin
:持久化到内存 根据Webpack运行环境的不同,在dev
开发时依旧使用MemoryCachePlugin
,而在build时使用IdleFileCachePlugin
。
Webpack5直接从内部核心代码的层面,统一了持久化缓存的方案,有效降低了缓存配置的复杂性。除此之外,由于所有被webpack处理的模块都会被缓存,我们npm run start/build
的二次编译速度会远超cache-loader
,同时dll
也可以退出历史舞台了。
Webpack4时之所以要有dll
,是因为cache-loader
并不能覆盖所有模块,只能对个别被loader
处理的模块进行缓存。而那些通用的库是没法被cache-loader
处理的,所以只能通过dll
的方式来预编译。
实际上,Webpack5的内置缓存方案无论从性能上还是安全性上都要好于cache-loader
:
- 性能上:由于所以被webpack处理的模块都会被缓存,缓存的覆盖率要高的多
- 安全上:由于cache-loader使用了基于mtime的缓存验证机制,导致在CI环境中缓存经常会失效,但是Webpack5改用了基于文件内容etag的缓存验证机制,解决了这个问题。
Module Federation
这个被翻译为模块联邦,听起来有点奇怪。但是它可能时webpack5中最引人瞩目的一个特性, 这个特性可谓时真正实现了不同应用之间的模块共享。
例如我们有一个应用a,一个应用b,我们想让b应用使用a应用中的一个组件。这时候可能脑子的第一想法时cv大法搞一个,但是这样后期的维护就会变得很艰难,组件更新的实时同步根本无法确保。 这时候模块联邦就帮我们解决了这样一个问题。 具体的使用介绍将会在下一篇文章《webpack5-模块联邦实现微前端》中详细讲解。希望大家及时关注哦~
The Better TreeShaking
树摇的优化主要有两点:
- 嵌套 Webpack现在会去追踪 export 的链路,对于嵌套场景有更好的优化。 在下面的示例代码中,我们最终的使用参数只有
webpack_five
而webpack_four
是不会出现在最终的打包程序中的。
// inner.js`
export const webpack_four = 4
export const webpack_five = 5
// module.js
import * as inner from "./inner"
export { inner }
// user.js`
import * as module from "./module"
console.log(module.inner.webpack_five)
- 内部模块 Webpack 4 不会去分析导入和导出模块之间的依赖关系,Webpack5 里面会通过 optimization.innerGraph记录依赖关系。 在下面的示例代码中,只有webpack_cookie方法使用了 egg。最终可以实现标记更多没有使用的导出项。
import { egg } from "./egg"
function eatingEgg() {
return egg
}
export function webpack_cookie() {
return eatingEgg()
}
其他特性
- Named chunk IDs (命名块 id)
- Compilers (编译器)
- Config changes (配置更改)
- 其他
- webpack5
最后
本文到此结束,希望对你有帮助 😉
今天的文章vue升级webpack5 | 八月更文挑战分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/21376.html