我经常在coffeescript中构建类,每个类都是自己的coffeesccript文件。然后,我有一个编译器(比如Gulp)将我构建的所有不同的类文件组合并缩小为一个缩小的.js文件。
我的问题来自继承。由于我的编译器只是在没有任何特定顺序的情况下输入文件,所以我可能会得到下面的代码。
#file: otherThing.coffee
#the class "Thing" is not yet defined, this will error
class window.otherThing extends window.Thing
_prop: "that other thing"
method: () =>
super()
#file: thing.coffee
class window.Thing
_prop: "the thing"
method: () =>
console.log(@_prop)
我目前的(草率的)解决方案是在每个文件中提供这样的注释。
#[COMPILE_PRIORITY:0.1]
我让编译器嗅出这些标记,并在将它们连接到单个文件中时对文件进行相应的排序。
有更好的方法来实现这一点吗?
我认为你想要的是制作一个依赖图,然后进行拓扑排序。这种排序将基于依赖图为你构建一个订单,你将基于正在扩展的类来构建它。
好消息是,似乎有人已经为CoffeeScript with Coffee Graph做了这件事。因此,您可以尝试在Coffee Graph的Gulp文件中放入一个步骤,该步骤将以(希望)正确的顺序将文件发送到CoffeeScript编译器。
全面披露:
我从来没有用过咖啡脚本。然而,我确实使用了javascript,而且狼吞虎咽。正如@Git向导所建议的,也许Coffee Graph可以做到这一点。然而,可能还有另一种方法。
我们所知道的
来自咖啡小书Script
在幕后,CoffeeScript使用JavaScript的原生原型创建类;为static属性添加一点语法糖继承和上下文持久性。作为一个开发人员,所有暴露的对你来说就是class关键字。
只要Javascript对象被同一应用程序包含或引用,它们就相互了解,也就是说,只要它们在同一词汇上下文中。由于gullow将所有文件带入管道,因此咖啡脚本编译器可能会在它们通过管道流时一次一个地对它们进行编译。事实确实如此,因此缺少了其他文件中包含的类的定义。
发件人http://coffeescript.org/
词汇范围界定和可变安全
CoffeeScript编译器注意确保变量在词法范围内正确地声明。
我们可以尝试什么
使用类似gulp-concat的方法将所有脚本文件连接到一个文件中。因为编译器同时拥有所有内容,因此所有类都在同一词法范围内,所以它可能能够正确地引用所有定义的类。