@lhx-kit/runtime浏览器侧运行时能力集合。subpath export 设计,按需 import 只打需要的东西。
@lhx-kit/runtime 只是 setupRuntime() 便利函数,生产代码建议直接 import 子模块typeof document === 'undefined' 分支都有 no-op 实现axios + ua-parser-js)
:::| 依赖 | 版本 | 用途 |
|---|---|---|
axios |
^1.7.9 |
request 子模块的底层 HTTP 客户端;拦截器栈 + 错误分类建立在 axios 上 |
ua-parser-js |
^1.0.39 |
env 子模块解析 UA → {browser, os, device, engine} |
msw |
>=2(peer 可选) |
mock 子模块的 Service Worker + Node Interceptor 运行时 |
一共 10 个子模块,全部通过 @lhx-kit/runtime/<name> subpath 暴露。
@lhx-kit/runtime/request — HTTP 客户端Axios 实例工厂,提供工业级能力:
| 能力 | 说明 |
|---|---|
| 🏷️ 公共参数 / 头注入 | commonParams 自动合并到 config.params;commonHeaders 合并到 headers |
| 🔗 拦截器栈 | 三个数组:requestInterceptors / responseInterceptors / errorInterceptors |
| 🔁 去重(dedupe) | 按 method + url + params + data 作为 key 缓存 in-flight 请求 |
| 🔄 重试(retry) | 次数 + 延迟 + shouldRetry 谓词;默认只对网络错误重试,4xx 不重试 |
:::details 🧮 去重算法
JSON 序列化对 key 顺序敏感是故意的:{a:1,b:2} 和 {b:2,a:1} 视为不同请求。
避免错误去重的典型场景:业务代码里 a={id:1}; b={id:1, extra:'…'} 明显是两个不同请求。
@lhx-kit/runtime/env — 环境检测@lhx-kit/runtime/mobile — 移动端适配整个 kit 的一大亮点。完整决策背景见 📱 移动端适配。
@lhx-kit/runtime/logger — Sink-based Logger不与具体上报平台耦合:
| 特性 | 说明 |
|---|---|
| 日志级别 | trace < debug < info < warn < error |
| sink 并行 | sink 之间并行执行,异常独立 catch(一个挂不影响其他) |
| 结构化字段 | 支持 key-value 对象,不是字符串拼接 |
@lhx-kit/runtime/bridge — WebView JSBridge保证在桌面浏览器 / SSR 下代码照样能跑,返回 reject 或 undefined。
@lhx-kit/runtime/auth — 可插拔登录不绑定任何具体登录方案:
与 request 配合:
@lhx-kit/runtime/mock — MSW 封装import.meta.env.DEV 条件判断,完全 tree-shake 掉
:::@lhx-kit/runtime/experiment — Feature Flag内部用 localStorage 做 ttl 缓存,失败时兜底到 defaults。
@lhx-kit/runtime/theme — CSS 变量主题写到 document.documentElement.style,所有用 var(--color-primary) 的 CSS 立即生效。
@lhx-kit/runtime/cdn-loader — 给插件用给 @lhx-kit/vite-plugin 使用的 CDN 加载器源码生成器。用户代码一般不直接用。
详见 🌐 CDN 外挂。
setupRuntime 聚合入口:::warning 业务代码建议直接 import 子模块
tree-shake 粒度更好。
早期版本是单入口 @lhx-kit/runtime,全部能力一次性 import。三个问题:
:::danger 单入口的问题
axios / ua-parser-js 这类大依赖即使不用 request / env 也被打进 bundlemock 模块内部 await import('msw'),Vite 的 pre-bundle 会预解析 msw → 即使生产不用也走一遍依赖拆成 subpath export 后:
import '@lhx-kit/runtime/mobile' → 最终 bundle 里只有 120 行 mobile 代码import '@lhx-kit/runtime/request' → 打包时才把 axios 拉进来每个 src/*.ts 都编译成独立 dist 文件并 emit dts,保证:
package.json#exports 字段和文件完全对应package.json exportsmobile 子模块的深度专题cdn-loader 子模块的深度专题