2015-06-10 29 views
3

我的應用程序將消息的對象以給定的語言加載到應用程序中。我的結構,像這樣:Browserify動態單獨的包

/lang 
    /en.js (100 kb file) 
    /ru.js (100 kb file) 
    /... many more 
app.js (this is `MyApp` as below) 

語言文件是非常大的,所以我想創建單獨的包,然後你只包括你需要<script src="lang/en.js"></script>的文件。該語言也可以隨時在應用程序中「切換」。

我該如何告訴browserify爲所有語言文件構建主應用程序和單獨的捆綁包,並仍允許MyApprequire這些語言文件?

function MyApp(lang) { 
    this.messages = {}; 
    this.switchLang(lang); 
}; 

MyApp.prototype.loadLang = function(lang) { 
    this.messages = require('./lang/' + lang + '.js'); 
}; 

MyApp.prototype.switchLang = function(lang) { 
    this.lang = lang; 
    this.loadLang(lang); 
}; 

MyApp.prototype.sayHello = function() { 
    alert(this.messages.HELLO); 
}; 

module.exports = MyApp; 

回答

2

您可以通過使用-r分開你的主應用程序的所有語言(要求),並且在browserify命令-x(外部)。

捆綁語言一起到一個文件中,看起來是這樣的:

browserify -r ./lang/en.js -r ./lang/ru.js > languages.js 

推薦:您可以創建與上面的命令每個語言文件單獨的包。只需使用-r一次。

然後包括MyApp.js之前在你的HTML頁面新文件(languages.js)。那麼在建立MyApp.js時你必須忽略它們。

browserify --ignore-missing -x ./lang/en.js -x ./lang/ru.js -d app.js > MyApp.js 

你仍然被允許爲require這些語言。

注意:如果你對每種語言單獨的包(見RECOMMENDED),你只被允許require在你的主應用程序附帶的。

沒有browserify路,爲在lang/每個文件自動做到這一點。

我建議你寫一個*.cmd(批)文件中lang/每種語言文件執行上面的命令。所以你仍然可以包括你喜歡的語言。

編輯:bundleing MyApp.js時使用--ignore-missing--im。所以你可以require所有語言,當他們失蹤時,他們仍然undefined

+0

謝謝你的幫助!當運行'browserify -x ./lang/en.js ....'時不會添加對其他語言文件的引用,所以當'MyApp.js'試圖要求它們時,它不知道它們在哪裏。我認爲這是因爲lang文件在'loadLang'中被動態地'required',所以browserify不會選擇它們。我已經通過添加一個函數來調用這個函數,所有的lang文件都需要像'require('./lang/en.js')'和'require('./lang/ru.js')'這樣可行。似乎有點哈克,但?也得到一些奇怪的Windows路徑問題。 –

+0

'不會添加對其他語言文件的引用,所以當MyApp.js試圖要求它們時,它不知道它們在哪裏。'是的,你只需要語言文件,當它們被包含在你的HTML頁面中'MyApp.js'之前。我將編輯我的答案以獲得其他更好的解決方案... – marcel