在 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};