2012-11-30 5 views
67

Ich habe coffeescript für eine Weile verwendet. Jetzt muss ich ein npm-Paket schreiben, kann ich es in coffeescript schreiben, oder ich sollte coffeescript in Javascript kompilieren?Kann ich in Coffeescript ein npm-Paket schreiben?

+1

Siehe auch: http://stackoverflow.com/questions/26196595/how-do-i-compile-coffeescript-before-publishing-to-npm –

Antwort

99

Ich werde vorschlagen, dass Sie Ihr Paket in coffeescript schreiben, aber nur in Javascript veröffentlichen. Ich mache es wie folgt aus:

  • Coffeescript-Code geht in src
  • Code lib
  • src kompiliert ist meinem git Repo verpflichtet, lib ist in meinem .gitignore
  • lib auf npm veröffentlicht, src ist in meinem .npmignore
  • das coffee-script Paket ist in meinem devDependencies

Sie können an einem einfachen Paket von mir einen Blick darauf werfen, refix, für Inspiration:

+24

Ich füge hinzu, dass eine 'prepublish' Aufgabe in Ihrem Paket definiert .json, die dein coffeescript kompiliert, ist eine praktische Möglichkeit, dies zu automatisieren, bevor du es veröffentlichst - da wir alle vergessen zu kompilieren. Weitere Informationen finden Sie im Skript 'npm 'scripts: https://npmjs.org/doc/scripts.html – smithclay

+10

Der einzige Punkt, dem ich nicht zustimme, ist, den lib-Ordner in' .gitignore' zu ​​belassen. Es ist sehr praktisch, den lib-Ordner in git zu behalten, damit Leute über eine git-URL auf Ihr Paket verweisen können. – ghempton

+4

Wenn Sie eine Nachinstallationsaufgabe haben, die Ihr coffeescript kompiliert, müssen Sie nicht .js zu 'lib /' in Ihrem git-Repository einchecken und können es sicher hinzufügen, um zu ignorieren, genau wie Linus hier vorschlägt. Sehen Sie - https://github.com/ilkosta/static-jade-brunch für ein Beispiel, wie Sie diese Haken verwenden könnten (sowie wie Sie möglicherweise eine globale Installation von coffeescript vermeiden könnten) –

1

Ich habe npm-Pakete in CoffeeScript von Grund auf neu geschrieben. Ich empfehle Ihnen, CoffeScript sowohl für den Knoten als auch für den Browser zu verwenden. Bevor Sie jedoch Ihr Modul verwenden oder veröffentlichen können, müssen Sie das Quell-CoffeeScript in JavaScript kompilieren. Das sollte Sie jedoch nicht davon abhalten, CoffeeScript zu verwenden.

Tipp: Verwenden Sie während der Entwicklung coffee -cw yourfile.coffee (Befehlszeile), um die Datei auf Änderungen zu überwachen und beim Speichern zu kompilieren.

10

Sie können in Coffeescript NPM Module schreiben, aber in Ordnung Damit sie von JS-Benutzern verwendet werden können, müssen sie vor der Veröffentlichung auf NPM in JS kompiliert werden.

package.json macht dies einfach mit ihrem prepublish Skript-Hook, der das angegebene Skript vor der Veröffentlichung ausführt. Heres ein Beispiel eines Hakens prepublish NPM in zombie.js

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

0

Während ich bin nicht sicher, ob es der beste Ansatz ist, technisch es ist möglich Ihr Paket meist in Coffeescript zu schreiben.

Grundsätzlich können Sie eine JS-Datei schreiben, die einfach hüllt den coffee Befehl, etwa so:

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); 
}); 

Lauf node howl.js (oder einfach howl, wenn es global installiert ist) wird nun Awwooooo! ausgeben.Sie können Dinge wie require andere CoffeeScript-Dateien und Zugriffsargumente tun, indem Sie sie vom JavaScript-Wrapper an das CoffeeScript übergeben.

Wie auch immer, es kann Gründe geben, dies nicht zu tun, aber es hat für mich bisher funktioniert, also dachte ich, ich würde dies für eine zusätzliche Perspektive einreichen.

Für ein einfaches Beispielprojekt, das diese Technik verwendet, überprüfen Sie https://www.github.com/joshuabc/packdown.

+0

Für Ihr spezifisches Beispiel ist es nicht notwendig, exec zu verwenden. Sie können anfordern ('coffee-script/register'), es registriert einen globalen Handler für erfordert, dass automatisch jede Kaffeeabhängigkeit kompiliert. Dies ist jedoch keine gute Übung für eine Bibliothek, da das globale coffee-script mit anderen Versionen in Konflikt geraten kann. – Diego

+1

Beispiel: require ('coffe-script/register'); var howl = require ('./ heulen'); – Diego

+0

Guter Punkt Diego. Einige weitere Details dazu: "coffee-script/register" hängt von [require.extensions] (http://nodejs.org/docs/latest/api/globals.html#globals_require_extensions) ab, was veraltet ist. Laut nodejs.org: * "Da das Modul-System gesperrt ist, wird dieses Feature wahrscheinlich nie wieder verschwinden. Es kann jedoch subtile Fehler und Komplexitäten geben, die am besten nicht verändert werden." * Die Funktion wird wahrscheinlich nicht aus dem Kaffee entfernt selbst] (https://github.com/jashkenas/coffeescript/issues/3692), aber meiner Meinung nach ist die Abwertung ein guter Grund, klar zu gehen. – joshuarh

0

Wenn viele Ihrer Module haben coffee-script in ihren devDependencies, dann ist es coffee-script nur global sinnvoll zu installieren, anstatt es installieren für jedes Modul (die viel länger dauert).

coffee-build ist ein globaler Versionsmanager für coffee-script.

einfach diese 2-Skripte zu Ihrem package.json hinzufügen:

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

Beachten Sie, wie -v 1.11.x keine exakte Version ist, die implizite Upgrades ermöglicht.

Der einzige Nachteil ist, dass Benutzer müssen npm install -g coffee-build, bevor sie Ihr Modul installieren können.