Wie kann ich eine js-Datei in eine andere js-Datei einfügen, um mich an die DRY-Prinzip und Duplizierung von Code vermeiden.
Wie füge ich eine js-Datei in eine andere js-Datei ein? [duplicate]
Aditya Shukla
Mattball
Sie können eine Skriptdatei nur in eine HTML-Seite einfügen, nicht in eine andere Skriptdatei. Das heißt, Sie kann Schreiben Sie JavaScript, das Ihr “eingeschlossenes” Skript in dieselbe Seite lädt:
var imported = document.createElement('script');
imported.src="https://stackoverflow.com/path/to/imported/script";
document.head.appendChild(imported);
Es besteht jedoch eine gute Chance, dass Ihr Code von Ihrem “eingeschlossenen” Skript abhängt. In diesem Fall kann es jedoch fehlschlagen, da der Browser das “importierte” Skript asynchron lädt. Am besten verwenden Sie einfach eine Bibliothek eines Drittanbieters wie jQuery oder YUI, die dieses Problem für Sie löst.
// jQuery
$.getScript('/path/to/imported/script.js', function()
{
// script is now loaded and executed.
// put your dependent JS here.
});
-
Ich kann nur wiederholen: bei Gebrauch
$.getScript
Das zweite abhängige Skript wird zum Laden gestartet nachdem der erste geladen und ausgeführt wurde. es ist sequentielles statt paralleles Laden. Außerdem, wenn jemand pro enthalten<script>
eine solcheloader.js
Datei, die eine JavaScript-Bibliothek lädt (denken Sie zum Beispiel an jQuery UI), als man die nicht einfach laden kannmain.js
die die Bibliothek im nächsten verwenden<script>
. Daher wird die Verwendung der JavaScript-Bibliothek nicht so einfach wie gewöhnlich sein. Zum Verständnis: Ich möchte den Weg nutzen, aber man sollte noch etwas mehr vorschlagen, um ihn praktikabel zu machen.– Oleg
9. Januar 11 um 0:05 Uhr
-
Im Falle Ihres ersten Vorschlags muss man verwenden
imported.onload
um die Skripte zu kaskadieren. Aber in dem Fall haben wir weiterhin die gleichen Probleme, die ich beschrieben habe.– Oleg
9. Januar 11 um 0:09 Uhr
-
Wenn Sie beispielsweise “Timelines” der Entwicklertools von Google Chrome verwenden, können Sie dies überprüfen ok-soft-gmbh.com/jqGrid/iedeveloper.htm Gebraucht
document.writeln
lädt Skripte parallel und führt (auswertet) in der gleichen richtigen Reihenfolge aus. Die Seite ist XHTML und daher sind die ersten Aussagen von stackoverflow.com/questions/802854/… auch falsch. Also nicht gefunden und begründet (was ich verifizieren konnte) warum es ist schlecht zu benutzendocument.writeln
Innen<script>
platziert in der<head>
. Ich möchte, dass mir jemand einen postet.– Oleg
9. Januar 11 um 0:47 Uhr
-
Laut dieser Dokumentation developer.mozilla.org/en-US/docs/Web/HTML/Element/script Mit HTML5 können Sie async=”false” angeben, wenn Sie document.createElement() verwenden, um zu erzwingen, dass das Laden synchron ist. Dies scheint das Problem bei der Verwendung dieser Methode zu lösen.
– Steve Waring
19. Mai ’19 um 19:30 Uhr
-
Als ich dies jedoch mit einer Warnung nach dem appendChild und einer Warnung als erste Zeile des eingefügten Skripts getestet habe, kam die Warnung aus dem eingefügten Skript an zweiter Stelle, es war also kein synchrones Laden.
– Steve Waring
19. Mai ’19 um 19:45 Uhr
Oleg
Ich stimme dem nicht zu document.write
Technik (siehe Vorschlag von Vahan Margaryan). Ich mag document.getElementsByTagName('head')[0].appendChild(...)
(siehe Vorschlag von Matt Ball), aber es gibt ein wichtiges Problem: die Ausführungsreihenfolge des Skripts.
In letzter Zeit habe ich viel Zeit mit der Reproduktion verbracht ein ähnliches Problemund sogar das bekannte jQuery-Plug-in verwendet dieselbe Technik (siehe src Hier), um die Dateien zu laden, aber auch andere haben das Problem gemeldet. Stellen Sie sich vor, Sie haben eine JavaScript-Bibliothek, die aus vielen Skripten und einem besteht loader.js
lädt alle Teile. Einige Teile sind voneinander abhängig. Stellen Sie sich vor, Sie schließen eine andere ein main.js
Skript pro <script>
die die Objekte aus verwendet loader.js
unmittelbar nach dem loader.js
. Das Problem war das manchmal main.js
wird ausgeführt, bevor alle Skripte geladen sind loader.js
. Die Verwendung von $(document).ready(function () {/*code here*/});
Innen main.js
Skript hilft nicht. Die Verwendung von Kaskadierung onload
Ereignishandler in der loader.js
führt dazu, dass das Skript sequentiell statt parallel geladen wird, und erschwert die Verwendung main.js
Skript, das nur irgendwo dahinter enthalten sein sollte loader.js
.
Indem ich das Problem in meiner Umgebung reproduziere, kann ich sehen, dass **die Ausführungsreihenfolge der Skripts in Internet Explorer 8 bei der Einbeziehung von JavaScript abweichen kann*. Es ist ein sehr schwieriges Problem, wenn Sie Skripte einschließen müssen, die voneinander abhängig sind. Das Problem ist in beschrieben Javascript-Dateien parallel ladenund die vorgeschlagene Problemumgehung ist die Verwendung document.writeln
:
document.writeln("<script type="text/javascript" src="https://stackoverflow.com/questions/4634644/Script1.js"></script>");
document.writeln("<script type="text/javascript" src="Script2.js"></script>");
Im Fall von “Die Skripte werden parallel heruntergeladen, aber in der Reihenfolge ausgeführt, in der sie auf die Seite geschrieben wurden”, nach dem Wechsel von document.getElementsByTagName('head')[0].appendChild(...)
Technik zu document.writeln
ich hatte das Problem nicht mehr gesehen.
Daher empfehle ich Ihnen die Verwendung document.writeln
.
AKTUALISIERT: Wenn jemand interessiert ist, kann er versuchen, zu laden (und neu zu laden) Die Seite im Internet Explorer (die Seite verwendet die document.getElementsByTagName('head')[0].appendChild(...)
Technik), und vergleichen Sie dann mit die fixierte Version Gebraucht document.writeln
. (Der Code der Seite ist relativ schmutzig und stammt nicht von mir, aber er kann verwendet werden, um das Problem zu reproduzieren).
Vahan Margaryan
Sie müssen ein document.write-Objekt schreiben:
document.write('<script type="text/javascript" src="https://stackoverflow.com/questions/4634644/file.js" ></script>');
und platzieren Sie es in Ihrer Haupt-Javascript-Datei
-
Uh, bitte tun nicht plädieren für die Verwendung
document.write()
.– Mattball
8. Januar 11 um 15:49 Uhr
-
@Matt Ball: Du hast Recht, aber da Vahan neu hier ist, möchtest du vielleicht erklären, warum.
– Konerak
8. Januar 11 um 15:51 Uhr
-
@Konerak: Hier ist der Grund.
– Mattball
8. Januar 11 um 15:52 Uhr
-
+1 Ich stimme dem Kritiker von nicht zu
document.write
. Ich schreibe mehr Informationen in meine Antwort auf die Frage.– Oleg
8. Januar 11 um 21:44 Uhr
-
@Matt: lustig, dass die am häufigsten gewählte Antwort auf diese Frage die Verwendung von document.write für einfache Dinge wie das Laden eines Skripts befürwortet.
– Fretje
9. März 11 um 15:01 Uhr
Arnab
Es ist nicht direkt möglich. Sie können auch einen Präprozessor schreiben, der damit umgehen kann.
Wenn ich es richtig verstehe, dann sind die folgenden Dinge hilfreich, um das zu erreichen:
-
Verwenden Sie einen Präprozessor, der Ihre JS-Dateien durchläuft und beispielsweise nach Mustern wie „@import somefile.js“ sucht und diese durch den Inhalt der eigentlichen Datei ersetzt. Nicholas Zakas (Yahoo) hat eine solche Bibliothek in Java geschrieben, die Sie verwenden können (http://www.nczonline.net/blog/2009/09/22/introducing-combiner-a-javascriptcss-concatenation-tool/)
-
Wenn Sie Ruby on Rails verwenden, können Sie das Jammit-Asset-Packaging ausprobieren. Es verwendet die Konfigurationsdatei „assets.yml“, in der Sie Ihre Pakete definieren können, die mehrere Dateien enthalten können, und sie dann auf Ihrer eigentlichen Webseite mit dem Paketnamen verweisen.
-
Versuchen Sie es mit einem Modullader wie z RequireJS oder ein Skriptlader wie LabJs mit der Möglichkeit, die Ladereihenfolge zu steuern und paralleles Herunterladen zu nutzen.
JavaScript bietet derzeit keine “native” Möglichkeit, eine JavaScript-Datei in eine andere wie CSS einzufügen ( @import ), aber alle oben genannten Tools/Möglichkeiten können hilfreich sein, um das von Ihnen erwähnte DRY-Prinzip zu erreichen. Ich kann verstehen, dass es sich möglicherweise nicht intuitiv anfühlt, wenn Sie einen serverseitigen Hintergrund haben, aber so sind die Dinge. Für Front-End-Entwickler ist dieses Problem normalerweise ein „Bereitstellungs- und Verpackungsproblem“.
Ich hoffe es hilft.
.
mögliches Duplikat von Einschließen einer .js-Datei in eine .js-Datei oder diese
– Benutzer113716
8. Januar 11 um 15:47 Uhr
Dies scheint jetzt die kanonische Dupe-Wahl zu sein.
– ggorlen
3. Oktober 20 um 19:35 Uhr