404 字
2 分钟
03 · Webpack 核心
Webpack 的心智模型
Webpack 把一切(JS、CSS、图片)都当模块,核心是四件套:
- entry:从哪开始构建依赖图。
- output:产物输出到哪。
- loader:“某种文件 → JS 模块”的转换器(如
css-loader、ts-loader、babel-loader)。 - plugin:在编译生命周期钩子上做更重的活(压缩、生成 HTML、提取 CSS)。
module.exports = { entry: "./src/index.js", output: { path: "dist", filename: "[name].[contenthash].js" }, module: { rules: [{ test: /\.tsx?$/, use: "babel-loader" }], }, plugins: [new HtmlWebpackPlugin()],};loader vs plugin
- loader 是”文件级”转换,一对一(一个资源进,一个模块出)。链条从右到左执行。
- plugin 是”生命周期级”扩展,能访问整个编译对象,做代码分割、资源注入、报表等。
简记:改文件内容用 loader,改构建过程/产物用 plugin。
code splitting 拆包
// 动态 import 自动拆成独立 chunkbutton.onclick = () => import("./heavy").then(m => m.run());// 或配置optimization: { splitChunks: { chunks: "all" } } // 提取公共依赖拆包让首屏只加载必要代码,公共库单独缓存,是性能优化的基础。
常见优化
mode: "production"自动开启压缩、tree-shaking。contenthash文件名:内容不变则文件名不变,最大化浏览器缓存。cache目录缓存:二次构建大幅提速。- 用
webpack-bundle-analyzer看谁占了体积。
小结
- 四件套:entry/output/loader/plugin。
- loader 转文件,plugin 扩流程。
- 动态 import + splitChunks 做拆包优化首屏。
contenthash文件名利于长缓存。
练习
- 手写一个最小 webpack 配置,把 TS 入口打包成 dist 下的 hash 命名文件。
- 配置
splitChunks: { chunks: "all" },观察公共依赖是否被提取到独立 chunk。 - 用
webpack-bundle-analyzer找出体积最大的模块,想办法减小。
03 · Webpack 核心
http://117.72.32.87/blog/posts/engineering-roadmap-03-webpack/