68 votes

Est-ce que je peux écrire un package npm en CoffeeScript ?

J'ai utilisé CoffeeScript pendant un certain temps. Maintenant, j'ai besoin d'écrire un package npm, puis-je l'écrire en CoffeeScript, ou dois-je compiler CoffeeScript en JavaScript ?

1 votes

100voto

Linus G Thiel Points 18378

Je vais suggérer que vous écriviez votre package en coffeescript, mais que vous le publiiez uniquement en javascript. Voici comment je procède :

  • Le code coffeescript va dans src
  • Le code est compilé dans lib
  • src est commité dans mon repo git, lib est dans mon .gitignore
  • lib est publié sur npm, src est dans mon .npmignore
  • Le package coffee-script est dans mes devDependencies

Vous pouvez consulter un de mes packages simples, refix, pour inspiration :

24 votes

Je vais ajouter que définir une tâche prepublish dans votre package.json qui compile votre coffeescript est un moyen pratique d'automatiser cela avant votre publication - puisque nous oublions tous parfois de le compiler. Voir la documentation npm scripts pour plus d'informations: npmjs.org/doc/scripts.html

10 votes

Le seul point avec lequel je ne suis pas d'accord est de garder le dossier lib dans .gitignore. Il est très pratique de garder le dossier lib dans git afin que les gens puissent faire référence à votre paquet via une URL git.

4 votes

Si vous avez une tâche postinstall qui compile votre coffeescript, vous n'avez pas besoin de vérifier .js dans lib/ dans votre dépôt git, et pouvez l'ajouter en toute sécurité à ignorer comme le suggère Linus ici. Voir - github.com/ilkosta/static-jade-brunch pour un exemple de comment vous pourriez utiliser ces hooks (ainsi que comment vous pourriez éventuellement éviter une installation globale de coffeescript)

10voto

Joseph Moniz Points 138

Vous pouvez écrire des modules NPM en coffeescript, mais pour qu'ils soient utilisables par les utilisateurs JS, ils doivent être compilés en JS avant d'être publiés sur NPM.

package.json facilite ceci avec leur crochet de script prepublish qui exécute le script spécifié avant la publication. Voici un exemple d'un crochet NPM prepublish dans zombie.js

https://github.com/assaf/zombie/blob/master/package.json#L16

2voto

aleclarson Points 1375

Si beaucoup de vos modules ont coffee-script dans leurs devDependencies, il est utile d'installer coffee-script globalement au lieu de l'installer pour chaque module (ce qui prend beaucoup plus de temps).

coffee-build est un gestionnaire de versions global pour coffee-script.

Ajoutez simplement ces 2 scripts à votre package.json:

{
  "name": "my-coffee-module",
  "scripts": {
    "build": "coffee-build -v 1.11.x -b -o js src",
    "postinstall": "npm run build"
  }
}

Remarquez comment -v 1.11.x n'est pas une version exacte, ce qui permet des mises à jour implicites.

Le seul inconvénient est que les utilisateurs doivent exécuter npm install -g coffee-build avant de pouvoir installer votre module.

1voto

davidpfahler Points 589

J'ai écrit des packages npm en CoffeeScript à partir de zéro. Je vous encourage à utiliser CoffeScript pour node ainsi que pour le navigateur. Cependant, avant de pouvoir utiliser ou publier votre module, vous devez compiler le code source CoffeeScript en JavaScript. Cela ne devrait cependant pas vous empêcher d'utiliser CoffeeScript.

Astuce : Pendant le développement, utilisez coffee -cw votrefichier.coffee (en ligne de commande) pour surveiller le fichier et le compiler à chaque sauvegarde.

0voto

joshuabc Points 2131

Alors que je ne suis pas sûr que ce soit la meilleure approche, techniquement c'est possible d'écrire votre package principalement en CoffeeScript.

En gros, vous pouvez écrire un fichier JS qui enveloppe simplement la commande coffee, comme ceci :

bin/howl.coffee

console.log 'Awwwooooo!'

bin/howl.js

#!/usr/bin/env node

var path    = require('path');
var exec    = require('child_process').exec;
var coffee  = path.resolve(__dirname, '../node_modules/coffee-script/bin/coffee');
var howl    = path.resolve(__dirname, './howl.coffee');
var command = coffee + ' ' + howl;

exec(command, function(error, stdout) {
  if (error) { throw error };
  console.log(stdout);
});

En exécutant node howl.js (ou simplement howl quand il est installé globalement) vous obtiendrez désormais Awwooooo!. Vous pouvez faire des choses comme require d'autres fichiers CoffeeScript et accéder aux arguments en les passant du "wrapper" JavaScript au CoffeeScript.

De toute manière, il peut y avoir des raisons de ne pas le faire, mais ça a fonctionné pour moi jusqu'à présent alors j'ai pensé soumettre cela pour une perspective supplémentaire.

Pour un exemple de projet simple utilisant cette technique, consultez https://www.github.com/joshuabc/packdown.

0 votes

Pour votre exemple spécifique, il n'est pas nécessaire d'utiliser exec. Vous pouvez utiliser require('coffee-script/register'), cela enregistre un gestionnaire global pour les require qui compile automatiquement toute dépendance en café. Cependant, ce n'est pas une bonne pratique pour une bibliothèque car le coffee-script global peut entrer en conflit avec d'autres versions.

1 votes

L'exemple précédent devient: require('coffe-script/register'); var howl = require('./howl');

0 votes

Bon point Diego. Quelques détails supplémentaires à ce sujet: coffee-script/register dépend de require.extensions qui est obsolète. Selon nodejs.org: "Comme le système de module est verrouillé, cette fonctionnalité ne disparaîtra probablement jamais. Cependant, elle peut présenter des bogues subtils et des complexités qui sont préférables de ne pas toucher." Il est peu probable que la fonctionnalité soit supprimée de coffee elle-même, mais à mon avis, l'obsolescence est une bonne raison de s'en éloigner.

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