[Node.js]node中的require究竟是怎樣工做的

##關於require 但凡使用過node.js/io.js,一定都會用到require這個函數來引用其它模塊(本身寫的或他人的)。但不少人(包括本人)都沒有把node中關於require(在文檔中modules這一部份)介紹認真看過一遍。node


這裏先介紹一下你們可能都已熟知的狀況:npm

文件加載

node中在使用require加載文件時,會嘗試在引用文件名不存在的狀況下,依次加上.js、.node.json這三個後綴名來試錯。注意,這裏指的是引用文件名對應文件不存在的狀況下。
例如,當你在代碼中使用require('./hello')來引用當前目錄下hello這個文件的時候,它是會默認先去查找名爲hello這個文件是否存在,假如存在這個文件(即不帶任何後綴),那麼,它就會直接讀取這個文件的內容,而不是去嘗試添加後綴。另外須要注意的是,它這裏是將這個無後綴看成js文件來解析的,而無論裏面是什麼代碼。json

關於引用文件時路徑問題,按照以./按相對路徑或絕對路徑來解析。緩存

node_modules加載

若是使用require時候,不帶任何相對或絕對路徑,那麼node會嘗試從node_modules中去尋找所須要的模塊。node查找node_modules的方式是從當前目錄找起,一直找到根目錄下。即一級一級地先查看是否有node_modules這個文件夾,若是有就從裏面尋找對應模塊,若是未找到則進入上一級目錄查找。函數

文件夾做爲模塊

除了在node_modules下文件夾是一個模塊以外,你還能夠在其它地方放置一個這樣的文件夾做爲模塊,而後以相對或者絕對路徑的方式進行引用。ui

有兩種方式(官網上所說三種,其實可併爲兩種)可使文件夾做爲一個模塊引用到。翻譯

  • 文件夾下建立一個package.json文件,並使用"main": "abc.js"方式,這樣require就會去引用目錄下abc.js文件。
  • 當文件夾中無package.json這個文件時,它會在文件夾中嘗試尋找index.jsindex.node這兩個文件 。若是有,則使用對應文件。

! 這裏有一個問題,若是同一級存在同名的文件夾和文件時候,會怎麼辦呢?首先,真正使用如出一轍名字的文件和文件夾在同一級是不能同時存在的。其次,當相似於hi.jshi目錄同時存在時呢?它會率先查找使用hi目錄,若是目錄按照上面形式並未查找到結果時,則使用hi.js這個文件。code


因爲不少人(包括本人)沒認真看過modules模塊的介紹,因此對node_modules文件夾有一個潛意識的假設,認爲node_modules中存放的都是文件夾模塊,不能放單個js文件。
其實,node_modules文件夾中,不只能夠放npm install而來的文件夾模塊,還能夠放置單個js文件,造成一個模塊。文檔

如,將一個test.js文件放入node_modules文件夾中後,就能夠直接在代碼中使用require('test')來引用它了,就像引用一個npm模塊同樣。
這樣作的好處是,不用爲一個簡單的模塊而作一個文件夾,同時還能夠不帶路徑進行引用。io

其實,關於node中require還有一些必要的知識須要瞭解,好比引用緩存、互相引用的問題等,這些在modules文檔中都有詳細說明,這裏就再也不翻譯了。

相關文章
相關標籤/搜索