coffeescript 的自定义预处理步骤?

Custom pre-processing steps for coffeescript?

有没有办法以模块化的方式向咖啡编译器添加预处理步骤?

比如说,我想用下划线函数来增强 all 数组和对象的功能,允许我做类似 testArray.first() 的事情,并且有它编译为 _.first(testArray)

这在普通 javascript 中是非常危险的,因为我必须扩展 Array.prototype 并且可能会破坏其他库中数组的功能。不过,使用 coffee-script 似乎是安全且有趣的。

如果能以

的方式做到这一点,那就太好了
  1. 模块化——我可以添加多个预处理步骤,从不同的项目中提取,以不同的方式使编程变得更加简单和优雅
  2. 集成 - 我希望能够更改 coffeescript 配置文件中的某些内容,这样我就不必使用自定义二进制文件并替换调用 coffee 编译器的每个开发工具中的命令(对于实时编译等)。

这是否存在于 coffeescript 中?如果没有,它似乎应该。如果没有人听说过,我会向开发人员提出来。

CoffeeScript 没有插件系统。如果您想自定义它,没有简单的出路。您可以 fork CoffeeScript 存储库,并根据您的要求修改编译器。但是,这意味着您必须通过定期从主存储库中提取更新来维护编译器的分支。

请参阅 CoffeeScript 编译器存储库 (https://github.com/jashkenas/coffeescript/blob/master/lib/coffee-script/coffee-script.js#L195) 中的以下代码:

....
  o[k] = v;
}
o.bare = true;
js = compile(code, o);
if (sandbox === global) {
  return vm.runInThisContext(js);
} else {
  return vm.runInContext(js, sandbox);
}
....

您可以向该文件添加新方法

precompile = function (code) {
    // do pre-processing here
}

并制作

js = compile(precompile(code), o);

我还没有尝试过这个,所以你在做的时候可能会碰壁。虽然您想要的更改很简单,但不必担心词法分析器。

不过,您可以编写自己的解析器以使用任何语言进行这些更改,并使用 grunt/gulp 将咖啡编译和预编译步骤结合起来。我会推荐这种方法。