Zapic
本帖最后由 Zapic 于 2020-9-26 15:50 编辑

在MCBBS Extender 2.0中,我一直致力于让更多人参与到MCBBS Extender的开发中.或者说,我一直致力于让超过700人的用户群里的论坛体验变得更好.
如果你不知道这是什么,请前往此处了解详情:https://www.mcbbs.net/thread-952104-1-1.html
为了让更多人的诉求得以实现,让更多人的强迫症得到安慰,我为开发者们提供了一个"简单易用的"开发MCBBS Extender的方案:模块式的添加功能

直到后来才发现,这一套方案会对MCBBS Extender的环境有强依赖,让开发者们的想法被强行绑定在MCBBS Extender中.
我认为论坛的二次开发应该是自由分散的,而不是封闭集中的.所以,我将晚上拿来逛bika的时间,花在了重新构建开发者体验上.

之后,在接下来的更新中,变得更加自由了.
你可以开发一个
    脱离MCBBS Extender运行
    但可以为MCBBS Extender用户 提供一个集中化管理界面
的MCBBS用户脚本程序,
或者一个
    强依赖于MCBBS Extender
    并使用预先封装好的论坛常用操作函数
    以及拥有更优雅实现方法的用户操作事件API
的MCBBS Extender模块.

从现在开始,MCBBS Extender更像一个工具库,而不是一个核心.
开发者开发的脚本可以脱离MCBBS Extender以便让更多人体验到二次开发对体验的提升对心灵的救赎.
用户也可使用不带任何功能的MCBBS Extender Core,然后从MCBBS Extender插件市场添加功能,获得更加客制化的体验.

请给我一些星星:
MCBBS Extender Project 开源地址:https://github.com/Proj-MExt
MCBBS Extender 插件市场: https://github.com/Proj-MExt/Modules-Repo
MCBBS Extender 开发指南: https://github.com/Proj-MExt/Modules-Repo/wiki

欢迎提交Pull Request,协助我修复错误,以及优化我并不是很好的代码质量.

以下是一些开发者比较用例:
在现有的MCBBS Extender中,所有模块强依赖MCBBS Extender,模块的入口必须位于模块体内部,由MCBBS Extender Core调用:

  1. (async () => {
  2.      await unsafeWindow.MExt;
  3.      let MExt = unsafeWindow.MExt;
  4.      MExt.exportModule({
  5.          "core": (()=>{/* Core code */})
  6.     });
  7. })();

复制代码


在即将发布的更新中,你可以继续选择强依赖于MCBBS Extender:
异步方式:

  1. (async () => {
  2.     const MExt = await new Promise(_ => { !unsafeWindow.MExt ? unsafeWindow.addEventListener("MExtLoaded", __ => { _(unsafeWindow.MExt) }) : _(unsafeWindow.MExt)});
  3.     // Your Core code ...

  4.     // ...
  5.     // ...
  6.     const Module = {
  7.         "meta": {
  8.              "id": "md_example",
  9.              "name": "Example Module",

  10.              "author": "Zapic",

  11.              "version": "1.0.0",

  12.              "updateInfo": []

  13.         },
  14.         "style": `/*Style*/`
  15.     }
  16.     MExt.exportModule(Module);
  17. })();
复制代码

同步Promise方式:

  1. (() => {
  2.     new Promise(_ => { !unsafeWindow.MExt ? unsafeWindow.addEventListener("MExtLoaded", __ => { _(unsafeWindow.MExt) }) : _(unsafeWindow.MExt)})
  3.     .then((MExt) => {
  4.          // Your Core code ...
  5.         // ...
  6.         // ...
  7.         const Module = {
  8.             "meta": {
  9.                  "id": "md_example",
  10.                  "name": "Example Module",
  11.                  "author": "Zapic",
  12.                  "version": "1.0.0",
  13.                  "updateInfo": []
  14.             },
  15.             "style": `/*Style*/`
  16.         }
  17.         MExt.exportModule(Module);

  18.     });
  19.     // Core code

  20.     const Module = {
  21.         "meta": {
  22.              "id": "md_example",
  23.              "name": "Example Module",

  24.              "author": "Zapic",

  25.              "version": "1.0.0",

  26.              "updateInfo": []

  27.         },
  28.         "style": `/*Style*/`
  29.     }
  30.     MExt.exportModule(Module);
  31. })();
复制代码


同步回调方式:

  1. const MyCore = (MExt) => {
  2.     // Your Core code ...

  3.     // ...
  4.     // ...
  5.     const Module = {
  6.         "meta": {
  7.              "id": "md_example",
  8.              "name": "Example Module",

  9.              "author": "Zapic",

  10.              "version": "1.0.0",

  11.              "updateInfo": []

  12.         },
  13.         "style": `/*Style*/`
  14.     }
  15.     MExt.exportModule(Module);
  16. }
  17. if(!unsafeWindow.MExt){
  18.      unsafeWindow.addEventListener("MExtLoaded",() => {
  19.         MyCore(unsafeWindow.MExt);     });
  20. } else {
  21.     MyCore(unsafeWindow.MExt);
  22. }
复制代码


或者开发可以脱离MCBBS Extender运行的用户脚本,并动态的接入MCBBS Extender:

  1. (() => {
  2.     let SelfConfig = {
  3.          "enable": true
  4.     }
  5.     new Promise(_ => { !unsafeWindow.MExt ? unsafeWindow.addEventListener("MExtLoaded", __ => { _(unsafeWindow.MExt) }) : _(unsafeWindow.MExt)})
  6.     .then((MExt)=>{
  7.         SelfConfig.enable = MExt.Storage.get("example_enable");
  8.         MExt.exportModule({
  9.              "meta": { /*...*/},
  10.              "config": [{
  11.                    "id": "example_enable",
  12.                    "name": "启用Example",
  13.                    "type": "check",
  14.                    "default": true
  15.              }],
  16.              "core": () => {
  17.                   // Code to run if MCBBS Extender exists...
  18.                   // ...
  19.              }
  20.         });
  21.     });
  22.      // Your Core code ...
  23.      // ...
  24.      // ...
  25. })();
复制代码


MCBBS提供了一些简单易用的事件,可以让开发者更方便的实现想要的功能,而不需要边骂"Discuz搞什么幺蛾子"边翻Discuz源码然后吐血.
你要吐的血我先吐了
比如添加自定义评分理由:

  1. document.addEventListener("RateWindowOpened",(e) => {
  2.      let myreason = document.createElement("li");
  3.      myreason.innerHTML = "不愧是你";
  4.      document.getElementById("reasonselect").appendChild(myreason);
  5. })
复制代码






SHEEP_REALMS
好!
(第一时间收到了新帖提醒

第一页 上一页 下一页 最后一页