Actualmente estoy en un proyecto que es un gran sitio que usa la biblioteca Prototype, y ya hay una gran cantidad de código Javascript.¿Cómo puedo inyectar Javascript (incluido Prototype.js) en otros sitios sin saturar el espacio de nombres global?
Ahora estamos trabajando en un trozo de código que se obtiene "inyecta" en sitios de otras personas (personas Foto añadiendo un > etiqueta < guión en sus sitios) que luego ejecutar nuestro código y añadir un montón de elementos DOM y funcionalidad a su sitio. Esto tendrá nuevas piezas de código y también reutilizará gran parte del código que usamos en nuestro sitio principal.
El problema que tengo es que es claro que no se enfríe simplemente agregar una secuencia de comandos > < que incluirá Prototipo en las páginas de las personas. Si hacemos eso en una página que ya usa CUALQUIER marco, estamos seguros de que lo arruinaremos todo.
jQuery nos da la opción de "cambiar el nombre" del objeto $, por lo que podría manejar esta situación decentemente, excepto obviamente por el hecho de que no estamos usando jQuery, entonces tendríamos que migrar todo.
En este momento estoy contemplando una serie de opciones feas, y no estoy seguro de qué es lo mejor ...
- reescritura todo para usar jQuery, con un objeto $ renombrado por todas partes.
- Creando una "nueva" biblioteca de prototipos con solo el subconjunto que estaríamos usando en el código "inyectado", y renombrando $ a otra cosa. Por otra parte, tendría que adaptar las partes de mi código que se compartirían de alguna manera.
- No está utilizando una biblioteca en absoluto en el código inyectado, para mantenerlo lo más limpio posible, y volver a escribir el código compartido para no utilizar ninguna biblioteca. Esto obviamente degeneraría en nosotros creando nuestro propio frankenstein de una biblioteca, que probablemente sea el peor escenario de la historia.
Me pregunto lo que ustedes piensan que podía hacer, y también si hay alguna opción mágica que resolvería todos mis problemas ...
Por ejemplo, ¿cree que podría utilizar algo como Caja/Cajita para guardar mi propio código y aislarlo del resto del sitio, y tener prototipo dentro de allí? ¿O estoy completamente perdiendo el punto con eso?
También leí una vez acerca de una técnica para bookmarklets, se le añade el código de la siguiente manera:
(function() { /* your code */ })();
Y a continuación, el código es todo dentro de su función anónima y no se ha tocado el espacio de nombres global en absoluto . ¿Cree que podría hacer un archivo que contiene:
(function() {
/* Full Code of the Prototype file here */
/* All my code that will run in the "other" site */
InitializeStuff_CreateDOMElements_AttachEventHandlers();
})();
¿Funcionaría? ¿Lograría el objetivo de no saturar el espacio de nombre global, y no matar la funcionalidad en un sitio que usa jQuery, por ejemplo?
¿O es prototipo demasiado complejo de alguna manera para aislarlo así?
(NOTA: Creo que sé que eso crearía cierres todas partes y eso es más lento, pero no me importa demasiado sobre el rendimiento, el código no está haciendo nada que compleja)
Normalmente, cuando inyecta su código en otros sitios web, proporciona una pequeña fracción de la funcionalidad de su aplicación principal, por lo que tiene sentido codificar las funciones necesarias en javascript "nativo". Sin embargo, parece que ese no es el caso en su proyecto. Creo que funcionaría con la función de envoltura anónima. Algunos bookmarklets tienen rutinas que cargan dinámicamente las bibliotecas requeridas. Realizar algunas pruebas para confirmar que la técnica realmente funciona, debe ser rápida. :) – Favio