只有满足声明即赋值且值完全静态、作用域封闭无副作用、类型纯净无外部依赖三个条件的const变量才会被内联;构建工具通过ast静态分析识别纯表达式并替换为字面量,再经压缩消除冗余。

现代构建工具(如 Webpack、esbuild、Rollup、Next.js 内置工具链)会在构建阶段自动对满足条件的变量执行常量内联(Constant Inlining)和常量折叠(Constant Folding),无需手动配置,但需代码符合引擎可静态分析的前提。
哪些变量会被内联?
只有满足以下全部条件的变量才可能被内联:
-
声明即赋值且值完全静态:如
const PI = 3.14159、const ENV = "production";不支持运行时计算,如const now = Date.now()或const host = window.location.host不会被内联。 - 作用域封闭、无副作用:变量不能在函数外被修改,也不能出现在闭包或模块顶层以外的动态上下文中。例如导出后被其他模块重新赋值,会阻断内联。
-
类型纯净、无外部依赖:若变量值来自纯函数调用(如
const msg = (() => "Hello")()或const version = semver.coerce("2.0.0")),该函数必须是构建时可静态求值的纯函数(无 I/O、无全局状态、参数全为字面量)。
构建工具如何识别并处理?
工具链通过 AST 静态分析识别可内联节点,典型流程如下:
- 解析源码生成抽象语法树,标记所有
const声明及其初始化表达式; - 递归判断表达式是否“纯”:检查是否含
Math.random()、new Date()、fetch、this、arguments、未定义变量等不可预测成分; - 若判定安全,则将变量引用直接替换为字面量值,并移除原声明语句;
- 后续压缩阶段(如 Terser)还会合并冗余计算、消除死代码,进一步精简输出。
实际效果示例
原始代码:
const API_BASE = "https://api.example.com";
const TIMEOUT = 5000;
const isProd = process.env.NODE_ENV === "production";
function fetchUser(id) {
return fetch(`${API_BASE}/users/${id}`, { timeout: TIMEOUT });
}
if (isProd) {
console.log("Running in production");
}
经构建优化后(生产模式下):
function fetchUser(id) {
return fetch("https://api.example.com/users/" + id, { timeout: 5000 });
}
console.log("Running in production");
注意:process.env.NODE_ENV === "production" 被预替换为 true,再经布尔折叠简化为 if (true),最终被 Terser 移除条件分支,只保留内部语句。
开发者可控的优化建议
-
优先使用
const声明明确不变的值,避免let或var; -
避免在常量初始化中引入运行时依赖,如不要写
const token = localStorage.getItem("token"); -
对环境变量使用标准注入方式(如 Webpack 的
DefinePlugin、Vite 的import.meta.env),确保其在构建时被字符串字面量替换; -
复杂逻辑尽量封装为具名纯函数并导出,便于工具识别其确定性(例如
export const getFeatureFlag = () => true可能被折叠,而匿名箭头函数嵌套过深则可能失效)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











