ES6標準發布后,module成為標準,標準的使用是以export指令導出接口,以import引入模塊,但是在我們一貫的node模塊中,我們采用的是CommonJS規范,使用require引入模塊,使用module.exports導出接口。
不把require和import整清楚,會在未來的標準編程中死的很難看。
require時代的模塊
node編程中最重要的思想之一就是模塊,而正是這個思想,讓JavaScript的大規模工程成為可能。模塊化編程在js界流行,也是基于此,隨后在瀏覽器端,requirejs和seajs之類的工具包也出現了,可以說在對應規范下,require統治了ES6之前的所有模塊化編程,即使現在,在ES6 module被完全實現之前,還是這樣。
node的module遵循CommonJS規范,requirejs遵循AMD,seajs遵循CMD,雖各有不同,但總之還是希望保持較為統一的代碼風格。
// a.js// -------- node -----------module.exports = { a : function() {}, b : 'xxx'};// ----------- AMD or CMD ----------------define(function(require, exports, module){ module.exports = { a : function() {}, b : 'xxx' };});可以看出,為了保持風格的高度統一,除了在瀏覽器端的模塊中要使用一個define函數來提供模塊的閉包以外,其他代碼可以完全一致。
// b.js// ------------ node ---------var m = require('./a');m.a();// ------------ AMD or CMD -------------define(function(require, exports, module){ var m = require('./a'); m.a();});在使用上,也非常相似。雖然AMD or CMD提供了更加豐富的風格,但是我們本文主要是討論node環境下,所以不做擴展。
ES6中的module
ES6發布的module并沒有直接采用CommonJS,甚至連require都沒有采用,也就是說require仍然只是node的一個私有的全局方法,module.exports也只是node私有的一個全局變量屬性,跟標準半毛錢關系都沒有。
export導出模塊接口
export的用法挺復雜的,具體有哪些可以看 這里 。這里舉幾個例子:
// a.jsexport default function() {}export function a () {}var b = 'xxx';export {b}; // 這是ES6的寫法,實際上就是{b:b}setTimeout(() => b = 'ooo', 1000);export var c = 100;在要導出的接口前面,加入export指令。
在export之后,b還可以被修改,這和CommonJS有著巨大不同,關于內部機理的東西,本文就無恥的省略了。
注意,下面的語法有嚴重錯誤:
// 錯誤演示export 1; // 絕對不可以var a = 100;export a;
export在導出接口的時候,必須與模塊內部的變量具有一一對應的關系。直接導出1沒有任何意義,也不可能在import的時候有一個變量與之對應。 export a 雖然看上去成立,但是 a 的值是一個數字,根本無法完成解構,因此必須寫成 export {a} 的形式。即使a被賦值為一個function,也是不允許的。而且,大部分風格都建議,模塊中最好在末尾用一個export導出所有的接口,例如:
新聞熱點
疑難解答
圖片精選