hexo.call
首先调用hexo对象中的call方法:1
2
3
4
5
6
7return hexo.call(cmd, args).then(function() {
return hexo.exit();
}).catch(function(err) {
return hexo.exit(err).then(function() {
handleError(err);
});
});
1 | Hexo.prototype.call = function(name, args, callback){ |
注意到,通过self.extend.console.get(name)
获取到的其实是个函数function,所以c.call(self,args)
其实是调用的js自带的call函数。因为console.register的时候是放入的函数,注意var c = this.store[name.toLowerCase()] = fn;
这句代码,关于注册命令的分析,我们已经在(hexo new命令解析)[https://johnwonder.github.io/2016/09/09/hexo-new/]中分析过。
所以这里的call就是调用的每个命令js文件中定义的函数,如plugins/console/new.js中定义的:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29function newConsole(args){
/* jshint validthis: true */
// Display help message if user didn't input any arguments
//console.log('参数是:'+args._);
if (!args._.length){
return this.call('help', {_: ['new']});
}
var data = {
title: args._.pop(),//标题
//这里layout就是可以通过 hexo n title layout获取
layout: args._.length ? args._[0] : this.config.default_layout,
slug: args.s || args.slug,
path: args.p || args.path
};
var keys = Object.keys(args);
var key = '';
var self = this;
for (var i = 0, len = keys.length; i < len; i++){
key = keys[i];
if (!reservedKeys[key]) data[key] = args[key];
}
return this.post.create(data, args.r || args.replace).then(function(post){
self.log.info('Created: %s', chalk.magenta(tildify(post.path)));
});
}
这里的this对象就是hexo本身,所以this.post就是hexo对象中定义的post变量:
1 | Post.prototype.create = function(data, replace, callback){ |