coffeescript的自定义预处理步骤?

时间:2015-10-07 15:59:20

标签: compiler-construction coffeescript preprocessor coffeescript-resources

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

例如,假设我想用下划线函数扩充所有数组和对象的功能,允许我执行testArray.first()之类的操作并将其编译为{{ 1}}

这在普通的javascript中非常危险,因为我必须扩展_.first(testArray)并且可能会破坏其他库中数组的功能。但是,使用咖啡脚本似乎是安全而有趣的。

如果有办法以

的方式做到这一点会很棒
  1. 模块化 - 我可以添加多个预处理步骤,从不同的项目中提取,使编程更加容易和优雅的方式
  2. 集成 - 我希望能够在coffeescript的配置文件中更改某些内容,这样我就不必使用自定义二进制文件并在每个调用coffee编译器的开发工具中替换该命令(用于实时编译)等)。
  3. 这是否存在于coffeescript中?如果没有,它似乎应该。如果没有人听说过,我会跟开发者一起提出来。

1 个答案:

答案 0 :(得分:3)

CoffeeScript没有插件系统。如果你想自定义它,没有简单的方法。您可以分叉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来组合咖啡编译和预编译步骤。我会推荐这种方法。