40 votes

Comment concaténer des fichiers JavaScript en un seul fichier ?

Je veux créer un fichier JavaScript compilé pour mon site Web. Pour le développement, je préférerais conserver le JavaScript dans des fichiers séparés et, dans le cadre de mes scripts automatisés, concaténer les fichiers en un seul et exécuter le compresseur dessus.

Le problème est que si j'utilise l'ancienne commande de copie DOS, elle insère également les marqueurs EOF, ce dont le compresseur se plaint :

copier /A *.js compilé.js /Y

Que font les autres ?

1 votes

Phil, d'après ton commentaire sur ma réponse, je vois maintenant que tu n'obtiens pas de marqueurs EOF (enfin, j'en ai eu un avec la copie, à la fin du fichier résultant) mais bien les BOMs, parce que d'une certaine manière tu as écrit des fichiers Unicode. Aplatissez-les en Ascii, vous devriez vous en débarrasser.

0 votes

En effet, tout au long de ma journée, je travaille sur Windows, Linux et Mac avec de nombreux langages différents. Pour moi, Unicode est la norme.

35voto

David Brockman Points 492

Je recommande d'utiliser Apache Ant et YUI Compressor.

http://ant.apache.org/

http://yui.github.com/yuicompressor/

Mettez quelque chose comme ceci dans le fichier xml de construction Ant. Cela créera deux fichiers, application.js et application-min.js.

<target name="concatenate" description="Concatenate all js files">
    <concat destfile="build/application.js">
        <fileset dir="src/js" includes="*.js" />
    </concat>
</target>

<target name="compress" depends="concatenate" description="Compress application.js to application-min.js">
    <apply executable="java" parallel="false">
        <filelist dir="build" files="application.js" />
        <arg line="-jar" />
        <arg path="path/to/yuicompressor-2.4.2.jar" />
        <srcfile />
        <arg line="-o" />
        <mapper type="glob" from="*.js" to="build/*-min.js" />
        <targetfile />
    </apply>
</target>

2 votes

Il en ressort un Unexpected element "{}target" {antlib:org.apache.tools.ant}target erreur pour moi. Vous avez des idées ?

4 votes

J'ai cessé d'utiliser Ant il y a quelques années. Maintenant j'utilise Node pour ces choses. Jetez un coup d'oeil à cela : mechanics.flite.com/blog/2012/06/19/

11voto

eugensk00 Points 832

Pour copier sans EOF, utilisez le mode binaire :

copy /B *.js compiled.js /Y

Si le fichier résultant a encore des EOFs, cela peut provenir d'un des fichiers originaux, cela peut être corrigé par cette variante :

copy /A *.js compiled.js /B /Y

/A supprime les EOF de fin des fichiers originaux s'il y en a et /B empêche l'ajout de EOF au fichier résultant. Si un EOF n'est pas à la fin, le fichier source sera tronqué à cet endroit. L'ordre des commutateurs est important. Si vous écrivez

copy /A *.js /B compiled.js /Y  

- Les EOFs dans les fichiers sources ne seront pas supprimés mais les EOFs résultants ne seront pas ajoutés.

Essayez vous-même, c'est là que je l'obtiens. Les commandes DOS sont bizarres.

0 votes

Curieusement, l'option /B n'a fait aucune différence pour mes fichiers.

0 votes

J'ai essayé votre suggestion, mais j'obtiens toujours : ï "¿ Comme un marqueur entre les endroits où les fichiers se rejoignent... merci de regarder cela.

2 votes

Il semble que j'ai compris, ï "¿ est un préfixe d'octets UTF8. Il doit être placé au tout début du fichier, sinon il est traité comme une donnée et votre compilateur s'en plaint. Ce n'est pas un problème d'EOF. Et vous ne pouvez pas utiliser copy.

6voto

desigeek Points 1965

Dans asp.net AJAX, vous pouvez utiliser la balise 'CompositeScript'. Cela combinera tous vos scripts en 1 gros fichier js, économisant la bande passante en réduisant le nombre de http 304 et éventuellement de http 401.

Un échantillon :

 <asp:ScriptManager ID="ScriptManager1" runat="server">
        <CompositeScript>
            <Scripts>
                <asp:ScriptReference Path="~/Scripts/Script1.js" />
                <asp:ScriptReference Path="~/Scripts/Script2.js" />
                <asp:ScriptReference Path="~/Scripts/Script3.js" />
            </Scripts>
        </CompositeScript>
    </asp:ScriptManager>

Pour plus d'informations, voir ici : http://msdn.microsoft.com/en-us/library/cc488552.aspx

4voto

Martin Kool Points 1757

Nous avons créé un mécanisme composé des éléments suivants :

  • minfication (pour js et css)
  • agrégation en paquets
  • mise en cache (statut http 304)
  • envoi des fichiers originaux pour le mode de développement

C'est peut-être trop pour vos besoins, mais pour répondre à votre question sur ce que font les autres, voici comment cela fonctionne :

  1. Une demande arrive à, disons, /css.aspx?package=core
  2. Nous recherchons le nom de l'emballage dans un fichier de configuration xml (que par exemple, déclare que le paquet "core" contient les fichiers /js/mootools.js et /js/swfobject.js).
  3. Nous vérifions si la minification est activée. Par exemple, dans un environnement de développement, nous ne voulons pas voulons pas que le contenu js minifié soit servi, mais plutôt écrire les fichiers originaux. Pour les js, cela se fait par document.writes de script et pour css nous écrivons des règles d'importation.
  4. Si la minification est nécessaire (dans l'environnement de production), nous vérifions l'en-tête if-modified-since de la demande. Si ce client a déjà le contenu minifié, nous envoyons l'en-tête http 304. Si le client a besoin du contenu, nous vérifions si nous avons le contenu minifié dans le cache et le servons. Sinon, nous réduisons le contenu et envoyons le résultat.

Tout cela est réparti dans des services distincts. Il y a un service de cache injecté dans le service jsminificationwriter. Il utilise le service de minification original qui s'occupe uniquement des règles de minification.

Ce qui est bien dans cette approche, c'est que :

  • Il oblige nos équipes de développement à penser en "paquets" js/css et donc à diviser correctement les fonctionnalités et à les répartir sur les pages qui en ont besoin.
  • Pendant le développement, vous êtes parfaitement capable de déboguer, en obtenant les fichiers et les numéros de ligne appropriés.
  • Vous pouvez brancher n'importe quelle autre implémentation de service de minification comme YUI et ainsi de suite. JsMin n'était que notre première prise.
  • Il s'agit d'une approche générale qui fonctionne pour différents types de contenu.

J'espère que cela vous aidera. Je peux poster quelques fragments de code pour illustrer davantage si vous le souhaitez.

3voto

annakata Points 42676

Je vais seconder yuicompressor, mais j'utilise /packer/

http://johannburkard.de/blog/programming/javascript/automate-javascript-compression-with-yui-compressor-and-packer.html

Ça a été vraiment excellent pour moi.

1 votes

Packer utilise la compression côté client, ce qui peut ralentir l'utilisateur, et n'est donc pas recommandé.

0 votes

Ou prenez Shrinker, c'est le génial utilitaire de compression pour Mac : itunes.apple.com/us/app/shrinker/id439567298?mt=12&ls=1#

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X