gpt4 book ai didi

javascript - 如何实现一个仅在需要时才修改原始模块的插件?

转载 作者:数据小太阳 更新时间:2023-10-29 05:22:48 24 4
gpt4 key购买 nike

我有一个扩展原始模块的插件。
它应该只在明确需要时修改模块。

问题:
一旦需要一次,原始模块就会永远被修改,对于插件不是依赖项的情况也是如此。
这里的顺序无关紧要,只需要一次插件就足够了。

例子:

define("main", [], function() {
return {opt: "A"};
});
define("plugin", ["main"], function(obj) {
obj.opt = "B";
});
require(["main", "plugin"], function(obj) {
console.log(obj.opt); // should log B
});
require(["main"], function(obj) {
console.log(obj.opt); // should log A but logs B
});

我猜要走的路是以某种方式告诉 require 总是从源代码重新加载 main 而不是使用缓存的版本。
不过我不知道怎么做。
或者也许有更优雅的方式?

请各位大侠赐教

fiddle :http://jsfiddle.net/r75e446f

更新:有些人可能会发现知道我需要这个用于我的业力单元测试环境以测试带有和不带有插件的模块很重要。

更新 2:在下面查看我自己的解决方案。

最佳答案

RequireJS 模块是单例的。如果你加载 main 一次、两次、10 次,你总是会得到相同的模块。所以如果你修改它的状态,它会为所有使用它的模块修改。可以告诉 RequireJS 取消定义模块,但我不推荐这样做,因为它只会让你的代码变得晦涩难懂。

如果我想做您正在尝试做的事情,我会像这样设计我的代码:

<script>
define("main", [], function() {
function Main (opt) {
this.opt = opt;
}
return Main;
});
define("plugin1", [], function() {
return {
install: function (main) {
main.opt += " plugin1";
}
};
});
define("plugin2", [], function() {
return {
install: function (main) {
main.opt += " plugin2";
}
};
});
// Case 1: no plugins
require(["main"], function(Main) {
var main = new Main("A");
console.log(main.opt);
});
// Case 2: only plugin1
require(["plugin1", "main"], function (plugin1, Main) {
var main = new Main("A");
plugin1.install(main);
console.log(main.opt);
});
// Case 3: only plugin2
require(["plugin2", "main"], function (plugin2, Main) {
var main = new Main("A");
plugin2.install(main);
console.log(main.opt);
});
// Case 4: plugin1 and plugin2
require(["plugin1", "plugin2", "main"], function (plugin1, plugin2,
Main) {
var main = new Main("A");
plugin1.install(main);
plugin2.install(main);
console.log(main.opt);
});

基本上,将所有情况下通用的Main 类设为可在构造时初始化,可由插件修改。然后每个插件都可以在 Main 上自行安装。上面的代码是可以如何完成的最小说明。在实际项目中,最终解决方案的设计必须考虑项目的特定需求。

关于javascript - 如何实现一个仅在需要时才修改原始模块的插件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27533392/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com