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

本文详细解析了JavaScript中的模块导出与导入机制,包括exports、module.exports、require及import等关键字的区别与联系,并通过实例展示了不同版本Node.js环境下模块的使用方式。

我们在编写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转译后看一下

clipboard.png
其实使用export,编译后还是使用的exports

export default

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

export default firstName;
export {lastName };

clipboard.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值