Skip to content

Commit 2da8eac

Browse files
committed
docs(module): edit import()
1 parent e5c9cca commit 2da8eac

File tree

4 files changed

+137
-23
lines changed

4 files changed

+137
-23
lines changed

docs/function.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1567,7 +1567,7 @@ clownsEverywhere(
15671567

15681568
上面代码中,如果在`param2``bar`后面加一个逗号,就会报错。
15691569

1570-
这样的话,如果以后修改代码,想为函数`clownsEverywhere`添加第三个参数,就势必要在第二个参数后面添加一个逗号。这对版本管理系统来说,就会显示添加逗号的那一行也发生了变动。这看上去有点冗余,因此新的语法允许定义和调用时,尾部直接有一个逗号。这与数组和对象的尾逗号规则,保持一致了
1570+
如果像上面这样,将参数写成多行(即每个参数占据一行),以后修改代码的时候,想为函数`clownsEverywhere`添加第三个参数,或者调整参数的次序,就势必要在原来最后一个参数后面添加一个逗号。这对于版本管理系统来说,就会显示添加逗号的那一行也发生了变动。这看上去有点冗余,因此新的语法允许定义和调用时,尾部直接有一个逗号。
15711571

15721572
```javascript
15731573
function clownsEverywhere(
@@ -1581,3 +1581,5 @@ clownsEverywhere(
15811581
);
15821582
```
15831583

1584+
这样的规定也使得,函数参数与数组和对象的尾逗号规则,保持一致了。
1585+

docs/intro.md

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,54 @@
11
# ECMAScript 6简介
22

3-
ECMAScript 6.0(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了。它的目标,是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言。
3+
ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在2015年6月正式发布了。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。
44

5-
## ECMAScript和JavaScript的关系
5+
## ECMAScript 和 JavaScript 的关系
66

7-
一个常见的问题是,ECMAScript和JavaScript到底是什么关系
7+
一个常见的问题是,ECMAScript 和 JavaScript 到底是什么关系
88

9-
要讲清楚这个问题,需要回顾历史。1996年11月,JavaScript的创造者Netscape公司,决定将JavaScript提交给国际标准化组织ECMA,希望这种语言能够成为国际标准。次年,ECMA发布262号标准文件(ECMA-262)的第一版,规定了浏览器脚本语言的标准,并将这种语言称为ECMAScript,这个版本就是1.0版。
9+
要讲清楚这个问题,需要回顾历史。1996年11月,JavaScript 的创造者 Netscape 公司,决定将 JavaScript 提交给国际标准化组织ECMA,希望这种语言能够成为国际标准。次年,ECMA 发布262号标准文件(ECMA-262)的第一版,规定了浏览器脚本语言的标准,并将这种语言称为 ECMAScript,这个版本就是1.0版。
1010

11-
该标准从一开始就是针对JavaScript语言制定的,但是之所以不叫JavaScript,有两个原因。一是商标,Java是Sun公司的商标,根据授权协议,只有Netscape公司可以合法地使用JavaScript这个名字,且JavaScript本身也已经被Netscape公司注册为商标。二是想体现这门语言的制定者是ECMA,不是Netscape,这样有利于保证这门语言的开放性和中立性。
11+
该标准从一开始就是针对 JavaScript 语言制定的,但是之所以不叫 JavaScript,有两个原因。一是商标,Java 是 Sun 公司的商标,根据授权协议,只有 Netscape 公司可以合法地使用 JavaScript 这个名字,且 JavaScript 本身也已经被 Netscape 公司注册为商标。二是想体现这门语言的制定者是 ECMA,不是 Netscape,这样有利于保证这门语言的开放性和中立性。
1212

13-
因此,ECMAScript和JavaScript的关系是,前者是后者的规格,后者是前者的一种实现(另外的ECMAScript方言还有Jscript和ActionScript)。日常场合,这两个词是可以互换的。
13+
因此,ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一种实现(另外的 ECMAScript 方言还有 Jscript 和 ActionScript)。日常场合,这两个词是可以互换的。
1414

15-
## ES6与ECMAScript 2015的关系
15+
## ES6 与 ECMAScript 2015 的关系
1616

17-
媒体里面经常可以看到”ECMAScript 2015这个词,它与ES6是什么关系呢
17+
ECMAScript 2015(简称 ES2015)这个词,也是经常可以看到的。它与 ES6 是什么关系呢
1818

19-
2011年,ECMAScript 5.1版发布后,就开始制定6.0版了。因此,ES6这个词的原意,就是指JavaScript语言的下一个版本
19+
2011年,ECMAScript 5.1版发布后,就开始制定6.0版了。因此,ES6 这个词的原意,就是指 JavaScript 语言的下一个版本
2020

2121
但是,因为这个版本引入的语法功能太多,而且制定过程当中,还有很多组织和个人不断提交新功能。事情很快就变得清楚了,不可能在一个版本里面包括所有将要引入的功能。常规的做法是先发布6.0版,过一段时间再发6.1版,然后是6.2版、6.3版等等。
2222

2323
但是,标准的制定者不想这样做。他们想让标准的升级成为常规流程:任何人在任何时候,都可以向标准委员会提交新语法的提案,然后标准委员会每个月开一次会,评估这些提案是否可以接受,需要哪些改进。如果经过多次会议以后,一个提案足够成熟了,就可以正式进入标准了。这就是说,标准的版本升级成为了一个不断滚动的流程,每个月都会有变动。
2424

2525
标准委员会最终决定,标准在每年的6月份正式发布一次,作为当年的正式版本。接下来的时间,就在这个版本的基础上做改动,直到下一年的6月份,草案就自然变成了新一年的版本。这样一来,就不需要以前的版本号了,只要用年份标记就可以了。
2626

27-
ES6的第一个版本,就这样在2015年6月发布了,正式名称就是《ECMAScript 2015标准》(简称ES2015)。2016年6月,小幅修订的《ECMAScript 2016标准》(简称ES2016)如期发布,这个版本可以看作是ES6.1版,因为两者的差异非常小(只新增了数组实例的`includes`方法和指数运算符),基本上是同一个标准。根据计划,2017年6月将发布ES2017标准
27+
ES6 的第一个版本,就这样在2015年6月发布了,正式名称就是《ECMAScript 2015标准》(简称 ES2015)。2016年6月,小幅修订的《ECMAScript 2016标准》(简称 ES2016)如期发布,这个版本可以看作是 ES6.1 版,因为两者的差异非常小(只新增了数组实例的`includes`方法和指数运算符),基本上是同一个标准。根据计划,2017年6月发布 ES2017 标准
2828

29-
因此,ES6既是一个历史名词,也是一个泛指,含义是5.1版以后的JavaScript的下一代标准,涵盖了ES2015、ES2016、ES2017等等,而ES2015则是正式名称,特指该年发布的正式版本的语言标准。本书中提到ES6的地方,一般是指ES2015标准,但有时也是泛指“下一代JavaScript语言”。
29+
因此,ES6 既是一个历史名词,也是一个泛指,含义是5.1版以后的 JavaScript 的下一代标准,涵盖了ES2015、ES2016、ES2017等等,而ES2015 则是正式名称,特指该年发布的正式版本的语言标准。本书中提到 ES6 的地方,一般是指 ES2015 标准,但有时也是泛指“下一代 JavaScript 语言”。
3030

3131
## 语法提案的批准流程
3232

33-
任何人都可以向TC39标准委员会提案。一种新的语法从提案到变成正式标准,需要经历五个阶段。每个阶段的变动都需要由TC39委员会批准。
33+
任何人都可以向标准委员会(又称 TC39 委员会)提案,要求修改语言标准。
34+
35+
一种新的语法从提案到变成正式标准,需要经历五个阶段。每个阶段的变动都需要由 TC39 委员会批准。
3436

3537
- Stage 0 - Strawman(展示阶段)
3638
- Stage 1 - Proposal(征求意见阶段)
3739
- Stage 2 - Draft(草案阶段)
3840
- Stage 3 - Candidate(候选人阶段)
3941
- Stage 4 - Finished(定案阶段)
4042

41-
一个提案只要能进入Stage 2,就差不多等于肯定会包括在以后的正式标准里面。ECMAScript当前的所有提案,可以在TC39的官方网站[Github.com/tc39/ecma262](https://github.com/tc39/ecma262)查看。
43+
一个提案只要能进入 Stage 2,就差不多肯定会包括在以后的正式标准里面。ECMAScript 当前的所有提案,可以在 TC39 的官方网站[Github.com/tc39/ecma262](https://github.com/tc39/ecma262)查看。
4244

43-
本书的写作目标之一,是跟踪ECMAScript语言的最新进展,介绍5.1版本以后所有的新语法。对于那些明确将要列入标准的新语法,尤其是那些Babel转码器(详见后文)已经支持的功能,也将予以介绍
45+
本书的写作目标之一,是跟踪 ECMAScript 语言的最新进展,介绍5.1版本以后所有的新语法。对于那些明确或很有希望,将要列入标准的新语法,都将予以介绍
4446

45-
## ECMAScript的历史
47+
## ECMAScript 的历史
4648

47-
ES6从开始制定到最后发布,整整用了15年。
49+
ES6 从开始制定到最后发布,整整用了15年。
4850

49-
前面提到,ECMAScript 1.0是1997年发布的,接下来的两年,连续发布了ECMAScript 2.0(1998年6月)和ECMAScript 3.0(1999年12月)。3.0版是一个巨大的成功,在业界得到广泛支持,成为通行标准,奠定了JavaScript语言的基本语法,以后的版本完全继承。直到今天,初学者一开始学习JavaScript,其实就是在学3.0版的语法。
51+
前面提到,ECMAScript 1.0是1997年发布的,接下来的两年,连续发布了 ECMAScript 2.0(1998年6月)和 ECMAScript 3.0(1999年12月)。3.0版是一个巨大的成功,在业界得到广泛支持,成为通行标准,奠定了 JavaScript 语言的基本语法,以后的版本完全继承。直到今天,初学者一开始学习 JavaScript,其实就是在学3.0版的语法。
5052

5153
2000年,ECMAScript 4.0开始酝酿。这个版本最后没有通过,但是它的大部分内容被ES6继承了。因此,ES6制定的起点其实是2000年。
5254

docs/module.md

Lines changed: 113 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -622,7 +622,9 @@ import {db, users} from './constants';
622622

623623
## import()
624624

625-
上面说过了,`import`语句会被JavaScript引擎静态分析,先于模块内的其他模块执行(叫做”连接“更合适)。所以,下面的代码会报错。
625+
### 简介
626+
627+
前面介绍过,`import`命令会被 JavaScript 引擎静态分析,先于模块内的其他模块执行(叫做”连接“更合适)。所以,下面的代码会报错。
626628

627629
```javascript
628630
// 报错
@@ -631,9 +633,9 @@ if (x === 2) {
631633
}
632634
```
633635

634-
上面代码中,引擎处理`import`语句是在执行之前,所以`import`语句放在`if`代码块之中毫无意义,因此会报句法错误,而不是执行时错误。
636+
上面代码中,引擎处理`import`语句是在编译时,这时不会去分析或执行`if`语句,所以`import`语句放在`if`代码块之中毫无意义,因此会报句法错误,而不是执行时错误。也就是说,`import``export`命令只能在模块的顶层,不能在代码块之中(比如,在`if`代码块之中,或在函数之中)
635637

636-
这样的设计,固然有利于编译器提高效率,但也导致无法在运行时加载模块。从长远来看,`import`语句会取代 Node 的`require`方法,但是`require`是运行时加载模块,`import`语句显然无法取代这种动态加载功能
638+
这样的设计,固然有利于编译器提高效率,但也导致无法在运行时加载模块。从语法上,条件加载就不可能实现。如果`import`命令要取代 Node 的`require`方法,这就形成了一个障碍。因为`require`是运行时加载模块,`import`命令无法取代`require`的动态加载功能
637639

638640
```javascript
639641
const path = './' + fileName;
@@ -648,7 +650,7 @@ const myModual = require(path);
648650
import(specifier)
649651
```
650652

651-
上面代码中,`import`函数的参数`specifier`,指定所要加载的模块的位置。`import`语句能够接受什么参数`import()`函数就能接受什么参数,两者区别主要是后者为动态加载。
653+
上面代码中,`import`函数的参数`specifier`,指定所要加载的模块的位置。`import`命令能够接受什么参数`import()`函数就能接受什么参数,两者区别主要是后者为动态加载。
652654

653655
`import()`返回一个 Promise 对象。下面是一个例子。
654656

@@ -668,3 +670,110 @@ import(`./section-modules/${someVariable}.js`)
668670

669671
`import()`类似于 Node 的`require`方法,区别主要是前者是异步加载,后者是同步加载。
670672

673+
### 适用场合
674+
675+
下面是`import()`的一些适用场合。
676+
677+
(1)按需加载。
678+
679+
`import()`可以在需要的时候,再加载某个模块。
680+
681+
```javascript
682+
button.addEventListener('click', event => {
683+
import('./dialogBox.js')
684+
.then(dialogBox => {
685+
dialogBox.open();
686+
})
687+
.catch(error => {
688+
/* Error handling */
689+
})
690+
});
691+
```
692+
693+
上面代码中,`import()`方法放在`click`事件的监听函数之中,只有用户点击了按钮,才会加载这个模块。
694+
695+
(2)条件加载
696+
697+
`import()`可以放在`if`代码块,根据不同的情况,加载不同的模块。
698+
699+
```javascript
700+
if (condition) {
701+
import('moduleA').then(...);
702+
} else {
703+
import('moduleB').then(...);
704+
}
705+
```
706+
707+
上面代码中,如果满足条件,就加载模块 A,否则加载模块 B。
708+
709+
(3)动态的模块路径
710+
711+
`import()`允许模块路径动态生成。
712+
713+
```javascript
714+
import(f())
715+
.then(...);
716+
```
717+
718+
上面代码中,根据函数`f`的返回结果,加载不同的模块。
719+
720+
### 注意点
721+
722+
`import()`加载模块成功以后,这个模块会作为一个对象,当作`then`方法的参数。因此,可以使用对象解构赋值的语法,获取输出接口。
723+
724+
```javascript
725+
import('./myModule.js')
726+
.then(({export1, export2}) => {
727+
// ...·
728+
});
729+
```
730+
731+
上面代码中,`export1``export2`都是`myModule.js`的输出接口,可以解构获得。
732+
733+
如果模块有`default`输出接口,可以用参数直接获得。
734+
735+
```javascript
736+
import('./myModule.js')
737+
.then(myModule => {
738+
console.log(myModule.default);
739+
});
740+
```
741+
742+
上面的代码也可以使用具名输入的形式。
743+
744+
```javascript
745+
import('./myModule.js')
746+
.then(({default: theDefault}) => {
747+
console.log(theDefault);
748+
});
749+
```
750+
751+
如果想同时加载多个模块,可以采用下面的写法。
752+
753+
```javascript
754+
Promise.all([
755+
import('./module1.js'),
756+
import('./module2.js'),
757+
import('./module3.js'),
758+
])
759+
.then(([module1, module2, module3]) => {
760+
···
761+
});
762+
```
763+
764+
`import()`也可以用在 async 函数之中。
765+
766+
```javascript
767+
async function main() {
768+
const myModule = await import('./myModule.js');
769+
const {export1, export2} = await import('./myModule.js');
770+
const [module1, module2, module3] =
771+
await Promise.all([
772+
import('./module1.js'),
773+
import('./module2.js'),
774+
import('./module3.js'),
775+
]);
776+
}
777+
main();
778+
```
779+

docs/reference.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@
116116
- Jason Orendorff, [ES6 In Depth: Collections](https://hacks.mozilla.org/2015/06/es6-in-depth-collections/):Set和Map结构的设计思想
117117
- Axel Rauschmayer, [Converting ES6 Maps to and from JSON](http://www.2ality.com/2015/08/es6-map-json.html): 如何将Map与其他数据结构互相转换
118118

119-
## Proxy和Reflect
119+
## Proxy 和 Reflect
120120

121121
- Nicholas C. Zakas, [Creating defensive objects with ES6 proxies](http://www.nczonline.net/blog/2014/04/22/creating-defensive-objects-with-es6-proxies/)
122122
- Axel Rauschmayer, [Meta programming with ECMAScript 6 proxies](http://www.2ality.com/2014/12/es6-proxies.html): Proxy详解
@@ -211,6 +211,7 @@
211211
- ESDiscuss, [Why is "export default var a = 1;" invalid syntax?](https://esdiscuss.org/topic/why-is-export-default-var-a-1-invalid-syntax)
212212
- Bradley Meck, [ES6 Module Interoperability](https://github.com/nodejs/node-eps/blob/master/002-es6-modules.md): 介绍 Node 如何处理 ES6 语法加载 CommonJS 模块
213213
- Axel Rauschmayer, [Making transpiled ES modules more spec-compliant](http://www.2ality.com/2017/01/babel-esm-spec-mode.html): ES6 模块编译成 CommonJS 模块的详细介绍
214+
- Axel Rauschmayer, [ES proposal: import() – dynamically importing ES modules](http://www.2ality.com/2017/01/import-operator.html): import() 的用法
214215

215216
## 二进制数组
216217

0 commit comments

Comments
 (0)