1. 程式人生 > >nodejs中require理解

nodejs中require理解

content 另一個 方式 null time 得到 程序 timeout user

引用網址:https://github.com/nswbmw/N-blog/blob/master/book/2.1%20require.md

require 用來加載一個文件的代碼,關於 require 的機制這裏不展開講解,請仔細閱讀 官方文檔。

簡單概括以下幾點:

  • require 可加載 .js、.json 和 .node 後綴的文件
  • require 的過程是同步的,所以這樣是錯誤的:
setTimeout(() => {
  module.exports = { a: ‘hello‘ }
}, 0)

require 這個文件得到的是空對象 {}

  • require 目錄的機制是:
    • 如果目錄下有 package.json 並指定了 main 字段,則用之
    • 如果不存在 package.json,則依次嘗試加載目錄下的 index.js 和 index.node
  • require 過的文件會加載到緩存,所以多次 require 同一個文件(模塊)不會重復加載
  • 判斷是否是程序的入口文件有兩種方式:
    • require.main === module(推薦)
    • module.parent === null

循環引用

循環引用(或循環依賴)簡單點來說就是 a 文件 require 了 b 文件,然後 b 文件又反過來 require 了 a 文件。我們用 a->b 代表 b require 了 a。

簡單的情況:

a->b
b->a

復雜點的情況:

a->b
b->c
c->a

循環引用並不會報錯,導致的結果是 require 的結果是空對象 {},原因是 b require 了 a,a 又去 require 了 b,此時 b 還沒初始化好,所以只能拿到初始值 {}。當產生循環引用時一般有兩種方法解決:

  1. 通過分離共用的代碼到另一個文件解決,如上面簡單的情況,可拆出共用的代碼到 c 中,如下:
c->a
c->b
  1. 不在最外層 require,在用到的地方 require,通常在函數的內部

總的來說,循環依賴的陷阱並不大容易出現,但一旦出現了,對於新手來說還真不好定位。它的存在給我們提了個醒,要時刻註意你項目的依賴關系不要過於復雜,哪天你發現一個你明明已經 exports 了的方法報 undefined is not a function

,我們就該提醒一下自己:哦,也許是它來了。

官方示例: https://nodejs.org/api/modules.html#modules_cycles

nodejs中require理解