节点(目录树,插件)
节点是Broccoli的核心概念,本质上代表一个目录,外观上是一个插件。接口非常简单。
接口简介
new Plugin(inputNodes, options)
inputNodes是输入节点,通常就是其它插件的实例,注意是一个复数单词,也就说也可以接受节点的数组。 options:
- name ,插件名称
- annotation, 描述性的名称,在调试时,用于区分不同的实例,当然前提是你为每个实例传入不同的annotation。
- persistentOutput,如果真,在每次build之后不会自动清楚。
Plugin.prototype.build()
在你的插件(继承自这个Plugin)中复写该方法,每次构建都会调用这个方法。插件的功能就在这里实现。通常在build方法里面使用这些只读的属性:
- this.inputPaths,通常是上游插件的输出,通过它,插件得以获取所有关注的文件。
- this.outputPath,这是一个单数的英文单词,输出目录只有一个。这并不能阻止你在该目录下创建多个目录。每次build之前,此目录自动清空。
- this.cachedPath,可以想象成一个全局变量,除非退出Broccoli,此目录在运行期内一只存在。
每次呼叫build,上述这些值都保持不变。
需要执行异步任务的话,返回Promise即可,最终的返回值一般抛弃。 报告错误,只要抛出异常或者返回Promise的reject即可。
Plugin.prototype.getCallbackObject()
属于高阶用法。仅在实例化的时候呼叫一次。
返回一个对象,Broccoli会呼叫它的build方法,通常返回插件的this。在某些场合,特别是抽象1插件,可以达成类似于aop的效果。
比如,可以拦截插件的build方法,你可以返回return { build: this.buildWrapper.bind(this)}
。
甚至完全转交给另一个对象来处理,return new MyPluginWorker(this.inputPaths, this.outputPath, this.cachePath)
,只要MyPluginWorker有一个build方法。
1. 这里借用了java的术语,是指不是直接用来实例化,而是供其它插件开发者继承之后来开发插件。下一章提到的过滤器就是。 ↩