从 JavaScript 文件或 REPL 中 require()'ing CoffeeScript 文件

Posted

技术标签:

【中文标题】从 JavaScript 文件或 REPL 中 require()\'ing CoffeeScript 文件【英文标题】:require()'ing a CoffeeScript file from a JavaScript file or REPL从 JavaScript 文件或 REPL 中 require()'ing CoffeeScript 文件 【发布时间】:2011-06-13 17:10:23 【问题描述】:

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

    我希望能够编写 require() CoffeeScript 模块的 javascript 文件 我希望能够从节点 REPL 中加载 CoffeeScript 模块

对于案例 #1: 作为一种解决方法,我可以将 .coffee 编译为 .jsrequire() .js 模块。

对于案例 #2: 现在我是 eval()ing coffee-script.compile() 的输出。

有没有更好、更统一的方法来做到这一点?

【问题讨论】:

CoffeeScript REPL 怎么样,coffee 与节点一相比,REPL 非常原始:它缺乏颜色、自动完成、多行语句等 更新:coffee REPL 现在很棒了 :) 【参考方案1】:

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

【讨论】:

咦,我怎么没想到呢? :) require.extensions 现已弃用,目前还没有替代方案。 我希望它会继续存在,因为它是一个稳定的功能,而且正如您所提到的,目前还没有替代品。【参考方案2】:

更通用的解决方案是使用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

【讨论】:

require.extensions 的核心问题——注册一个扩展会改变你整个应用程序的全局状态——遗憾的是,better-require 没有解决,这意味着如果你的第三个中的任何一个都会中断派对子模块碰巧依赖于不同的版本,比如 Yaml 或 CoffeeScript。 better-require 默认也不加载“.litcoffee”模块,而可以通过require('coffee-script/register');加载

以上是关于从 JavaScript 文件或 REPL 中 require()'ing CoffeeScript 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Python 代码进入 REPL(读取、评估、打印、循环)

如何有效且快速地将大型 (6 Gb) .csv 文件导入 R,而不会导致 R REPL 崩溃?

什么是REPL?

Swift REPL:如何导入,加载,评估或需要.swift文件?

Swift REPL:如何导入、加载、评估或需要 .swift 文件?

Node.js REPL