ES6 的 export 和 import 是静态语法,必须写在模块顶层,支持 Tree Shaking、编译时错误检测、可靠模块执行顺序及原生环境兼容性。

ES6 的 export 和 import 是静态语法,必须写在模块顶层、不能出现在条件语句或函数中。这种“编译时就确定依赖”的特性,带来几个实实在在的工程优势:
支持 Tree Shaking(摇树优化)
打包工具(如 Webpack、Vite、Rollup)能在构建阶段扫描所有 import 语句,明确知道哪些导出被使用、哪些从未被引用。未使用的 export 可被安全移除,显著减小最终产物体积。实测中,合理使用命名导出 + 按需导入,可使生产包体积平均减少 20%–27%。
- ✅ 正确写法:
export const formatTime = ...+import { formatTime } from './utils.js' - ❌ 无法摇树:
export default { formatTime, formatDate }整体导出对象,即使只用其中一个方法,整个对象也可能保留
编译时错误检测更早更准
因为依赖关系在执行前就已解析,IDE 和构建工具能立刻发现拼写错误、路径不存在、导入名称未导出等问题。比如:
-
import { fetchUser } from './api.js',但api.js实际只export const getUser→ 编辑器直接标红,无需运行就能定位 - 循环依赖也能被提前识别并给出清晰提示,而不是等到运行时报错或行为异常
保障按需加载与安全的模块执行顺序
静态结构让引擎或打包器能准确推导模块图(Module Graph),从而保证:
- 所有
export在模块执行前已注册,不会出现“暂时性死区”之外的访问问题 - 模块只执行一次,且导出值是实时绑定(live binding),修改
export let count后,所有import处都能同步看到更新 - 动态导入
import('./chunk.js')虽返回 Promise,但其目标模块本身仍遵循静态导出规则,不影响分析可靠性
原生环境兼容性更好,无需运行时垫片
浏览器通过 <script type="module"></script> 原生支持 ES 模块,自动启用 CORS、延迟执行、作用域隔离等机制。静态分析能力是这一支持的基础——CommonJS 的 require() 依赖运行时求值,无法在纯浏览器中无构建直接运行。
- Node.js 自 v12.20+ 也原生支持
"type": "module",无需 Babel 或 CommonJS 转换 - 静态特性还为未来功能铺路,比如类型检查(TypeScript)、宏(macro)等依赖编译期分析的能力


















