Prototype methods as actions
每一个挂载到Generator prototype的方法都会被当作一个task。每个task都会在Yeoman环境中按照顺序运行。换个简单的说法就是,object上通过Object.getPrototypeOf(Generator)返回的方法会自动执行。
Helper and private methods
有三个方式可以创建不自动执行的方法
1.给函数名称加上_前缀(eg:_private_method)
class extends Generator {
method1() {//这个是一个task,会被自动运行
console.log('hey 1');
}
_private_method() {//这个方法不会自动执行
console.log('private hey');
}
}
2.用实例方法
class extends Generator {
constructor(args, opts) {
// Calling the super constructor is important so our generator is correctly set up
super(args, opts)
this.helperMethod = function () {//将方法挂载到this上
console.log('won\'t be called automatically');
};
}
}
3.扩展父generator
class MyBase extends Generator {
helper() {
console.log('methods on the parent generator won\'t be called automatically');
}
}
module.exports = class extends MyBase {
exec() {
this.helper();
}
};
The run loop
如果只有一个generator,按顺序运行任务是可以的。但一旦你开始把他们组合在一起,这是不够的。
run loop是一个优先级队列系统,优先级在代码中定义为特殊的原型方法名。当方法名与优先级名相同时,运行循环会将该方法推送到这个特殊队列中。如果方法名与优先级不匹配,则将其推送到默认组中。
class extends Generator {
priorityName() {}
}
你也可以把多个方法组合起来
Generator.extend({
priorityName: {
method() {},
method2() {}
}
});
可用优先级为(按运行顺序):
1.initializing - 初始化方法 (checking current project state, getting configs, etc)
2.prompting - 提示用户交互 (where you’d call this.prompt())
configuring - Saving configurations and configure the project (creating .editorconfig files and other metadata files)
3.default - 执行不匹配其他的优先函数的函数
4.writing - Where you write the generator specific files (routes, controllers, etc)
5.conflicts - Where conflicts are handled (used internally)
6.install - Where installations are run (npm, bower)
7.end - Called last, cleanup, say good bye, etc
异步任务
有多种方法可以暂停运行循环,直到任务以异步方式完成工作。
最简单的方式就是return a promise。当resolves执行的,loop可以继续执行。如果依赖的异步api不支持promise,可以调用this.async()。eg:
asyncTask() {
var done = this.async();
getUserEmail(function (err, name) {
done(err);
});
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。