原文链接: https://interview.poetries.top/docs/excellent-docs/9-%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B%E6%A8%A1%E5%9D%97.html

前端工程化

简版速记

面试前最后 5 分钟扫一遍,核心结论先记住,细节再翻正文。

  • Loader vs Plugin:Loader 是「文件转换器」,把非 JS 模块(css/图片/ts)转成 webpack 能识别的内容,按数组从右到左、从下到上链式执行;Plugin 监听 webpack 生命周期的事件钩子(基于 Tapable 观察者模式),可介入打包全流程做更广的事。一句话:Loader 管「翻译」,Plugin 管「扩展」。
  • 构建三阶段:①初始化(合并参数 → 创建 Compiler)②构建(从 entry 出发,调 Loader 转译 → acorn 生成 AST → 递归找依赖)③生成(seal 封装 Chunk → emitAssets 写盘)。Compiler 全局唯一,Compilation 每次编译都新建。
  • module / chunk / bundle:module = 每个源文件;chunk = 多个 module 的合并单元(entry / import() / splitChunks 产生);bundle = 最终输出文件。
  • 文件指纹 hashhash 全项目级(任一文件改全变);chunkhash 入口级;contenthash 单文件内容级——抽离 CSS 用 contenthash,缓存命中率最高。
  • 构建提速babel-loadercacheDirectory + exclude node_modulesIgnorePlugin(不引入)、noParse(引入不解析)、多进程(HappyPack / ParallelUglify)、DllPlugin(框架预编译,仅开发环境)、HMR 热更新。
  • 产物优化:小图 base64、contenthash 利于缓存、import() 懒加载、splitChunks 抽公共/第三方代码、CDN、mode: 'production'(自动压缩 + Tree Shaking + Scope Hoisting)。
  • Tree Shaking 依赖 ES6 Module 静态结构(编译时即可分析),CommonJS 动态 require 无法摇树;副作用代码摇不掉,用 package.jsonsideEffects 标注。
  • Babel 三步:parse(babylon → AST)→ transform(plugin 遍历改 AST)→ generate(生成 ES5)。preset 是 plugin 集合;@babel/polyfill 污染全局已废弃,改用 core-js + regenerator-runtime;做第三方库用 @babel/plugin-transform-runtime 避免全局污染。
  • 为何 Proxy 不能 polyfill:Class 可用 function 模拟、Promise 可用 callback 模拟,但 Proxy 的拦截能力 Object.defineProperty 无法等价实现。
  • Vite 为什么快:开发态基于浏览器原生 ES Module,按需编译、免打包冷启动;生产态用 Rollup 打包。

目录

Last Updated:
Contributors: leeguooooo