2

我们在编写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。


jay_tian
394 声望17 粉丝

php,前端,node