上一篇文章講了require引入子產品,其實require有兩個功能:
1.加載檔案子產品,并執行裡面代碼
2.拿到被加載檔案子產品導出的接口對象,就是exports導出的内容
首先每個子產品中都預設有一個exports的空對象,這個對象預設輸出{}
我們定義b.js,在裡面會導出這個子產品的部分内容
var a = 'bbb'
console.log(exports)
exports.foo = 'hello'
console.log(exports)
exports.add = function(x, y) {
return x + y
}
我們定義a.js,引入并使用b.js暴漏的内容,我們可以用 obj.xx 的形式進行引用内部子產品導出内容。
var ret = require('./b')
console.log(ret)
console.log(ret.foo)
console.log(ret.add(10, 20))
執行node .\a.js 輸出如下:
這裡詳細說一下exports,其實在每個子產品内部有這麼兩行代碼:
exports = module.exports
return module.exports
在子產品最後都會傳回module.exports,而exports這個變量是對module.exports的引用。在使用exports過程中,前往别把exports的引用給改了。示例代碼中導出的對象,都是通過 . 來擷取内部子產品中的方法或者變量。如果不通過 . ,直接就把一個變量或者方法導出,直接就能用怎麼辦?那就不能用exports了,因為他會斷開引用。用module.exports=變量名/方法
function defa(x) {
return x
}
//導出單個成員,可以直接引用,不用.出來了
module.exports = defa
下面講一下require的加載規則:
1. a子產品引入b和c子產品,b子產品也引入了c子產品。多次引入了c子產品,c子產品隻會執行一次,多次引入隻是為了獲得導出的對象,後面加載時會從緩存加載。
2.require引入第三方包時怎麼查找的: