我建立了一个库来解决这个问题。当然,我不确定它是否会对您有所帮助,因为代码仍然必须首先意识到问题并使用该库,因此只有在您能够更改代码以使用该库时它才会有所帮助。
有问题的库称为Packages JS,可以免费下载和使用,因为它是在知识共享许可下的开源。
它基本上是通过在函数中打包代码来工作的。从这些函数中,您可以导出要公开给其他包的对象。在消费者包中,您将这些对象导入本地命名空间。其他人甚至您自己是否多次使用相同的名称都没关系,因为您可以解决歧义。
这是一个例子:
(文件示例/greeting.js)
Package("example.greeting", function() {
// Create a function hello...
function hello() {
return "Hello world!";
};
// ...then export it for use by other packages
Export(hello);
// You need to supply a name for anonymous functions...
Export("goodbye", function() {
return "Goodbye cruel world!";
});
});
(文件示例/ambiguity.js)
Package("example.ambiguity", function() {
// functions hello and goodbye are also in example.greeting, making it ambiguous which
// one is intended when using the unqualified name.
function hello() {
return "Hello ambiguity!";
};
function goodbye() {
return "Goodbye ambiguity!";
};
// export for use by other packages
Export(hello);
Export(goodbye);
});
(文件示例/ambiguitytest.js)
Package("example.ambiguitytest", ["example.ambiguity", "example.greeting"], function(hello, log) {
// Which hello did we get? The one from example.ambiguity or from example.greeting?
log().info(hello());
// We will get the first one found, so the one from example.ambiguity in this case.
// Use fully qualified names to resolve any ambiguities.
var goodbye1 = Import("example.greeting.goodbye");
var goodbye2 = Import("example.ambiguity.goodbye");
log().info(goodbye1());
log().info(goodbye2());
});
example/ambiguitytest.js 使用了两个库,它们都导出函数再见,但它可以显式导入正确的库并将它们分配给本地别名以消除它们之间的歧义。
以这种方式使用 jQuery 意味着通过将其代码包装在对 Package 的调用中并导出它现在暴露给全局范围的对象来“打包”jQuery。这意味着稍微改变一下库,这可能不是您想要的,但是很遗憾,如果不求助于 iframe,我就无法解决这个问题。
我计划在下载中包含流行库的“打包”版本,jQuery 肯定在列表中,但目前我只有 jQuery 的选择器引擎 Sizzle 的打包版本。