J'essaie d'utiliser Grunt comme outil de construction pour ma webapp.
Je veux avoir au moins deux configurations:
Configuration du développement - charger des scripts à partir de fichiers séparés, sans concaténation,
donc mon index.html ressemblerait à quelque chose comme:
<!DOCTYPE html>
<html>
<head>
<script src="js/module1.js" />
<script src="js/module2.js" />
<script src="js/module3.js" />
...
</head>
<body></body>
</html>
II. Configuration de la production - charge mes scripts minifiés et concaténés dans un seul fichier,
avec index.html en conséquence:
<!DOCTYPE html>
<html>
<head>
<script src="js/MyApp-all.min.js" />
</head>
<body></body>
</html>
La question est, comment puis-je faire grogner ces index.html en fonction de la configuration lorsque j'exécute grunt dev
ou grunt prod
?
Ou peut-être que je creuse dans la mauvaise direction et qu'il serait plus facile de toujours générer MyApp-all.min.js
mais de mettre dedans tous mes scripts (concaténés) ou un script de chargeur qui charge de manière asynchrone ces scripts à partir de fichiers séparés?
Comment faites-vous, les gars?
la source
Réponses:
J'ai récemment découvert ces
v0.4.0
tâches compatibles avec Grunt :pré-processus de grognement
grunt-env
Vous trouverez ci-dessous des extraits de mon
Gruntfile.js
.Configuration ENV:
Prétraitement:
Tâches:
Et dans le
/src/tmpl/index.html
fichier modèle (par exemple):Je suis sûr que ma configuration est différente de la plupart des gens, et l'utilité de ce qui précède dépendra de votre situation. Pour moi, bien que ce soit un morceau de code génial, le grunt-usemin de Yeoman est plus robuste que ce dont j'ai personnellement besoin.
REMARQUE: je viens de découvrir les tâches répertoriées ci-dessus aujourd'hui, il se peut donc que je manque une fonctionnalité et / ou que mon processus change en cours de route. Pour l'instant, j'aime la simplicité et les fonctionnalités que grunt-preprocess et grunt-env ont à offrir. :)
Mise à jour de janvier 2014:
Motivé par un vote négatif ...
Lorsque j'ai posté cette réponse, il n'y avait pas beaucoup d'options pour Grunt
0.4.x
qui offraient une solution qui répondait à mes besoins. Maintenant, des mois plus tard, je suppose qu'il y a plus d'options qui pourraient être meilleures que celles que j'ai publiées ici. Bien que j'utilise encore personnellement et que j'aime utiliser cette technique pour mes versions , je demande aux futurs lecteurs de prendre le temps de lire les autres réponses données et de rechercher toutes les options. Si vous trouvez une meilleure solution, veuillez poster votre réponse ici.Mise à jour de février 2014:
Je ne sais pas si cela sera utile à personne, mais j'ai créé ce référentiel de démonstration sur GitHub qui montre une configuration complète (et plus complexe) en utilisant les techniques que j'ai décrites ci-dessus.
la source
path : '/<%= pkg.name %>/dist/<%= pkg.version %>/<%= now %>/<%= ver %>'
qui concatère tous les vars (c'est mon chemin de construction). Sur mon modèle , je vais devoir:<script src="http://cdn.foo.com<!-- @echo path -->/js/bulldog.min.js"></script>
. Quoi qu'il en soit, je suis heureux d'avoir pu vous faire gagner du temps! : Ddata
objet différent pour dev / prod.J'ai trouvé ma propre solution. Pas encore poli mais je pense que je vais aller dans ce sens.
En gros, j'utilise grunt.template.process () pour générer mon à
index.html
partir d'un modèle qui analyse la configuration actuelle et produit soit une liste de mes fichiers source d'origine soit des liens vers un seul fichier avec du code minifié. L'exemple ci-dessous concerne les fichiers js, mais la même approche peut être étendue à css et à tout autre fichier texte possible.grunt.js
:index.js (the index task)
:Enfin,
index.tmpl
avec une logique de génération intégrée:UPD. J'ai découvert que Yeoman , qui est basé sur le grognement, a une tâche usemin intégrée qui s'intègre au système de construction de Yeoman. Il génère une version de production de index.html à partir des informations de la version de développement de index.html ainsi que d'autres paramètres d'environnement. Un peu sophistiqué mais intéressant à regarder.
la source
grunt.template.process()
(ce que vous utilisez ici) qui rendrait cela encore plus facile. Vous pouvez faire la même chose en utilisant grunt-template en passant simplement undata
objetdifférentpour dev / prod.Je n'aime pas les solutions ici (y compris celle que j'ai donnée précédemment ) et voici pourquoi:
J'ai compris comment résoudre ces deux problèmes. J'ai configuré ma tâche de grognement de sorte que chaque fois qu'un fichier est ajouté ou supprimé, les balises de script sont automatiquement générées pour refléter cela. De cette façon, vous n'avez pas besoin de modifier votre fichier html ou votre fichier grunt lorsque vous ajoutez / supprimez / renommez vos fichiers JS.
Pour résumer comment cela fonctionne, j'ai un modèle html avec une variable pour les balises de script. J'utilise https://github.com/alanshaw/grunt-include-replace pour remplir cette variable. En mode dev, cette variable provient d'un modèle de globalisation de tous mes fichiers JS. La tâche de surveillance recalcule cette valeur lorsqu'un fichier JS est ajouté ou supprimé.
Maintenant, pour obtenir des résultats différents en mode dev ou prod, il vous suffit de remplir cette variable avec une valeur différente. Voici du code:
jsSrcFileArray
est votre modèle de grognement de fichier grunt typique.jsScriptTags
prend lejsSrcFileArray
et les concatène avec desscript
étiquettes des deux côtés.destPath
est le préfixe que je veux sur chaque fichier.Et voici à quoi ressemble le HTML:
Maintenant, comme vous pouvez le voir dans la configuration, je génère la valeur de cette variable sous forme de
script
balise codée en dur lorsqu'elle est exécutée enprod
mode. En mode dev, cette variable se développera à une valeur comme celle-ci:Faites moi savoir si vous avez des questions.
PS: Ceci est une quantité folle de code pour quelque chose que je voudrais faire dans chaque application JS côté client. J'espère que quelqu'un pourra transformer cela en un plugin réutilisable. Peut-être que je le ferai un jour.
la source
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
Comment as-tu fais ça?<script>
balises HTML ?destPath
dejsScriptTags
et troquégrunt.file.expandMapping
avecgrunt.file.expand
les fichiers que je voulais étaient déjà dans les bons endroits. Cela simplifiait beaucoup les choses. Merci @DanielKaplan, vous m'avez fait gagner énormément de temps :)Je me pose la même question depuis un moment, et je pense que ce plugin grunt pourrait être configuré pour faire ce que vous voulez: https://npmjs.org/package/grunt-targethtml . Il implémente des balises html conditionnelles, qui dépendent de la cible grunt.
la source
Je cherchais une solution plus simple et directe, j'ai donc combiné la réponse de cette question:
Comment placer un bloc if else dans gruntfile.js
et est venu avec les étapes simples suivantes:
Utilisez la logique suivante dans le bloc concat / copy de votre Gruntfile.js pour votre fichier index.html:
exécutez 'grunt --Release' pour choisir le fichier index-production.html et laissez le drapeau pour avoir la version de développement.
Pas de nouveaux plugins à ajouter ou à configurer et pas de nouvelles tâches de grognement.
la source
Cette tâche grognante nommée scriptlinker ressemble à un moyen facile d'ajouter les scripts en mode dev. Vous pouvez probablement exécuter une tâche de concaturation d'abord, puis la pointer vers votre fichier concaténé en mode prod.
la source
<!--SINON COMPONENT SCRIPTS-->
et<!--SPEC SCRIPTS-->
. Et voici la tâche Grunt qui le fait (un travail réel, par opposition aux trucs dans les documents). J'espère que ça aide;)grunt-dom-munger lit et manipule le HTML avec des sélecteurs CSS. Ex. lire les balises de votre html. Supprimez des nœuds, ajoutez des nœuds, etc.
Vous pouvez utiliser grunt-dom-munger pour lire tous vos fichiers JS liés par votre index.html, les uglifier, puis utiliser à nouveau grunt-dom-munger pour modifier votre index.html afin de ne lier que le JS minifié
la source
J'ai trouvé un plugin grunt appelé grunt-dev-prod-switch. Tout ce qu'il fait, c'est commenter certains blocs qu'il recherche en fonction d'une option --env que vous passez à grogner (bien que cela vous limite à dev, prod et test).
Une fois que vous l'avez configuré comme expliqué ici , vous pouvez exécuter par exemple:
grunt serve --env=dev
, et il ne fait que commenter les blocs qui sont enveloppés paret il décommentera les blocs qui sont enveloppés par
Il fonctionne également sur javascript, je l'utilise pour configurer la bonne adresse IP à laquelle me connecter pour mon API backend. Les blocs changent simplement en
Dans votre cas, ce serait aussi simple que cela:
la source
grunt-bake est un script de grunt fantastique qui fonctionnerait très bien ici. Je l'utilise dans mon script de construction automatique JQM.
https://github.com/imaginethepoet/autojqmphonegap
Jetez un œil à mon fichier grunt.coffee:
Cela regarde tous les fichiers dans base.html et les aspire pour créer des travaux index.html fantastiques pour les applications multipages (phonegap). Cela permet un développement plus facile car tous les développeurs ne travaillent pas sur une seule application longue page (empêchant de nombreux enregistrements de conflits). Au lieu de cela, vous pouvez diviser les pages et travailler sur de plus petits morceaux de code et compiler sur la page complète à l'aide d'une commande watch.
Bake lit le modèle à partir de base.html et injecte les pages html des composants sur la montre.
Démonstrations jQuery Mobile
app.initialize ();
Vous pouvez aller un peu plus loin et ajouter des injections dans vos pages pour les "menus", les "popups", etc., afin de pouvoir vraiment diviser les pages en composants plus petits et gérables.
la source
Utilisez une combinaison de wiredep https://github.com/taptapship/wiredep et usemin https://github.com/yeoman/grunt-usemin afin que grunt s'occupe de ces tâches. Wiredep ajoutera vos dépendances un fichier de script à la fois, et usemin les concaténera toutes en un seul fichier pour la production. Cela peut ensuite être accompli avec seulement quelques commentaires html. Par exemple, mes packages bower sont automatiquement inclus et ajoutés au html lorsque je lance
bower install && grunt bowerInstall
:la source
Cette réponse n'est pas pour les noobs!
Utiliser le modèle Jade ... passer des variables à un modèle Jade est un cas d'utilisation standard
J'utilise grunt (grunt-contrib-jade) mais vous n'avez pas besoin d'utiliser grunt. Utilisez simplement le module jade npm standard.
Si vous utilisez grunt, votre fichier grunt aimerait quelque chose comme ...
Nous pouvons désormais accéder facilement aux données transmises par grunt dans le modèle Jade.
Tout comme l'approche utilisée par Modernizr, j'ai défini une classe CSS sur la balise HTML en fonction de la valeur de la variable passée et je peux utiliser la logique JavaScript à partir de là selon que la classe CSS est présente ou non.
C'est très bien si vous utilisez Angular car vous pouvez faire des ng-if pour inclure des éléments dans la page selon que la classe est présente.
Par exemple, je pourrais inclure un script si la classe est présente ...
(Par exemple, je pourrais inclure le script de rechargement en direct dans le développement mais pas dans la production)
la source
Considérez processhtml . Il permet de définir plusieurs "cibles" pour les builds. Les commentaires sont utilisés pour inclure ou exclure conditionnellement des éléments du HTML:
devient
Il prétend même faire des trucs astucieux comme ça (voir le LISEZMOI ):
la source