如何避免在另一个插件也使用Requirejs时重新定义插件中的Requirejs

时间:2017-10-15 作者:kontur

现在有一个小问题我还没有解决好。

我编写了一个Wordpress插件,它使用requirejs加载javascript模块。一切都很好,直到偶尔我从用户那里收到非常模糊的错误报告。事实证明,当其他主题或插件也有使用requirejs的好主意时,就会出现臭名昭著的“不匹配匿名define()模块(问题)”[http://www.requirejs.org/docs/errors.html#mismatch] 由于requirejs本身有两个实例。

有什么办法吗?

2 个回复
最合适的回答,由SO网友:kontur 整理而成

经过长时间的搜索,似乎找到了一种方法。

首先,这意味着使用requirejs optimiser, i、 e.预编译模块,可能是一个缩小的文件。

其次,在optimiser options 有一个namespace 选项,基本上是所有require、define和module调用的前缀,因此它们不再干扰站点上的其他requirejs。

这么说吧$ node r.js -o build.js使用以下版本。js文件:

({
    paths: {
        \'modulename\': \'path/to/modulefile\',
        \'modulename\': \'path/to/modulefile\',
        \'modulename\': \'path/to/modulefile\',
        \'requireLib\': \'path/to/requirejs\'
    },
    name: "js/main",
    out: "js/bundle.js",
    include: "requireLib",
    namespace: "mynamespace",
})
将转换中定义的模块js/main.jsjs/bundle.js 小型化,包括所有required模块和所有模块require() 该缩小文件中的调用将是mynamespace.require() 在输出文件中调用。

这个include 选项很重要,以便优化人员实际包括requirejs 它本身在捆绑包中,并将其称为“require”(即“requireLib”)以外的其他名称是必需的,这样优化人员内部就不会感到困惑。

最后this file 具有所有可用的优化器生成。js选项。

It is insane to think that any plugin or theme author using requirejs should be aware of this, 事实上,我认为大多数开发人员直到遇到与另一个插件或主题的这种不兼容组合时才会这样做。然而,这是一种确保requirejs在Wordpress项目中使用时不会引起问题的方法。

SO网友:janh

您可以查看$wp\\U scripts($wp\\U scripts->registered)中排队的脚本,但命名可能不同(“这是requirejs,但我们称之为loadstuffjs,仅仅因为”),所以我怀疑它是否接近完美。

此外,您的插件可能会在其他插件之前加载,它们可能会在您没有任何控制的情况下触发问题。

也许可以让加载requirejs成为可选的(但已启用),并告诉人们,如果遇到此问题,他们应该尝试禁用加载它(原因是“其他”requirejs将被加载并且工作正常)。此外,我会得到一个你有这些问题的插件/主题列表,并告知用户不兼容,并询问他们是否想启用你的“兼容模式”(即不通过插件加载requirejs)。

结束