在 Node.JS中
1、Node.js 提供了 exports 和 require 两个对象,其中 exports 是模块公开的接口, require 用于从外部获取一个模块的接口,即所获取模块的 exports 对象。require是“运行时加载”,加载模块得到对应的对象。
2、require 不会重复加载模块,也就是说无论调用多少次 require, 获得的模块都是同一个(实例)。Node.js 与 ES6 模块输出的都是值的引用。
require获取模块的接口与其对应的值是动态绑定关系, 即通过该接口, 可以取到模块内部实时的值。
3、exports.Hello表示通过 exports 对象把 Hello 类 export,将exports.Hello指向了 Hello, 然后 在其他文件中需要通过 require('./singleobject').Hello 来获取 Hello 对象,因为require('./singleobject')就获得singleobject模块的exports对象。而exports.Hello指向了Hello。所以require('./singleobject').Hello 能够获取Hello对象。
//singleobject.js
function Hello() {
var name;
this.setName = function (thyName) {
name = thyName;
};
this.sayHello = function () {
console.log('Hello ' + name);
};
};
exports.Hello = Hello;
4、module.exports = Hello; 直接将 exports对象指向Hello,那么require('./hello')就直接获得了Hello对象。
//hello.js
function Hello() {
var name;
this.setName = function(thyName) {
name = thyName;
};
this.sayHello = function() {
console.log('Hello ' + name);
};
};
module.exports = Hello;
//gethello.js
var Hello = require('./hello');
hello = new Hello();
hello.setName('BYVoid');
hello.sayHello();
不可以通过对 exports 直接赋值代替对 module.exports 赋值。
exports 实际上只是一个和 module.exports 指向同一个对象的变量,
它本身会在模块执行结束后释放,但 module 不会,因此只能通过指定
module.exports 来改变访问接口。
参考:Node.js开发指南
在 ES 6中,
1、模块不是对象。加载模块是“编译时加载”或者静态加载, 即 ES6 可以在编译时就完成模块加载。
2、export 命令用于规定模块的对外接口, import 命令用于输入其他模块提供的功能。
3、export 命令除了输出变量, 还可以输出函数或类
4、export 命令规定的是对外的接口, 接口名必须与模块内部的变量建立一一对应关系
// 报错
var m = 1 ;
export m;
通过变量 m , 还是直接输出1。1 只是一个值, 不是接口。 正确的写法:
// 写法二
var m = 1 ;
export {m};