Kann ich ein npm-Paket in CoffeeScript schreiben?


Antworten:


99

Ich werde vorschlagen, dass Sie Ihr Paket in Coffeescript schreiben, es aber nur in Javascript veröffentlichen. So mach ich es:

  • Coffeescript-Code geht rein src
  • Code wird zu kompiliert lib
  • srcist meinem git repo verpflichtet, libist in meinem.gitignore
  • lib wird bis npm veröffentlicht, src ist in meinem.npmignore
  • Das coffee-scriptPaket ist in meinemdevDependencies

Sie können sich ein einfaches Paket von mir ansehen , refix , um sich inspirieren zu lassen:


24
Ich werde hinzufügen, dass das Definieren einer prepublishAufgabe in Ihrem package.json, die Ihr Kaffeeskript kompiliert, eine praktische Möglichkeit ist, dies vor Ihrer Veröffentlichung zu automatisieren - da wir alle manchmal vergessen, zu kompilieren. scriptsWeitere Informationen finden Sie im npm- Dokument: npmjs.org/doc/scripts.html
smithclay

10
Der einzige Punkt, mit dem ich nicht einverstanden bin, ist, den lib-Ordner beizubehalten .gitignore. Es ist sehr praktisch, den lib-Ordner in git zu behalten, damit Benutzer ü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 lib/in Ihrem Git-Repository einchecken und können es sicher hinzufügen, um es zu ignorieren, wie Linus es hier vorschlägt. Unter - github.com/ilkosta/static-jade-brunch finden Sie ein Beispiel dafür, wie Sie diese Hooks verwenden können (und wie Sie möglicherweise eine globale Installation von Coffeescript vermeiden können)
Merlyn Morgan-Graham

Dies ist wahrscheinlich der nachhaltigere Ansatz und ein gutes Beispiel für Best Practices. Sie können jedoch auch auf stackoverflow.com/a/27813782/722758 nach einer direkteren (wenn auch etwas hackigen) Möglichkeit suchen, Coffeescript in einem npm-Paket zu verwenden.
Packmate

1
@kroe so sorry, das ist ein bisschen umständlich und ziemlich lustig. Ich hatte die Dateien nie hinzugefügt, da Punktdateien vom .gitignore ignoriert werden ... Blöd mich. Jetzt behoben, danke!
Linus Thiel

10

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

package.jsonmacht dies einfach mit ihrem prepublishSkript-Hook, der das angegebene Skript ausführt, bevor Sie veröffentlichen. Hier ist ein Beispiel für eineprepublish NPM-Hook in zombie.js

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


2

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

Coffee-Build ist ein globaler Versionsmanager fürcoffee-script .

Fügen Sie einfach diese 2 Skripte zu Ihrem hinzu package.json:

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

Beachten Sie, dass -v 1.11.xes sich nicht um eine exakte Version handelt, die implizite Upgrades ermöglicht.

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


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 Ihr Modul jedoch 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.


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 den coffeeBefehl einfach wie folgt umschließt :

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

Das Ausführen node howl.js(oder einfach, howlwenn es global installiert ist) wird jetzt ausgegeben Awwooooo!. Sie können Dinge wie tunrequire andere CoffeeScript-Dateien und auf Argumente zugreifen, indem Sie sie vom JavaScript- "Wrapper" an das CoffeeScript übergeben.

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

Ein einfaches Beispielprojekt mit dieser Technik finden Sie unter https://www.github.com/joshuabc/packdown .


Für Ihr spezielles Beispiel muss exec nicht verwendet werden. Sie können require ('Kaffeeskript / Register') verwenden. Es registriert einen globalen Handler für Requests, der automatisch alle Kaffeeabhängigkeiten kompiliert. Dies ist jedoch keine gute Vorgehensweise für eine Bibliothek, da das globale Kaffeeskript mit anderen Versionen in Konflikt stehen kann
Diego

1
Das vorherige Beispiel lautet: require ('coffe-script / register'); var howl = require ('./ howl');
Diego

Guter Punkt Diego. Noch ein paar Details dazu: coffee-script/registerhängt von require.extensions ab, die veraltet sind. Laut nodejs.org: "Da das Modulsystem gesperrt ist, wird diese Funktion wahrscheinlich nie verschwinden . Es kann jedoch subtile Fehler und Komplexitäten geben, die am besten unberührt bleiben." Es ist unwahrscheinlich, dass das Merkmal aus dem Kaffee selbst entfernt wird , aber meiner Meinung nach ist die Abwertung ein guter Grund, sich klar zu machen.
Packmate
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.