1.ES6使用export和import来导出、导入模块
2.ES6模块的设计思想是尽量的静态化,是编译是就能确定模块的依赖关系,以及输入和输出的变量
3.node的编程思想是模块化,所以每个文件就是一个模块,每个模块的内部,module变量代表当前模块,是一个对象,他的exports是对外接口,加载某个模块其实就是记在模块的module.exports属性。node用的是CommonJs规范,CommonJS用exports和require来导出、导入文件。import和require都是被模块化所使用的。
在es5中,用module.exports和exports导出模块,用require引入模块。
es6新增export和export default导出模块,import导入模块。
module.exports和exports的区别:
module和exports是node.js给每个js文件内置的2个对象。
例如:console.log('1--', module); console.log('2--', exports)
注意:module.exports和exports一开始都是一个空对象{},实际上,这两个对象指向同一块内存。这也就是说module.exports和exports是等价的(有个前提:不去改变它们指向的内存地址)。
require引入的对象本质上是module.exports。这就产生了一个问题,当 module.exports和exports指向的不是同一块内存时,exports的内容就会失效。
export和 export default的区别:
一、在es6中的两种基本用法
新建两个文件:a.js, b.js。a.js用于导出模块,b.js用户导入模块。两个文件放在同一目录下。
- 第一种用法
export default导出:
export default导出对应的导入:
- 第二种用法
export导出:
export 导出对应的导入:
二、区别
可以在a.js中打印出module,通过打印的内容找到2种导出模块的区别。
注:一般来说,module.exports和exports与require对应。也就是用module.exports和exports导出的模块,则用require导入。(不是绝对,如果代码支持es6,也可以用import引入)。
import和require的区别
遵循的不同:
1.import是ES6的一个语法标准
(若要兼容所有的浏览器必须转化为ES5语法)
2.require遵循AMD规范引入方式
调用时间不同:
1.require是运行时调用,所以理论上可用于代码的任何地方
2.import是编译时调用,必须放在文件的开头
(import有提升效果,会提升到整个模块的头部,首先执行,他是静态执行的,不能使用表达式和变量即在运行时才能拿到结果的语法结构)
本质不同:
1.require是赋值过程,例如:const path=require('path');
2.import是结构过程,在node中用babel支持es6,把es6转化为es5,import语法会被转化成require
require和exports
都遵循CommonJs/AMD,只在运行时确定依赖关系及输入输出的变量,无法进行静态化
用法:
const fs=require(‘fs’);
exports.fs=fs;
module.exports=fs;
import/export
遵循ES6规范,支持编译时静态分析,是module的2个命令。
写法多样:
import fs from 'fs';
import {default as fs } from 'fs';
import * as fs from 'fs';
import {readFile } from 'fs';
import {readFile as read } from "fs";
import fs,{readFile} from 'fs';
export default fs;
export const fs;
export function add(){};
export {readFile,read} from 'fs';
export * from 'fs';