2017-10-12 139 views
0

我想通過使用流星1.6測試版chokidar(看門狗)在飛行中加載多個模塊,但是在做了關於這個問題的廣泛研究後,我似乎無法得到它工作。在流星node.js動態加載模塊

從我所收集的設計要求比靜態字符串以外的任何不會採取,即

require("test/string/here") 

因爲如果我嘗試:

var path = "test/string/here" 
require(path) 

我只是得到錯誤:無法找到模塊,即使這些字符串是相同的。

現在的事情是我不確定如何繼續這個,我真的不得不使用導入或靜態字符串時使用流星還是有一些解決方法呢?

watchdog(cmddir, (dir) => { 
match = "." + regex_cmd.exec(dir); 

match = dir; 

loader.emit("loadcommand", match) 


}); 

loader.on('loadcommand', (file) => { 
require(file); 
}); 
+0

我用反應加載和動態導入工作就像一個魅力! –

+0

這些模塊是否經常使用npm模塊,或者您自己的腳本(即不在/導入)?如果後者,你需要給它一個絕對路徑或它不會工作 – Mikkel

+0

或至少有一個足夠的相對路徑。 '/ test/string/here'工作嗎? –

回答

0

在你描述的內容中有一些內在的奇怪。

chokidar用於觀看實際的文件和文件夾。

但是Meteor會編譯和捆綁您的代碼,導致構建後的應用程序文件夾與您的項目結構完全不同。

雖然流星現在支持動態導入,但流星內部的機制並不依賴於實際的項目文件,而是依賴流星建立的。

如果要動態require文件,如在節點,包括動態生成的模塊路徑,你應該避免importrequire語句,這是由內置的導入機制流星自動替換。相反,您將不得不組成自己的加載函數,注意您的應用程序構建的文件夾與您的項目文件夾不同。

例如,如果您的服務器正在監視靜態位置中的文件和/或文件夾,這與您的應用的運行位置不同,可能會有效。最後,我覺得這是一個XY問題:你沒有描述你的目標,上面的問題是試圖解決一個奇怪的解決方案,似乎不適合流星的工作方式,因此這可能不是您隱含目標的最合適解決方案。

+0

基本上,我試圖完成的是將單獨的命令(用於通過事件觸發的程序)加載到流星中,這就是爲什麼我使用chokidar觀看特定文件夾並且它是子文件夾的原因。 –

+0

如果說「實時」是指在應用程序構建時不可用,那麼它就超出了Meteor的範圍,並且必須如上所述構建自己的加載函數。 – ghybs

+0

不好意思問這個問題,但我想知道是否有任何鏈接/書籍可以幫助實現您自己的加載功能。 –

0

@Sashko在解釋Meteor的動態導入here方面做得非常出色。也有docs

動態導入一個功能返回一個承諾,而不是僅僅在構建時靜態導入。示例:

import('./component').then((MyComponent) => { 
    render(MyComponent); 
}); 

該承諾在模塊加載完成後運行。如果您嘗試重複加載模塊,則只會加載一次,並在隨後的請求中立即可用。

afaict您可以使用變量來輸入字符串。