exportvarname='my name'exportconstsay=()=>'your name'// this function is private to the modulefunctionsubtract(num1,num2){returnnum1-num2;}// define a function...functionmultiply(num1,num2){returnnum1*num2;}// ...and then export it laterexport{multiply};
可能已经注意到“模块”不是像“text / javascript”类型那样的内容类型。模块JavaScript文件使用与脚本JavaScript文件相同的内容类型提供, 因此无法仅根据内容类型进行区分。此外,当类型无法识别时,浏览器会忽略<script>元素,因此不支持模块的浏览器将自动忽略<script type =“module”>行, 从而提供良好的向后兼容性。
Module Loading Sequence in Web Browsers
模块的独特之处在于,与脚本不同,它们可以使用import来指定必须加载其他文件才能正确执行。为了支持该功能,<script type =“module”>始终表现为 应用了defer属性。defer属性对于加载脚本文件是可选的,但始终应用于加载模块文件。 一旦HTML解析器遇到带有src属性的<script type =“module”>, 模块文件就会开始下载,但是在完全解析Document之后才会执行。模块也按它们在HTML文件中出现的顺序执行。这意味着第一个<script type =“module”> 始终保证在第二个之前执行,即使一个模块包含内联代码而不是指定src。
import { identifier1, identifier2 } from "./example.js";
import * as example from "./example.js";
import { sum } from "./example.js";
import { multiply } from "./example.js";
import { magicNumber } from "./example.js";
if (flag) {
export flag; // syntax error
}
function tryImport() {
import flag from "./example.js"; // syntax error
}
# export.js
export var name = "Nicholas";
export function setName(newName) {
name = newName;
}
# import.js
import { name, setName } from "./example.js";
console.log(name); // "Nicholas"
setName("Greg");
console.log(name); // "Greg"
name = "Nicholas"; // error
#export.js
function sum(num1, num2) {
return num1 + num2;
}
export { sum as add };
#import.js
import { add as sum } from "./example.js";
console.log(typeof add); // "undefined"
console.log(sum(1, 2)); // 3
#export.js
// module code without exports or imports
Array.prototype.pushAll = function(items) {
// items must be an array
if (!Array.isArray(items)) {
throw new TypeError("Argument must be an array.");
}
// use built-in push() and spread operator
return this.push(...items);
};
#import.js
import "./export.js";
let colors = ["red", "green", "blue"];
let items = [];
items.pushAll(colors);
<!-- load a module JavaScript file -->
<script type="module" src="module.js"></script>
<!-- include a module inline -->
<script type="module">
import { sum } from "./example.js";
let result = sum(1, 2);
</script>
<!-- this will execute first -->
<script type="module" src="module1.js"></script>
<!-- this will execute second -->
<script type="module">
import { sum } from "./example.js";
let result = sum(1, 2);
</script>
<!-- this will execute third -->
<script type="module" src="module2.js"></script>