两者都能削减用户下载的 JavaScript。代码分割把 bundle 拆成按需加载的 chunk;tree shaking 移除你从不使用的代码。它们是互补的:分割加载什么,摇掉每个 chunk 内部的死代码。
代码分割
不是一个大 bundle,而是把 app 拆分,让每个路由或重型功能成为一个只在需要时才获取的独立 chunk:
js
= ( ());
button. = () => {
{ openEditor } = ();
();
};
两者都能削减用户下载的 JavaScript。代码分割把 bundle 拆成按需加载的 chunk;tree shaking 移除你从不使用的代码。它们是互补的:分割加载什么,摇掉每个 chunk 内部的死代码。
不是一个大 bundle,而是把 app 拆分,让每个路由或重型功能成为一个只在需要时才获取的独立 chunk:
= ( ());
button. = () => {
{ openEditor } = ();
();
};
动态 import() 就是那个信号——打包器会在那个边界处产出一个独立文件。
打包器静态分析 ES module 的 import/export,并丢弃没有任何东西引用的导出。它只对 ESM(静态、可分析)有效——而不是 CommonJS 的 require:
import { debounce } from "utils"; // only debounce is kept; throttle, etc. are shaken out
它依赖 package.json 中的 "sideEffects": false 和按函数导入;barrel 文件或有副作用的模块会破坏它。
这是「发送更少 JS」背后的两个杠杆。面试官希望你知道代码分割决定什么在何时加载,tree shaking 决定里面到底有什么,以及 tree shaking 依赖于静态的 ESM——正是这个细节区分了真正调优过 bundle 的人和只读过相关文章的人。
一个包含详细解答的 IT 面试题库——从初级到高级。
捐赠