Skip to content

模块化

尽管我认为 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
};
function hello() {
    $log.info('Hello world!');
}

function run() {
    $log.info('Run!');
}

// 暴露变量给外界
module.exports = {
    hello: hello,
    run: run
};

当然,也可以这么写。

js
exports.hello = hello;
exports.run = run;
exports.hello = hello;
exports.run = run;

这样 hellorun 函数在引入该文件的地方就可以调用了。

引入模块

假设现在 main.js 文件中,要引入同级目录下的 test.js 模块,可以这么写:

js
var test = require('./test.js');

test.hello();
var test = require('./test.js');

test.hello();

路径

require 方法传入的路径最好是相对路径,当然,也可以是绝对路径。

相对路径以 ./../ 开头,绝对路径以 / 开头。

每个插件所获取到的路径都是虚拟路径,并不是在电脑上的真实路径。虚拟路径具体体现为 / 代表插件根目录,而不是电脑文件系统的根目录。

所以就刚才的例子而言,'./test.js''/test.js' 的效果是一样的,后缀名 .js 可以省略。

考虑到安全性,插件只能加载插件目录下的脚本以及内置模块。如果利用相对路径回退到插件根目录之外,将无法加载到任何文件。

额外的变量

在模块内部除了可以使用 requiremodule.exports 以及 exports 之外,还可以使用以下变量:

  • __filename 当前文件路径
  • __dirname 当前文件夹路径

当然,上面两个变量获取到的依旧是虚拟路径,/ 代表插件根目录。