#webpack learn
将loader用在必要的文件上,并且用include限制文件路径,如
const path = require("node:path");
module.exports = {
// ...
module: {
rules: [
{
test: /\.js$/,
include: path.resolve(__dirname, "src"),
loader: "babel-loader",
},
],
},
};每个loader/plugin都有启动时间
resolve 是用来告诉webpack怎么去寻找模块的。 减少 resolve.modules, resolve.extensions, resolve.mainFiles, resolve.descriptionFiles 的配置,因为会增加文件系统的调用。
使用dllPlugin分离不常改变的代码块
DllPlugin 是 webpack 提供的一个优化构建性能的插件,核心作用是 将第三方依赖(或不常变动的基础代码)提前编译成独立的动态链接库(DLL),避免在每次业务代码构建时重复编译这些稳定代码,从而大幅提升项目的构建速度。
它借鉴了 Windows 系统的 DLL(动态链接库)思想:
- 抽离稳定代码:把项目中不常变化的依赖(如 react、vue、lodash 等第三方库)单独打包成 DLL 文件(一个或多个)。
- 生成映射清单:通过 DllPlugin 生成一个 manifest.json 文件,该文件记录了 DLL 中各模块的路径、ID 等映射关系。
- 业务代码复用 DLL:在业务代码构建时,通过 DllReferencePlugin 读取 manifest.json,直接复用已编译的 DLL 代码,不再重新编译这些依赖。
webpack 5 可以使用Module Federation或持久化缓存(persistent cache)替代
尽量将代码减少
- 使用更简洁的库
- treeshaking 去掉无用代码
- 使用splitChunks 抽离重复代码块,防止重复代码块编译到多个地方
- 部分编译,只编译你现在需要用到的模块
使用eval或cheap-source-map等性能比较好的sourceMap,最建议使用eval-cheap-module-source-map
- TerserPlugin 代码压缩
- [fullhash]/[chunkhash]/[contenthash] 文件hash指纹
- ModuleConcatenationPlugin 代码优化
可以使得入口体积减少
module.exports = {
// ...
optimization: {
runtimeChunk: true,
},
};module.exports = {
// ...
optimization: {
removeAvailableModules: false,
removeEmptyChunks: false,
splitChunks: false,
},
};不要使用ts-loader做类型校验,紧紧用来转换代码。生产环境下可以使用ForkTsCheckerWebpackPlugin做校验,它是多线程的。 或者开发时使用swc或esbuild进行ts转换 生产环境下再使用tsc进行类型校验 + ts-loader + babel-loader进行代码转换
module.exports = {
// ...
test: /\.tsx?$/,
use: [
{
loader: "ts-loader",
options: {
transpileOnly: true,
},
},
],
};
``;不过要注意多线程下,某些loader和plugin需要特殊的配置,比如ts-loader。