从JavaScript文件或REPL中require()一个CoffeeScript文件

54

我正在使用Node.js,并希望将CoffeeScript纳入我的工作流程中。我有两个用例:

  1. 我想编写能够require() CoffeeScript 模块的 JavaScript 文件
  2. 我想能够在 Node REPL 中加载 CoffeeScript 模块

对于第一种情况: 我只需将 .coffee 编译为 .jsrequire().js 模块,作为解决方法。

对于第二种情况: 目前我正在 eval() 输出的 coffee-script.compile()

是否有更好、更综合的方法来完成这个问题呢?


咖啡脚本 REPL coffee 怎么样? - David Tang
那个 REPL 相比于 Node 的那个非常原始:它缺乏颜色、自动完成、多行语句等功能。 - nicolaskruchten
5
更新:coffee REPL 现在非常棒 :) - nicolaskruchten
2个回答

95

coffee-script 模块在被导入后会注册其扩展名。

$ echo 'console.log "works"' > module.coffee

$ echo '
> require("coffee-script")
> require("./module")
> ' > test.js

$ node test.js
works

$ node
> require('coffee-script'); require('./module')
works
{}

编辑:随着 CoffeeScript 1.7.0 的发布,这种行为已经发生了变化。现在你需要执行以下操作:

require('coffee-script/register');

哎呀,我怎么没想到呢? :) - nicolaskruchten
2
require.extensions现已被弃用,目前还没有替代方案。 - vaughan
我期望它能够保持稳定,因为它是一个稳定的功能,并且正如你所提到的,目前还没有替代品。 - Gunchars

12

使用better-require可能是一种更加灵活的解决方案。

npm install better-require

它允许您使用require()直接加载CoffeeScript文件,无需预先编译。(它还允许您require()一堆其他文件格式:CoffeeScript、ClojureScript、YAML、XML等)

就CoffeeScript而言,它只需要coffee-script模块即可。

require('better-require')();
var myModule = require('./mymodule.coffee');
var clojurescriptModule = require('./mymodule.cljs');
// etc.

声明:我编写了better-require


1
require.extensions 的核心问题在于,注册扩展名会改变全局状态,影响整个应用程序。遗憾的是,better-require 并没有解决这个问题,这意味着如果你的任何第三方子模块依赖于不同版本的 Yaml 或 CoffeeScript,那么事情就会出错。 - flow
better-require 也不会默认加载 ".litcoffee" 模块,但是可以通过 require('coffee-script/register'); 加载它们。 - shaunc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接