ES6之模块化导入导出

一、概述node

在js的历史上一直没有模块(module)体系,没法将一个大程序拆分红相互依赖的小文件,再用简单的方法拼装起来,这对开发大型的、复杂的项目造成了巨大障碍。浏览器

在 ES6 以前,社区制定了一些模块加载方案,最主要的有 CommonJSAMD 两种。前者用于服务器,后者用于浏览器。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};

七、介绍到此结束。

相关文章
相关标签/搜索