工作台小组件开发
开发环境
node 18+
下载开发模板
Usage
首先进入WPS开放平台 > 应用能力 > 工作台小组件能力配置 > 创建小组件
复制block_type_id

进入小组件模板根目录config/evn.json,粘贴复制的block_type_id

依次执行
yarn
git init
git add .
git commit -m "xxx"
打包会带上commit信息用于确认包版本,所以打包前务必执行commit
完成上述步骤后,执行 yarn build ,会在根目录下生成bundle文件夹和androidBundleCommonInfo.json和iosBundleCommonInfo.json,后两个json是用来映射基础包依赖关系的,不要动。

bundle文件夹下common为基础包,忽略即可。剩下三个包即是需要上传的包。
回到WPS开放平台刚刚复制block_type_id的小组件页面,点击创建版本,按提示上传三端包即可。
如何开发小组件
小组件的实现是完全依赖于react-native的,PC是通过react-native-web编译而成,所以一切遵循react-native&react的框架规范和语法逻辑,相关问题请翻阅React Native官方文档
PC端开发
- 执行
yarn dev:web,将在项目目录下的 dist 文件夹输出小组件产物。 - 打开金山协作调试模式,在 localStorage 中新增
workspace_debug_comp参数,name为 block_type_id,url可以为任何端内能正常访问加载的 url(同源或者白名单),例如:https://woa.wps.cn/debugwidget/block.js。(仅新增小组件开发调试需配置,开发已上线小组件直接代理接口返回的 packages 中的 url 即可) - 在 localStorage 配置
workspace_debug_nocache为true,可以让客户端工作台不读取缓存,每次加载都从 url 获取最新数据。

- 本地启动一个服务,推荐VSCode插件Live Server

安装后点击go live,默认端口应该是5500,也可以更改成其他端口,具体使用方式看插件文档。
因为本地启动的服务是无法直接在客户端中加载渲染的,所以接下来要做的事就是把localstorage中配置的能够正常访问的url代理到本地服务的ip:port上去。(例如host+nginx、whistle等等)
下面是用whistle的方式:
- 开启金山协作网络代理,设置=>通用设置=>网络代理(去设置),代理服务器为whistle服务。

- 在代理中将 localstorage中配置的url(https://woa.wps.cn/debugwidget/block.js)请求指向本地产出的小组件js后打开工作台即可看到小组件成功注册

小组件的调试信息输出在工作台所在的webview,请先在控制台执行以下代码打开工作台调试工具
document.querySelector('#webview-portal-workspace').openDevTools()
小组件代码改动后要看最新改动的效果,可选中工作台的调试工具(mac是cmd+r,windows是ctrl+r)单独刷新工作台。
移动端开发
敬请期待
props属性
以下为几个所有组件都会接收到的数据信息
| 属性名 | 数据类型 | 含义 |
|---|---|---|
| blockid | string | 当前组件的id |
| height | number | 小组件高度高度(如存在标题含去标题高度) |
| isPadStyle | boolean | 是否是移动端pad布局 |
| isMobile | boolean | 是否是编辑器移动端(用于区分web环境,移动端没有此字段,仅用于编辑器适配) |
| showHeader | boolean | 小组件是否显示标题的状态 |
| transparency | number | 小组件透明度 |
| lang | string | 当前语言环境:zh-CN 简体中文、zh-TW 繁体中文、en-US 英语、th-TH 泰语、ja-JP 日语 |
API
当小组件需要主动调用客户端提供的能力时,就需要用到客户端向react-native注册的api方法。
react-native中的NativeModules下存在对象WOARCTBridgeModule,上面有挂载小组件所支持的api,可以通过调用相关api实现对应功能,随着版本的迭代可能会新增api,所以调用前请进行判空操作,以防较早版本客户端没有当前api而出现报错阻塞渲染的情况。
import { NativeModules } from 'react-native'
const ksxz = NativeModules.WOARCTBridgeModule
ksxz.xxx...2
3
login
获取临时登录凭证,参数为组件的blockId。会通过props传入,如果是初次开发可以先上传模板在预览编辑器中添加组件获取blockId临时写死在组件中进行mock。
| 方法名 | 参数 | 返回值 |
|---|---|---|
| login | blockId: string | JSON.Stringify({ code: 0, data: { code: 'xxxxxxxxxxx' }, msg: 'success' }) |

import { NativeModules } from 'react-native'
const ksxz = NativeModules.WOARCTBridgeModule
const App = (props) => {
const { blockId } = props
useEffect(() => {
login()
}, [])
const login = async () => {
const res = await ksxz.login(blockId)
const { code, data, msg } = JSON.parse(res)
...
}
...
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
request
发起http请求,存在于gateway网关当中的域名传后缀即可,通过读取serviceName字段进行拼接域名前缀。传值需要stringify序列化,返回值同样是stringify后的data。
非gateway网关服务内置域名推荐使用react-native官方内置fetch方法。
| 方法名 | 参数 | 返回值 |
|---|---|---|
| request | 同axios | Promise<string> |
NativeModules.WOARCTBridgeModule.request(`api/v1?block_id=${blockId}`, {
method: 'GET',
serviceName: 'woa',
})
NativeModules.WOARCTBridgeModule.request(`api/v1/`, {
method: 'post',
serviceName: 'woa',
body: JSON.stringify(data),
})2
3
4
5
6
7
8
9
10
getStyleSetting
获取当前客户端样式相关设置,包含字号和主题色
| 方法名 | 参数 | 返回值 | 描述 |
|---|---|---|---|
| getStyleSetting | void | JSON.stringify({ fontScaleLevel: number, colorTheme: 'light' | 'dark' }) | fontScaleLevel:字体缩放级别,PC端取值范围0-3,mobile取值范围0-5。colorTheme:主题色,'light'为浅色模式,'dark'为深色模式。 |
使用示例:
NativeModules.WOARCTBridgeModule.getStyleSetting()getServiceUrl
获取对应服务的域名
| 方法名 | 参数 | 返回值 |
|---|---|---|
| getServiceUrl | serviceName: string | url: string |
使用示例:
NativeModules.WOARCTBridgeModule.getServiceUrl('woa')openDeeplink
打开deeplink
| 方法名 | 参数 | 返回值 |
|---|---|---|
| openDeeplink | deeplink: string | void |
使用示例:
NativeModules.WOARCTBridgeModule.openDeeplink(`ksoxz://xz.wps.cn/webapp?app_id=${appid}`)onDragApp
仅移动端支持,拖拽事件,通知移动端当前拖拽状态,屏蔽移动端本身的部分事件。
| 方法名 | 参数 | 返回值 |
|---|---|---|
| onDragApp | status: 0 | 1 | 2 | void |
参数说明:
0: 开始拖拽,屏蔽移动端页面滑屏
1: 拖拽中,通知移动端当前是拖拽事件,非长按,关闭长按相关菜单
2: 结束拖拽,恢复移动端页面滑屏
使用示例:
NativeModules.WOARCTBridgeModule.onDragApp(0)事件通信
当客户端需要主动向小组件推送某些更新时,就需要小组件监听端推送过来的事件。
react-native中的NativeEventEmitter可以用来监听端触发的事件,客户端向NativeModules中注册了WOARCTCustomEventEmitter自定义事件触发器,构建对象的时候传入即可
import { NativeModules, NativeEventEmitter } from 'react-native'
const eventEmitter = new NativeEventEmitter(NativeModules.WOARCTCustomEventEmitter)
useEffect(() => {
let stylesListener = eventEmitter.addListener('app_style_setting_change', (styleSettingStr: string) => {
setStyleSetting(JSON.parse(styleSettingStr))
})
return () => {
// 养成销毁监听的好习惯
if (stylesListener) {
stylesListener.remove()
}
}
}, [])2
3
4
5
6
7
8
9
10
11
12
13
14
15
事件类型
| 事件名 | 回调函数参数 | 说明 |
|---|---|---|
| app_style_setting_change | styleSettingStr: string | getStyleSetting的主动推送版,一般在初始化时调用getStyleSetting获取初始值,然后监听该事件进行响应客户端操作的变更。回调函数参数同getStyleSetting。 |
| $ | any | 针对特定组件推送的事件,事件名为组件的实际blockId,回调函数参数取决于业务方需要传达的内容。 |
注意事项
- 小组件模板里根目录下common.ts文件中引入的依赖包版本不能更新,否则可能会对不上端内依赖的基础包版本依赖,导致渲染失败报错。