ES Module✅
ES Module 的基本语法与特性
答案
ES Module(ESM)是 ES6 引入的官方模块化方案,支持静态分析和编译时优化。
- 使用
import
引入模块,export
导出变量、函数、类等。 - 只能在模块顶层使用 import/export,不能动态声明。
- 默认严格模式,支持异步加载(import())。
- 每个模块有独立作用域,导入值为只读引用。
// a.js
export const foo = 1
export default function bar() {}
// b.js
import bar, { foo } from './a.js'
console.log(foo) // 1
bar()
答案解析
ESM 让 JS 支持原生模块化,提升了代码组织和依赖管理能力。
面试官视角
- 核心考察点:能否写出 import/export 基本用法
- 评分标准:
- 差:只会用 script 标签
- 良:能写出 import/export
- 优:能说明静态分析和只读引用
ES Module 与 CommonJS 的区别?
答案
- ESM 静态引入,编译时确定依赖,支持 tree-shaking;CJS 动态 require,运行时加载。
- ESM 导出为只读引用,CJS 导出为值拷贝(require 缓存)。
- ESM 支持异步加载(import()),CJS 不支持。
- ESM 默认严格模式,CJS 默认非严格。
- ESM 适合浏览器和现代 Node.js,CJS 主要用于 Node.js。
// CommonJS
const foo = require('./foo')
module.exports = { bar: 1 }
// ES Module
import { foo } from './foo.js'
export const bar = 1
答案解析
理解两者差异有助于跨平台开发和模块迁移。
面试官视角
- 核心考察点:能否说出 ESM/CJS 的本质区别
- 评分标准:
- 差:混淆 require 和 import
- 良:能说出静态/动态加载
- 优:能结合 tree-shaking、只读引用说明
ES Module 的导入导出方式有哪些?
答案
- 命名导出:
export const foo = 1
- 默认导出:
export default function() {}
- 批量导出:
export { foo, bar }
- 导入:
import { foo } from './a.js'
- 默认导入:
import bar from './a.js'
- 全部导入:
import * as mod from './a.js'
- 动态导入:
import('./a.js').then(...)
// a.js
export const foo = 1
export default function() {}
// b.js
import bar, { foo } from './a.js'
import * as mod from './a.js'
答案解析
掌握多种导入导出方式,能灵活组织模块代码。
面试官视角
- 核心考察点:能否写出多种 import/export 语法
- 评分标准:
- 差:只会默认导出
- 良:能用命名/批量导入
- 优:能用动态导入和 * as
ES Module 的静态分析和 tree-shaking 原理?
答案
- ESM 的 import/export 必须在顶层,编译时可确定依赖关系。
- 静态分析让打包工具(如 webpack、rollup)能检测未使用的导出,进行 tree-shaking(摇树优化),减少最终包体积。
- CJS 动态 require 无法静态分析,不能 tree-shaking。
答案解析
理解静态分析和 tree-shaking,有助于优化前端构建性能。
面试官视角
- 核心考察点:能否说明 ESM 优势
- 评分标准:
- 差:不知 tree-shaking
- 良:能说出静态分析
- 优:能结合打包优化说明
ES Module 如何在浏览器和 Node.js 中使用?
答案
- 浏览器:使用
<script type="module">
,支持 import/export,自动严格模式,支持跨域加载。 - Node.js:需
.mjs
后缀或package.json
设置"type": "module"
,支持 import/export。 - 注意路径必须写全(如
./foo.js
),不能省略扩展名。
// 浏览器
// Node.js
// package.json: { "type": "module" }
// main.mjs
import { foo } from './foo.mjs'
<script type="module" src="main.js"></script>
答案解析
了解 ESM 在不同环境的用法,能解决实际开发兼容问题。
面试官视角
- 核心考察点:能否正确配置 ESM 环境
- 评分标准:
- 差:只会用 CJS
- 良:能写出 type="module"
- 优:能说明 Node.js 配置和路径细节