要寫(xiě) NodeBB 插件,棒極了!在這之前,你需要知道一些東西。
和 WordPress 類(lèi)似,NodeBB 的插件搭建在 NodeBB 的鉤子系統(tǒng)上。鉤子系統(tǒng),通過(guò)可控制的方式,把 NodeBB 的部分功能開(kāi)放給插件開(kāi)發(fā)者,允許插件更改內(nèi)容,或者觸發(fā)確定的行為。
過(guò)濾器、動(dòng)作
有兩種類(lèi)型的鉤子:過(guò)濾器* 和 執(zhí)行器。*
過(guò)濾器 作用于內(nèi)容。當(dāng)內(nèi)容在 NodeBB 中傳遞時(shí),你可以進(jìn)行修改。例如,可以用過(guò)濾器修改帖子內(nèi)容,比如把帖子中出現(xiàn)的所有“蘋(píng)果”更改為“橙子”。類(lèi)似地,可以用過(guò)濾器美化內(nèi)容(比如代碼過(guò)濾器),或者移除粗口(粗口過(guò)濾器)。
執(zhí)行器 會(huì)在 NodeBB 中特定的位置執(zhí)行。在特定動(dòng)作觸發(fā)后 做 些事情。例如,執(zhí)行器可以用來(lái),在用戶(hù)發(fā)帖時(shí),通知管理員。其他的用法包括分析記錄,或者在新用戶(hù)注冊(cè)后自動(dòng)發(fā)送歡迎的消息。
當(dāng)你編寫(xiě)插件時(shí),先確認(rèn)你需要位置的鉤子是否存在。如果不存在,提交一個(gè)申請(qǐng),然后我們會(huì)在下個(gè) NodeBB 版本中加入這個(gè)的鉤子。
好了,我們先來(lái)寫(xiě)一個(gè)簡(jiǎn)答的插件:
首先在NodeBB項(xiàng)目根目錄下,新建一個(gè)寫(xiě)我們的插件的文件夾/plugins

在plugins目錄下新建一個(gè)nodebb-plugin-post-comments
(一個(gè)nodebb插件的命名規(guī)范必須是:以“nodebb-plugin- ”開(kāi)頭)

配置
每一個(gè)插件包含一個(gè)配置文件,文件名為plugin.json,如下所示:
在plugins/nodebb-plugin-post-comments/plugin.json新建一個(gè)配置文件
{
"id": "nodebb-plugin-post-comments",
"name": "new a plugin for comment of post",
"description": "NodeBB Plugin that allows users to mention other users by prepending an '@' sign to their username",
"url": "http://www.baidu.com", #這里一般是該插件所在的github地址,由于我這是本地寫(xiě)的插件,所以地址可以隨便寫(xiě)
"library": "./library.js", #這里寫(xiě)的是入口文件的路勁,相對(duì)當(dāng)前目錄
"hooks": [
{ "hook": "filter:teasers.get", "method": "addScripts" }
],
"nbbpm": {
{ "compatibility": "^0.7.0" }
}
}
library 屬性是庫(kù)相對(duì)插件包目錄的路徑。NodeBB 會(huì)自動(dòng)加載庫(kù)(如果插件處于激活狀態(tài))。
hooks屬性是一個(gè)數(shù)組,包含一組對(duì)象,告訴 NodeBB 你 插件使用的鉤子,以及當(dāng)調(diào)用鉤子時(shí),庫(kù)中使用的方法。每個(gè)對(duì)象包含下面的屬性 (星號(hào)標(biāo)記的屬性是必需的):
-
hook, NodeBB 鉤子的名稱(chēng) -
method, 插件中調(diào)用的方法 -
priority, 最終調(diào)用方法時(shí),相對(duì)的優(yōu)先級(jí) (默認(rèn): 10)
nbbpm 屬性是一個(gè)對(duì)象,包含 NodeBB 包管理器的信息。
-
compatibility指定了插件兼容的 NodeBB 版本。
你插件的核心是庫(kù)文件library.js,當(dāng)您的插件激活時(shí),NodeBB 會(huì)自動(dòng)引用。
你在庫(kù)中編寫(xiě)的每個(gè)方法都有確定的參數(shù)個(gè)數(shù),取決于怎樣調(diào)用:
- 過(guò)濾器發(fā)送單個(gè)參數(shù)給你的方法,異步方法也可以接受回調(diào)。
- 執(zhí)行器發(fā)送一些參數(shù)(具體個(gè)數(shù)取決于鉤子的實(shí)現(xiàn))。這些參數(shù)在:doc: 鉤子列表 <hooks>的文檔中列出。
庫(kù)方法示例
在plugins/nodebb-plugin-post-comments/下新建 library.js
內(nèi)容如下:
var comment = {
addScripts:function(){
console.log("我是一個(gè)新插件");
}
};
module.exports = comment;
如果我們要寫(xiě)個(gè)方法,用來(lái)監(jiān)聽(tīng) action:post.save 鉤子,我們應(yīng)該添加下面的行到 plugin.json 文件的 hooks部分:
{ "hook": "action:post.save", "method": "myMethod" }
我們的庫(kù)應(yīng)該這樣寫(xiě):
var MyPlugin = {
myMethod: function(postData) {
// 在這里處理 postData
}
};
package.json
在plugins/nodebb-plugin-post-comments/下新建 package.json
(這個(gè)里面的內(nèi)容可以從本地已有插件中的package.json中復(fù)制,然后在其中改一下插件的名字就可以了),內(nèi)容太多這里就不讓了。
在nodebb中的install.js 中加入新寫(xiě)的插件,如下:

在nodebb中的最外面的package.json中加入新寫(xiě)的插件:
但是這里要注意的一個(gè)問(wèn)題就是:里面寫(xiě)的插件都是一個(gè)插件的版本,但是這是自己寫(xiě)的本地插件,版本就這樣寫(xiě):`“file:插件的路勁(相對(duì)本package.json的路勁)”

安裝插件
絕大多數(shù)情況下,你的插件應(yīng)該發(fā)布在 npm 上,然后你的包名一定以“nodebb-plugin-” 開(kāi)頭。這樣可以讓用戶(hù),通過(guò)運(yùn)行npm install把插件直接安裝到他們的實(shí)例中。
當(dāng)通過(guò) npm 安裝時(shí),你的插件 必須 以 “nodebb-plugin-” 開(kāi)頭,否則 NodeBB 會(huì)找不到它。
然后在nodebb的根目錄上執(zhí)行npm i
安裝插件出錯(cuò)

解決辦法:直接將nodebb-plugin-post-comments插件復(fù)制后放到node_modules根目錄下
測(cè)試
運(yùn)行 NodeBB 的開(kāi)發(fā)模式:
項(xiàng)目根目錄下執(zhí)行:./nodebb dev
這可以打印出插件的調(diào)試日志,你可以查看到,已加載的插件,插件注冊(cè)的鉤子。
在管理員面板中激活你的插件
點(diǎn)擊nodebb首頁(yè)面的Admin按鈕,最右邊一個(gè)圖標(biāo):

點(diǎn)擊PLUGIN按鈕:

通過(guò)npm i 安裝新寫(xiě)的插件后,這個(gè)頁(yè)面就會(huì)有該插件,如圖,點(diǎn)擊ACTIVATE激活插件:


好了,現(xiàn)在新寫(xiě)的插件就可以試試了,重新啟動(dòng)nodebb服務(wù)器,刷新頁(yè)面(一定要刷新頁(yè)面),就會(huì)看到庫(kù)文件library.js中寫(xiě)的監(jiān)聽(tīng)鉤子的函數(shù)中的console.log(“內(nèi)容”),就會(huì)在終端輸出來(lái)。

小結(jié):
鉤子的觸發(fā)時(shí)機(jī):
在初始化時(shí)就出發(fā)(頁(yè)面刷新后)
filter:post.parse
filter:teasers.get
在你想要使用哪一個(gè)鉤子的時(shí)候,一定要看一下,代碼中是否有觸發(fā)該鉤子的firhook,firhook觸發(fā)鉤子,firhook的毀掉函數(shù)給庫(kù)函數(shù)library.js中監(jiān)聽(tīng)鉤子的方法傳遞參數(shù)。