Skip to content

插件开发指南 ​

先要确定插件所属的大类,这个是发布工具内置的,需要发布工具内部添加维护,不支持用户自定义。 目前可用的有

  • Common
  • Metaweblog
  • Wordpress
  • Github
  • Gitlab
  • Custom
  • System

新增大类的时候需要维护(内部维护) ​

  • DynamicJsonCfg
  • getSubtypeList
  • setDynamicJsonCfg
  • src/platforms/pre.ts
  • src/composables/usePlatformDefine.ts
  • src/ui/components/settings/bridge/bridgeRegistry.ts(平台配置组件注册表)

API授权插件开发指南 ​

  1. 确定大类。例如:Halo属于Common

  2. 新建子类别。例如:src/platforms/dynamicConfig.ts里面的SubPlatformType加一个Common_CSDN

  3. 注册子类别,需要修改

    • getSubtypeList
    • src/platforms/pre.ts
  4. 新增适配器 API授权需要再 src/adaptors/api 新建文件。例如

    • HaloApiAdaptor 需要继承 BaseBlogApi
    • HaloConfig 需要继承 CommonBlogConfig
    • HaloPlaceholder 需要继承 CommonBlogPlaceholder
    • useHaloApi 定义 const useHaloApi = async (key: string, newCfg?: HaloConfig) => {}
  5. 注册适配器 适配器 src/adaptors/index.ts getCfg 配置 src/adaptors/index.ts getAdaptor YAML适配器(不一定有)

  6. 开启配置页面 在 src/ui/components/settings/bridge/bridgeRegistry.ts 注册该平台的配置组件

  7. 修改图片上传逻辑,可选

网页授权插件开发指南 ​

  1. 确定大类。例如:CSDN属于Custom

  2. 新建子类别。例如:src/platforms/dynamicConfig.ts里面的SubPlatformType加一个Custom_CSDN

  3. 注册子类别,需要修改

    • getSubtypeList
    • src/platforms/pre.ts
  4. 新增适配器 网页授权需要再 src/adaptors/web 新建文件。例如

    • csdnWebAdaptor 需要继承 BaseWebApi
    • csdnConfig 需要继承 CommonWebConfig
    • csdnPlaceholder 需要继承 CommonWebPlaceholder
    • useCsdnWeb 定义 const useCsdnWeb = async (key?: string, newCfg?: CsdnConfig) => {}
  5. 注册适配器 适配器 src/adaptors/index.ts getCfg 配置 src/adaptors/index.ts getAdaptor YAML适配器(不一定有)

  6. 开启配置页面 在 src/ui/components/settings/bridge/bridgeRegistry.ts 注册该平台的配置组件

  7. 修改图片上传逻辑,可选

  8. docker 代理适配,已不再需要

  9. 普通请求注意事项,目前全程使用 proxy,例如:简书、知乎、微信公众号,代码要注意的地方:

    js
    const resJson = await this.webFetch(apiUrl, [mergedHeaders], body, method, contentType, true, "base64", "text")
  10. 图片上传注意事项,目前有两种方式:

10.1 全程使用 proxy,例如:知乎、简书、微信公众号,代码要注意的地方:

js
// uploadFile 方法
// 注意:FormData, Blob 等对象必须使用原生浏览器的
const file = new Blob([mediaObject.bits], { type: mediaObject.type })
const filename = mediaObject.name

// xxxFormFetch 方法
// 注意:最后一个参数必须是 true
const resJson = await this.webFormFetch(url, [header], formData, true)

11.2 网页端使用 proxy,PC 端使用 node-fetch-cjs,例如:CSDN

js
// uploadFile 方法
// 注意:FormData, Blob 等对象必须使用封装的
const { FormData, Blob } = FormDataUtils.getFormData(this.appInstance)
const file = new Blob([mediaObject.bits], { type: mediaObject.type })
const filename = mediaObject.name

// xxxFormFetch 方法
// 注意:最后一个参数必须是 false
const resJson = await this.webFormFetch(apiUrl, [headers], formData, false)

文件系统插件开发指南 ​

  1. 确定大类。例如:LocalSystem属于Fs

  2. 新建子类别。例如:src/platforms/dynamicConfig.ts里面的SubPlatformType加一个Fs_LocalSystem

  3. 注册子类别,需要修改

    • getSubtypeList
    • src/platforms/pre.ts
  4. 新增适配器 API授权需要再 src/adaptors/fs 新建文件。例如

    • LocalSystemApiAdaptor 需要继承 BaseBlogApi
    • LocalSystemConfig 需要继承 CommonBlogConfig
    • LocalSystemPlaceholder 需要继承 CommonBlogPlaceholder
    • LocalSystemYamlConvertAdaptor 需要继承 YamlConvertAdaptor
    • useLocalSystemApi 定义 const useLocalSystemApi = async (key: string, newCfg?: LocalSystemConfig) => {}
  5. 注册适配器 适配器 src/adaptors/index.ts getCfg 配置 src/adaptors/index.ts getAdaptor YAML适配器(不一定有)

  6. 开启配置页面 在 src/ui/components/settings/bridge/bridgeRegistry.ts 注册该平台的配置组件

  7. 修改图片上传逻辑,可选

构建命令 ​

目标命令输出
插件本体pnpm build(含 vue-tsc 类型检查)dist/
单独构建插件 libpnpm pluginBuilddist/
思源挂件pnpm widgetBuildwidget/
浏览器扩展(Chrome)pnpm extBuildextension/chrome/
浏览器扩展(Firefox)pnpm extBuild -t firefoxextension/firefox/
nginx 部署pnpm nginxBuildnginx/
vercel 部署pnpm vercelBuildvercel/

四个 web 产物由 vite.webapp.config.ts 统一构建,按 BUILD_TYPE 落到各自目录。

动态引用的类库 ​

下面这些库需要动态引用,不能直接打进构建产物:

"fetch-blob": "^4.0.0",
"formdata-polyfill": "^4.0.10",

以 GPL-3.0 许可发布