2

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

说,例如,我想增加一个所有阵列或下划线功能对象的功能,让我做这样的事情testArray.first()并将其编译成_.first(testArray)

这是后话这将在普通的javascript中做非常危险,因为我不得不扩展Array.prototype并可能会破坏其他库中的数组功能。尽管如此,咖啡剧本似乎是安全和有趣的。

这将是巨大的,如果有一种方法在某种程度上是

  1. 模块化做到这一点 - 我可以添加多个预处理步骤,从不同的项目,这使得编程更加轻松优雅拉动不同的方式
  2. 集成 - 我想能够在coffeescript的配置文件中更改某些内容,以便我不必使用自定义二进制文件,并在调用咖啡编译器的每一个开发工具中替换该命令(用于现场编辑等)。

这是否存在内置于咖啡标记?如果不是,它似乎应该。如果没有人听说过,我会和开发人员一起提出。

回答

3

CoffeeScript没有插件系统。如果你想定制它,没有简单的方法。您可以分叉CoffeeScript回购,并根据您的要求修改编译器。但是,这意味着您必须定期通过主repo的更新来维护编译器的分支。

请参阅从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将咖啡编译和预编译步骤相结合。我会推荐这种方法。