Comment puis-je convertir une application node.js multi-fichiers en un seul fichier?

Si j'ai une application node.js remplie de plusieurs instructions requises, comment puis-je compiler cela dans un seul fichier .js ? Je devrais résoudre manuellement les instructions requises et veiller à ce que les classes soient chargées dans le bon ordre. Existe-t-il un outil qui fait cela?

Permettez-moi de préciser.

Le code qui est exécuté sur node.js n'est pas spécifique au noeud. La seule chose que je fais, qui n'a pas d'équivalent navigateur direct, require , c'est pourquoi je demande. Il n'utilise aucune des bibliothèques de nœuds.

Vous pouvez utiliser le webpack avec la cible: 'node', il intégrera tous les modules requis et exportera tout en tant que module unique, autonome, un fichier, nodejs

http://webpack.github.io/docs/configuration.html#target

Si vous souhaitez envoyer un code commun au navigateur, je recommanderais personnellement quelque chose comme brequire ou requireJS qui peut "compiler" votre source nodeJS pour charger de manière asynchrone tout en maintenant la commande.

Pour un compilateur réel dans un seul fichier, vous pouvez en retirer un pour requireJS mais je ne le croirais pas avec de gros projets avec une complexité élevée et des cas de bord.

Il ne devrait pas être trop difficile d'écrire un fichier comme package.json que npm utilise pour indiquer dans quel ordre les fichiers doivent se produire dans votre emballage. De cette façon, il est de votre responsabilité de vous assurer que tout est compacté dans le bon ordre, vous pouvez ensuite écrire une application de nœud simplifiée pour lire votre fichier package.json et utiliser IO de fichier pour créer votre script compilé.

La génération automatique de l'ordre dans lequel les fichiers doivent être emballés nécessite de créer un arborescence de dépendance et de faire beaucoup d'analyse de fichier. Cela devrait être possible, mais il risque probablement de se bloquer sur des dépendances circulaires. Je ne connais aucune bibliothèque pour faire cela pour vous.

NE PAS utiliser requireJS si vous valorisez votre santé mentale . Je l'ai vu dans un projet généreux et c'était une catastrophe absolue … peut-être le pire choix technique de cette entreprise. RequireJS est conçu pour fonctionner dans le navigateur et pour charger de manière asynchrone et récursive les dépendances JS. C'est une idée TERRIBLE. Les navigateurs aspirent au chargement de lots et de nombreux petits fichiers sur le réseau; Chaque document sur la performance Web vous en informera. Ainsi, vous allez très rapidement finir par avoir besoin d'une solution pour écraser vos fichiers JS ensemble … à quel moment, quel est le but d'avoir un mécanisme de résolution de dépendance dans le navigateur? Et même si votre site de production sera brisé dans un seul fichier JS, avec requireJS, votre code doit constamment supposer que toute dépendance pourrait ou ne pas être chargée encore; Dans un projet complexe, cela conduit à des milliers de barrières de charge asynchrones qui enveloppent chaque point d'interaction entre les modules. Lors de ma dernière entreprise, nous avions des endroits où la pile de fermeture avait plus de 12 niveaux de profondeur. Toute la logique «si elle est encore chargée» rend votre code plus complexe et plus difficile à utiliser. Il bloque également le code qui augmente le nombre d'octets envoyés au client. De plus, le client doit charger la bibliothèque requireJS elle-même, qui brûle encore 14.4k. La taille seule devrait vous dire quelque chose sur le niveau de fonctionnalité dans le projet requireJS. Pour la comparaison, la boîte à outils entière underscore.js est seulement 4k.

Ce que vous voulez, c'est une étape de compilation pour écraser JS ensemble, pas un cadre lourd qui fonctionnera dans le navigateur ….

Vous devriez vérifier https://github.com/substack/node-browserify

Browserify fait exactement ce que vous demandez …. combine plusieurs modules NPM dans un seul fichier JS pour distribution au navigateur. Le code consolidé est fonctionnellement identique au code original, et les frais généraux sont bas (environ 4k + 140 octets par fichier supplémentaire, y compris la ligne "require ('file')"). Si vous êtes pointilleux, vous pouvez découper la majeure partie de ce 4k, qui fournit des wrappers pour imiter les globals ordinaires node.js dans le navigateur (par exemple, "process.nextTick ()").