我可以在CoffeeScript中编写npm软件包吗?


Answers:


99

我建议您使用coffeescript编写程序包,但仅将其发布为javascript。我这样做是这样的:

  • coffeescript代码进入 src
  • 代码被编译为 lib
  • src致力于我的git repo,lib在我的.gitignore
  • lib发布到npm,src在我的.npmignore
  • coffee-script包是我的devDependencies

您可以看一下我的简单软件包refix,以获取启发:


24
我要补充一点,prepublish在package.json中定义一个可编译coffeescript的任务是在发布之前自动执行此任务的便捷方法-因为我们所有人有时都忘记编译。有关scripts更多信息,请参见npm doc:npmjs.org/doc/scripts.html
smithclay 2012年

10
我不同意的一点是将lib文件夹保留在.gitignore。将lib文件夹保存在git中非常方便,以便人们可以通过git url引用您的软件包。
ghempton

4
如果您有一个可以编译coffeescript的安装后任务,则无需lib/在git存储库中检入.js即可,并且可以安全地将其添加为忽略,就像Linus在此处建议的那样。请参见-github.com/ilkosta/static-jade-brunch,以获取如何使用这些钩子的示例(以及如何避免在全球范围内安装coffeescript的示例)
Merlyn Morgan-Graham

尽管这可能是更可持续的方法,并且是最佳做法的一个很好的例子,但是您也可以查看stackoverflow.com/a/27813782/722758,以获得在npm软件包中使用coffeescript的更直接(如果有些hacking)的方法。
packmate 2015年

1
@kroe很抱歉,这有点尴尬,很有趣。我从未添加过文件,因为.gitignore忽略了点文件。立即修复,谢谢!
莱纳斯·泰尔


2

如果你的很多模块都coffee-script在他们的devDependencies,是非常有用的只是全球安装coffee-script,而不是安装它为每个模块(这需要更长的时间)。

coffee-build是的全球版本管理器coffee-script

只需将这两个脚本添加到您的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先安装模块。


1

我从头开始在CoffeeScript中编写了npm软件包。我鼓励您对节点和浏览器使用CoffeScript。但是,在使用或发布模块之前,必须将源CoffeeScript编译为JavaScript。但是,这不应阻止您使用CoffeeScript。

提示:在开发时,请使用coffee -cw yourfile.coffee(命令行)监视文件中的更改并在保存时进行编译。


0

虽然我不知道这是否是最好的方法,技术上可以写你的包大多在CoffeeScript的。

基本上,您可以编写一个简单地包装coffee命令的JS文件,如下所示:

箱/ how咖啡

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

现在将运行node howl.js(或仅howl在全局安装时运行)输出Awwooooo!。您可以执行require其他CoffeeScript文件之类的操作,并通过将参数从JavaScript“包装器”传递到CoffeeScript来访问参数。

无论如何,也许有理由不这样做,但是到目前为止它对我来说还是有效的,所以我想将其提交给其他人。

对于使用此技术的简单示例项目,请查看https://www.github.com/joshuabc/packdown


对于您的特定示例,无需使用exec。您可以使用require('coffee-script / register'),它为需要注册的全局处理程序自动编译任何咖啡依赖项。但是,对于图书馆来说,这不是一个好习惯,因为全球咖啡脚本可能会与其他版本发生冲突
Diego

1
先前的示例变为:require('coffe-script / register'); var howl = require('./ howl');
迭戈

好点迭戈。有关此问题的更多详细信息:coffee-script/register取决于已弃用的require.extensions。根据nodejs.org的说法:“由于模块系统被锁定,因此该功能可能永远不会消失。但是,它可能存在细微的错误和复杂性,最好不要改动。” 该功能不太可能从咖啡本身中删除,但在我看来,弃用是避免混淆的很好理由。
packmate 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.