2013-10-26 6 views
8

Ich verwende grunt-usemin Plugin. Ich frage mich, wie es weiter geht.grunt-usemin: Definieren benutzerdefinierter Fluss

Ich habe zwei Blöcke von Utimin Config in index.html.

<!-- build:js /scripts/scriptsmin.js --> 
<script src="/scripts/jquery.min.js"></script> 
... 
... 
<!-- endbuild --> 

<!-- build:js /scripts/scripts.js --> 
<script src="/scripts/app.js"></script> 
.... 
... 
<!-- endbuild --> 

Der erste Block, scriptsmin.js, ist eine Minifikationsdatei. Zweitens, scripts.js, enthält alle Dateien, die eine Verkleinerung benötigen.

Ich mag es.

  1. Lauf minifier (uglifyjs) auf dem zweiten Block
  2. concat ersten Block mit verkleinerten Version des zweiten (Schritt 1) ​​

Ist es möglich, wenn diese Blöcke in der gleichen Datei sind. Ich habe einen Abschnitt über flow gesehen. Konnte nicht folgen, ob ich den Block der Konfiguration benennen kann, und einzelnem Fluss auf jedem davon einstellen kann. Es spricht über den Fluss basierend auf dem Dateinamen (index.html). Wie soll ich den grunt useminPrepare Abschnitt schreiben.

+0

Wissen Sie, ob dies mit der aktuellen Version von grunt-usemin möglich ist? – fischermatte

Antwort

0

Frage nur, warum Sie zwei separate Ziele für Ihre JavaScript-Dateien benötigen, vor allem, wenn sie & in eine Datei verkettet werden sollen. Was ich tun würde, ist nur noch die ein Skriptblock am Ende der Datei, wie folgt aus:

<!-- build:js /scripts/scripts.js --> 
<script src="/scripts/jquery.min.js"></script> 
<script src="/scripts/app.js"></script> 
<!-- endbuild --> 

Es ist einfacher, so zu verstehen, wenn Sie alle Ihre JS an einem Block ist und nicht zwei. Die useminPrepare ist eine Aufgabe, die im Grunde Ihre Gruntfile-Konfiguration aktualisiert, um Concat-, Cssmin- und Uglify-Ziele für Ihre Skripts und Stile einzuschließen. Führen Sie es einfach auf den Dateien aus, die Ihre Build-Kommentare enthalten.

useminPrepare: { 
    html: 'build/index.html' 
} 

usemin sollte nicht zu anders aussehen zu useminPrepare, aber was Sie möchten Sie vielleicht finden tun ist ‚Samen‘ useminPrepare mit einer Datei, wenn das die gleichen Bau blockiert, wie der Rest des HTML enthält. So dass die tatsächliche usemin Config noch ein paar Dateien dort haben könnte:

usemin: { 
    html: ['build/index.html', 'build/about.html', 'build/contact.html'] 
} 

Nach useminPrepare läuft, dann concat laufen, verunstalten und cssmin Aufgaben, schließlich laufen usemin. So haben Sie eine benutzerdefinierte Aufgabe wie folgt:

grunt.registerTask('build', ['useminPrepare', 'concat', 'uglify', 'cssmin', 'usemin']); 

Ich hoffe, dies hilft.

+0

danke für Ihre Hilfe. Der Grund, warum ich zwei Blöcke habe, ist, dass ich die verkleinerten externen Bibliotheken (jquery, angular usw.) intakt halte, aber nur concat. Ich habe gelesen, dass es am besten ist, den Minifier nicht erneut durch gut getestete Minimed Files laufen zu lassen. Also halte ich sie alle in einem Block zusammen. Andere Dateien, wie meine benutzerdefinierte js, müssen minimiert werden, und dann mit anderen concat. Es gibt also nur eine Datei zum Herunterladen. Es tut mir leid, dass mir das nicht klar ist. Glauben Sie, dass es Sinn macht und möglich ist? Nochmals vielen Dank – bsr

+1

jQuery wird durch Uglify minimiert (so dass es keinen Unterschied sehen würde), Winkel durch Google Closure (so nah wie keinen Unterschied, wenn wieder mit Uglify komprimiert); Uglify selbst ist ein kampferprobtes Werkzeug, wenn Sie Probleme mit dem Ausführen von minimierten Dateien sehen, könnte es am besten sein, ein Problem zu melden, dann verwende ich Uglify, um alles zu minimieren, was ich einlade, egal ob es bereits minimiert wurde (über RequireJS & der r.js-Optimierer), und haben keine Probleme gesehen. Der einzige Nachteil ist offensichtlich, dass die Minimierung von mehr Code mehr Zeit in Anspruch nimmt, aber ich bezweifle, dass durch zweimaliges Ausführen von min Fehler auftreten. – Ben

2

Ich hatte das gleiche Problem. Wenn Sie mit zwei Dateien statt mit einem zufrieden sind, können Sie eine Verzweigung von usemin here verwenden. Es ermöglicht einige neue Strömungen, nämlich

  • Libs
  • libs2min
  • Leere
  • entfernen

Siehe full descriptions.So würde Ihr html sein:

<!-- build:libs2min /scripts/scriptsmin.js --> 
<script src="/scripts/jquery.js"></script> 
... 
... 
<!-- endbuild --> 

<!-- build:js /scripts/scripts.js --> 
<script src="/scripts/app.js"></script> 
.... 
... 
<!-- endbuild --> 

Nesting die Blöcke ist nicht wahrscheinlich eine gute Idee im Moment leider. Aber du könntest es ausprobieren. ändern Ihre package.json als so

Um die Gabel statt der regulären Grunzen-usemin zu installieren

"devDependencies": { 
    ... 
    "grunt-usemin": "Rauno56/grunt-usemin", 
    ... 
}, 

und halten ein Auge auf die wichtigsten Repo - vielleicht die Funktion davon ab, es zu nicht zu weit ist.