使用coffeescript和gulp防止继承问题

时间:2016-05-04 13:57:06

标签: inheritance coffeescript gulp

我经常在coffeescript中构建类,每个类都是自己的coffeescript文件。然后我有一个编译器(如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]

我让编译器嗅探这些标签,并在将它们连接成一个文件时对文件进行相应的排序。

有没有更好的方法来实现这一目标?

2 个答案:

答案 0 :(得分:0)

我认为你想要的是创建一个依赖图,然后做一个topological sort。这种排序将根据依赖关系图为您构建一个订单,您可以根据要扩展的类来构建它。

好消息是,似乎有人已经使用Coffee-Graph为CoffeeScript做了这个。因此,您可以尝试在Gulp文件中添加一个Coffee-Graph文件,该文件将文件(希望)以正确的顺序发送到CoffeeScript编译器。

答案 1 :(得分:0)

完全披露

我从未使用咖啡脚本。但是,我确实使用了javascript和gulp很多。作为@Git Wizard suggested,也许Coffee-Graph可以解决问题。但是,可能还有另一种方式。

我们所知道的

来自The Little Book on CoffeeScript

  

在幕后,CoffeeScript正在使用 JavaScript的原生原型   创建类;为静态属性添加一点语法糖   继承和上下文持久性。作为开发人员所有暴露的   给你的是关键字。

只要Javascript对象被同一个应用程序包含或引用,就知道了彼此,只要它们位于相同的词汇上下文中。由于gulp将所有文件带入管道,因此咖啡脚本编译器可能正在编译它们,因为它们一次通过管道流。这肯定是这种情况,因此缺少其他文件中包含的类的定义。

来自http://coffeescript.org/

  

词汇范围和可变安全性

     

CoffeeScript编译器会注意确保您的所有内容   变量在词法范围内正确声明

我们可以尝试什么

使用类似gulp-concat的内容将所有脚本文件连接到一个文件中。因为编译器同时具有所有内容,因此所有类都在相同的词法范围中,所以它可以正确地引用所有已定义的类。