# ES 模块语法

以下内容旨在作为对 ES2015 规范 中定义的模块行为的轻量级参考,因为正确理解导入和导出语句对于成功使用 Rollup 是必要的。

# 导入

导入的值不能被重新分配,尽管导入的对象和数组 可以 被 mutated(并且导出模块和任何其他导入将受到 mutation 的影响)。也就是说,它们的行为类似于 const 声明。

# 具名导入

使用源模块中的原始名称进行导入。

import { something } from './module.js';

从源模块导入特定项目,并在导入时分配自定义名称。

import { something as somethingElse } from './module.js';

# 名称空间导入

将源模块中的所有内容作为一个对象导入,该对象将所有源模块的 named exports 公开为属性和方法。

import * as module from './module.js';

从上面的示例中,something 将作为属性附加到导入的对象上,例如 module.something。如果存在默认导出,则可以通过 module.default 访问它。

# 默认导入

导入源模块的 default export。

import something from './module.js';

# 无命名导入

加载模块代码,但不要使任何新对象可用。

import './module.js';

这对于 polyfill 很有用,或者当导入代码的主要目的是处理 prototypes 时。

# 动态导入

使用 动态导入 API 导入模块。

import('./modules.js').then(({ default: DefaultExport, NamedExport }) => {
	// 用这个模块做点什么...
});

这对于代码分解应用程序和动态使用模块非常有用。

# 导出

# 具名导出

导出先前声明的值:

const something = true;
export { something };

导出时重命名:

export { something as somethingElse };

声明后立即导出值:

// `var`, `let`, `const`, `class`, 和 `function` 都是有效的
export const something = true;

# 默认导出

导出单个值作为源模块的默认导出:

export default something;

仅当你的源模块只有一个导出时才推荐这种做法。

尽管规范允许,但在同一个模块中混合默认和命名导出是不好的做法。

# 绑定是如何工作的?

ES 模块导出 live bindings,而不是值,因此可以在初始导入后更改值。

查看示例:

// incrementer.js
export let count = 0;

export function increment() {
	count += 1;
}
// main.js
import { count, increment } from './incrementer.js';

console.log(count); // 0
increment();
console.log(count); // 1

count += 1; // Error - 只有 incrementer.js 可以更改这个变量
Last Updated: 6/14/2023, 8:56:23 AM