Skip to content

Commit 20157ec

Browse files
authored
Update translation of 1-js-13-03 dynamic imports
1 parent 5edb5c9 commit 20157ec

File tree

1 file changed

+65
-21
lines changed
  • 1-js/13-modules/03-modules-dynamic-imports

1 file changed

+65
-21
lines changed
Lines changed: 65 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,98 @@
1+
# 动态导入(Dynamic import)
12

2-
# 动态导入(Dynamic imports)
3-
4-
我们在前面章节中介绍的导出和导入语句称为“静态”导入。
5-
6-
这是因为它们确实是静态的,语法非常严格。
3+
我们在前面章节中介绍的导出和导入语句称为“静态”导入。语法非常简单且严格。
74

85
首先,我们不能动态生成 `import` 的任何参数。
96

10-
模块路径必须是原始类型字符串,不能是函数调用,下面的语句不起作用
7+
模块路径必须是原始类型字符串,不能是函数调用,下面这样的 `import` 行不通
118

129
```js
13-
import ... from *!*getModuleName()*/!*; // 错误,只能是原始类型字符串
10+
import ... from *!*getModuleName()*/!*; // Error, only from "string" is allowed
1411
```
1512

1613
其次,我们无法根据条件或者在运行时导入:
1714

1815
```js
1916
if(...) {
20-
import ...; // 错误,不允许这样做
17+
import ...; // Error, not allowed!
2118
}
2219

2320
{
24-
import ...; // 错误,不能将导入放到块中
21+
import ...; // Error, we can't put import in any block
2522
}
2623
```
2724

28-
这是因为,导入/导出的目的是为代码提供主干结构。这是非常好的事情,因为这样便于分析代码结构,可以收集和打包模块,可以删除未使用的导出(tree-shaken)。这些只有在这一切都是固定的情况才能够实现
25+
这是因为 `import`/`export` 旨在提供代码结构的主干。这是非常好的事儿,因为这样便于分析代码结构,可以收集模块,可以使用特殊工具将收集的模块打包到一个文件中,可以删除未使用的导出("tree-shaken")。这些只有在 `import`/`export` 结构简单且固定的情况下才能够实现
2926

30-
但是,我们如何才能动态的按需导入模块呢
27+
但是,我们如何才能动态地按需导入模块呢
3128

32-
## import() 函数
29+
## import() 表达式
3330

34-
`import(module)` 函数可以在任何地方调用。它返回一个解析为模块对象的 promise。
31+
`import(module)` 表达式加载模块并返回一个 promise,该 promise resolve 为一个包含其所有导出的模块对象。我们可以在代码中的任意位置调用这个表达式
3532

36-
使用模式如下
33+
我们可以在代码中的任意位置动态地使用它。例如
3734

38-
```js run
39-
let modulePath = prompt("Module path?");
35+
```js
36+
let modulePath = prompt("Which module to load?");
4037

4138
import(modulePath)
4239
.then(obj => <module object>)
43-
.catch(err => <loading error, no such module?>)
40+
.catch(err => <loading error, e.g. if no such module>)
41+
```
42+
43+
或者,如果在异步函数中,我们可以使用 `let module = await import(modulePath)`
44+
45+
例如,如果我们有以下模块 `say.js`
46+
47+
```js
48+
// 📁 say.js
49+
export function hi() {
50+
alert(`Hello`);
51+
}
52+
53+
export function bye() {
54+
alert(`Bye`);
55+
}
56+
```
57+
58+
……那么,可以想像下面这样进行动态导入:
59+
60+
```js
61+
let {hi, bye} = await import('./say.js');
62+
63+
hi();
64+
bye();
65+
```
66+
67+
或者,如果 `say.js` 有默认的导出:
68+
69+
```js
70+
// 📁 say.js
71+
export default function() {
72+
alert("Module loaded (export default)!");
73+
}
4474
```
4575

46-
另外,如果在一个 async 函数里,我们可以这样使用 `let module = await import(modulePath)`
76+
……那么,为了访问它,我们可以使用模块对象的 `default` 属性:
4777

48-
就像这样:
78+
```js
79+
let obj = await import('./say.js');
80+
let say = obj.default;
81+
// or, in one line: let {default: say} = await import('./say.js');
82+
83+
say();
84+
```
85+
86+
这是一个完整的示例:
4987

5088
[codetabs src="say" current="index.html"]
5189

52-
所以,动态导入用起来很简单。
90+
```smart
91+
动态导入在常规脚本中工作时,它们不需要 `script type="module"`.
92+
```
93+
94+
```smart
95+
尽管 `import()` 看起来像一个函数调用,但它只是一种特殊语法,只是恰好使用了括号(类似于 `super()`)。
5396
54-
此外,动态导入可以像常规脚本一样工作,不需要额外指出 `script type="module"`
97+
因此,我们不能将 `import` 复制到一个变量中,或者对其使用 `call/apply`。因为它不是一个函数。
98+
```

0 commit comments

Comments
 (0)