在Meteor node.js

时间:2017-10-12 20:49:13

标签: javascript node.js meteor

我正在尝试使用Meteor 1.6测试版通过chokidar(看门狗)动态加载多个模块,但是在对此事进行广泛研究后,我似乎无法让它工作。

从我收集的设计要求中,除了静态字符串之外,不会接受任何其他内容,即

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);
});

2 个答案:

答案 0 :(得分:0)

你所描述的内容有一些本质上的奇怪。

chokidar用于观看实际文件和文件夹。

但Meteor编译并捆绑您的代码,导致构建后的app文件夹与您的项目结构完全不同。

虽然Meteor现在支持动态导入,但该机制是Meteor内部的,并不依赖于您的实际项目文件,而是依赖于Meteor构建的文件。

如果你想动态require文件,比如Node,包括动态生成的模块路径,你应该避免importrequire语句,这些语句会自动被Meteor内置替换进口机制。相反,你必须自己编写加载功能,注意你的app内置文件夹与你的项目文件夹不同。

例如,如果您的服务器正在静态位置观看文件和/或文件夹,这可能会起作用,这与您的应用运行的位置不同。

最后,我觉得这是一个XY问题:你没有首先描述你的目标,上面的问题是试图解决一个似乎不适合Meteor如何工作的奇怪解决方案,因此这可能不是你隐含目标的最合适的解决方案。

答案 1 :(得分:0)

@Sashko在解释Meteor的动态导入here方面做得很好。还有docs

动态导入是函数,它返回 promise ,而不是仅在构建时静态导入。例如:

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

一旦模块加载,promise就会运行。如果您尝试重复加载模块,那么它只会加载一次,并在后续请求中立即可用。

afaict你可以使用一个变量来输入字符串。