通用辅助函数
简介
本文件面向“通用辅助函数”的技术文档,系统梳理与归纳了跨平台、跨模块的常用工具函数,覆盖字符串处理、尺寸解析、对象属性合并、样式注入与内联、脚本加载、请求与下载、存储、URL 工具、版本管理、日志与计时器等能力。文档提供函数参考、设计目的、适用场景、性能与注意事项,并辅以可视化图示帮助开发者高效使用。
项目结构
通用辅助函数主要分布在以下位置:
- 平台层:web/h5 平台导出统一工具入口,便于在不同运行环境复用
- UI 层:提供尺寸转换、对象属性合并等与 UI 渲染密切相关的工具
- 渲染器层:提供样式注入、内联、脚本加载、插件识别、页面设置等渲染期工具
- 基础工具包:提供通用的字符串、类型判断、网络请求、下载、存储、Cookie、JSONP、定时器、日志、版本等工具
graph TB
subgraph "平台层"
WEB["@vtj/web 工具入口<br/>platforms/web/src/utils/index.ts"]
H5["@vtj/h5 工具入口<br/>platforms/h5/src/utils/index.ts"]
end
subgraph "UI 层"
UIIDX["UI 工具入口<br/>packages/ui/src/utils/index.ts"]
UIUTIL["UI 工具实现<br/>packages/ui/src/utils/util.ts"]
end
subgraph "渲染器层"
RNDIDX["渲染器工具入口<br/>packages/renderer/src/utils/index.ts"]
RNDUTIL["渲染器工具实现<br/>packages/renderer/src/utils/util.ts"]
end
subgraph "基础工具包"
UIDX["工具包入口<br/>packages/utils/src/index.ts"]
UBASE["基础工具<br/>packages/utils/src/base.ts"]
UCLIENT["客户端工具<br/>packages/utils/src/client.ts"]
UCOOKIE["Cookie 工具<br/>packages/utils/src/cookie.ts"]
UDOWNLOAD["下载工具<br/>packages/utils/src/download.ts"]
UJSONP["JSONP 工具<br/>packages/utils/src/jsonp.ts"]
ULOAD["脚本加载<br/>packages/utils/src/loadScript.ts"]
ULOGGER["日志工具<br/>packages/utils/src/logger.ts"]
URAF["动画帧工具<br/>packages/utils/src/raf.ts"]
UREQUEST["请求工具<br/>packages/utils/src/request.ts"]
USTORAGE["存储工具<br/>packages/utils/src/storage.ts"]
UURL["URL 工具<br/>packages/utils/src/url.ts"]
UVERSION["版本工具<br/>packages/utils/src/version.ts"]
UUTIL["通用工具<br/>packages/utils/src/util.ts"]
end
WEB --> UIDX
H5 --> UIDX
UIIDX --> UIUTIL
RNDIDX --> RNDUTIL
UIDX --> UBASE
UIDX --> UCLIENT
UIDX --> UCOOKIE
UIDX --> UDOWNLOAD
UIDX --> UJSONP
UIDX --> ULOAD
UIDX --> ULOGGER
UIDX --> URAF
UIDX --> UREQUEST
UIDX --> USTORAGE
UIDX --> UURL
UIDX --> UVERSION
UIDX --> UUTIL
核心组件
本节对常用工具函数进行分类与要点说明,便于快速定位与使用。
-
字符串与类型处理
- 将任意值转为字符串(保留原字符串或序列化)
- 判断是否为 Vue 插件(函数或带 install 的对象)
- 判断是否为内置标签或原生 HTML 标签
- 将布尔或对象值转换为对象属性集合(默认值合并)
-
尺寸与单位处理
- 将数值或百分比/视口单位转换为像素数值
- 将数值或字符串尺寸转换为字符串(自动补 px)
-
样式与脚本注入
- 通过 CSSStyleSheet 或 style 元素注入样式(支持作用域与 rpx 转换)
- 将已 adopted 的样式表内联到 head 中
- 按 URL 列表批量注入 link stylesheet
- 异步加载远程脚本并暴露全局库对象
-
页面与容器设置
- 基于页面/区块文件设置容器类名(如 is-page、is-pure)
-
平台与运行时
- 获取 Mock 实例(兼容不同运行时)
- 通用工具(类型判断、字符串处理等)
架构总览
通用辅助函数采用“分层聚合”的组织方式:
- 平台入口:统一导出工具包,屏蔽平台差异
- 功能子模块:按领域拆分(网络、存储、样式、脚本、日志等)
- UI/渲染器适配:在 UI 层与渲染器层补充与框架强相关的工具
graph LR
PWEB["平台 Web 入口"] --> UENTRY["工具包入口"]
PH5["平台 H5 入口"] --> UENTRY
UENTRY --> NET["网络/请求"]
UENTRY --> STORAGE["存储/Cookie"]
UENTRY --> DOWNLOAD["下载"]
UENTRY --> SCRIPT["脚本加载"]
UENTRY --> LOG["日志"]
UENTRY --> TIMER["计时器/RAF"]
UENTRY --> UTIL["通用工具"]
UI["UI 工具"] --> UENTRY
RENDER["渲染器工具"] --> UENTRY
详细组件分析
UI 工具函数
-
函数:getSizeValue
- 设计目的:统一尺寸输出格式,数字自动补 px
- 参数:value(字符串或数字)
- 返回:字符串(带 px 或原样返回)
- 适用场景:样式计算、尺寸传参
- 性能与注意:常量时间,无副作用
-
函数:parseSize
- 设计目的:将百分比/视口单位转换为基于最大值的像素值
- 参数:size(字符串或数字)、max(最大值)
- 返回:数字(像素)
- 适用场景:响应式布局、容器尺寸计算
- 性能与注意:正则匹配与整数解析,建议传入合法字符串
-
函数:toObjectProps
- 设计目的:将布尔或对象值标准化为对象属性集合
- 参数:value(布尔或对象)、defaultValue(默认对象)
- 返回:对象(合并默认值与传入对象)
- 适用场景:组件属性合并、配置项归一化
- 性能与注意:浅拷贝与对象合并,避免深层嵌套
flowchart TD
Start(["进入 parseSize"]) --> TypeCheck["判断 size 类型"]
TypeCheck --> IsNum{"是数字?"}
IsNum --> |是| RetNum["直接返回数字"]
IsNum --> |否| Regex["检测是否为百分比/视口单位"]
Regex --> HasUnit{"匹配到单位?"}
HasUnit --> |是| ParseInt["解析数值并按比例计算"]
HasUnit --> |否| ParseInt2["解析为整数"]
ParseInt --> Floor["向下取整"]
ParseInt2 --> RetInt["返回整数"]
Floor --> End(["结束"])
RetInt --> End
RetNum --> End
渲染器工具函数
-
函数:toString
- 设计目的:将任意值转为字符串(字符串保持不变,否则 JSON 序列化)
- 参数:value(任意)
- 返回:字符串
- 适用场景:日志、调试信息输出
-
函数:adoptedStyleSheets
- 设计目的:向文档注入样式,支持作用域与 rpx 转换;优先使用 CSSStyleSheet API,回退到 style 元素
- 参数:global(运行时窗口)、id(样式标识)、css(样式内容)、scoped(是否作用域)
- 返回:无(副作用注入样式)
- 适用场景:动态样式注入、主题切换
- 性能与注意:CSSStyleSheet.replaceSync 在部分浏览器不可用时会回退到 DOM 操作,注意幂等性与去重
-
函数:adoptStylesToInline
- 设计目的:将已 adopted 的样式表规则内联到 head 的 style 中
- 参数:document(文档对象)
- 返回:无(副作用)
- 适用场景:预渲染、静态化输出
-
函数:loadCss
- 设计目的:异步拉取远程 CSS 并注入
- 参数:id、url
- 返回:无
- 适用场景:懒加载样式
-
函数:loadCssUrl
- 设计目的:批量注入 link stylesheet
- 参数:urls(URL 数组)、global(可选)
- 返回:无
- 适用场景:多资源样式加载
-
函数:loadScriptUrl
- 设计目的:异步加载远程脚本并暴露全局库对象
- 参数:urls(URL 数组)、library(库名称)、global(可选)
- 返回:Promise(解析为模块默认或命名导出)
- 适用场景:第三方库按需加载
- 性能与注意:onload/onerror 处理,避免重复注入
-
函数:isVuePlugin
- 设计目的:判断值是否为 Vue 插件(函数或含 install 的对象)
- 参数:value(未知)
- 返回:布尔
- 适用场景:插件注册前校验
-
函数:isBuiltInTag / isNativeTag
- 设计目的:区分内置组件与原生 HTML 标签
- 参数:tag(字符串)
- 返回:布尔
- 适用场景:渲染器标签路由
-
函数:getMock
- 设计目的:获取 Mock 实例(兼容不同运行时)
- 参数:global(可选)
- 返回:Mock 对象或 undefined
- 适用场景:测试与开发环境
-
函数:setupPageSetting
- 设计目的:根据页面/区块文件设置容器类名
- 参数:app(应用实例)、route(路由对象)、file(页面/区块文件)
- 返回:无
- 适用场景:页面容器状态标记
sequenceDiagram
participant Caller as "调用方"
participant Loader as "loadScriptUrl"
participant Doc as "document.head"
participant Global as "window"
Caller->>Loader : 传入 urls, library
Loader->>Global : 读取已有模块
alt 已存在
Loader-->>Caller : 返回模块
else 不存在
loop 遍历 urls
Loader->>Doc : 创建 script 元素并设置 src
Doc-->>Loader : onload/onerror 回调
alt 加载成功
Loader->>Global : 读取 library
Loader-->>Caller : 返回模块
else 加载失败
Loader-->>Caller : 抛出错误
end
end
end
基础工具包(packages/utils)
-
入口导出:统一导出各子模块,便于按需引入
-
通用工具(util.ts)
- 包含类型判断、字符串处理等基础能力
-
基础工具(base.ts)
- 提供基础类型与工具函数
-
客户端工具(client.ts)
- 运行时环境检测与客户端相关能力
-
Cookie 工具(cookie.ts)
- Cookie 读写与解析
-
下载工具(download.ts)
- 文件下载与 Blob 处理
-
JSONP 工具(jsonp.ts)
- JSONP 请求封装
-
脚本加载(loadScript.ts)
- 脚本加载与模块暴露
-
日志工具(logger.ts)
- 日志级别与输出控制
-
计时器(raf.ts)
- 动画帧与节流工具
-
请求工具(request.ts)
- HTTP 请求封装(GET/POST/拦截器等)
-
存储工具(storage.ts)
- 本地存储封装(localStorage/sessionStorage)
-
URL 工具(url.ts)
- URL 解析与查询参数处理
-
版本工具(version.ts)
- 版本比较与语义化版本处理
依赖分析
- 平台入口依赖工具包:web/h5 平台通过入口统一导出 @vtj/utils,降低模块耦合
- UI/渲染器依赖工具包:UI 层与渲染器层分别导出自身工具入口,再由工具包统一收敛
- 工具包内部模块解耦:各子模块独立导出,按需引入,避免全量导入
graph TB
WEBIDX["platforms/web/src/utils/index.ts"] --> UENTRY["packages/utils/src/index.ts"]
H5IDX["platforms/h5/src/utils/index.ts"] --> UENTRY
UIIDX["packages/ui/src/utils/index.ts"] --> UIUTIL["packages/ui/src/utils/util.ts"]
RNDIDX["packages/renderer/src/utils/index.ts"] --> RNDUTIL["packages/renderer/src/utils/util.ts"]
UENTRY --> UUTIL["packages/utils/src/util.ts"]
UENTRY --> UREQUEST["packages/utils/src/request.ts"]
UENTRY --> USTORAGE["packages/utils/src/storage.ts"]
UENTRY --> UURL["packages/utils/src/url.ts"]
UENTRY --> UDOWNLOAD["packages/utils/src/download.ts"]
UENTRY --> ULOAD["packages/utils/src/loadScript.ts"]
UENTRY --> ULOGGER["packages/utils/src/logger.ts"]
UENTRY --> URAF["packages/utils/src/raf.ts"]
UENTRY --> UCOOKIE["packages/utils/src/cookie.ts"]
UENTRY --> UJSONP["packages/utils/src/jsonp.ts"]
UENTRY --> UCLIENT["packages/utils/src/client.ts"]
UENTRY --> UBASE["packages/utils/src/base.ts"]
UENTRY --> UVERSION["packages/utils/src/version.ts"]
性能考虑
-
样式注入
- 优先使用 CSSStyleSheet API 注入,不支持时回退到 DOM 操作;注意幂等性与去重,避免重复插入
- 内联 adopted 样式时受同源策略限制,读取失败会记录错误,建议降级处理
-
尺寸解析
- 百分比/视口单位解析涉及正则与整数解析,建议传入规范字符串,避免异常分支
-
脚本加载
- 使用 Promise 包装 script 加载,onload/onerror 分支明确,避免重复注入
-
请求与下载
- 统一的请求封装与下载工具,建议结合缓存与超时控制,避免频繁 IO
故障排查指南
-
样式未生效
- 检查是否正确调用注入函数,确认 id 唯一且未被覆盖
- 若使用 CSSStyleSheet API,确认浏览器支持情况
-
adopted 样式内联失败
- 检查同源策略与 CORS 设置,确认 cssRules 可读
-
脚本加载失败
- 检查 urls 是否可达,onerror 回调是否触发
-
插件注册报错
- 使用 isVuePlugin 校验插件类型,确保为函数或含 install 的对象
-
Mock 未找到
- 使用 getMock 获取实例,注意不同运行时的差异
结论
通用辅助函数体系以“平台入口 + 工具包 + 领域子模块”的方式组织,兼顾跨平台与功能内聚。UI/渲染器层补充与框架强相关的工具,基础工具包提供通用能力。通过本文档的函数参考、设计目的、适用场景与性能注意事项,开发者可高效选择与组合工具函数,提升开发效率与稳定性。
附录
-
平台入口导出
- web 平台导出统一工具入口,便于在不同运行环境复用
- h5 平台导出统一工具入口
-
UI 工具入口
- 导出尺寸、对象属性合并等工具
-
渲染器工具入口
- 导出样式、脚本、插件识别、页面设置等工具