¿Cómo puedo incluir un archivo JavaScript en otro archivo JavaScript?
¿Hay algo en JavaScript similar a @import
en CSS que permita incluir un archivo JavaScript dentro de otro archivo JavaScript?
4870
3
Las versiones antiguas de JavaScript no tenían import, include o require, por lo que se han desarrollado muchos enfoques diferentes para este problema.
Pero desde 2015 (ES6), JavaScript tiene el estándar ES6 modules para importar módulos en Node.js, que también es soportado por la mayoría de los navegadores modernos.
Para la compatibilidad con los navegadores más antiguos, se pueden utilizar las herramientas build y/o transpilation.
Módulos ES6
Los módulos ECMAScript (ES6) han sido soportados en Node.js desde la v8.5, con la bandera
--experimental-modules
. Todos los archivos involucrados deben tener la extensión.mjs
.Módulos ECMAScript en los navegadores
Los navegadores tienen soporte para cargar módulos ECMAScript directamente (sin necesidad de herramientas como Webpack) desde Safari 10.1, Chrome 61, Firefox 60 y Edge 16. Compruebe el soporte actual en caniuse.
Más información en https://jakearchibald.com/2017/es-modules-in-browsers/
Importaciones dinámicas en los navegadores
Las importaciones dinámicas permiten que el script cargue otros scripts según sea necesario:
Más información en https://developers.google.com/web/updates/2017/11/dynamic-import
Node.js require
El viejo estilo de importar módulos, todavía muy utilizado en Node.js, es el sistema module.exports/require.
Existen otras formas de incluir contenidos externos de JavaScript en los navegadores que no requieren preprocesamiento.
Carga AJAX
Puedes cargar un script adicional con una llamada AJAX y luego usar
eval
para ejecutarlo. Esta es la forma más directa, pero está limitada a su dominio debido al modelo de seguridad de la caja de arena de JavaScript. El uso deeval
también abre la puerta a bugs, hacks y problemas de seguridad.Carga de Fetch
Al igual que las importaciones dinámicas, puedes cargar uno o varios scripts con una llamada
fetch
usando promesas para controlar el orden de ejecución de las dependencias de los scripts usando la librería Fetch Inject:Carga de jQuery
La biblioteca jQuery proporciona la funcionalidad de carga en una línea:
Carga dinámica de scripts
Puedes añadir una etiqueta de script con la URL del script en el HTML. Para evitar la sobrecarga de jQuery, esta es una solución ideal.
El script puede incluso residir en un servidor diferente. Además, el navegador evalúa el código. La etiqueta
<script>
puede ser inyectada en elde la página web, o insertada justo antes de la etiqueta de cierre
.Este es un ejemplo de cómo podría funcionar:
Esta función añadirá una nueva etiqueta
<script>
al final de la sección head de la página, donde el atributosrc
se establece en la URL que se da a la función como primer parámetro.Ambas soluciones se discuten e ilustran en JavaScript Madness: Dynamic Script Loading.
Detección de la ejecución del script
Ahora, hay un gran problema que debes conocer. Hacer esto implica que se cargue el código de forma remota. Los navegadores web modernos cargarán el archivo y seguirán ejecutando tu script actual porque cargan todo de forma asíncrona para mejorar el rendimiento. (Esto se aplica tanto al método jQuery como al método de carga dinámica de scripts manual).
Significa que si usas estos trucos directamente, no podrás usar tu código recién cargado la siguiente línea después de haber pedido que se cargue, porque todavía se estará cargando.
Por ejemplo:
my_lovely_script.js
contieneMySuperObject
:Luego recargas la página pulsando F5. ¡Y funciona! Confuso...
¿Entonces qué hacer al respecto?
Bueno, puedes usar el hack que sugiere el autor en el enlace que te di. En resumen, para la gente con prisa, utiliza un evento para ejecutar una función callback cuando se carga el script. Así puedes poner todo el código que usa la librería remota en la función callback. Por ejemplo:
Luego escribes el código que quieres usar DESPUÉS de cargar el script en una función lambda:
Luego ejecutas todo eso:
Ten en cuenta que el script puede ejecutarse después de que el DOM se haya cargado, o antes, dependiendo del navegador y de si has incluido la línea
script.async = false;
. Hay un gran artículo sobre la carga de Javascript en general que discute esto.Fusión de código fuente/preprocesamiento
Como se mencionó en la parte superior de esta respuesta, muchos desarrolladores utilizan herramientas de construcción/transpilación como Parcel, Webpack, o Babel en sus proyectos, lo que les permite utilizar la próxima sintaxis de JavaScript, proporcionar compatibilidad con navegadores antiguos, combinar archivos, minificar, realizar la división del código, etc.
Es posible generar dinámicamente una etiqueta JavaScript y añadirla al documento HTML desde dentro de otro código JavaScript. Esto cargará el archivo de JavaScript dirigido.
Tal vez puedas usar esta función que encontré en esta página ¿Cómo incluyo un archivo JavaScript en un archivo JavaScript?: