在平常开发中,HMS常常会遇到如下这些语句es6
import {xxx, xxxx} from 'xxx' import xxx from 'xxx' import('../xxx') let xxx = 'x'; export {xxx} export class xxx {} export default {} exports.post() module.exports.init = init;
那么问题来了,这些import
和export
语句表示什么意思?有什么区别呢?浏览器
import
和export
是ES6模块中的两个命令。服务器
ES6模块功能主要有两个命令构成:export
和import
。export
命令用于规定模块的对外接口,import
命令用于输入其余模块提供的功能。异步
在ES6前,模块加载最主要的有 CommonJS 和 AMD两种。前者用于服务器,后者用于浏览器。
ES6 模块的设计思想是尽可能的静态化,使得编译时就能肯定模块的依赖关系,以及输入和输出的变量。函数
export
命令用于规定模块的对外接口。即输出模块内部变量(方法、类)。post
// 1. 直接输出变量(方法、类) export var m = 1; export function multiply(x, y) { return x * y; }; // 2. 使用大括号指定所要输出的一组变量(方法、类) var m = 1; export { m }; // 3. as关键字重命名 // 重命名后,v2能够用不一样的名字输出两次 function v1() { ... } function v2() { ... } export { v1 as streamV1, v2 as streamV2, v2 as streamLatestVersion };
export
语句输出的接口,与其对应的值是动态绑定关系,即经过该接口,能够取到模块内部实时的值。export
命令能够出如今模块的任何位置,只要处于模块顶层就能够。使用export
命令定义了模块的对外接口之后,其余 JS 文件就能够经过import
命令加载这个模块。 import
命令接受一对大括号,里面指定要从其余模块导入的变量名。大括号里面的变量名,必须与被导入模块对外接口的名称相同。ui
// 1. 引入变量(方法、类)-(逐一加载) import { firstName, lastName, year } from './profile.js'; // 2. as关键字重命名 import { lastName as surname } from './profile.js'; // 3. 总体加载 import * as circle from './circle';
import
命令提高至顶部先执行(编译阶段执行)import
命令静态执行,不能使用表达式和变量import
命令,只会执行一次export default
就是输出一个叫作default
的变量或方法,系统容许自定义命名设计
// 默认输出一个函数 export default function () { console.log('foo'); } // 引用并指定名字 import customName from './export-default';
export default
命令的本质是将后面的值,赋给default
变量,因此能够直接将一个值写在export default
以后code
为了实如今运行中加载模块,引入了import()
函数,实现了动态加载。对象
import('./myModule.js') .then(({export1, export2}) => { // ... });
import()
和import
主要区别为前者是动态加载。 import()
返回一个Promise
对象,import()
加载模块成功之后,这个模块会做为一个对象,看成then方法的参数。 import()
相似于Node的require
方法,区别主要是前者是异步加载,后者是同步加载 import()
一般用于按需加载、条件加载、动态的模块路径
// 1. // 引入模块的某些变量(方法、类),配合四、5使用 import {xxx, xxxx} from 'xxx' // 2. // 引入模块的默认变量(方法、类),配合6使用 import xxx from 'xxx' // 3. // 实现动态加载,适用于按需加载等 import('../xxx') // 4. // 输出模块的变量(方法、类),对应引入方法为1 let xxx = 'x'; export {xxx} // 5. // 输出模块的变量(方法、类),对应引入方法为1 export class xxx {} // 6. // 输出模块默认的变量(方法、类),对应引入方法为2 export default {} // 7. // 待更新 exports.post() // 8. // 待更新 module.exports.init = init;