每一個文件就是一個模塊。文件內定義的變量、函數等等都是在本身的做用域內,都是自身所私有的,對其它文件不可見。javascript
每一個文件內部都有一個module
對象,它包含如下屬性html
id
: 模塊的識別符,一般是帶有絕對路徑的模塊文件名filename
:模塊的文件名,帶有絕對路徑loaded
:返回一個布爾值,表示模塊是否已經完成加載parent
:返回一個對象,表示調用該模塊的模塊children
:返回一個數組,表示該模塊要用到的其餘模塊exports
:表示模塊對外輸出的值在module
中有一個屬性exports
,即:module.exports
。它是該模塊對外的輸出值,是一個對象。其它模塊在加載該模塊時,實際上加載到的數據都是由它提供的。java
module.exports
輸出的能夠是一個對象,也能夠是一個函數。在引用該模塊的文件內,若是接受到的是對象,能夠直接訪問其中的屬性,若是接受到的是一個函數,也能夠直接執行。node
exports
是一個特殊的存在,它是對module.exports
的指向,能夠經過向exports
對象中添加變量、方法等,可是不能直接將exports
指向一個值,這樣會切斷exports
和module.exports
之間的聯繫。es6
export
和module.exports
的使用有一點須要注意,若是導出的是一個函數,只能使用module.exports
。數組
export
用於規定模塊的對外接口,能夠輸出變量、函數或類。export
規定的對外接口必須與模塊內部的變量創建一一對應關係。函數
// 方式一 export 1; // 報錯 // 方式二 var a = 1; export a; // 報錯 // 方式三 function fn() {} export fn; // 報錯
// 方式一 export var a = 1; // 方式二 var a = 1; export {a}; // 方式三 var a = 1; export {a as a1}; // 對a重命名輸出 // 方式四 export function fn() {}; // 方式五 function fn() {} export {fn};
export default
和export
的區別:ui
export
時,輸出的內容和接收時用的變量名稱必須一致,不然沒法加載;使用export default
,則爲模塊指定默認輸出,同時,能夠爲接收到的變量指定其它名稱export
輸出的變量或者函數,在import
時,須要使用大括號;使用export default
則不用import
和export
配對使用,用於加載接收export
輸入的內容code
require
用於加載模塊文件,默認加載的文件後綴名爲.js
htm
/
開頭,則表示加載的是一個絕對路徑./
或../
開頭,則表示加載的是一個相對當前位置的路徑node_modules
下尋找module
、module.exports
、exports
採用的是CommonJS模塊規範。export
和export default
採用的是ES6模塊規範。
module.exports
輸出的是值的拷貝;export
是值的引用module.exports
在運行時加載;export
是在編譯時輸出// addA.js var a = 1; function addA() { a++; } module.exports = { a: a, addA: addA }; // use addA var addA = require('./addA.js'); console.log(addA.a); // 1 addA.addA(); console.log(addA.a); // 1 /************ 改善後 *********************/ // addA.js var a = 1; function addA() { a++; } module.exports = { get a() { return a; }, addA: addA };
// addA.js export.a = 1; export.addA = function() { a++; } // use addA import {a, addA} from './addA'; console.log(a);// 1 addA(); console.log(a);// 2