一、概述node
在js的历史上一直没有模块(module)体系,没法将一个大程序拆分红相互依赖的小文件,再用简单的方法拼装起来,这对开发大型的、复杂的项目造成了巨大障碍。浏览器
在 ES6 以前,社区制定了一些模块加载方案,最主要的有 CommonJS 和 AMD 两种。前者用于服务器,后者用于浏览器。ES6 在语言标准的层面上,实现了模块功能,服务器
并且实现得至关简单,彻底能够取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案。函数
二、ES6 模块(module)的设计思想是什么?优化
那就是尽可能的静态化,使得编译时就能肯定依赖关系ui
三、CommonJS模块 和 ES6 模块比较spa
看两段代码设计
// 导出 node 文件系统的几个方法
let {stat,exists,readFile} = require('fs');
注意:这段代码其实是加载了整个 fs 模块。这种加载方式称为“运行时加载”,由于只有运行时才能获得这个对象。致使彻底没办法在编译时作“静态优化”。
// ES6 模块
import {stat,exists,readFile} from 'fs'
注意:这段代码只导出了三个方法,其余的方法没有加载。这种方式称为“编译时加载”,ES6能够在编译时就完成模块加载,效率要比CommonJS模块的加载方式高。
四、模块功能命令之 export 和 import。code
模块功能主要有两个命令构成:export 和 import。 export 命令用于规定模块的对外接口,import命令用于输入其余模块提供的功能。对象
一个js文件就是一个模块,该文件内部的全部变量,外部没法获取,若是你但愿外部可以读取模块内部某个变量,就必须使用export关键字输出该变量。
输出变量:
//eg:对外部输出三个变量----》声明后输出
// js 文件内部
export var name = 'zjl'
export var age = 18
export var gender = '男'
// eg:对外输出三个变量-----》先声明再输出 优先使用这种写法
var name = 'zjl'
var age = 18
var gender = '男'
export {name,age,gender}
输出函数:
export function test(x,y){ return x*y; }
export 输出的变量或函数都有本身的名字,咱们也能够重命名:
function test(){...} function test2(){....} function test3(){...} export {test as fun1,test2 as fun2,test3 as fun3}
注意:export 命令规定的是对外接口,接口名与模块内部变量之间,必须与模块的变量创建一一对应关系。(有种键值对的意思),
简单来讲导出的变量他必须有一个值。
export 语句不能放在代码块内,如函数内,不然会报错。由于此作法使其没法作到静态化,违背了 ES6 模块的设计理念。
import 命令
经过 export 定义了模块的接口以后,咱们能够经过import 命令加载这个模块。
载入模块方式:
// 大括号内的变量名,必须跟 export 对外接口的变量名一致 import {name,age,gender} from './XXX.js'
// 重命名
iport {name as username};
注意几个 import 关键点
①import 导入的值都是只读的,不容许修改输入的接口。
②能够修改导入的对象 ,能够修改导入对象的属性,但不推荐这样作,建议把导入的变量(不论是普通变量仍是对象)都当作只读的。
③import.....from 中 from 后面的路径能够是绝路径也能够是相对路径。
④js模块导入时能够省略后面 的 .js后缀。
⑤import 命令具备提高效果,它会把import命令提高到模块的头部,首先执行。
⑥执行同一个import命令屡次,默认只会执行一次,不会执行屡次
import {name} from './XXX.js' import {name} from './XXX.js' //只会执行一次
⑦从同一个模块经过多条import加载不一样变量,但它们对应的是同一个模块实例。import语句是 单例模式(Singleton)
import {name} from './a.js' import {age} from 'a.js' // 单例模式
⑧不推荐 import 和 require 在同一个模块使用,由于他们的执行时期不同,致使的结果可能就不同。
目前在模块中使用 require 还须要 Babel 转换比较麻烦。
⑨总体加载模块
import * as user from './a.js' // 导出 a 模块的全部值并命名为 user(一个对象)
五、模块功能命令之 export default
咱们经过前面了解到 import 导入 export 对外接口 须要知道对外接口的准确名称,才能拿到对应的值,这样是比较麻烦的。为此ES6还提供了 export default 命令,
使用 export default 导出的值,import导入能够为这个导出值自定义名称。
// 导出模块 a.js,导出一个匿名函数 export default function (){...} //导入模块 b.js, import fun from './a.js'; // fun还能够为其余合法的名称
默认输出(export default)注意点:
①export default 只能使用一次,export可使用屡次
②后面不能跟变量声明语句
export default var a=10; // 写法错误
③export default a 的含义就是jiang将变量 a 的值赋给变量 default,因此上面那种写法是错误的。
④ export 导出必定要指定对外接口 而 export default 不须要。
⑤export 和 export default 能一块儿使用。
六、export 和 import 的复合写法。
export {name,age} from 'a.js' // 这种写法至关于转发了这两个接口,没有实际导入当前模块,当前模块不能直接使用这两个变量。 // 能够写成两句,实际导入当前模块 import {name,age} from 'a.js' export {name,age};
七、介绍到此结束。