標籤:緩衝 exports blog 相對 ports html str 沒有 運行
1. 模組化介紹
1.1. 由於JavaScript不是一個模組化語言,存在兩大缺陷:
a、檔案中的代碼會造成全域汙染;
b、 依賴的載入順序無法完全保證,例如jquery外掛程式要在引入jquery後引入。
1.2. Node中的模組化:
a、 檔案天生就是一個私人的範圍
b、 檔案與檔案之間通過特定的規則進行互動(匯入匯出)
c、 程式最終由n個檔案組成整個應用程式
d、 在每個模組內部,module代表當前模組,這個對象有一個屬性exports,通過require函數載入這個模組,其實就是在載入某個模組,也就是該模組的module.exports介面。
2. Node中的模組分類
2.1. 核心模組https://nodejs.org/en/docs/
就是node中的內建模組,例如fs,http等,其載入速度最快,因為已經被編譯到node程式中了,每個模組都提供了一個唯一的核心標識名稱,所以載入規則都一樣
Var 變數名=require(‘核心模組名’)
1.2. 第三方模組
第三方模組就是由社區提供的模組(通常是npm),有將近35萬個之多,通過在使用的時候都遵循以下三步:
a、 通過 npm 下載到項目中;
b、 通過 require 函數載入下載的第三方模組;
c、 查閱第三方模組的文檔;
以marked為例(提供將markdown格式字串轉為HTML格式字串的功能)
a、npm install marked
b、var marked = require(‘marked’)
c、console.log(marked(‘# hello world’))
d、輸出結果為:<h1>hello world</h1>
1.3. 使用者自訂模組
使用者模組就是使用者自己編寫的檔案模組,通常是一個檔案或者多個檔案組成。
例如以下簡單的加減功能
在cal.js檔案中
function add(x,y){ return x+y;};function minus(x,y){ return x-y;}module.exports.add=add;module.exports.minus=minus;
在app.js檔案中
var cal = require(‘./cal)
2.4.模組化特點總結
a、所有代碼都運行在模組範圍,不會汙染全域範圍
b、模組可以多次載入,但是只會在第一次載入時運行一次,然後運行結果就被緩衝起來了,以後再載入,就直接讀取緩衝結果
c、模組載入的順序,按照其在代碼中出現的順序
d、 module.exports 是模組的對外匯出介面,其它檔案載入該模組,實際上就是讀取 module.exports
通過 require 函數載入別的模組,載入模組的過程實際上就是執行被載入模組中的代碼,得到被載入模組的 module.exports 介面對象
3. exports和module.exports
為了方便,Node為每個模組提供了一個 exports 屬性,指向 module.exports ,也就是說可以通過修改 exports 從而修改 module.exports
3.1. 如果需要向外只匯出一個變數、例如一個函數、字串、數字等,則必須通過為 module.exports 賦值才可以。
注意:為 exports 賦值是不管用的,因為每個模組最終對外到處的介面是 module.exports,而 exports 只是 module.exports 的一個引用,所以一旦給 exports 賦值,就切斷了兩者之間的參考關聯性,賦的值也就不管用了。
總結:如果希望嚮往匯出多個介面成員,則可以使用 exports 添加屬性成員方便的對外匯出。
但是如果想要向外部提供一個單一的字串、函數、數組等介面資料,則必須通過為 module.exports 賦值。(給 exports 賦值是不管用的)。
4. require 函數載入模組規則流程
require 函數接收的值被稱作模組標識符,可能是一個核心模組標識名,也可能是一個第三方模組,也可能是一個相對路徑形式的檔案路徑。在指定檔案模組的時候,可以省略檔案名稱尾碼,當省略了文檔名尾碼之後,node 會以 .js、.node、.json 依次嘗試補足。
下面是詳細的載入規則:
4.1. 優先從緩衝載入
4.2. 標識符分析
a、如果是核心模組,直接載入
b、如果是使用者模組,即以 ./ 或者 ../ 開始的標識符或者絕對路徑形式的模組,則直接載入
c、如果是第三方模組,則相對於當前模組找 node_modules 目錄
d、找到 node_modules 目錄之後,找與被載入模組同名的目錄
e、如果找到,則找 package.json 檔案,如果找到 package.json 檔案,則找檔案的 main 屬性,如果找到 main 屬性,則直接載入
f、如果沒有 package.json 檔案或者沒有 main 屬性或者 main 屬性指定的檔案模組不存在,則預設載入該目錄中的 index.js、index.node、index.json
g、以上條件任何一個不成立,則直接進入上一級目錄找 node_modules 目錄,規則同上,直到找到當前檔案模組所屬磁碟根目錄如果還找不到,則直接報錯:can not find module xxx
node.js的模組化介紹