Skip to content

Commit

Permalink
feat: update expressions
Browse files Browse the repository at this point in the history
  • Loading branch information
xyliu3 committed Dec 20, 2024
1 parent c412ccf commit eaf4e29
Showing 1 changed file with 7 additions and 7 deletions.
14 changes: 7 additions & 7 deletions files/zh-cn/web/javascript/reference/operators/import/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import(moduleName, options)
### 参数

- `moduleName`
- : 要导入的模块。说明符的求值是宿主特异的(host-specified),但始终遵循与静态的 [import 声明](/zh-CN/docs/Web/JavaScript/Reference/Statements/import)相同的算法。
- : 要导入的模块。标识符的求值是宿主特异的(host-specified),但始终遵循与静态的 [import 声明](/zh-CN/docs/Web/JavaScript/Reference/Statements/import)相同的算法。
- `options`
- : 一个包含了导入选项的对象。以下是可识别的键:
- `with`
Expand All @@ -46,7 +46,7 @@ import 声明语法(`import something from "somewhere"`)是静态的,并

- 当静态导入显著减慢你的代码加载,或增加你的程序内存使用时,那么你很可能不需要正要导入的代码,或者以后才会需要它。
- 当你正要导入的模块在加载时并不存在时。
- 当导入说明符字符串需要动态构建时。(静态导入仅支持静态说明符。)
- 当导入标识符字符串需要动态构建时。(静态导入仅支持静态标识符。)
- 当你正要导入的模块有副作用,并且你仅在某些条件下才希望有这些副作用。(建议模块中不要有任何副作用,但有时模块的依赖项中是否有副作用也无法控制)
- 当你处于非模块化的环境(例如,`eval` 或脚本文件)时。

Expand All @@ -60,17 +60,17 @@ import 声明语法(`import something from "somewhere"`)是静态的,并
import("./data.json", { with: { type: "json" } });
```

动态模块导入并不在所有执行上下文中都可使用。例如,`import()` 可以在主线程、共享工作线程(shared worker)或专用工作线程(dedicated worker)中使用,但如果在 [service worker](/zh-CN/docs/Web/API/Service_Worker_API)[worklet](/zh-CN/docs/Web/API/Worklet) 中调用,则会抛出错误。
动态模块导入并不在所有执行上下文中都可使用。例如,`import()` 可以在主线程、共享/专用 worker 中使用,但如果在 [service worker](/zh-CN/docs/Web/API/Service_Worker_API)[worklet](/zh-CN/docs/Web/API/Worklet) 中调用,则会抛出错误。

### 模块命名空间对象

*模块命名空间对象*是一个描述模块所有导出的对象。它是一个静态对象,在模块被求值时创建。有两种方式可以访问模块的模块命名空间对象:通过[命名空间导入](/zh-CN/docs/Web/JavaScript/Reference/Statements/import#命名空间导入)`import * as name from moduleName`)或通过动态导入的 promise 兑现值。

模块命名空间对象是一个[密封](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed)的对象,它具有 [null 原型对象](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object#null_原型对象)。也就是说,对象的所有字符串键对应于模块的导出,并且永远不会有额外的键。所有键都是以字典序[可枚举的](/zh-CN/docs/Web/JavaScript/Enumerability_and_ownership_of_properties)(即 [`Array.prototype.sort()`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#描述) 的默认行为),默认导出名为 `default` 的键。此外,模块命名空间对象具有一个 [`[Symbol.toStringTag]`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toStringTag) 属性,值为 `"Module"`,在 {{jsxref("Object.prototype.toString()")}} 中被使用。

在使用 {{jsxref("Object.getOwnPropertyDescriptors()")}} 获取它们的描述符时,字符串属性是不可配置的(non-configurable)但是可写入的。然而,它们实际上是只读的,因为你不能给属性重新赋一个新的值。这些值可以由导出它们的模块重新赋值,但不能由导入它们的模块重新赋值——这种行为反映了静态导入所创建的[实时绑定](/zh-CN/docs/Web/JavaScript/Reference/Statements/import#导入的值只能由导出者修改)。属性的可写入性反映了值是可能变化的,因为不可配置和不可写入的属性必须是常量。例如,你可以重新给一个变量的导出赋值,并且可以在模块命名空间对象中观察到新的值。
在使用 {{jsxref("Object.getOwnPropertyDescriptors()")}} 获取它们的描述符时会发现,字符串属性是不可配置的和可写入的。然而它们实际上是只读的,因为你不能给属性重新赋一个新的值。这些值可以由导出它们的模块重新赋值,但不能由导入它们的模块重新赋值——这种行为反映了静态导入所创建的[实时绑定](/zh-CN/docs/Web/JavaScript/Reference/Statements/import#导入的值只能由导出者修改)。属性的可写入性反映了值是可能变化的,因为不可配置和不可写入的属性必须是常量。例如,你可以重新给一个变量的导出赋值,并且可以在模块命名空间对象中观察到新的值。

每个模块说明符对应一个唯一的模块命名空间对象,所以以下通常是正确的
每个模块标识符对应一个唯一的模块命名空间对象,所以下面的代码通常是正确的

```js
import * as mod from "/my-module.js";
Expand Down Expand Up @@ -169,9 +169,9 @@ if (typeof window === "undefined") {
}
```

### 使用非字面量说明符导入模块
### 使用非字面量标识符导入模块

动态导入允许任何表达式作为模块说明符,而不仅仅是字符串字面量。
动态导入允许任何表达式作为模块标识符,而不仅仅是字符串字面量。

这里,我们同时加载 10 个模块(如 `/modules/module-0.js``/modules/module-1.js` 等),并调用每个模块导出的 `load` 函数。

Expand Down

0 comments on commit eaf4e29

Please sign in to comment.