Я построил библиотеку, чтобы решить эту проблему. Конечно, я не уверен, поможет ли это вам, потому что код все еще должен знать о проблеме и, в первую очередь, использовать библиотеку, так что это поможет, только если вы сможете изменить свой код для использования библиотеки.
Данная библиотека называется Packages JS и может быть загружена и использована бесплатно, так как она является Open Source по лицензии Creative Commons.
Это в основном работает путем упаковки кода внутри функций. Из этих функций вы экспортируете те объекты, которые хотите выставить в другие пакеты. В потребительских пакетах вы импортируете эти объекты в локальное пространство имен. Не имеет значения, если кто-то еще или даже вы сами используете одно и то же имя несколько раз, потому что вы можете устранить неоднозначность.
Вот пример:
(пример файла / приветствие.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 таким образом будет означать «упаковку» jQuery путем обертывания его кода в вызов Package и экспорта объектов, которые он теперь предоставляет в глобальную область. Это означает, что нужно немного изменить библиотеку, что, возможно, не то, что вам нужно, но, увы, нет другого пути, который я могу увидеть, не прибегая к iframes.
Я планирую включить в пакет «упакованные» версии популярных библиотек, и jQuery определенно находится в списке, но на данный момент у меня есть только упакованная версия Sizzle, механизма выбора jQuery.