node中 模块导入和导出的探究

我们在编写js过程中,经常会碰到 requrie和import的写法,也会看到export default,exports的写法,他们能不能混用呢,我们来探究一下

当前环境:

node版本 v9.6.1

操作系统 Mac

module

我们打印出module,结果如下
《node中 模块导入和导出的探究》
《node中 模块导入和导出的探究》

module.id 模块的识别符,通常是带有绝对路径的模块文件名。

module.filename 模块的文件名,带有绝对路径。

module.loaded 返回一个布尔值,表示模块是否已经完成加载。

module.parent 返回一个对象,表示调用该模块的模块。

module.children 返回一个数组,表示该模块要用到的其他模块。

module.exports 表示模块对外输出的值。

exports与module.exports

《node中 模块导入和导出的探究》
《node中 模块导入和导出的探究》
我们可以看到在模块中exports和module.exports 是同一个对象
就相当于,文件执行前默认执行了一下语句

let exports = module.exports;

export

var firstName = 'Michael';
var lastName = 'Jackson';
var year = 1958;

export {firstName, lastName, year};

执行结果
《node中 模块导入和导出的探究》

我们看到在node v9.6.1 版本中并不支持export,我们使用bable转译后看一下

《node中 模块导入和导出的探究》
其实使用export,编译后还是使用的exports

export default

var firstName = 'Michael';
var lastName = 'Jackson';

export default firstName;
export {lastName };

《node中 模块导入和导出的探究》

关于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。

    原文作者:jay_tian
    原文地址: https://segmentfault.com/a/1190000014305806
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞