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

Posted

技术标签:

【中文标题】我可以在 CoffeeScript 中编写 npm 包吗?【英文标题】:Can I write npm package in CoffeeScript? 【发布时间】:2012-11-18 17:01:50 【问题描述】:

我使用 CoffeeScript 已经有一段时间了。现在我需要写一个npm包,我可以用CoffeeScript写,还是把CoffeeScript编译成javascript

【问题讨论】:

另见:***.com/questions/26196595/… 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

我会建议你用coffeescript 编写你的包,但只用javascript 发布它。我是这样做的:

咖啡脚本代码进入src 代码编译为lib src 致力于我的 git repo,lib 在我的 .gitignore lib 发布到 npm,src 在我的 .npmignore coffee-script 包在我的devDependencies

你可以看看我的一个简单的包,refix,以获得灵感:

https://github.com/linus/refix npm install refix

【讨论】:

我要补充一点,在你的 package.json 中定义一个 prepublish 任务来编译你的咖啡脚本是在你发布之前自动化这个的一种方便的方法——因为我们有时都会忘记编译。有关更多信息,请参阅 npm scripts 文档:npmjs.org/doc/scripts.html 我不同意的一点是将 lib 文件夹保存在 .gitignore 中。将 lib 文件夹保存在 git 中非常方便,以便人们可以通过 git url 引用您的包。 如果你有一个安装后任务来编译你的coffeescript,那么你不需要在你的git存储库中签入.js到lib/,并且可以安全地将它添加到忽略,就像Linus在这里建议的那样.请参阅 - github.com/ilkosta/static-jade-brunch 了解如何使用这些钩子的示例(以及如何避免全局安装 coffeescript) 虽然这可能是更可持续的方法和最佳实践的一个很好的例子,但您也可以查看***.com/a/27813782/722758,了解在 npm 包中使用 coffeescript 的更直接(如果有点 hacky)的方法。 @kroe 很抱歉,这有点尴尬而且很搞笑。我从未添加过这些文件,因为 .gitignore 忽略了点文件......我很傻。现已修复,谢谢!【参考方案3】:

你可以在 coffeescript 中编写 NPM 模块,但为了让 JS 用户可以使用它们,必须先将它们编译为 JS,然后才能在 NPM 上发布。

package.json 使用他们的prepublish 脚本挂钩使这变得容易,该挂钩在您发布之前运行指定的脚本。下面是zombie.js 中prepublish NPM 钩子的示例

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

【讨论】:

【参考方案4】:

虽然我不确定这是否是最好的方法,但从技术上讲,可以主要用 CoffeeScript 编写你的包。

基本上,你可以写一个简单包装coffee命令的JS文件,像这样:

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

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

无论如何,可能有理由不这样做,但到目前为止它对我有用,所以我想我会提交这个以获得额外的视角。

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

【讨论】:

对于你的具体例子,不需要使用exec。您可以使用 require('coffee-script/register'),它为自动编译任何咖啡依赖项的 requires 注册一个全局处理程序。但是对于库来说这不是一个好习惯,因为全局咖啡脚本可能与其他版本发生冲突 前面的例子变成:require('coffe-script/register'); var howl = require('./howl'); 好点迭戈。更多细节:coffee-script/register 依赖于已弃用的require.extensions。根据 nodejs.org:“由于 Module 系统被锁定,此功能可能永远不会消失。但是,它可能有细微的错误和复杂性,最好保持不变。” 该功能是 @987654323 @,但在我看来,弃用是一个很好的理由来避开。【参考方案5】:

如果您的许多模块在其devDependencies 中包含coffee-script,那么只全局安装coffee-script 而不是为每个模块安装它(这需要更长的时间)会很有用。

coffee-build 是coffee-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 才能安装您的模块。

【讨论】:

以上是关于我可以在 CoffeeScript 中编写 npm 包吗?的主要内容,如果未能解决你的问题,请参考以下文章

什么是对的CoffeeScript + NPM的最佳做法?

我无法在 Coffeescript 交互模式(REPL)中编写多行代码

CoffeeScript单元测试?

用JavaScript编写的CoffeeScript

现在啊还不太清楚 nodejs和coffeescript 的关系

将 CoffeeScript 项目转换为 JavaScript(不缩小)? [关闭]