You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// no tree-shakingimportStufffrom'./stuff';doSomething(Stuff);// tree-shakingimportStufffrom'./stuff';doSomething();// tree-shakingimport'./stuff';doSomething();// no tree-shakingimport'my-lib';doSomething();// 全部导入 no tree-shakingimport_from'lodash';// 具名导入 tree-shakingimport{debounce}from'lodash';// 直接导入具体的模块 tree-shakingimportdebouncefrom'lodash/lib/debounce';
import{something}from'./something';functionusingSomething(){returnsomething;}exportfunctiontest(){returnusingSomething();}// 在使用 test 导出时才使用 something。
一、webpack4的构建优化
1. 加快构建速度
1.1 优化配置
这里介绍的主要的几种优化配置如下所示:
如果你有没用过的配置可以接着看下面的具体使用方法,如果你已经很熟悉了则可以跳过此节~
1. exclude、include范围
PS. 相比exclude可以多用include
2. noParse
noParse: /node_modules\/(moment|chart\.js)/
3. IgnorePlugin
例如: moment (2.24.0版本) 会将所有本地化内容和核心功能一起打包,我们就可以使用 IgnorePlugin 在打包时忽略本地化内容(语言包),见下图。
4.1 thread-loader
4.2 happypack
5. cache-loader/cacheDirectory
cacheDirectory例子:
cache-loader例子:
6. Dll缓存(动态链接库)
使用相关插件:
具体步骤:
(1) 新增一个webpack配置去编译DLL文件(
[name].dll.js
、[name].manifest.json
)(2) dev构建时,告诉 Webpack 使用了哪些动态链接库
(3) html template里引入文件
因为我这里只是本地构建加速,所以就以dev的方式引入
到这DLL就配好了。有些人可能比较好奇
react.dll.js
和react.manifast.js
到底是什么文件,做了什么事?你看看他两个文件就知道啦~react.dll.js
其实主要就是所引用模块的代码集合react.manifast.js
则写明包含哪些模块、模块路径1.2 检测工具
2. 构建产物方面
2.1 减小构建产物大小、提高复用率
这里介绍的主要的几种优化配置如下所示:
@babel/plugin-transform-runtime
具体使用:
1. optimization.splitChunks分包
2. babel配置
提取所有页面所需的helper函数到一个包里,避免重复注入
3. tree-shaking
(1) 具体配置
(2) 哪类代码会被shake掉?以下有一些事例
(3) 什么叫有副作用的代码?
只要被引入,就会对应用程序产生重要的影响。 (一个很好的例子就是全局样式表,或者设置全局配置的js文件。)
(4) 有副作用的代码我们不希望被shake,我们可以配置如下
(5) 注意,babel配置需要配
modules: false
,忽略import/export代码编译2.2 检测工具
3. 产物检查
ES check
具体使用例子:
二、webpack5的构建优化
1. 速度优化
1.1 编译缓存
一些参数注解
cache: true
就是cache: { type: 'memory' }
的别名type
: 'filesystem'|'memory'。如果设置'memory'则缓存在内存且不能配置其他信息,设置成'filesystem'就可以配置更多信息。默认开发模式使用的是'memory',生产模式是false。
version
: 当配置文件和代码都没有发生变化,但是构建的外部依赖(如环境变量)发生变化时,预期的构建产物代码也可能不同。这时就可以使用 version 配置来防止在外部依赖不同的情况下混用了相同的缓存。例如,可以传入 cache: {version: process.env.NODE_ENV},达到当不同环境切换时彼此不共用缓存的效果。1.2 长效缓存 Long-term caching
1.2.1 引子
比如只是jsx删除引用的一个css文件 好多bundle文件的hash就都变了。)
1.2.2 webpack4实现长效缓存
之前需要通过如下配置达到长效缓存:
或者配置
配置说明:
(NamedChunksPlugin 只能对普通的 Webpack 模块起作用,异步模块(异步模块可以在 import 的时候加上 chunkName 的注释,比如这样:import(/ webpackChunkName: “lodash” / ‘lodash’).then() 这样就有 Name 了),external 模块是不会起作用的。)
1.2.3 Webpack5默认启用deterministic实现长效缓存
Webpack5采用新的算法,生产模式下默认启用如下配置不仅实现长效缓存,还减少了文件打包大小:
PS.具体采用的算法还需要进一步深入研究~
2. 包构建大小优化
2.1 Node Polyfill脚本被移除
Webpack 4版本附带了大多数Node.js核心模块的polyfill,一旦前端使用了任何核心模块,这些模块就会自动应用,导致polyfill文件很大,但是其实有些polyfill是不必要的。
而现在webpack5将不会自动为Node.js模块添加Polyfills,需要开发者手动添加合适的Polyfills。
升级迁移至webpack5需要注意:
2.2 tree-shaking
1.嵌套tree-shaking
能够跟踪对export的嵌套属性的访问,分析模块的export和import的依赖关系,去掉未被使用的模块
2.内部模块tree-shaking(深度作用域分析)
新属性optimization.innerGraph分析模块导出和导入之间的依赖关系,在生产模式下默认启用。
可以分析以下符号:
3.package.json 中的“sideEffects”标志允许将模块手动标记为无副作用,从而在不使用它们时将其移除。
webpack 5 还可以根据对源代码的静态分析,自动将模块标记为无副作用。
更多Webpack5的内容推荐阅读:
The text was updated successfully, but these errors were encountered: