2015-06-29 76 views
2

我遇到一個奇怪的問題,運行最新的browserify(10.2.4)和gulp。 似乎相同的文件被多次解析,所以創建單例時我沒有得到相同的實例。 我在module.exports之前放了一個'調試器',並且驗證它被調用兩次。Browserify多次解析同一個文件

note#1:我猜測說,browserify會根據字符串緩存文件,所以當調用來自不同位置的相對路徑不會有相同的字符串時,即使它們指向相同的位置。

注意#2:我在使用Browserify 3〜直到現在,只有當我升級它開始發生。

實施例:

鑑於:

app.js 
/folder1/foo.js 
/folder2/bar.js 

/folder1/foo.js:

function Foo(){} 
module.exports = new Foo(); // Creating a singleton 

/folder2/bar.js

var foo = require('../folder1/foo'); 
function Bar(){ 
// do something with foo 
} 
module.exports = Bar; 

/app.js

var foo = require('./folder1/foo'), 
Bar = require('./folder2/bar'); 
var bar = new Bar(); 
// Now 'foo' here and 'foo' inside Bar are not the same instance. 

回答

3

你應該改變你的架構是這樣的:

/folder1/foo.js:

function Foo(){} 
module.exports = Foo; 

/文件夾2 /條.js

function Bar(foo){ 
// do something with foo 
} 
module.exports = Bar; 

/app.js

var Foo = require('./folder1/foo'), 
var Bar = require('./folder2/bar'); 
var bar = new Bar(new Foo()); 

我有同樣的問題,我發現,這僅僅是一個根本不切實際的建築風格。

編輯:這樣,你有一個「單身」,這是由主要組件/類(app.js)管理。

例如:想象一下,您有一個需要config對象的子組件/子類。 - > App.js使用SubComponent.js。

您的方法require'config'(實現爲singleton)並將其用於組件。

問題:現在您要添加另一個需要其他config對象的同一類型的子組件。它不適用於你的解決方案。

解決方案:讓您的父組件處理所有「單件」(配置對象)。

+1

但是這意味着我根本不能使用Singletons,所以它不是一個解決方案 –