以下內容爲初步的實踐,並未深入探究。可能純在片面性。僅僅爲開發過程中發現的問題,以及原因的筆記(不一定正確)。
NodeJS的模塊默認情況下是單例性質的,不過其並不能保證如我們編程時設想的那樣一定是單例,根據NodeJS的官方文檔中描述,某個模塊導入是否爲單例受以下兩個因素的影響:
-
Node 模塊的緩存機制是大小寫敏感的,譬如如果你
require('/foo')
與require('/FOO')
會返回兩個不同的對象,儘管你的foo與FOO是完全相同的文件。 -
模塊是基於其被解析得到的文件名進行緩存的,鑑於不同的模塊會依賴於其被調用的路徑進行緩存鑑別,因此並不能保證你使用
require('foo')
會永遠返回相同的對象,可能會根據不同的文件路徑得到不同的對象。
簡單實踐
寫一個 test.json 文件:
{
"text": "hello world",
"mark": "這是一個標記"
}
在寫一個 test.js 用 require 導入 test.json 文件
const first = require('./test.json')
console.log('first', first) // "{ text: 'hello world', mark: '這是一個標記' }"
delete first.text // 刪除first對象中的 text 字段
const second = require('./test.json')
console.log('second', second) // "second { mark: '這是一個標記' }"
const third = require('./Test.json')
console.log('third', third) // "third { text: 'hello world', mark: '這是一個標記' }"