ES6语法——模块化Module

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yaocong1993/article/details/85260430

http://es6.ruanyifeng.com/阮一峰ES6

十八、Module

模块(module)体系可以将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来。

// ES6模块
import {stat,exists,readFile} from 'fs'; // 从fs模块加载3个方法,其它方法不加载

ES6模块在编译时就能确定模块的依赖关系,以及输入和输出的变量。这种加载称为“编译时加载”或者静态加载,效率更高,使静态分析成为可能,比如引入宏和类型检验功能。这也导致了没法引用ES6模块本身,因为它不是对象。

ES6模块自动采用严格模式。尤其需要注意this的限制,顶层的this指向undefined。

ES6模块通过export命令规定模块的对外接口,通过import命令输入其它模块提供的功能。

1、export命令

一个模块是一个独立的文件,该文件内部的所有变量,外部无法获取。

export用于向外输出变量、函数或类。通常export输出的变量是本来的名字,但可以使用as关键字重命名,输出多次。

// profile.js
var name='Michael Jackson';
var year=1993;

export {name as fullName,name as myName,year};

export规定的对外接口,必须与模块内部的变量建立一一对应关系,通过该接口可以取到模块内部实时的值。

export var m=1; // 写法一

var m=1; // 写法二
export {m};

var n=1; // 写法三
export {n as m};

export 1; // 报错
var m=1; // 报错,直接输出1,只是一个值,不是变量
export m;

export和import命令可以出现在模块的任何位置,只要处于模块顶层。如果处于块级作用域内,就会报错,因为没法做静态优化了。

2、import命令

使用export命令定义了模块的对外接口后,其它JS文件可以通过import命令加载这个模块,从中输入变量。

import命令接受{},指定要从其它模块导入需要的变量名,变量名必须与被导入模块对外接口的名称相同。可以用as关键字为输入的变量重命名。from指定模块文件的位置,相对路径或绝对路径,.js后缀可以省略。如果只是模块名,不带有路径,则必须有配置文件告诉JS引擎该模块的位置。

import命令具有提升效果,会提升到整个模块的头部在编译阶段执行,{}不能使用表达式和变量。

// main.js
import {fullName as name,year} from './profile.js';

import输入的变量是只读的,因为它的本质是输入接口。但如果输入的变量是一个对象,改写该变量的属性是允许的,但建议当作只读。

import {a} from './xxx.js'
a={}; // Syntax Error : 'a' is read-only;
a.foo='hello'; // 合法操作,但不要轻易修改

import会执行所加载的模块,不输入任何值。

import 'lodash';

3、export default命令

export default命令,为模块指定默认输出,只能使用一次。其实只是输出一个名字叫default的变量,后面不能跟变量声明语句。

使用import时,用户不需要知道所要加载的变量名,可以指定任意名称接收,此时import命令后面不使用{}。

// export-default.js
export default function(x,y){
  return x*y;
};
export default var a=1; // 错误
export default 42; // 正确
// import-default.js
import customName from './export-default';

4、模块的整体加载

除了指定加载某个输出值,还可以使用整体加载。用星号(*)指定一个对象,所有输出值都加载在这个对象上面。

模块整体加载所在的那个对象,应该是可以静态分析的,所以不允许运行时修改其属性。

import * as circle from './circle';

猜你喜欢

转载自blog.csdn.net/yaocong1993/article/details/85260430
今日推荐