В настоящее время я работаю над проектом, который представляет собой большой сайт, использующий библиотеку Prototype, и уже существует огромное количество кода Javascript.
Сейчас мы работаем над фрагментом кода, который будет «внедрен» в сайты других людей (представьте себе людей, добавляющих тег на свои сайты), который затем запустит наш код и добавит несколько элементов DOM и функциональность их сайта. В нем будут новые фрагменты кода, а также много кода, который мы используем на нашем главном сайте.
У меня проблема в том, что, конечно, не круто просто добавить , который будет включать Prototype на страницах людей. Если мы сделаем это на странице, которая уже использует ANY framework, мы гарантированно все испортим.
jQuery дает нам возможность «переименовать» объект $, чтобы он мог справиться с этой ситуацией прилично, за исключением того факта, что мы не используем jQuery, поэтому нам пришлось бы перенести все .
Прямо сейчас я обдумываю несколько ужасных вариантов, и я не уверен, что лучше ...
- Перепишите все, чтобы использовать jQuery, с везде переименованным объектом $.
- Создание «новой» библиотеки прототипов только с подмножеством, которое мы будем использовать в «внедренном» коде, и переименование $ во что-то другое. С другой стороны, мне придется адаптировать части моего кода, которые будут каким-либо образом предоставлены.
- Не использовать библиотеку во введенном коде, чтобы она была максимально чистой, и переписывать общий код, чтобы вообще не использовать библиотеку. Это, очевидно, вылилось бы в создание нами собственного Франкенштейна библиотеки, что, вероятно, является наихудшим сценарием в истории.
Мне интересно, что вы, ребята, думаете, я мог бы сделать, а также есть ли какой-нибудь волшебный вариант, который решит все мои проблемы ...
Например, как вы думаете, я мог бы использовать что-то вроде Caja / Cajita, чтобы изолировать свой собственный код и изолировать его от остальной части сайта, и иметь там Prototype? Или я с этим совершенно не согласен?
Я также однажды читал о технике для букмарклетов, если бы вы добавили свой код следующим образом:
(function() { /* your code */ })();
И тогда ваш код находится внутри вашей анонимной функции, и вы вообще не затрагивали глобальное пространство имен.
Как вы думаете, я мог бы сделать один файл, содержащий:
(function() {
/* Full Code of the Prototype file here */
/* All my code that will run in the "other" site */
InitializeStuff_CreateDOMElements_AttachEventHandlers();
})();
Будет ли это работать? Будет ли это достигать цели не загромождать глобальное пространство имен и не убивать функциональность на сайте, который использует, например, jQuery?
Или Prototype слишком сложен, чтобы так его изолировать?
(ПРИМЕЧАНИЕ: я думаю, что знаю, что это создаст замыкания повсюду, и это будет медленнее, но меня не волнует производительность, мой код не делает ничего сложного)