我们在编写js过程中,经常会碰到 requrie和import的写法,也会看到export default,exports的写法,他们能不能混用呢,我们来探究一下
当前环境:
node版本 v9.6.1
操作系统 Mac
module
我们打印出module,结果如下
module.id 模块的识别符,通常是带有绝对路径的模块文件名。
module.filename 模块的文件名,带有绝对路径。
module.loaded 返回一个布尔值,表示模块是否已经完成加载。
module.parent 返回一个对象,表示调用该模块的模块。
module.children 返回一个数组,表示该模块要用到的其他模块。
module.exports 表示模块对外输出的值。
exports与module.exports
我们可以看到在模块中exports和module.exports 是同一个对象
就相当于,文件执行前默认执行了一下语句
let exports = module.exports;
export
var firstName = 'Michael';
var lastName = 'Jackson';
var year = 1958;
export {firstName, lastName, year};
执行结果
我们看到在node v9.6.1 版本中并不支持export,我们使用bable转译后看一下
其实使用export,编译后还是使用的exports
export default
var firstName = 'Michael';
var lastName = 'Jackson';
export default firstName;
export {lastName };
关于node中模块导出结论
所以node中导出模块只会用到了module.exports,其他语法都只是一些包装而已
require
当modle.js为exports的形式时
module.js
var firstName = 'Michael';
var lastName = 'Jackson';
exports.default = firstName;
exports.lastName = lastName;
index.js
const test4 = require('./modle');
console.log(test4);
结果
{ default: 'Michael', lastName: 'Jackson' }
当modle.js为export的形式时
module.js
var firstName = 'Michael';
var lastName = 'Jackson';
export default firstName;
export lastName = lastName;
index.js
const test4 = require('./modle');
console.log(test4);
结果:
{ default: 'Michael', lastName: 'Jackson' }
结论
require接受到的是module.exports对象
当你使用export default firstName时,转化成了exports.default = firstName;
所以无论你使用什么样的形式导出模块,对于require来说都是一样的
import
当modle.js为export的形式时
var firstName = 'Michael';
var lastName = 'Jackson';
export default firstName;
export { lastName };
index.js
import test6 from './module';
console.log(test6);
结果
Michael
这里就和require不一样了,import默认导出的是 export default
index.js
import * as test6 from './module';
console.log(test6);
结果:
{ default: 'Michael', lastName: 'Jackson' }
这时候导出的结果才和require一致
当import test6 from './module'是,默认会查找default,假如没有export default那么 test6为undefined,那么要导出lastName就得使用
import { lastName } from './module';
当modle.js为exports的形式时
var lastName = 'Jackson';
var firstName = 'Michael';
exports = { lastName , firstName };
index.js
import test7 from './module';
console.log(test7);
结果
{ firstName: 'Michael', lastName: 'Jackson' }
结论
导出模块可以使用 export和exports,引入模块可以使用 import和require,但两两可以交叉使用,
import/export 最终都是编译为 require/exports 来执行的
只是export 会有一个default的不同,但一般来说export对应import,exports对应require。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。