2012-11-30 32 views
67

我已經用了一段時間的coffeescript。現在我需要編寫一個npm包,我可以用coffeescript編寫它,還是我應該將coffeescript編譯爲javascript?我可以在coffeescript中編寫npm包嗎?

+1

另請參閱:http://stackoverflow.com/questions/26196595/how-do-i-compile-coffeescript-before-publishing-to-npm –

回答

99

我會建議你在coffeescript中編寫你的包,但只發布在JavaScript中。我不喜歡這樣寫道:

  • 的CoffeeScript代碼放在src
  • 代碼被編譯爲lib
  • src致力於我的git倉庫,lib是我.gitignore
  • lib發佈到NPM, src在我的.npmignore
  • coffee-script包在我的devDependencies

你可以看看一個簡單的包礦,refix的,靈感:

+24

我會補充說,在你的包中定義一個'prepublish'任務編譯你的coffeescript的.json是在發佈之前自動完成的一個方便的方法 - 因爲我們都忘記編譯有時。有關更多信息,請參見npm'scripts'文檔:https://npmjs.org/doc/scripts.html – smithclay

+10

我不同意的一點是將lib文件夾保存在'.gitignore'中。在git中保存lib文件夾非常方便,這樣人們可以通過git url來引用你的包。 – ghempton

+4

如果你有一個postinstall任務來編譯你的coffeescript,那麼你不需要在你的git倉庫中檢查.js到'lib /',並且可以安全地添加它來忽略,就像Linus在這裏所說的那樣。請參閱 - https://github.com/ilkosta/static-jade-brunch關於如何使用這些鉤子的示例(以及如何避免全局安裝咖啡標記) –

1

我從頭開始在CoffeeScript中編寫了npm包。我鼓勵你使用CoffeScript作爲節點以及瀏覽器。但是,在您使用或發佈您的模塊之前,您必須將源代碼CoffeeScript編譯爲JavaScript。不過,這不應該妨礙您使用CoffeeScript。提示:在開發過程中,使用coffee -cw yourfile.coffee(命令行)觀察文件的變化並在保存時編譯。

10

你可以寫在CoffeeScript中NPM模塊,但爲了爲了讓JS用戶可以使用它們,必須先將它們編譯爲JS,然後才能在NPM上發佈。

package.json通過它們的prepublish腳本掛鉤使您可以輕鬆完成此任務,該腳本掛鉤在發佈之前運行指定的腳本。這裏有一個一prepublish NPM鉤在zombie.js

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

0

雖然我不知道這是否是最好的方法,例如技術上可以寫你的包大多在CoffeeScript的。

基本上,你可以寫一個簡單的包裹coffee命令JS文件,像這樣:

斌/ howl.coffee

console.log 'Awwwooooo!' 

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

正在運行node howl.js(或簡單地說howl當它全球安裝)現在將輸出Awwooooo!。您可以通過將它們從JavaScript「包裝器」傳遞給CoffeeScript來執行其他CoffeeScript文件和訪問參數require之類的操作。

無論如何,可能有理由不這樣做,但它迄今爲止工作,所以我想提出這個額外的角度。

對於使用此技術的簡單示例項目,請查看https://www.github.com/joshuabc/packdown

+0

對於您的具體示例,不需要使用exec。您可以使用require('coffee-script/register'),它會註冊一個全局處理程序,以便自動編譯咖啡依賴關係。由於全局咖啡腳本可能與其他版本衝突,所以對於圖書館來說這不是一個好習慣 – Diego

+1

以前的例子變成:require('coffe-script/register'); var howl = require('./ howl'); – Diego

+0

好點迭戈。關於這個的更多細節:'coffee-script/register'取決於不推薦使用的[require.extensions](http://nodejs.org/docs/latest/api/globals.html#globals_require_extensions)。根據nodejs.org:*「由於Module系統被鎖定,此功能可能永遠不會消失,但它可能有微妙的錯誤和複雜性,最好保持不動。」*該功能[不太可能從咖啡中刪除本身](https://github.com/jashkenas/coffeescript/issues/3692),但在我看來,棄用是一個很好的理由。 – joshuarh

0

如果您的許多模塊在其devDependenciescoffee-script中有效,只需全局安裝coffee-script而不是爲每個模塊安裝(需要更長的時間)。

coffee-buildcoffee-script的全球版本管理器。

只是這2個腳本添加到您的package.json

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

注意如何-v 1.11.x是不是一個確切的版本,它允許隱式的升級。

唯一的缺點是用戶必須先安裝npm install -g coffee-build才能安裝模塊。

相關問題