編寫(xiě)一個(gè)簡(jiǎn)單的NodeBB插件

要寫(xiě) NodeBB 插件,棒極了!在這之前,你需要知道一些東西。

和 WordPress 類(lèi)似,NodeBB 的插件搭建在 NodeBB 的鉤子系統(tǒng)上。鉤子系統(tǒng),通過(guò)可控制的方式,把 NodeBB 的部分功能開(kāi)放給插件開(kāi)發(fā)者,允許插件更改內(nèi)容,或者觸發(fā)確定的行為。

更多 鉤子 信息請(qǐng)查看全部

過(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

新建一個(gè)plugins目錄

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

新建一個(gè)新插件目錄
配置

每一個(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ě)的插件,如下:

把新寫(xiě)的插件加入最后一行

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

加入新寫(xiě)的插件
安裝插件

絕大多數(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ò)

出錯(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)擊Admin按鈕:最右邊一個(gè)圖標(biāo)

點(diǎn)擊PLUGIN按鈕:


點(diǎn)擊PLUGIN按鈕下拉列表 的 install plugin

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

激活nodebb-plugin-post-comments
nodebb-plugin-post-comments插件已激活

好了,現(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)。

刷新頁(yè)面后輸出

小結(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ù)。

參考文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容