正在加载...

JavaScript 模块

模块把 JavaScript 代码拆分到不同文件中。export 暴露值,import 使用值。示例显示 lida / tea / mint。

命名导出

命名导出保留明确的名称,一个模块可以导出多个值。

创建 math.js

javascript
export const drink = "tea";
export function label(name) {
return `${name} / ${drink} / mint`;
}

drink 和 label 能被其他模块使用,因为它们被导出了。未导出的代码留在文件内部。

导入命名值

命名导入使用大括号,并写出相同的导出名称。

在 app.js 中使用

javascript
import { drink, label } from "./math.js";
console.log(drink);
console.log(label("lida"));

导入会连接导出的绑定,而不是创建独立定义。浏览器中的这些文件需要通过 HTTP 或 HTTPS 提供。

默认导出

默认导出通常是模块的主要值。导入时可以选择本地名称,不使用大括号。

创建并导入默认值

javascript
export default function greet(name) {
return `Hello, ${name}!`;
}
import greet from "./greeting.js";
console.log(greet("lida"));

命名导入使用 { drink, label },默认导入使用 greet。一个文件只能有一个默认导出。

模块作用域与动态导入

模块顶层声明不会成为 window 的属性。import() 稍后加载模块,并返回 Promise。

稍后加载模块

javascript
const secret = "not global";
export const items = ["tea", "mint"];
import("./menu.js").then((menu) => console.log(menu.items.join(" / ")));
console.log(window.secret); // undefined

只有 items 穿过模块边界。动态导入的结果是 namespace 对象,导出值可以作为它的属性读取。

在单页中观察模块

这个自包含示例在内存中创建模块文本,生成 Blob URL 并导入它,不依赖项目文件。

运行浏览器模块示例

html
<p id="result"></p>
<script type="module">
const source = `export const drink = "tea"; export function label(name) { return name + " / " + drink + " / mint"; }`;
const url = URL.createObjectURL(new Blob([source], { type: "text/javascript" }));
const module = await import(url);
document.querySelector("#result").textContent = module.label("lida");
URL.revokeObjectURL(url);
</script>

页面会准确显示 lida / tea / mint。type="module" 启用模块语法,Blob URL 不需要网络文件。

真实项目通常使用 math.js、app.js 和 <script type="module" src="./app.js"></script>。不要依赖 file:// 测试,应使用 HTTP 服务器。

📊 模块选择

语法 用途 示例
命名导出/导入 分享指定名称 export const drink = "tea" / import { drink } ...
默认导出/导入 分享主要值 export default function greet() / import greet ...
动态导入 稍后加载并获得 Promise import("./menu.js").then(...)
模块作用域 保持顶层声明私有 const secret = "not global"

实践练习

创建 math.js,在 app.js 导入 drink 和 label,再添加默认的 greet,让页面显示 lida / tea / mint。

常见错误

不要删除命名导入的大括号,不要在同一文件写两个默认导出,也不要把未导出的值当成全局变量。

要点

export 选择要暴露的绑定,import 使用它们,默认导入可以选择名称,模块作用域保护未导出的声明。
让模块保持专注,并在示例结束后释放临时 Blob URL。

🧠 测试您的知识

准备开始

测试您的知识

通过这个互动测验挑战自己,看看你对这个主题的理解程度如何

❓
6
问题
🎯
70%
及格要求
♾️
∞
时间
🔄
∞
尝试次数

📝 说明

  • 仔细阅读每个问题
  • 为每个问题选择最佳答案
  • 您可以随时重新参加测验
  • 您的进度将显示在顶部