天天看點

nodejs(四)require與exports

上一篇文章講了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 輸出如下:

nodejs(四)require與exports

這裡詳細說一下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引入第三方包時怎麼查找的: