Webpack-RequireJS互操作黑客攻击:模块尚未加载上下文错误,但兄弟姐妹有

时间:2018-02-22 08:21:26

标签: webpack requirejs

我在系统中遇到问题,我们可以自由地混合和匹配Webpack和RequireJS。我们有一个静态代码库来创建各种Web UI,但在这个Web UI中,可以从其他地方请求动态部分。

静态Web UI部分是使用Webpack构建的。但是,动态部件是使用RequireJS自然请求的。现在这很简单,但问题是这些动态部分中的一些想要引用回静态部分。这通常会导致重复,因为RequireJS会重新获取并初始化代码,而忽略了代码已经存在于Webpack创建的包中的事实。

为了解决这个问题,我想出了一个(巧妙的)怪异的黑客,在我们的静态代码的开头,我们导入了我们知道需要通过RequireJS和window.define("static/code/location", () => import "static/code/location")所需的静态部分。 (解释,这个实际的代码当然不会起作用)。

所以我们基本上抓住Webpack模块引用并定义RequireJS,该模块提供了一个特定的命名模块。这实际上有效,我很高兴。

但是出现了一个奇怪的问题。其中一个动态需要的代码包含RequireJS的const a = require("some/path/a");语法,并且出于某种原因,这个特定的“some / path / a”错误包含module has not been loaded yet for context: _. Use require([])。即使在请求行之前,我手动(通过开发人员控制台)执行define("path/to/a", () => {})也会发生这种情况。此外,做const b = require("some/path/b");确实有效,返回正确的模块并且没有错误,尽管模块的路径是相同的,并且这两个模块最初都是在我的怪异黑客解决方案中并排定义到RequireJS如上所述。

关于发生了什么的任何线索,为什么一个兄弟姐妹定义而另一个兄弟姐妹没有,也无法定义,将是最受欢迎的。虽然这绝对不是一个特别“好”的用例......很抱歉。

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法。我仍然不知道究竟是什么导致了错误,但是解决这个问题的方法是将path/to/a定义为普通对象,而不是返回普通对象的无参数函数。

window.define("path/to/a", import("a"))(再次释义。)