插件开发指南
先要确定插件所属的大类,这个是发布工具内置的,需要发布工具内部添加维护,不支持用户自定义。 目前可用的有
- 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授权插件开发指南
确定大类。例如:Halo属于Common
新建子类别。例如:src/platforms/dynamicConfig.ts里面的SubPlatformType加一个Common_CSDN
注册子类别,需要修改
- getSubtypeList
- src/platforms/pre.ts
新增适配器 API授权需要再 src/adaptors/api 新建文件。例如
- HaloApiAdaptor 需要继承 BaseBlogApi
- HaloConfig 需要继承 CommonBlogConfig
- HaloPlaceholder 需要继承 CommonBlogPlaceholder
- useHaloApi 定义 const useHaloApi = async (key: string, newCfg?: HaloConfig) => {}
注册适配器 适配器 src/adaptors/index.ts getCfg 配置 src/adaptors/index.ts getAdaptor YAML适配器(不一定有)
开启配置页面 在 src/ui/components/settings/bridge/bridgeRegistry.ts 注册该平台的配置组件
修改图片上传逻辑,可选
网页授权插件开发指南
确定大类。例如:CSDN属于Custom
新建子类别。例如:src/platforms/dynamicConfig.ts里面的SubPlatformType加一个Custom_CSDN
注册子类别,需要修改
- getSubtypeList
- src/platforms/pre.ts
新增适配器 网页授权需要再 src/adaptors/web 新建文件。例如
- csdnWebAdaptor 需要继承 BaseWebApi
- csdnConfig 需要继承 CommonWebConfig
- csdnPlaceholder 需要继承 CommonWebPlaceholder
- useCsdnWeb 定义 const useCsdnWeb = async (key?: string, newCfg?: CsdnConfig) => {}
注册适配器 适配器 src/adaptors/index.ts getCfg 配置 src/adaptors/index.ts getAdaptor YAML适配器(不一定有)
开启配置页面 在 src/ui/components/settings/bridge/bridgeRegistry.ts 注册该平台的配置组件
修改图片上传逻辑,可选
docker 代理适配,已不再需要
普通请求注意事项,目前全程使用 proxy,例如:简书、知乎、微信公众号,代码要注意的地方:
jsconst resJson = await this.webFetch(apiUrl, [mergedHeaders], body, method, contentType, true, "base64", "text")图片上传注意事项,目前有两种方式:
10.1 全程使用 proxy,例如:知乎、简书、微信公众号,代码要注意的地方:
// 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
// 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)文件系统插件开发指南
确定大类。例如:LocalSystem属于Fs
新建子类别。例如:src/platforms/dynamicConfig.ts里面的SubPlatformType加一个Fs_LocalSystem
注册子类别,需要修改
- getSubtypeList
- src/platforms/pre.ts
新增适配器 API授权需要再 src/adaptors/fs 新建文件。例如
- LocalSystemApiAdaptor 需要继承 BaseBlogApi
- LocalSystemConfig 需要继承 CommonBlogConfig
- LocalSystemPlaceholder 需要继承 CommonBlogPlaceholder
- LocalSystemYamlConvertAdaptor 需要继承 YamlConvertAdaptor
- useLocalSystemApi 定义 const useLocalSystemApi = async (key: string, newCfg?: LocalSystemConfig) => {}
注册适配器 适配器 src/adaptors/index.ts getCfg 配置 src/adaptors/index.ts getAdaptor YAML适配器(不一定有)
开启配置页面 在 src/ui/components/settings/bridge/bridgeRegistry.ts 注册该平台的配置组件
修改图片上传逻辑,可选
构建命令
| 目标 | 命令 | 输出 |
|---|---|---|
| 插件本体 | pnpm build(含 vue-tsc 类型检查) | dist/ |
| 单独构建插件 lib | pnpm pluginBuild | dist/ |
| 思源挂件 | pnpm widgetBuild | widget/ |
| 浏览器扩展(Chrome) | pnpm extBuild | extension/chrome/ |
| 浏览器扩展(Firefox) | pnpm extBuild -t firefox | extension/firefox/ |
| nginx 部署 | pnpm nginxBuild | nginx/ |
| vercel 部署 | pnpm vercelBuild | vercel/ |
四个 web 产物由 vite.webapp.config.ts 统一构建,按 BUILD_TYPE 落到各自目录。
动态引用的类库
下面这些库需要动态引用,不能直接打进构建产物:
"fetch-blob": "^4.0.0",
"formdata-polyfill": "^4.0.10",