Skip to content

createMyTrans / dlsjsTrans

createMyTrans方法用于构建一个自定义的 JSON 翻译器,将存储在 JSON 中的配置(包括函数、异步操作等)翻译为可执行的 JavaScript 对象。dlsjsTrans 是 dlsjs 提供的预设翻译器实例,使用默认规则。

语法

javascript
createMyTrans(rules)
dlsjsTrans(jsonObj, scope)

描述

createMyTrans 函数接收一个 rules 参数,用于扩展预设的翻译规则,返回一个新的翻译器函数。翻译器内部使用 deepConvert 进行深度遍历,对 JSON 对象中的每一个值根据规则进行翻译。

翻译器的工作原理

翻译器在遍历 JSON 对象时,会按照以下优先级匹配规则:

  1. 保留键名(reservedKey):当键名匹配时,将键值送入对应函数解析
  2. 保留属性(reservedProperty):当对象包含特定属性时,将整个对象送入对应函数解析,返回值替换原对象
  3. 保留深度属性(reservedDeepProperty):类似保留属性,但返回值会继续被翻译
  4. 保留字(reservedWord):当字符串值匹配 @关键字/内容 格式时,将内容部分送入对应函数解析

预设规则说明

保留属性(reservedProperty)

属性说明
@step创建多步函数,支持 custom 和 eval 两种步骤类型
@json将字符串通过 JSON.parse 解析为对象

保留字(reservedWord)

关键字说明返回值
@scope从 scope.data 中取值对应路径的数据
@dataScope同 @scope对应路径的数据
@eval构造一个返回表达式值的函数function
@funcEval构造并立即执行函数,返回结果any
@func构造一个可调用函数,参数通过 args 传入function
@async构造一个返回 Promise 的异步函数async function

保留字的使用格式为 @关键字/表达式,例如 @eval/scope.value + 1

自定义规则

通过 createMyTrans(rules) 可以扩展以下四类规则:

  • rules.reservedProperty - 扩展保留属性
  • rules.reservedDeepProperty - 扩展保留深度属性
  • rules.reservedWord - 扩展保留字
  • rules.reservedKey - 扩展保留键名

自定义规则会与预设规则合并(Object.assign),同名规则会覆盖预设规则。

注意事项

  • 翻译器内部使用 new Function 动态构造函数,存在安全风险,不要翻译不可信的 JSON 数据
  • @eval@funcEval@func@async 构造的函数可以访问 scopeRWdayjs 三个变量
  • @scope@dataScopescope.data 中取值,路径需以 #/ 开头
  • @step 中的 custom 类型步骤需要通过 params.funcScope 提供自定义函数
  • dlsjsTranscreateMyTrans({}) 的返回值,使用所有预设规则
  • 翻译器会递归处理对象和数组,直到所有可翻译的内容都被处理
  • 终止符判断(isTerminator)用于防止翻译器无法停止,匹配到保留属性或保留字时会识别为分支终点
  • 该函数依赖 ramda 和 dayjs

示例

使用预设翻译器

创建自定义翻译器

浏览器兼容

createMyTransdlsjsTrans 使用了 new Function、箭头函数、async/await 等特性,需要支持 ES2017 的浏览器环境:

  • Chrome 55+
  • Firefox 52+
  • Safari 11+
  • Edge 15+

不支持 IE 浏览器。

性能考虑

  • 时间复杂度: O(n) - 其中 n 是 JSON 对象中所有节点的数量(深度遍历)
  • 空间复杂度: O(n) - 需要存储翻译后的对象和递归调用栈
  • new Function 的构造开销较大,建议对同一配置只翻译一次并缓存结果
  • 翻译器内部使用 Object.assign 合并规则,每次调用 createMyTrans 都会生成新的规则集
  • 对于大型 JSON 配置,建议分块翻译或使用懒加载策略
  • @async 创建的异步函数每次调用都会重新执行,应注意避免在循环中频繁调用

相关函数

  • deepConvert - 深度遍历对象的核心方法,翻译器内部使用
  • RW - 路径访问函数,翻译器内部通过它访问 scope.data
  • matchRules - 通用条件判断,可用于翻译结果的校验