Type aliases
AllKeyToType
AllKeyToType<T, B>: object
Type parameters
CCEventHubCb
CCEventHubCb: function
CCIAssistPropKeys
CCIAssistPropKeys: keyof CFPDOptMapping
CCIRequestFn
CCIRequestFn: function
Type declaration
-
-
Parameters
Returns CCIRequestResult
|
Promise<CCIRequestResult>
CFOptionInputData
CFOptionInputData: string | number | CCUploadResult | null
CFPDMarkIconName
CFPDMarkIconName: "rating-love" | "rating-nps" | "rating-love" | "rating-star" | "rating-thumbs-up" | "rating-thumbs-down" | "rating-number"
CFPDMatrixYOptionDimension
CFPDOptMapKey
CFPDOptMapKey: keyof CFPDOptMapping
CFParamNames
CFParamNames: keyof CCQueryParams
os-client-core 核心模块
changelog
该模块承载了巧思问卷答题客户端的核心逻辑流程,基于此模块可以单独开发自制的答题页面客户端,使用本模块以后,除了遵从一些启动配置和接口交互之外,只需专注于开发每个题型的 UI 即可,下面会详细介绍如何基于此模块创建自己的答题客户端应用。
使用了该核心包后,在控制台打印核心包的数据时,会发现里面的页面,节点,选项等对象上都有很多属性,但是你们如果要使用其中的属性来渲染页面,则切记一定要使用文档中提及到的属性,如果文档中没有提及到的属性,即使在控制台看到了它的内容好像是和设计端设置的内容一样,也不能使用,因为这些属性是核心包内部使用的,没有在文档中暴露给 UI,是因为它们可能会发生变化,如果后续移除了,UI 就没法正常渲染了。
已经暴露给 UI 的属性是不会轻易更改的,如果发生更改会升级核心包大版本。
如果你从代码编辑器中定位到这些属性的定义处,会发现它们都被@ignore 标注了,说明它们不应该被 UI 使用。
如果发现某个属性 UI 要使用到却没有出现在文档中(即被@ignore 了)则在 os-client-core 中提 issue。
安装核心逻辑依赖包
我们的核心包包含两种:
一个是纯核心包,只有与运行环境无关纯答题逻辑流程,无法直接运行,需要参照运行环境配置的规则,基于该纯核心包适配一些环境运行规则,然后才能在你希望的环境上运行起来。
另一个是 web 适配包,该包是参照运行环境配置的规则,基于纯核心包设配了 web 运行环境环境规则,可以直接使用与构建 web 端的答题客户端
如果你想构建基于 web 的答题客户端,建议直接使用 web 适配包,免去环境适配的工作,如果你要构建非 web 端(如小程序,原生 app)的答题客户端,则只能使用纯纯核心包,然后自行按规则配置好环境运行规则,再继续。
安装核心包:
npm install @choiceform/os-client-core/ # 或者 yarn add @choiceform/os-client-core
安装好以后可以分别按类似于下面方式使用:
使用核心包:
// 纯核心包和web适配核心包同时只用一个,自动提示包则按需使用 // 使用纯核心包 import { Core } from '@choiceform/os-client-core'; // 使用web环境适配核心包 import { Core } from '@choiceform/os-client-core/dist/web-core'; // 如果你的答题端需要支持填空题自动提示功能,需要额外使用自动提示搜索的辅助包 // 不支持的不要使用 import { getAutoCompleteData } from '@choiceform/os-client-core/dist/support/atcp';
运行环境适配
纯核心包中只包含题目解析和答题控制流程,并不包含运行环境适配的功能,比如运行时需要使用缓存,需要使用获取远程数据,需要获取系统当前语言等,这些东西在不同的运行环境中实现是不一样的,纯核心包期待每个使用它的地方为它适配好这些东西。
比如核心包可以用于微信小程序中来开发一个答题小程序,这时候就可以把微信小程序的
wx.getStorage()
配置为缓存获取方法,把wx.request()
配置为获取远程数据的方法等。再比如用于 web 方面时,
localStorage
配置为缓存适配,xmlHttpRequest
配置为网络请求适配。web 适配包是在纯核心包功能的基础上默认加入了 web 方面的适配的包,在开发 web 端的答题程序时,无需再次进行 web 适配,即可调用包中的接口开始启动答题流程。
对于其他环境上的开发则需先添加好环境适配在启动答题流程。
具体的适配规则请参照CCCore.registerEnv方法和CCEnvOptions中的说明。 也可以参照一下两个资源了解如何而配置环境运行规则:
如果你使用 typescript 编写项目,则该安装包的更目录下有 index.d.ts 提供基本的数据类型。强烈建议使用 typescript 来编写答题 UI 程序,这样在编程的时候就能通过编辑器的智能提示就能知道 UI 使用的数据源的数据结构,和相关说明.
类型文件 tips
核心包的
typescript
类型文件中使用了const enum
, 在使用--isolatedModules
配置进行编译的项目中,const enum
无法被识别,不会成inline
字面量,所以运行的时候会出错。如果你的项目使用了--isolatedModules
配置进行编译,可以在package.json
中的scripts
中增加一个任务:{ "scripts": { "postinstall": "node node_modules/@choiceform/os-client-core/enum2union.js" } }
这样当每次安装最近的核心包后,都会自动将核心包类型文件中的
const enum
准成literal union
,避免--isolatedModules
配置进行的编译问题。默认使用
const enum
是因为它较literal union
在类型辨析和文档生成方面更友好,尤其当是number union
的时候。开始创建答题客户端
你可以使用任何方式来创建一个项目,建议基于常见框架或库来创建:
对于这些常见的库和框架,我们写了一些项目案例放到了这里,你可以以这些案例项目为模板仓库创建自己的项目
当创建好项目以后我们需要安装该核心包作为依赖。
使用核心逻辑依赖包
核心包中提供了CCClient类型的
CCClient
对象,里面包含四个对象:CCClient.Core
,它是CCCore类型。CCClient.I18n
,它是CCI18n类型CCClient.EventHub
,它是CCEventHub类型import {Core, I18n, EventHub} from `@choiceform/os-client-core`; console.info(Core, I18n, EventHub);
当成功把依赖加入到自己的项目中之后,就要开始对答题客户端进行编程了。
了解答题程序流程
这里说明答题客户端运行的主要流程
基于核心包自制答题客户端时,除了专注于制作 UI 页面外,还需要在 UI 与核心包之间做出必要的交互,后面我们会以上面列出的答题流程为基础说明这两者之间要做哪些必要的交互。
下面具体说明各个流程与页面的渲染
web 端答题程序路由规则(仅适用于 web 核心适配包)
一般情况下,web 端答题程序应该实现下面四个路由:
以下是说明中,xxxx 就是问卷 id
/
,地址是形如:http://your.host.com?sid=xxxx
的规则/survey
,地址形如:http://your.host.com/survey?sid=xxxx
/reward
,展示奖励结果,地址形如:http://your.host.com/reward?sid=xxxx
的规则,和答题页面的格式一样/themes
,用于内嵌到问卷编辑器内部,让问卷设计者在设计问卷时可以实施查看某个问题在答题页面的 UI 展现.答题程序运行启动流程
进入程序后,调用核心包提供的CCCore.setup方法初始化页面配置,需要传入一个CCSetupOptions类型的参数,这个方法是一个异步方法,要等该方法执行完以后才能执后续的的操作。
初始化完成后,需要打开开始页面,在开始页面中需要调用CCCore.fetchStartState方法获得问卷封面数据,这是一个CCStartState类型的数据,然后根据开始页面/封面渲染规则进行页面渲染.
当问卷封面的
开始答题
按钮被点击以后,需要进入到答题页面,在这进入答题页面后调用CCCore.fetchSurveyState方法可以获得题目数据,这个数据是一个CCSurveyState类型的对象,当前要渲染的题目是CCSurveyState.nodes属性,然后可以根据答题页面渲染规则来渲染题目。当题目中的选项被点击或输入框被输入时,UI 层需要按UI 与核心交互回调函数说明的规则调用对应的回调函数通知核心模块,这个在答题页面渲染规则中对个各个题目的渲染规则说明中也有详细的解释.
在答题时点击上一题下一题时,UI 层需要按UI 与核心交互回调函数说明的规则调用对应的回调函数通知核心模块。
当有警告消息和错误消息时,核心模块会发出该消息,在初始化的时候需要设置CCSetupOptions.notify,CCSetupOptions.alert,CCSetupOptions.error,CCSetupOptions.locateError等几个方法来接受警告或错误消息,并在 UI 中以适当的方式将消息展示出来。
(适用于 web 端)如果配置了奖励,则在答题页面回答完了所有问题后,点击领奖按钮需要进入到奖励页面,到达奖励页面后需要调用CCCore.fetchRewardState方法来获取奖励数据,这个数据是一个CCRewardState类型的对象,然后照奖励页面/页面渲染规则来渲染奖励页面。
(仅使用 web 端)实时预览页面是一个独立页面,不在正式答题的流程内,也不会和其他几个页面发生跳转关系,他用于嵌入到问卷编辑器中提供实时预览功能,具体的渲染规则请参照实时预览页面渲染规则
开始页面/封面渲染规则
封面数据是一个CCStartState类型的对象,在该类型的 API 文档CCStartState中说明了应该在页面中渲染那些内容。
答题页面渲染渲染规则
答题页面的数据是一个CCSurveyState类型的对象,在答题页面中主要要渲染以下一些内容.
关联属性:CCSurveyState.nodes,这个属性是一个题目列表,之中有时候包含一个题目,有时候包含多个题目,需要一一渲染这些题目,其中可能出现以下这些题目类型,点击每个类型的链接可以查看该类型的渲染规则.
选择题:CCSelectNode
拖拽打分题:CCValueMarkNode
图形打分题:CCIconMarkNode
连续评价题:CCSlideRateNode
数值分配题:CCWeightNode
填空题:CCFillNode
排序题:CCSequenceNode
菜单题:CCMenuNode
级联菜单题:CCCascadeNode
图标题:CCSelectIconNode
图片选择题: CCSelectImageNode
图片框选题: CCHotSpotNode
图片热力题: CCHeatMapNode
MaxDiff 问题: CCMaxDiffNode
素材展示页面:CCDescriptionNode
上传题:CCUploadNode
手动定位题:CCRegionNode
自动定位题:CCLocationNode
范围定位题:CCAreaNode
矩阵题:CCMatrixNode
结束节点:CCEndNode
抽奖节点:CCLotteryNode
验证节点: CCVerifyNode
断点续答恢复确认面板
关联属性CCSurveyState.answerResumer,是CCAnswerResumer类型,如果该属性有值,且CCAnswerResumer.show的值为
true
,则先不要渲染题目,而是先渲染一个断点续答恢复确认面板,让答题者选择是基于之前缓存的答题记录继续做答,还是重新开始做答. 具体的渲染细节参照CCAnswerResumer类型中的说明;关联属性CCSurveyState.previewTool,是CCPreviewTool类型,如果该属性有值,说明是预览模式,需要渲染一个预览辅助工具,使得测试答题的人在预览模式下能进行一些调试操作,具体的渲染规则查看CCPreviewTool类型中的说明.
关联式属性CCSurveyState.restTime,如果该属性有值,则需要在答题页面的某个地方渲染这个值作为剩余时间的提示,这个值是一秒一秒地减少的.
关联属性CCSurveyState.needProgressBar和CCSurveyState.progress,如果CCSurveyState.needProgressBar的值为 true,则需要渲染当前答题进度,进度就是CCSurveyState.progress的值
如果CCSurveyState.nextButton属性有值,则需渲染前进(下一题)按钮,按钮的文字就是该属性的值, 点击以后需要调用CCUIEventHandler.handleNextClick方法
奖励页面/页面渲染规则(适用于 web 端)
该页面的数据是一个CCRewardState的对象,在该类型的 API 文档CCRewardState中说明了应该在页面中渲染那些内容。
实时预览页面渲染规则(适用于 web 端)
该页面的数据是一个CCRealtime类型的数据,真正要渲染的数据躲在CCRealtime.data中,它是CCRealtimeState类型,它有几个变化:
当CCRealtimeState.isStart的值为
true
时,当成开始页面渲染当CCRealtimeState.isGift的值为
true
时,当成奖励页面渲染如果以上皆不是,则当成答题页面渲染.
如果问卷内容支持多种语言,需要渲染多语言切换下拉列表,无论当成那个页面渲染,都需要.
如果问卷中要求使用计时器或进度条,当以答题页面方式渲染的时候可以渲染一个不动的时间或进度调效果,供预览.当以开始页面和奖励页面渲染的时候则不需要.
前进后退按钮,同答题页规则相同
多语言切换下拉列表
如果问卷支持多种语言的内容,则在开始页面,答题页面和实时预览页面中都需要添加一个问卷内容语言切换下拉列表 下拉列表的内容源自于:
当
langTable
中包含两个或两个以上语言是就渲染语言选择列表,没有langTable
属性,或langTable
中包含的语言只有一个则不要渲染语言选择列表.当答题者点击预览列表切换语言时,需要回调CCUIEventHandler.handleLangChange方法.
样式与主题
设计端中可以为问卷设置全局样式,分别通过以下方式访问到:
为每个节点也能设计一些布局信息,参照[[CCBNode.layout]]。
需要使用这些信息渲染页面
UI 与核心交互回调函数
各个页面和题目的 UI 被渲染出来以后,答题者可以在上面进行一些操作,当进行这些操作的时候,UI 层需要调用对应的回调函数来通知核心模块。
这些回调函数的规则在CCUIEventHandler类型中有详细的说明。
强化 UI 和逻辑分离的概念
平时我们使用 react,vue,angular 等库或框架编写前端项目时,我们的数据源和业务逻辑都是自己管理的,他们或者作为组件的状态,或者作为传入组件的属性,但是无论哪种,我们在项目中都有地方对他们的值进行修改和控制,用框架的更新属性的方法更改了这些值以后,框架就能感知到变化,就会驱动页面更新
但是当我们基于
@choiceform/os-client-core
开发答题页面程序时,答题程序的数据源和业务逻辑都是在这个包里的,答题页面程序负责开发的只是 UI 程序,UI 程序里面对业务逻辑是一无所知值的,对于数据源中某些属性的变化也是无感知的.所以就无法驱动页面更新,我们需要制定一些规则,UI 程序需要遵循这些规则,才能让核心逻辑程序包和 UI 程序可以正常地相互协作.规则:
UI 程序中使用了核心包以后,每个页面都可以通过特定的数据获取方法从核心包中取到当前页面的数据,数据层次从页面到题目,从题目到选项一层层下去,UI 中可以绑定这个数据上的各种属性渲染出页面内容.(这一步没有障碍)
UI 永远只可以使用数据源中的内容,永远不要更改数据源中的任何内容.我们以选项的操作和渲染举例说明,我们用 react 代码片段举例,其中的
option
是一个CCOption选项,question
是一个CCBNode问题,handler
是一个CCUIEventHandler事件处理器,我们假设他是从 state 中读取出来的,真实情况下可能是从上层 props 中传进来的,option
就是数据源在上述的代码中,我们渲染了一个选项,
option.selected
属性(依靠CCOption.selected来判断选项是否被选中,当选项未被选中时,背景渲染成gray
色,checkbox
处于不被check
的状态,当选项选中时,背景渲染成
red
色,checkbox
处于被check
的状态当选项被点击时,选项应该在选中与被选中的状态之间切换,这时候我们监听
onClick
事件,我们第一想法就是要使用setState
方法把把option.selected
属性的值从true
改成false
,或者从false
改为true
,这样 UI 页面就自然而然更新了,但是我们上面说了 UI 永远不能改数据源中的内容,所以 UI 程序中不能直接去改写option.selected
属性,而是通过调用CCUIEventHandler.handleOptionClick方法告诉核心逻辑层,核心逻辑层会去改写option.selected
的值但是这样会出现一个问题,核心层去改动了数据源中的内容时用的是非 UI 驱动的方法,UI 对此是无感知的.导致更改以后,UI 页面不会更新,这个问题在下一点中进行说明和解决.
怎样让 UI 层知道核心逻辑改动了数据源?
在前面我们强调了 UI 不直接更改数据源的规则,以及 UI 和逻辑分离的原因,但是当 UI 和逻辑分离以后,UI 发生操作后委托逻辑层的的回调函数中对数据源进行更改以后,UI 是不知道的,导致数据源中数据虽然发生了变化, UI 页面却没有被更新
为了解决这个问题,核心包中在更改任何可能影响 UI 渲染的数据时,都会在CCEventHub发出一个
SET_PROPS
事件,监听CCEventHub中的SET_PROPS
事件,然后再驱动 UI 页面更新。编写 UI 答题程序时要习惯 UI 和逻辑分离的思维,否则你很容易犯
在UI中更改数据源
的错误,一旦 UI 中改动了数据源中的属性,逻辑层再基于被 UI 中改坏的数据进行逻辑处理时,可能得到一个错误的结果,会导致数据结果出错.UI 组件自己内部的状态不是
数据源
,当然是由你自己任意管理,随意更改啦,不要混淆了概念哦.如果你对核心包的工作流程的理解达到炉火纯青的地步,其实你也是可以在 UI 中偶尔改一下数据源的内容,因为你知道这个改动不会影响到整个答题答题流程,这个在定制 UI 中临时解决一些特殊需求时非常有用。
建议使用 typescript 构建答题客户端,这时候核心包中的类型提示说明能帮助你快速了解各个属性的用途。
UI 中调用CCUIEventHandler的回调函数中传入的选项,题目等对象型参数,必须是数据源中的原始对象,不能是经 UI 中拷贝后的副本。
关于多语言翻译
核心包中自己适应的多语言已经翻译好了,如果你对现有的核心包中翻译的内容不满意,则可以在调用初始化方法:[CCCore.setup]的参数中配置CCSetupOptions.langSrcMap属性来把核心包使用的多语言内容变成你想要的方式.
关于 UI 的多语言,需要 UI 中自行解决,其中核心包中导出了一个
I18n
对象,里面包含CCI18n.MessageFormat属性,是一个通用的多语言翻译工具,UI 程序中可以沿用.在之前列出的例子项目中,也展示了如何解决 UI 程序自身的多语言问题. 如果要新增支持的多语言,代号请参照百科全书, 我们居于其中的代号改为使用xx_xx
这样小写字母加下划线的方式的代号.案例项目
小程序
原生应用
web 端(仅适用于 web 端)
UI 答题程序可以做成常规项目,或者动态模板项目,我们后面的项目会采用动态模板的方式
常规的前端程序,案例q.cform.io结合os-client-ui
动态模板项目,案例:os-client-live
关于两者的比较,请看os-client-live中的文档说明。
项目部署和注册(仅适用于 web 端)
答题程序做完以后,需要做以下事情,才能使你的答题程序和巧思调研系统结合起来一起工作.
我的答题程序
.如果该名字已被注册则需要换名字.https://www.myclient.com
http://localhost:8080
,这个地址是方便你本地开发调试使用的. 工作人员收到这些资料后,会审核你的答题程序,通过审核以后该程序会被注册到巧思调研系统,答题应用程序
下拉列表中,将会看到你答题程序名称,你可以选择适用你的答题程序来作为当前问卷的答题程序调试(仅适用于 web 端)
如果你在本地开发时已经在自己机器上有本地开发版的问卷编辑器,并且你准备用这个本地开发编辑器连接你的答题 UI 程序进项开发调试,则你什么操作也不需要做,他就会自动连通你本地的
http://localhost:8080
上的答题程序,记得要注意你本地启动的端口必须和上面准备资料中的端口一致哦.在本地的设计端配置
config/local.ts
中可以添加多个本地临时实验的答题端程序配置,如果你的设计端代码仓库中还没有这个文件,则启动设计端后就会出现,如果该文件报错,则删除掉该文件,重新启动一下设计端.localClient: [ { dynamic: false, id: 'My Client Demo', value: 'My Client Demo', host: 'http://localhost:4402', prod: false } ],
这样这个程序只会在你本地的设计端中出现.不会再发布后的设计端中出现
如果你使用非本地的问卷编辑器想连接本地的答题 UI 程序进行开发,则需要做以下操作才能连通.
默认情况下服务器上的问卷编辑器会连接服务骑上的答题程序,以上面提供的资料为例就是连通
https://www.myclient.com
我们在打开问卷编辑器的地址中附加额外参数
use_local_client
,这时候编辑器不再使用https://www.myclient.com
上的答题程序,而是转为使用你本地的http://localhost:8080
上启动的答题程序,记得要注意你本地启动的端口必须和上面准备资料中的端口一致哦.置顶说明
最新的格式规范,具体规则参照os-service-umbrella 的变更日志。
每次发布新版本时,需要更改 package.json 的版本号,同时需要将 changelog 中的[Unreleased]改为版本号和发布日期,并且会更改代码包中的版本名和发布日期,操作比较繁琐,所以写了个脚本来自动更改,运行
yarn release [version] [commit]
就会自动做这些更改(不填入版本号则自动递增,填入版本号时版本号不能变低,否则会报错),输入 commit 参数则会自动 git commit 版本更新的更改。一般来说,发起 pr 的提交中,只需要在 changelog 中标注更改即可,不需要升级版本号的提交,因为我们可能需要将多个 pr 都合并完后再发包,如果每个 pr 中都升级版本号,就会导致操作历史混乱。
我们等到各个 pr 都合并进来 staging 分支以后,确定了要发包时,才升级版本号并做出一个 chores:release vx.x.xx 的提交,这样,这个提交总是代表确实在这个提交处发布了一个包。
changelog
[Unreleased]
Added
Changed
Fixed
Removed
3.6.15 - 2022-8-26
Changed
3.6.14 - 2022-8-24
Changed
3.6.13 - 2022-8-24
Changed
3.6.12 - 2022-8-16
Fixed
3.6.11 - 2022-8-12
Fixed
3.6.10 - 2022-8-12
Added
3.6.9 - 2022-7-20
Fixed
3.6.8 - 2022-7-20
Fixed
3.6.7 - 2022-6-7
Fixed
3.6.6 - 2022-5-27
Changed
3.6.5 - 2022-5-23
Fixed
3.6.4 - 2022-5-16
Fixed
3.6.3 - 2022-5-12
Changed
3.6.2 - 2022-5-3
Added
Fixed
3.6.1 - 2022-4-28
Added
3.6.0 - 2022-4-27
Changed
3.4.58 - 2022-4-26
Fixed
3.4.57 - 2022-4-22
Fixed
3.4.56 - 2022-4-1
Added
Changed
3.4.55 - 2022-3-31
Changed
3.4.54 - 2022-3-31
Changed
Fixed
3.4.53 - 2022-3-30
Changed
3.4.52 - 2022-3-28
Added
Changed
Fixed
3.4.51 - 2022-3-20
Removed
3.4.50 - 2022-3-19
Changed
3.4.49 - 2022-3-16
Fixed
3.4.48 - 2022-3-16
Changed
Fixed
3.4.47 - 2022-3-16
Changed
3.4.46 - 2022-3-15
Added
3.4.45 - 2022-3-15
Changed
3.4.43 - 2022-3-12
Fixed
3.4.42 - 2022-3-11
Fixed
3.4.41 - 2022-3-11
Added
Fixed
3.4.40 - 2022-3-1
Fixed
3.4.39 - 2022-2-28
Fixed
3.4.38 - 2022-2-28
Added
3.4.34 - 2022-1-24
Added
Changed
3.4.33 - 2022-1-18
Changed
3.4.32 - 2022-1-17
Changed
Fixed
3.4.31 - 2022-1-13
Fixed
3.4.30 - 2022-1-13
Added
Changed
Fixed
3.4.21 - 2022-1-10
Fixed
3.4.20 - 2022-1-10
Removed
3.4.19 - 2022-1-10
Changed
3.4.18 - 2021-12-31
Fixed
3.4.17 - 2021-12-17
Fixed
3.4.16 - 2021-12-17
Fixed
3.4.14 - 2021-12-17
Fixed
3.4.11 - 2021-12-9
Added
Changed
Fixed
3.4.10 - 2021-12-8
Fixed
3.4.9 - 2021-12-7
Added
Changed
3.4.8 - 2021-12-4
Changed
3.4.7 - 2021-12-1
Changed
3.4.6 - 2021-11-29
Added
Removed
3.4.5 - 2021-11-27
Fixed
3.4.4 - 2021-11-25
Added
Changed
3.4.3 - 2021-11-24
Fixed
3.4.1 - 2021-11-23
Added
Changed
Removed
3.3.3 - 2021-11-8
Fixed
3.3.2 - 2021-11-6
Changed
Fixed
3.3.1 - 2021-11-2
Added
Fixed
3.3.0 - 2021-10-30
Added
hidden
的时候,标记选项的visiable
为false
Changed
Fixed
Removed
3.2.0 - 2021-9-29
Added
Changed
Fixed
Removed
3.1.2 - 2021-9-23
Changed
Fixed
Removed
3.1.1 - 2021-9-18
Added
Changed
更改上传题的文件路径属性名
只在微信环境中加载 wxsdk,并且加载失败后不中断系统运行
更改默认后退语言和语言有限度选择机制
多语言内容改为内置
升级了构建工具
配合新 UI 调整了部分不合理的属性名:normalIconUrl、activeIconUrl
Fixed
Removed
2021 年 9 月份之前的 changelog 没有被记录