外观
模块化
尽管我认为 Bob 插件代码量应该会比较小,可能核心逻辑也就是发送一个网络请求,然后进行数据解析之后回调到 Bob 主程序,但是为了更好地组织代码,仿照 Node.js
提供了模块化的功能。
你可以通过 require('path')
的方式来引入 JavaScript
脚本文件,如此一来,被引入的脚本文件就会变成一个模块,拥有了自己独立的命名空间。
暴露变量
假设现在插件根目录有个 test.js
文件,当它被作为一个模块被引入的时候,想要暴露一些变量给外界使用,可按照如下的写法:
js
function hello() {
$log.info('Hello world!');
}
function run() {
$log.info('Run!');
}
// 暴露变量给外界
module.exports = {
hello: hello,
run: run
};
当然,也可以这么写。
js
exports.hello = hello;
exports.run = run;
这样 hello
和 run
函数在引入该文件的地方就可以调用了。
引入模块
假设现在 main.js
文件中,要引入同级目录下的 test.js
模块,可以这么写:
js
var test = require('./test.js');
test.hello();
路径
require
方法传入的路径最好是相对路径,当然,也可以是绝对路径。
相对路径以 ./
或 ../
开头,绝对路径以 /
开头。
每个插件所获取到的路径都是虚拟路径,并不是在电脑上的真实路径。虚拟路径具体体现为 /
代表插件根目录,而不是电脑文件系统的根目录。
所以就刚才的例子而言,'./test.js'
和 '/test.js'
的效果是一样的,后缀名 .js
可以省略。
考虑到安全性,插件只能加载插件目录下的脚本以及内置模块。如果利用相对路径回退到插件根目录之外,将无法加载到任何文件。
额外的变量
在模块内部除了可以使用 require
、module.exports
以及 exports
之外,还可以使用以下变量:
__filename
当前文件路径__dirname
当前文件夹路径
当然,上面两个变量获取到的依旧是虚拟路径,/
代表插件根目录。