Ich versuche, Grunt als Build-Tool für meine Webanwendung zu verwenden.
Ich möchte mindestens zwei Setups haben:
I. Entwicklungssetup - Laden Sie Skripte aus separaten Dateien ohne Verkettung.
meine index.html würde also ungefähr so aussehen:
<!DOCTYPE html>
<html>
<head>
<script src="js/module1.js" />
<script src="js/module2.js" />
<script src="js/module3.js" />
...
</head>
<body></body>
</html>
II. Produktions-Setup - Laden Sie meine Skripte minimiert und verkettet in eine Datei.
mit index.html entsprechend:
<!DOCTYPE html>
<html>
<head>
<script src="js/MyApp-all.min.js" />
</head>
<body></body>
</html>
Die Frage ist, wie kann ich grunzen lassen, um diese index.html abhängig von der Konfiguration zu machen, wenn ich grunt dev
oder ausführe grunt prod
?
Oder vielleicht grabe ich in die falsche Richtung und es wäre einfacher, immer zu generieren, MyApp-all.min.js
aber entweder alle meine Skripte (verkettet) oder ein Loader-Skript, das diese Skripte asynchron aus separaten Dateien lädt, darin abzulegen?
Wie machst du das, Jungs?
quelle
Antworten:
Ich habe kürzlich diese Grunt-
v0.4.0
kompatiblen Aufgaben entdeckt:Grunz-Vorprozess
grunzen-env
Unten sind Ausschnitte aus meinem
Gruntfile.js
.ENV-Setup:
Vorverarbeitung:
Aufgaben:
Und in der
/src/tmpl/index.html
Vorlagendatei (zum Beispiel):Ich bin mir sicher, dass mein Setup anders ist als das der meisten Leute, und der Nutzen des oben genannten hängt von Ihrer Situation ab. Für mich ist das Yeoman- Grunz-Usemin zwar ein großartiger Code, aber robuster als ich persönlich brauche.
HINWEIS: Ich habe heute gerade die oben aufgeführten Aufgaben entdeckt, sodass mir möglicherweise eine Funktion fehlt und / oder sich mein Prozess später ändern kann. Im Moment liebe ich die Einfachheit und die Funktionen, die Grunt-Preprocess und Grunt-Env bieten. :) :)
Update Januar 2014:
Motiviert durch eine Abwertung ...
Als ich diese Antwort veröffentlichte, gab es für Grunt nicht viele Optionen
0.4.x
, die eine Lösung boten, die meinen Anforderungen entsprach. Jetzt, Monate später, würde ich vermuten, dass es mehr Optionen gibt, die besser sein könnten als das, was ich hier gepostet habe. Während ich diese Technik für meine Builds immer noch persönlich verwende und gerne verwende, bitte ich zukünftige Leser, sich die Zeit zu nehmen, die anderen gegebenen Antworten zu lesen und alle Optionen zu recherchieren. Wenn Sie eine bessere Lösung finden, posten Sie bitte Ihre Antwort hier.Update Februar 2014:
Ich bin mir nicht sicher, ob es jemandem helfen wird, aber ich habe dieses Demo-Repository auf GitHub erstellt , das ein vollständiges (und komplexeres Setup) unter Verwendung der oben beschriebenen Technik (en) zeigt.
quelle
path : '/<%= pkg.name %>/dist/<%= pkg.version %>/<%= now %>/<%= ver %>'
die alle Variablen enthält (das ist mein Erstellungspfad). Auf meiner Vorlage habe ich :<script src="http://cdn.foo.com<!-- @echo path -->/js/bulldog.min.js"></script>
. Wie auch immer, ich bin froh, dass ich dir etwas Zeit sparen konnte! : Ddata
Objekt für dev / prod übergeben.Ich habe meine eigene Lösung gefunden. Noch nicht poliert, aber ich denke, ich werde mich in diese Richtung bewegen.
Im Wesentlichen verwende ich grunt.template.process () , um meine
index.html
aus einer Vorlage zu generieren , die die aktuelle Konfiguration analysiert und entweder eine Liste meiner ursprünglichen Quelldateien oder Links zu einer einzelnen Datei mit verkleinertem Code erstellt. Das folgende Beispiel gilt für js-Dateien, aber der gleiche Ansatz kann auf CSS und andere mögliche Textdateien erweitert werden.grunt.js
::index.js (the index task)
::Schließlich
index.tmpl
mit eingebauter Generierungslogik:UPD. Es wurde herausgefunden, dass Yeoman , das auf Grunzen basiert, eine integrierte Usemin- Aufgabe hat, die in Yeomans Build-System integriert ist. Es generiert eine Produktionsversion von index.html aus Informationen in der Entwicklungsversion von index.html sowie anderen Umgebungseinstellungen. Ein bisschen raffiniert, aber interessant anzusehen.
quelle
grunt.template.process()
(den Sie hier verwenden), der dies noch einfacher machen würde. Sie können dasselbe mit grunt-template tun,indem Sie einfach ein anderesdata
Objekt für dev / prod übergeben.Ich mag die Lösungen hier nicht (einschließlich der, die ich zuvor gegeben habe ) und hier ist der Grund:
Ich habe herausgefunden, wie ich diese beiden Probleme lösen kann. Ich habe meine Grunzaufgabe so eingerichtet, dass jedes Mal, wenn eine Datei hinzugefügt oder gelöscht wird, die Skript-Tags automatisch generiert werden, um dies widerzuspiegeln. Auf diese Weise müssen Sie weder Ihre HTML-Datei noch Ihre Grunzdatei ändern, wenn Sie Ihre JS-Dateien hinzufügen / entfernen / umbenennen.
Um zusammenzufassen, wie das funktioniert, habe ich eine HTML-Vorlage mit einer Variablen für die Skript-Tags. Ich benutze https://github.com/alanshaw/grunt-include-replace , um diese Variable zu füllen. Im Dev-Modus stammt diese Variable aus einem Globbing-Muster aller meiner JS-Dateien. Die Überwachungsaufgabe berechnet diesen Wert neu, wenn eine JS-Datei hinzugefügt oder entfernt wird.
Um im Entwicklungs- oder Produktmodus unterschiedliche Ergebnisse zu erzielen, füllen Sie diese Variable einfach mit einem anderen Wert. Hier ist ein Code:
jsSrcFileArray
ist Ihr typisches Grunzmuster.jsScriptTags
nimmt dasjsSrcFileArray
und verkettet sie zusammen mitscript
Tags auf beiden Seiten.destPath
ist das Präfix, das ich für jede Datei haben möchte.Und so sieht HTML aus:
Wie Sie in der Konfiguration sehen können, generiere ich den Wert dieser Variablen als fest codiertes
script
Tag, wenn sie improd
Modus ausgeführt wird. Im Dev-Modus wird diese Variable auf einen Wert wie den folgenden erweitert:Lassen Sie mich wissen, wenn Sie Fragen haben.
PS: Dies ist eine verrückte Menge an Code für etwas, das ich in jeder clientseitigen JS-App tun möchte. Ich hoffe, jemand kann daraus ein wiederverwendbares Plugin machen. Vielleicht werde ich eines Tages.
quelle
I've set up my grunt task so that every time a file is added or deleted, the script tags automatically get generated to reflect that
Wie hast du das gemacht?<script>
Tags zu löschen ?destPath
vonjsScriptTags
und tauschtegrunt.file.expandMapping
mit ,grunt.file.expand
da die Dateien , die ich bereits an den richtigen Stellen wollte. Dies hat die Dinge sehr vereinfacht. Danke @DanielKaplan, du hast mir sehr viel Zeit gespart :)Ich habe mir schon eine Weile die gleiche Frage gestellt und ich denke, dieses Grunz-Plugin könnte so konfiguriert werden, dass es das tut, was Sie wollen: https://npmjs.org/package/grunt-targethtml . Es implementiert bedingte HTML-Tags, die vom Grunzziel abhängen.
quelle
Ich suchte nach einer einfacheren und direkteren Lösung und kombinierte die Antwort aus dieser Frage:
So platzieren Sie einen anderen Block in gruntfile.js
und kam mit folgenden einfachen Schritten:
Verwenden Sie die folgende Logik im concat / copy-Block Ihrer Gruntfile.js für Ihre index.html-Datei:
Führen Sie 'grunt --Release' aus, um die Datei index-product.html auszuwählen, und lassen Sie das Flag weg, um die Entwicklungsversion zu erhalten.
Keine neuen Plugins zum Hinzufügen oder Konfigurieren und keine neuen Grunzaufgaben.
quelle
Diese Grunzaufgabe namens scriptlinker scheint eine einfache Möglichkeit zu sein, die Skripte im Entwicklungsmodus hinzuzufügen. Sie könnten wahrscheinlich zuerst eine Concat-Task ausführen und sie dann im Prod-Modus auf Ihre verkettete Datei verweisen.
quelle
<!--SINON COMPONENT SCRIPTS-->
und<!--SPEC SCRIPTS-->
. Und hier ist die Grunt-Aufgabe, die es erledigt (eine tatsächlich funktionierende, im Gegensatz zu den Dingen in den Dokumenten). Hoffe es hilft;)grunt-dom-munger liest und bearbeitet HTML mit CSS-Selektoren. Ex. Lesen Sie Tags aus Ihrem HTML. Entfernen Sie Knoten, fügen Sie Knoten hinzu und vieles mehr.
Sie können grunt-dom-munger verwenden, um alle Ihre JS-Dateien zu lesen, die durch Ihre index.html verknüpft sind, sie hässlich machen und dann grunt-dom-munger erneut verwenden, um Ihre index.html so zu ändern, dass nur die minimierte JS verknüpft wird
quelle
Ich habe ein Grunz-Plugin namens grunt-dev-prod-switch gefunden. Alles, was es tut, ist, bestimmte Blöcke zu kommentieren, nach denen es sucht, basierend auf einer --env-Option, die Sie an grunzen übergeben (obwohl es Sie auf dev, prod und test beschränkt).
Sobald Sie es wie hier beschrieben eingerichtet haben , können Sie beispielsweise Folgendes ausführen:
grunt serve --env=dev
und alles, was es tut, ist die Blöcke auskommentieren, die von umbrochen werdenund es werden Blöcke auskommentiert, die von umwickelt werden
Es funktioniert auch mit Javascript. Ich verwende es, um die richtige IP-Adresse für meine Backend-API einzurichten. Die Blöcke ändern sich einfach zu
In Ihrem Fall wäre es so einfach:
quelle
grunt-bake ist ein fantastisches grunt-Skript, das hier großartig funktionieren würde. Ich verwende es in meinem JQM-Auto-Build-Skript.
https://github.com/imaginethepoet/autojqmphonegap
Schauen Sie sich meine grunt.coffee-Datei an:
Dies betrachtet alle Dateien in base.html und saugt sie an, um index.html zu erstellen. Das funktioniert fantastisch für mehrseitige Apps (Phonegap). Dies erleichtert die Entwicklung, da nicht alle Entwickler an einer langen, einseitigen App arbeiten (wodurch viele Konflikt-Checkins verhindert werden). Stattdessen können Sie die Seiten aufteilen und an kleineren Codestücken arbeiten und mit einem Überwachungsbefehl zur vollständigen Seite kompilieren.
Bake liest die Vorlage aus base.html und fügt die HTML-Seiten der Komponente in watch ein.
jQuery Mobile Demos
app.initialize ();
Sie können noch einen Schritt weiter gehen und Ihren Seiten Injektionen für "Menüs", "Popups" usw. hinzufügen, damit Sie Seiten wirklich in kleinere verwaltbare Komponenten aufteilen können.
quelle
Verwenden Sie eine Kombination aus Wiredep https://github.com/taptapship/wiredep und Usemin https://github.com/yeoman/grunt-usemin , damit Grunzen diese Aufgaben erledigt. Wiredep fügt Ihre Abhängigkeiten einzeln als Skriptdatei hinzu, und usemin verkettet sie alle zu einer einzigen Datei für die Produktion. Dies kann dann mit nur einigen HTML-Kommentaren erreicht werden. Zum Beispiel werden meine Bower-Pakete automatisch eingeschlossen und dem HTML hinzugefügt, wenn ich Folgendes ausführe
bower install && grunt bowerInstall
:quelle
Diese Antwort ist nichts für Noobs!
Verwenden Sie Jade-Vorlagen ... Das Übergeben von Variablen an eine Jade-Vorlage ist ein Standard-Anwendungsfall
Ich benutze Grunzen (Grunt-Contrib-Jade), aber Sie müssen kein Grunzen verwenden. Verwenden Sie einfach das Standard-npm-Jademodul.
Wenn Sie grunzen, dann möchte Ihre Grunzdatei so etwas wie ...
Wir können jetzt einfach auf die Daten zugreifen, die von grunt in der Jade-Vorlage übergeben wurden.
Ähnlich wie bei Modernizr habe ich eine CSS-Klasse für das HTML-Tag entsprechend dem Wert der übergebenen Variablen festgelegt und kann von dort aus die JavaScript-Logik verwenden, je nachdem, ob die CSS-Klasse vorhanden ist oder nicht.
Dies ist ideal, wenn Sie Angular verwenden, da Sie ng-ifs ausführen können, um Elemente in die Seite aufzunehmen, je nachdem, ob die Klasse vorhanden ist.
Zum Beispiel könnte ich ein Skript einfügen, wenn die Klasse vorhanden ist ...
(Zum Beispiel könnte ich das Live-Reload-Skript in dev, aber nicht in die Produktion aufnehmen.)
quelle
Betrachten Sie processhtml . Es ermöglicht die Definition mehrerer "Ziele" für Builds. Kommentare werden verwendet, um Material bedingt in den HTML-Code aufzunehmen oder aus ihm auszuschließen:
wird
Es gibt sogar vor, solche raffinierten Dinge zu tun (siehe README-Datei ):
quelle