Existe-t-il quelque chose en JavaScript similaire à @import
CSS qui vous permet d'inclure un fichier JavaScript dans un autre fichier JavaScript?
javascript
file
import
include
Alec Smart
la source
la source
script
balises ordonnées ?Réponses:
Les anciennes versions de JavaScript n'avaient pas d'importation, d'inclusion ou d'exigence, donc de nombreuses approches différentes de ce problème ont été développées.
Mais depuis 2015 (ES6), JavaScript a la norme des modules ES6 pour importer des modules dans Node.js, qui est également pris en charge par la plupart des navigateurs modernes .
Pour la compatibilité avec les anciens navigateurs, des outils de construction comme Webpack et Rollup et / ou outils de transpilation comme Babel peuvent être utilisés.
Modules ES6
Les modules ECMAScript (ES6) sont pris en charge dans Node.js depuis la v8.5, avec l'
--experimental-modules
indicateur, et depuis au moins Node.js v13.8.0 sans l'indicateur. Pour activer « ESM » ( par rapport précédent système de module de style CommonJS de Node.js [ « CJS »]) vous soit utiliser"type": "module"
danspackage.json
ou donner les fichiers l'extension.mjs
. (De même, les modules écrits avec le module CJS précédent de Node.js peuvent être nommés.cjs
si votre valeur par défaut est ESM.)En utilisant
package.json
:Ensuite
module.js
:Ensuite
main.js
:En utilisant
.mjs
, vous auriezmodule.mjs
:Ensuite
main.mjs
:Modules ECMAScript dans les navigateurs
Les navigateurs prennent en charge le chargement direct des modules ECMAScript (aucun outil tel que Webpack n'est requis) depuis Safari 10.1, Chrome 61, Firefox 60 et Edge 16. Vérifiez la prise en charge actuelle sur caniuse . Il n'est pas nécessaire d'utiliser l'
.mjs
extension Node.js ; les navigateurs ignorent complètement les extensions de fichiers sur les modules / scripts.En savoir plus sur https://jakearchibald.com/2017/es-modules-in-browsers/
Importations dynamiques dans les navigateurs
Les importations dynamiques permettent au script de charger d'autres scripts selon les besoins:
En savoir plus sur https://developers.google.com/web/updates/2017/11/dynamic-import
Node.js nécessite
L'ancien style de module CJS, encore largement utilisé dans Node.js, est le
module.exports
/require
système.Il existe d'autres façons pour JavaScript d'inclure du contenu JavaScript externe dans les navigateurs qui ne nécessitent pas de prétraitement.
Chargement AJAX
Vous pouvez charger un script supplémentaire avec un appel AJAX puis l'utiliser
eval
pour l'exécuter. C'est le moyen le plus simple, mais il est limité à votre domaine en raison du modèle de sécurité JavaScript sandbox. L'utilisationeval
ouvre également la porte à des bugs, des hacks et des problèmes de sécurité.Récupérer le chargement
Comme Dynamic Imports, vous pouvez charger un ou plusieurs scripts avec un
fetch
appel en utilisant des promesses pour contrôler l'ordre d'exécution des dépendances de script à l'aide de la bibliothèque Fetch Inject :Chargement de jQuery
La bibliothèque jQuery fournit une fonctionnalité de chargement sur une seule ligne :
Chargement de script dynamique
Vous pouvez ajouter une balise de script avec l'URL du script dans le code HTML. Pour éviter les frais généraux de jQuery, c'est une solution idéale.
Le script peut même résider sur un autre serveur. De plus, le navigateur évalue le code. La
<script>
balise peut être injectée dans la page Web<head>
ou insérée juste avant la</body>
balise de fermeture .Voici un exemple de la façon dont cela pourrait fonctionner:
Cette fonction ajoutera une nouvelle
<script>
balise à la fin de la section d'en-tête de la page, où l'src
attribut est défini sur l'URL qui est donnée à la fonction comme premier paramètre.Ces deux solutions sont discutées et illustrées dans JavaScript Madness: Dynamic Script Loading .
Détecter quand le script a été exécuté
Maintenant, il y a un gros problème que vous devez connaître. Cela implique que vous chargez le code à distance . Les navigateurs Web modernes chargeront le fichier et continueront d'exécuter votre script actuel car ils chargent tout de manière asynchrone pour améliorer les performances. (Cela s'applique à la fois à la méthode jQuery et à la méthode de chargement manuel de script dynamique.)
Cela signifie que si vous utilisez ces astuces directement, vous ne pourrez pas utiliser votre code nouvellement chargé la ligne suivante après avoir demandé son chargement , car il sera toujours en cours de chargement.
Par exemple:
my_lovely_script.js
contientMySuperObject
:Ensuite, vous rechargez la page qui frappe F5. Et il fonctionne! Déroutant...
Que faire alors?
Eh bien, vous pouvez utiliser le hack que l'auteur suggère dans le lien que je vous ai donné. En résumé, pour les personnes pressées, il utilise un événement pour exécuter une fonction de rappel lorsque le script est chargé. Vous pouvez donc mettre tout le code à l'aide de la bibliothèque distante dans la fonction de rappel. Par exemple:
Ensuite, vous écrivez le code que vous souhaitez utiliser APRÈS le chargement du script dans une fonction lambda :
Ensuite, vous exécutez tout cela:
Notez que le script peut s'exécuter après le chargement du DOM ou avant, selon le navigateur et si vous avez inclus la ligne
script.async = false;
. Il y a un excellent article sur le chargement de Javascript en général qui en discute.Fusion / prétraitement du code source
Comme mentionné en haut de cette réponse, de nombreux développeurs utilisent des outils de construction / transpilation comme Parcel, Webpack ou Babel dans leurs projets, leur permettant d'utiliser la syntaxe JavaScript à venir, de fournir une compatibilité descendante pour les navigateurs plus anciens, de combiner des fichiers, de réduire, effectuer le fractionnement de code, etc.
la source
onreadystatechange
événement etreadyState
propriété). De plus, le chargement de script dynamique ne bénéficie pas des scanners de préchargement du navigateur. Recommander cet article HTML5Rocks: html5rocks.com/en/tutorials/speed/script-loadingSi quelqu'un recherche quelque chose de plus avancé, essayez RequireJS . Vous obtiendrez des avantages supplémentaires tels que la gestion des dépendances, une meilleure simultanéité et éviterez la duplication (c'est-à-dire la récupération d'un script plus d'une fois).
Vous pouvez écrire vos fichiers JavaScript dans des "modules", puis les référencer en tant que dépendances dans d'autres scripts. Ou vous pouvez utiliser RequireJS comme une simple solution "allez chercher ce script".
Exemple:
Définissez les dépendances en tant que modules:
some-dependency.js
implementation.js est votre fichier JavaScript "principal" qui dépend de some-dependency.js
Extrait du README GitHub :
la source
Il existe en fait un moyen de charger un fichier JavaScript de manière non asynchrone, vous pouvez donc utiliser les fonctions incluses dans votre fichier nouvellement chargé juste après son chargement, et je pense que cela fonctionne dans tous les navigateurs.
Vous devez utiliser
jQuery.append()
sur l'<head>
élément de votre page, c'est-à-dire:Cependant, cette méthode a également un problème: si une erreur se produit dans le fichier JavaScript importé, Firebug (ainsi que Firefox Error Console et Chrome Developer Tools également) signaleront sa place de manière incorrecte, ce qui est un gros problème si vous utilisez Firebug pour suivre Beaucoup d'erreurs JavaScript (je le fais). Firebug ne connaît tout simplement pas le fichier nouvellement chargé pour une raison quelconque, donc si une erreur se produit dans ce fichier, il signale qu'elle s'est produite dans votre fichier HTML principal , et vous aurez du mal à trouver la vraie raison de l'erreur.
Mais si cela ne vous pose pas de problème, cette méthode devrait fonctionner.
J'ai en fait écrit un plugin jQuery appelé $ .import_js () qui utilise cette méthode:
Donc, tout ce que vous devez faire pour importer JavaScript est:
J'ai également fait un test simple pour cela à Example .
Il inclut un
main.js
fichier dans le HTML principal puis le scriptmain.js
utilisé$.import_js()
pour importer un fichier supplémentaire appeléincluded.js
, qui définit cette fonction:Et juste après l'inclusion
included.js
, lahello()
fonction est appelée et vous obtenez l'alerte.(Cette réponse fait suite au commentaire d'e-satis).
la source
jQuery.getScript
, de cette façon vous n'avez pas à vous soucier de l'écriture du plugin ...script
élément à lehead
fera fonctionner de manière asynchrone, sauf si leasync
est spécifiquement défini surfalse
."
, le code se casseraUne autre façon, qui à mon avis est beaucoup plus propre, est de faire une requête Ajax synchrone au lieu d'utiliser une
<script>
balise. C'est également ainsi que Node.js gère les inclus.Voici un exemple utilisant jQuery:
Vous pouvez ensuite l'utiliser dans votre code comme vous utiliseriez habituellement un include:
Et pouvoir appeler une fonction à partir du script requis sur la ligne suivante:
la source
async: false
est censé être obsolète. Ce n'est pas! Comme l'indique votre citation, seuls les éléments liés à jqXHR le sont.Il y a une bonne nouvelle pour toi. Très bientôt, vous pourrez facilement charger du code JavaScript. Il deviendra un moyen standard d'importer des modules de code JavaScript et fera partie du noyau JavaScript lui-même.
Il suffit d'écrire
import cond from 'cond.js';
pour charger une macro nommée àcond
partir d'un fichiercond.js
.Vous n'avez donc pas à vous fier à un framework JavaScript ni à faire explicitement des appels Ajax .
Faire référence à:
Résolution du module statique
Chargeurs de modules
la source
Il est possible de générer dynamiquement une balise JavaScript et de l'ajouter au document HTML à partir d'un autre code JavaScript. Cela chargera le fichier JavaScript ciblé.
la source
js.onload = callback;
La déclaration
import
est dans ECMAScript 6.Syntaxe
la source
Peut-être pouvez-vous utiliser cette fonction que j'ai trouvée sur cette page Comment puis-je inclure un fichier JavaScript dans un fichier JavaScript? :
la source
script.onload = callback;
var
, la variable sera globale?head
.Voici une version synchrone sans jQuery :
Notez que pour obtenir cet inter-domaine fonctionnel, le serveur devra définir l'en-
allow-origin
tête dans sa réponse.la source
http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js
)<script>
balise insérée , pas viaXMLHttpRequest
.const XMLHttpRequest = Components.Constructor("@mozilla.org/xmlextras/xmlhttprequest;1");
Je viens d'écrire ce code JavaScript (en utilisant Prototype pour la manipulation DOM ):
Usage:
Gist: http://gist.github.com/284442 .
la source
Voici la version généralisée de la façon dont Facebook le fait pour leur bouton J'aime omniprésent:
Si cela fonctionne pour Facebook, cela fonctionnera pour vous.
La raison pour laquelle nous recherchons le premier
script
élément au lieu dehead
oubody
est parce que certains navigateurs n'en créent pas s'il est manquant, mais nous avons la garantie d'avoir unscript
élément - celui-ci. En savoir plus sur http://www.jspatterns.com/the-ridiculous-case-of-adding-a-script-element/ .la source
Si vous voulez en JavaScript pur, vous pouvez utiliser
document.write
.Si vous utilisez la bibliothèque jQuery, vous pouvez utiliser la
$.getScript
méthode.la source
Vous pouvez également assembler vos scripts en utilisant PHP :
Fichier
main.js.php
:la source
La plupart des solutions présentées ici impliquent un chargement dynamique. Je cherchais plutôt un compilateur qui assemble tous les fichiers dépendants en un seul fichier de sortie. Les mêmes que les préprocesseurs Less / Sass traitent la
@import
règle CSS at. Comme je n'ai rien trouvé de convenable de ce genre, j'ai écrit un outil simple pour résoudre le problème.Voici donc le compilateur, https://github.com/dsheiko/jsic , qui remplace
$import("file-path")
en toute sécurité le contenu du fichier demandé. Voici le plugin Grunt correspondant : https://github.com/dsheiko/grunt-jsic .Sur la branche principale jQuery, ils concaténent simplement les fichiers source atomiques en un seul commençant par
intro.js
et se terminant parouttro.js
. Cela ne me convient pas car il n'offre aucune flexibilité sur la conception du code source. Découvrez comment cela fonctionne avec jsic:src / main.js
src / Form / Input / Tel.js
Maintenant, nous pouvons exécuter le compilateur:
Et obtenez le fichier combiné
build / main.js
la source
Si votre intention de charger le fichier JavaScript utilise les fonctions du fichier importé / inclus , vous pouvez également définir un objet global et définir les fonctions comme éléments d'objet. Par exemple:
global.js
file1.js
file2.js
main.js
Vous devez juste être prudent lorsque vous incluez des scripts dans un fichier HTML. L'ordre doit être comme ci-dessous:
la source
Cela devrait faire:
la source
eval
est ce qui ne va pas avec elle. De Crockford , "eval
est mauvais. Laeval
fonction est la fonctionnalité la plus mal utilisée de JavaScript. Évitez-la. Aeval
des alias. N'utilisez pas leFunction
constructeur. Ne passez pas de chaînes àsetTimeout
ousetInterval
." Si vous n'avez pas lu son "JavaScript: The Good Parts" alors sortez et faites-le maintenant. Vous allez ne le regretterez pas.http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js
)Ou plutôt que d'inclure au moment de l'exécution, utilisez un script pour concaténer avant le téléchargement.
J'utilise des pignons (je ne sais pas s'il y en a d'autres). Vous créez votre code JavaScript dans des fichiers séparés et incluez les commentaires qui sont traités par le moteur Sprockets comme inclus. Pour le développement, vous pouvez inclure des fichiers séquentiellement, puis pour la production pour les fusionner ...
Voir également:
la source
J'ai eu un problème simple, mais j'ai été déconcerté par les réponses à cette question.
J'ai dû utiliser une variable (myVar1) définie dans un fichier JavaScript (myvariables.js) dans un autre fichier JavaScript (main.js).
Pour cela, j'ai fait comme ci-dessous:
Chargé le code JavaScript dans le fichier HTML, dans l'ordre correct, myvariables.js d'abord, puis main.js:
Fichier: myvariables.js
Fichier: main.js
Comme vous l'avez vu, j'ai dû utiliser une variable dans un fichier JavaScript dans un autre fichier JavaScript, mais je n'avais pas besoin d'en inclure une dans un autre. J'avais juste besoin de m'assurer que le premier fichier JavaScript était chargé avant le deuxième fichier JavaScript et que les variables du premier fichier JavaScript sont accessibles dans le deuxième fichier JavaScript, automatiquement.
Cela m'a sauvé la journée. J'espère que ça aide.
la source
import
. Vous avez besoin d'un fichier HTML pour obtenir des informations d'un fichier js à un autre.<script>
balise. Cela peut aider à l'organisation. Cette réponse n'est tout simplement pas ce que la question demandait et n'est pas idéale dans ce contexte.Dans le cas où vous utilisez Web Workers et souhaitez inclure des scripts supplémentaires dans la portée du travailleur, les autres réponses fournies sur l'ajout de scripts à la
head
balise, etc. ne fonctionneront pas pour vous.Heureusement, les Web Workers ont leur propre
importScripts
fonction qui est une fonction globale dans le cadre du Web Worker, native du navigateur lui-même car elle fait partie de la spécification .Alternativement, en tant que deuxième réponse la plus votée à vos questions , RequireJS peut également gérer l'inclusion de scripts dans un Web Worker (probablement en s'appelant
importScripts
lui-même, mais avec quelques autres fonctionnalités utiles).la source
En langage moderne avec la vérification si le script a déjà été chargé ce serait:
Utilisation (asynchrone / attente):
ou
Utilisation (promesse):
la source
var pi = 3.14
. appeler la fonction loadJS () vialoadJs("pi.js").then(function(){ console.log(pi); });
La
@import
syntaxe pour réaliser l'importation JavaScript de type CSS est possible en utilisant un outil tel que Mixture via leur.mix
type de fichier spécial (voir ici ). J'imagine que l'application utilise simplement l'une des méthodes susmentionnées en interne, bien que je ne sache pas.De la documentation Mixture sur les
.mix
fichiers:Voici un exemple de
.mix
fichier qui combine plusieurs.js
fichiers en un seul:Le mélange produit cela en tant
scripts-global.js
que version réduite (scripts-global.min.js
).Remarque: je ne suis en aucun cas affilié à Mixture, à part l'utiliser comme outil de développement frontal. Je suis tombé sur cette question en voyant un
.mix
fichier JavaScript en action (dans l'un des passe-partout Mixture) et en étant un peu confus ("vous pouvez le faire?", Je me suis dit). Ensuite, j'ai réalisé qu'il s'agissait d'un type de fichier spécifique à l'application (quelque peu décevant, d'accord). Néanmoins, je pensais que les connaissances pourraient être utiles pour les autres.MISE À JOUR : Le mélange est maintenant gratuit (hors ligne).
MISE À JOUR : Le mélange est maintenant interrompu. Les anciennes versions de mélange sont toujours disponibles
la source
la source
body
n'existe pas encore ou ne peut pas être modifié. En outre, cela aide à expliquer les réponses.Ma méthode habituelle est:
Cela fonctionne très bien et n'utilise aucun rechargement de page pour moi. J'ai essayé la méthode AJAX (l'une des autres réponses) mais cela ne semble pas fonctionner aussi bien pour moi.
Voici une explication du fonctionnement du code pour ceux qui sont curieux: il crée essentiellement une nouvelle balise de script (après la première) de l'URL. Il le définit en mode asynchrone afin de ne pas bloquer le reste du code, mais appelle un rappel lorsque le readyState (l'état du contenu à charger) passe à «chargé».
la source
Bien que ces réponses soient excellentes, il existe une "solution" simple qui existe depuis le chargement du script, et elle couvrira 99,999% des cas d'utilisation de la plupart des gens. Incluez simplement le script dont vous avez besoin avant le script qui l'exige. Pour la plupart des projets, il ne faut pas longtemps pour déterminer quels scripts sont nécessaires et dans quel ordre.
Si script2 nécessite script1, c'est vraiment le moyen le plus simple de faire quelque chose comme ça. Je suis très surpris que personne n'ait soulevé cette question, car c'est la réponse la plus évidente et la plus simple qui s'appliquera dans presque tous les cas.
la source
J'ai écrit un module simple qui automatise le travail d'importation / inclusion de scripts de module en JavaScript. Pour une explication détaillée du code, reportez-vous à l'article de blog JavaScript require / import / include modules .
la source
Ce script ajoutera un fichier JavaScript en haut de toute autre
<script>
balise:la source
Il y a aussi Head.js . Il est très facile de gérer:
Comme vous le voyez, c'est plus facile que Require.js et aussi pratique que la
$.getScript
méthode de jQuery . Il possède également des fonctionnalités avancées, comme le chargement conditionnel, la détection de fonctionnalités et bien plus encore .la source
Il existe de nombreuses réponses possibles à cette question. Ma réponse est évidemment basée sur un certain nombre d'entre eux. C'est ce que je me suis retrouvé après avoir lu toutes les réponses.
Le problème avec
$.getScript
et vraiment toute autre solution qui nécessite un rappel lorsque le chargement est terminé est que si vous avez plusieurs fichiers qui l'utilisent et dépendent les uns des autres, vous n'avez plus de moyen de savoir quand tous les scripts ont été chargés (une fois qu'ils sont imbriqués) dans plusieurs fichiers).Exemple:
file3.js
file2.js:
file1.js:
Vous avez raison lorsque vous dites que vous pouvez spécifier Ajax pour qu'il s'exécute de manière synchrone ou utiliser XMLHttpRequest , mais la tendance actuelle semble être de déprécier les demandes synchrones, de sorte que vous ne pouvez pas obtenir une prise en charge complète du navigateur maintenant ou à l'avenir.
Vous pouvez essayer d'utiliser
$.when
pour vérifier un tableau d'objets différés, mais maintenant vous le faites dans chaque fichier et le fichier2 sera considéré comme chargé dès que le$.when
sera exécuté et non lorsque le rappel sera exécuté, donc le fichier1 continue son exécution avant le chargement du fichier3 . Cela a vraiment toujours le même problème.J'ai décidé de reculer au lieu d'avancer. Je vous remercie
document.writeln
. Je sais que c'est tabou, mais tant qu'il est utilisé correctement, cela fonctionne bien. Vous vous retrouvez avec du code qui peut être débogué facilement, s'affiche correctement dans le DOM et peut garantir l'ordre de chargement correct des dépendances.Vous pouvez bien sûr utiliser $ ("body"). Append (), mais vous ne pourrez plus déboguer correctement.
REMARQUE: vous ne devez l'utiliser que pendant le chargement de la page, sinon vous obtenez un écran vide. En d'autres termes, placez toujours ceci avant / en dehors de document.ready . Je n'ai pas testé l'utilisation de cela après le chargement de la page dans un événement de clic ou quelque chose comme ça, mais je suis sûr que cela échouera.
J'ai aimé l'idée d'étendre jQuery, mais évidemment vous n'en avez pas besoin.
Avant d'appeler
document.writeln
, il vérifie que le script n'a pas déjà été chargé en évaluant tous les éléments du script.Je suppose qu'un script n'est pas entièrement exécuté tant que son
document.ready
événement n'a pas été exécuté. (Je sais que l'utilisationdocument.ready
n'est pas obligatoire, mais beaucoup de gens l'utilisent, et la manipulation est une sauvegarde.)Lorsque les fichiers supplémentaires sont chargés, les
document.ready
rappels seront exécutés dans le mauvais ordre. Pour résoudre ce problème lorsqu'un script est réellement chargé, le script qui l'a importé est lui-même réimporté et l'exécution arrêtée. Cela provoque ledocument.ready
rappel du fichier d'origine exécuté à partir de n'importe quel script qu'il importe.Au lieu de cette approche, vous pouvez essayer de modifier le jQuery
readyList
, mais cela semble être une pire solution.Solution:
Usage:
Fichier3:
Fichier2:
Fichier1:
la source
Il existe plusieurs façons d'implémenter des modules en Javascript, voici les 2 plus populaires:
Modules ES6
Les navigateurs ne prennent pas encore en charge ce système de modulation, donc pour pouvoir utiliser cette syntaxe, vous devez utiliser un bundler comme webpack. Il est préférable d'utiliser un bundler de toute façon, car cela peut combiner tous vos différents fichiers en un seul fichier (ou en couple). Cela servira les fichiers du serveur vers le client plus rapidement car chaque requête HTTP est accompagnée d'une surcharge associée. Ainsi, en réduisant la requête HTTP globale, nous améliorons les performances. Voici un exemple de modules ES6:
CommonJS (utilisé dans NodeJS)
Ce système de modulation est utilisé dans NodeJS. Vous ajoutez essentiellement vos exportations à un objet qui est appelé
module.exports
. Vous pouvez ensuite accéder à cet objet via unrequire('modulePath')
. L'important ici est de réaliser que ces modules sont mis en cache, donc si vousrequire()
un certain module deux fois, il retournera le module déjà créé.la source
Je suis venu à cette question parce que je cherchais un moyen simple de maintenir une collection de plugins JavaScript utiles. Après avoir vu certaines des solutions ici, j'ai trouvé ceci:
Configurez un fichier appelé "plugins.js" (ou extensions.js ou tout ce que vous voulez). Conservez vos fichiers de plug-in avec ce seul fichier maître.
plugins.js aura un tableau appelé
pluginNames[]
que nous allons parcourireach()
, puis ajouter une<script>
balise à la tête de chaque plugin<script src="js/plugins/plugins.js"></script>
MAIS:
Même si tous les plugins sont déposés dans la balise head comme ils le devraient, ils ne sont pas toujours exécutés par le navigateur lorsque vous cliquez sur la page ou que vous actualisez.
J'ai trouvé qu'il est plus fiable d'écrire simplement les balises de script dans une inclusion PHP. Vous n'avez qu'à l'écrire une fois et c'est tout autant de travail que d'appeler le plugin en utilisant JavaScript.
la source