【ES6】Module模块详解

简介: 【ES6】Module模块详解

引言:由于两个JS文件之间相互使用必须通过一个html文件作为中介。ES6添加Module模块特为两个JS文件的直接引用。

一、Module的由来


 ES6的Class只是面向对象编程的语法糖,升级了ES5的构造函数的原型链继承的写法,并没有解决模块化问题。Module 功能则是为了解决这个问题而提出的。

 历史上,JavaScript一直没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来。其他语言都有这项功能,比如Ruby的require、Python的import,甚至连CSS都有@import,但是JavaScript没有任何这方面的支持,这对于开发大型的、复杂的项目形成了巨大障碍。

 在ES6之前,社区制定了一些模块加载方案,最主要的有CommonJS和AMD两种。前者用于服务器,后者用于浏览器。ES6 在语言规格的层面上实现了模块功能,而且实现得相当简单,完全可以取代现有的CommonJS和AMD规范,成为浏览器和服务器通用的模块解决方案。

 ES6模块的设计思想是尽量静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。CommonJS和AMD模块都只能在运行时确定这些东西。比如,CommonJS模块就是对象,输人时必须查找对象属性。

let { state, exists, readFile } = require('fs');

 以上代码的实质是整体加载fs模块(即加载fs的所有方法),然后在使用时用到3个方法。这种加载称为“运行时加载”。

 ES6模块不是对象,而是通过export命令显式指定输出的代码,输人时也采用静态命令的形式。

import { stat, exists, readFile } from 'fs';

 以上代码的实质是从fs模块加载3个方法,其他方法不加载。这种加载称为"编译时加载",即ES6可以在编译时就完成模块编译,效率要比CommonJS模块的加载方式高。

 除了静态加载带来的各种好处,ES6 模块还有以下好处。

 ●不再需要UMD模块格式,将来服务器和浏览器都会支持ES6模块格式。目前,通过各种工具库其实已经做到了这一点。

 ●将来浏览器的新API可以用模块格式提供,不再需要做成全局变量或者navigator对象的属性。

 ●不再需要对象作为命名空间(比如Math对象), 未来这些功能可以通过模块提供。

二、严格模式


 因为JS的语法规则确实比较随意,在一些大型项目中不太合适,所以官方提供了严格模式,在头部加上"use strict",ES6的模块自动采用严格模式。

 严格模式主要有如下限制:

 ●变量必须声明后再使用。

 ●函数的参数不能有同名属性,否则报错。

 ●不能使用with语句。

 ●不能对只读属性赋值,否则报错。

 ●不能使用前缀0表示八进制数,否则报错。

 ●不能删除不可删除的属性,否则报错。

 ●不能删除变量 (delete prop)会报错,只能删除属性(delete gloabl [prop])。

 ●eval不会在其外层作用域引入变量。

 ●eval和arguments不能被重新赋值。

 ●arguments不会自动反映函数参数的变化。

 ●不能使用arguments.callee.

 ●不能使用arguments.caller.

 ●禁止this指向全局对象。

 ●不能使用fn.caller和fn.arguments获取函数调用的堆栈。

 ●增加了保留字(比如protected、static和interface)。

三、export命令


 模块功能主要由两个命令构成: export 和import。export 命令用于规定模块的对外接口,import命令用于输人其他模块提供的功能。

 一个模块就是一个独立的文件。该文件内部的所有变量,外部无法获取。如果希望外部能够读取模块内部的某个变量,就必须使用export关键字输出该变量。下面是一个JS文件,里面使用export命令输出了变量。

// profile.js
export var firstName ='Michael';
export var LastName = 'Jackson' ;
export var year = 1958;

 上面的代码保存了用户信息。ES6将其视为一个模块,里面用export命令对外部输出了3个变量。 export的写法,除了像上面这样,还有另外一种。

// profile.js
var firstName = 'Michael' ;
var LastName = 'Jackson' ;
var year = 1958;
export {firstName,LastName,year};

 暴露的接口,还可以设置别名。如下。

function v1() {}
function v2() {}
export {
  v1 as fun,
  v2 as ny,
  v2 as sun
};

四、import命令


 同样,import的写法如下。

import {firstname , lastname , year} from './profile';

 同样,import也可以重命名。

import {firstname as a} from './profile';

 【注意】import具有提升效果。只要不在代码块内书写,位置任意。

查看更多ES6教学文章:


1. 【ES6】let与const 详解

2. 【ES6】变量的解构赋值

3. 【ES6】字符串的拓展

4. 【ES6】正则表达式的拓展

5. 【ES6】数值的拓展

6. 【ES6】数组的拓展

7. 【ES6】函数的拓展

8. 【ES6】对象的拓展

9. 【ES6】JS第7种数据类型:Symbol

10. 【ES6】Proxy对象

11. 【ES6】JS的Set和Map数据结构

12. 【ES6】Generator函数详解

13. 【ES6】Promise对象详解

14. 【ES6】异步操作和async函数

15. 【ES6】JS类的用法class

16. 【ES6】Module模块详解

17. 【ES6】ES6编程规范 编程风格

参考文献


阮一峰 《ES6标准入门(第2版)》

相关文章
|
2月前
bisec module 应用
bisec module 应用
14 0
|
SQL API Go
保持 Modules 的兼容性(上)
保持 Modules 的兼容性
33 0
|
JSON Go API
保持 Modules 的兼容性(下)
保持 Modules 的兼容性(下)
45 0
|
前端开发
Module理解及使用
Module理解及使用
134 0
|
JavaScript
es6 Module和commonjs的区别
es6 Module和commonjs的区别
|
缓存 JavaScript 开发者
CommonJs和es6的Module的区别
CommonJs和es6的Module的区别
|
前端开发 JavaScript Shell
十七、详解 ES6 Modules
对于新人朋友来说,想要自己去搞定一个ES6开发环境并不是一件容易的事情,因为构建工具的学习本身又是一个非常大的方向,我们需要花费不少的时间才能掌握它。 好在慢慢的开始有大神提供了一些非常简单易懂,学习成本非常低的解决方案来帮助大家学习。create-react-app就是这些解决方案中,个人认为最简单易懂的一种方式。
181 0
十七、详解 ES6 Modules
|
存储 JavaScript 前端开发
聊聊CommonJS与ES6 Module的使用与区别
学了JS并且用过Node.js后,对模块化应该是有所了解和使用了,那么一定见过以下两种模块导入导出的方式
171 0
10.1 modules
import codecs       # import 就是引入别人写的模块 with codecs.open('1.txt','w') as f:     pass import zhouyuyao.
679 0