- 前端
【免费下载链接】rematch
The Redux Framework
CHANGELOG.md 是@rematch/core包(Rematch 框架的核心运行时)的完整变更记录,它记录了这个包从 2018 年 0.2.0 起步、经历 1.0.0 正式化、2.0 大版本重构(monorepo、类型系统重写、架构调整)、再到当前仓库锁定的 2.2.0 的全部关键节点。本文以这份 CHANGELOG 为骨架逐版本解读:每个版本“改了什么、为什么改”,并对照当前仓库的源码(packages/core/src)与测试(packages/core/test)验证这些变更今天依然落在哪些代码路径上。读完你可以掌握三件事:Rematch 核心 API(init、addModel、dispatch/effects、插件钩子)的来历与底层实现位置;各版本破坏性变更对升级的影响;以及如何把 CHANGELOG 与源码、测试对应起来定位历史问题的回归测试。
版本总览
CHANGELOG 中部的文件头说明了它的组织方式:
All notable changes to this project will be documented in this file. See Conventional Commits for commit guidelines.
即 2.0.0-next 系列之后的条目按 Conventional Commits 规范生成(按 Bug Fixes / Features / Reverts 分组,附 commit hash),文件下半部分则沿用了更早的 Keep a Changelog 风格(按 Added / Changed / Breaking Change 分组)。整个仓库由 lerna 管理多包结构(见根目录 lerna.json),当前 packages/core/package.json 中"version": "2.2.0"与 CHANGELOG 的最新版一致。
按时间倒序,CHANGELOG 覆盖的版本节点如下:
| 版本 | 日期 | 性质 | 核心主题 |
|---|---|---|---|
| 2.2.0 | 2021-11-09 | 正式版 | 循环模型解构修复;devtoolComposer配置 |
| 2.1.1 | 2021-10-11 | 补丁 | TypeScript 类型推断修复 |
| 2.1.0 | 2021-08-13 | 正式版 | 类型修复集中批次 + treeshaking 优化 |
| 2.0.1 | 2021-02-23 | 补丁 | devtools 选项类型 |
| 2.0.0 | 2021-01-31 | 正式版 | 从 next.10 转正(仅版本号提升) |
| 2.0.0-next.1 ~ next.10 | 2020-07-30 ~ 2020-12-27 | 预发布 | 类型系统重写、bundle 瘦身、重新引入 action.meta |
| 2.0.0(旧格式条目) | 2020-03-29 | 大版本 | monorepo 重组、validate 重写、插件钩子新增 |
| 1.4.0 / 1.2.0 / 1.0.7 | 2019 ~ 2020 | 正式版 | 类型改进、依赖更新、IE11 修复 |
| 1.0.0-beta.0 ~ beta.5 | 2018-06 | 预发布 | 移除全局 dispatch/getState、baseReducer、devtools 开关 |
| 1.0.0-alpha.0 ~ alpha.9 | 2018-04 ~ 2018-06 | 预发布 | TypeScript 支持、多 store、插件 API 重写 |
| 0.2.0 ~ 0.6.0 | 2018-02 ~ 2018-03 | 早期 | 覆盖 store.dispatch、dispatch 返回 Promise、跨模型监听 |
下面按 2.x、2.0 大重构、1.x 预发布、0.x 早期四段展开,并逐一给出当前源码中的对应实现位置。
2.x 正式版:从 2.0.0 到 2.2.0
2.2.0(2021-11-09):循环模型解构修复与 devtoolComposer
CHANGELOG 中 2.2.0 记录了两类变更:
- Bug Fixes:
circular reference destructuring works with all models(#947,commit7ada366)——修复了相互引用的模型在 effects 中以解构方式互相访问时的工作问题。 - Features:
allow to config pass custom devtoolComposer for handling remote-dev-tools(#941,commit3634f5c)——允许用户在配置中传入自定义的devtoolComposer,用于对接远程 DevTools 一类的自定义 compose 方案。 - Reverts:回滚了一次误发布的 release chore(commit
6d2ebc7)。
循环模型修复的源码印证。“解构”指的是 effects 写作函数形式时把 dispatch 解构成模型名映射:effects: ({ dolphins, sharks }) => ({ ... }),让模型之间可以互相调用(比如 dolphins 的 effect 调用sharks.incrementAsync(1))。这个两阶段构建过程就在 rematchStore.ts 中——注意源码注释直接点明了为什么要分两步:
/** * generate dispatch[modelName][actionName] for all reducers and effects * * Note: To have circular models accessible in effects method with destructing, * ensure that model generation and effects generation execute in * different steps. */ bag.models.forEach((model) => prepareModel(rematchStore, model)) bag.models.forEach((model) => enhanceModel(rematchStore, bag, model))第一阶段prepareModel先把每个模型的 dispatcher 占位注入rematchStore.dispatch[model.name](rematchStore.ts),第二阶段enhanceModel才真正调用createEffectDispatcher展开 effects 并绑定(rematchStore.ts)。如果两个阶段合并在一次遍历里完成,后注册的模型在解构时还拿不到先注册模型的 dispatcher,循环引用就会失效。对应的回归测试是 circurlarmodels.test.ts,其中 dolphins 与 sharks 两个模型互相在 effects 中解构引用并跨模型 dispatch,断言最终 state:
await store.dispatch.sharks.incrementAsync(4) expect(store.getState().sharks).toEqual(4) await store.dispatch.dolphins.increment() await store.dispatch.dolphins.incrementSharksAsync() expect(store.getState().dolphins).toEqual(3)devtoolComposer 的源码印证。该配置项定义在 types.ts 的InitConfigRedux接口中(devtoolComposer?: DevtoolComposerGeneric),消费点在 reduxStore.ts:
const middlewares = Redux.applyMiddleware(...bag.reduxConfig.middlewares) const enhancers = bag.reduxConfig.devtoolComposer ? bag.reduxConfig.devtoolComposer(...bag.reduxConfig.enhancers, middlewares) : composeEnhancersWithDevtools(bag.reduxConfig.devtoolOptions)( ...bag.reduxConfig.enhancers, middlewares )即:用户提供了devtoolComposer时完全接管 enhancer 组合过程,否则回落到内置的composeEnhancersWithDevtools(reduxStore.ts),后者在devtoolOptions.disabled未开启且浏览器存在window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__时才接入 Redux DevTools Extension。这正是 1.0.0-beta.2 引入的“关闭 devtools”能力在 2.2.0 之后的最终形态。
2.1.1(2021-10-11):TypeScript 类型修复批次
CHANGELOG 记录两条 Bug Fixes:
ts typings, reducer now accepts void due to Immer usage(commita869a1f)——reducer 的类型允许返回void。这是为 immer 插件让路:immer 风格的 reducer 直接在传入的 state 上 mutate 而不显式 return,类型上必须容忍 void 返回。当前源码在 reduxStore.ts 中有直接注释佐证:
if (action.type in modelReducers) { return modelReducersaction.type as TState }types: improve the accuracy of dispatcher inference(#937,commit4bca82d,closes #939)——提升 dispatcher 的类型推断精度。dispatcher 的类型系统有专门测试目录 test/ts_typings,例如 dispatcher-typings.test.ts 即用于约束这一能力不回退。
2.1.0(2021-08-13):类型修复集中批次 + 构建优化
这是 2.x 中变更最多的一次正式发布,CHANGELOG 记录了 8 条 Bug Fixes,按主题可以归为三类:
类型与推断
connect() fails on Typescript 4.3+(#893,commitf794263)——修复 React-Reduxconnect在 TS 4.3+ 下的兼容性。make models on init() Partial<T>(#892,commit991a9d8)——init()的models入参类型放宽为Partial<T>。当前 types.ts 中InitConfig.models?: TModels | Partial<TModels>就是这一修复的落地形态。optional payload inference(#901,commitdfff163,closes #902)——payload 可选时的推断修复。reducers and effects with same name are correctly typed 4.3.X(#913,commit3db2d9f)——同名 reducer 与 effect 的 typing 冲突。this.reducer typed partially correct(commitf43c3a7)。
运行时行为
context binding in addModel(#873,commit7f99a45)——addModel时 effects 的 this 绑定修复。当前实现中 effects 被bind(modelDispatcher)(dispatcher.ts),使 effect 内部通过this调用同模型 action 时上下文正确。updated peerDependencies(#898,commit3013605)——当前 package.json 中为"peerDependencies": { "redux": ">=4" },即核心包要求 redux 4.x 或更高作为对等依赖。
构建与产物
build to modules to .mjs instead of .js and sideEffects: false for better treeshaking(commitc2978f3)——产物模块格式调整并声明无副作用以便 tree-shaking。当前 package.json 保留了"sideEffects": false,并以main/module/browser三字段分别指向 CJS、ESM 与 UMD 产物。
2.0.1 与 2.0.0(2021-02-23 / 2021-01-31)
- 2.0.1只有一条修复:
redux devtool options ts types(commit5fbf8ea),对应 types.ts 中的DevtoolOptions类型定义。 - 2.0.0标注为
Version bump only for package @rematch/core——即从2.0.0-next.10转正时没有代码变更,纯版本号提升。这也解释了为什么 2.0 系列的实际功能演进全部集中在下文 2.0.0-next 序列中。
2.0.0-next.1 ~ next.10:类型系统重写的预发布窗口
2020 年 7 月到 12 月的十个预发布版本,是@rematch/core历史上一次集中重写 TypeScript 类型的窗口。逐版本看 CHANGELOG 的条目:
- 2.0.0-next.1(2020-07-30):仅两条 Reverts(回滚了
publish %v [ci skip]的发布 chore,commit10b7f71、fbc6307),属于发布流程修正。 - 2.0.0-next.2(2020-08-19):
typescript types inference & documentation(commit178be27),开启类型推断改进。 - 2.0.0-next.3(2020-08-26):本序列中条目最多的一次,包含 12 条 Bug Fixes,核心是类型架构定型:
model state type inference(0d29531)、type inference for state and dispatch(541863b)、type inference of dispatchers(a129852)、rootState type inference on effects(a8b8484)——把 state / dispatch / rootState 的推断链路打通;createModel refactored(e024deb)——createModel重构为当前的简单形态,见 index.ts:export const createModel: ModelCreator = () => (mo) => mo as any,它作为 TS 中的类型辅助工具存在;removed dispatch(3e153ae)、incompability of redux dispatch with rematch(9b68614)——统一 rematch 自有 dispatch 与 redux dispatch 的语义;using Models as default option(4e7c29c)——类型默认泛型约定;loading: complete typings(dfa8688)、loading: removed ts-ignore and fixed typings(0ab397d)——连带把 @rematch/loading 的类型补全。
- 2.0.0-next.4(2020-08-26):
regression state on effects returning never(commit671a372),修复 effects 返回never时 state 类型退化。 - 2.0.0-next.5(2020-09-07):
regression in destructuring dispatch(commitf50c6e4)——注意这与 2.2.0 的 #947 是同一条问题线:解构 dispatch 的类型/行为在预发布期反复修复,最终在 2.2.0 以“works with all models”收尾。 - 2.0.0-next.6(2020-10-08):
core: changed option value of TExtraModels(commit8b416cd)。TExtraModels这个泛型参数用于表达插件注入的额外模型(如 loading/persist 会往根 state 上挂自己的字段),当前 types.ts 中InitConfig<TModels, TExtraModels>/Config/RematchStore等接口均以它为第二个泛型参数。 - 2.0.0-next.7(2020-11-30):一条 Bug Fix(
@rematch/select typescript plugin compatibility,#828,commit61890ca)与一条 Feature(support optional payload parameter on reducer,commit681acba)。后者使 reducer 的 payload 成为可选参数,与 2.1.0 的optional payload inference一脉相承;当前 dispatcher.ts 中createActionDispatcher对payload/meta都是“未传则不写入 action”:
return Object.assign( (payload?: any, meta?: any): Action => { const action: Action = { type: `${modelName}/${actionName}` } if (typeof payload !== 'undefined') { action.payload = payload } if (typeof meta !== 'undefined') { action.meta = meta } return rematch.dispatch(action) }, { isEffect } )- 2.0.0-next.8(2020-12-21):
Improved overall bundle size(#847,commit16e3271)。 - 2.0.0-next.9(2020-12-22):
Introduced meta to action(#848,commit2d55ae4)。这是 CHANGELOG 中一个值得注意的“先删后加”节点:2020-03-29 的旧格式 2.0.0 条目删除了meta参数(理由见下文),而 next.9 又以新形态重新引入——action 上的meta字段在 dispatcher.ts 中写入,在 effects middleware 中作为第三个实参传给 effect 实现(rematchStore.ts),reducer 侧同样以第三参接收(reduxStore.ts)。 - 2.0.0-next.10(2020-12-27):
Reduced @rematch/core bundle-size(#852,commit98f3f80),与 next.8 的 bundle 优化同线。
2.0.0 大版本重构(2020-03-29,旧格式条目)
CHANGELOG 后半段保留了一条更早的2.0.0 - 2020-03-29条目(Keep a Changelog 风格),它才是 2.0 架构层面的真正说明。逐条对照当前源码:
- 重组目录与文件以支持 monorepo 结构;构建脚本改用 tsdx 并统一 tsconfig——当前仓库正是 monorepo 布局:packages/core 与 immer、loading、persist、select、typed-state、updated 等插件包并列;tsconfig.base.json 为各包 tsconfig 提供公共基线。core 的 tsdx.config.js 与 package.json 中的
dts(tsdx 系)脚本是这一决策的延续。 validate入参从“直接传校验列表”改为“传一个返回校验列表的函数”,目的是不在生产环境执行无谓的计算——因为生产环境下错误反正不会抛出。当前 validate.ts 完整呈现了这一设计:
const validate = (runValidations: () => Validation[]): void => { if (process.env.NODE_ENV !== 'production') { const validations = runValidations() const errors: string[] = [] validations.forEach((validation) => { const isInvalid = validation[0] const errorMessage = validation[1] if (isInvalid) { errors.push(errorMessage) } }) if (errors.length > 0) { throw new Error(errors.join(', ')) } } }注意runValidations只在NODE_ENV !== 'production'分支内被调用,生产构建可被 tree-shake 掉。
- validate 收集并抛出全部错误,而不是只抛第一个——上述实现里
errors.join(', ')即“收集后一次抛出”的落地;validateConfig/validateModel/validatePlugin/validateModelReducer/validateModelEffect(validate.ts)都遵循同一套行为,测试见 validatePlugins.test.ts 与 config.test.ts。 - store 默认名从纯数字改为
Rematch Store ${number}——当前 config.ts 精确实现了这一点:
let count = 0 ... const storeName = initConfig.name ?? `Rematch Store ${count}` count += 1该名字同时用作 Redux DevTools 中 store 的展示名(devtoolOptions.name,config.ts)。
- 移除插件配置内嵌其他插件的能力(避免重复注册等问题)——改为在插件 README 中声明依赖顺序。当前 config.ts 中插件配置合并只处理
models与redux两个维度,无递归插件机制。 - 移除 action 的
meta参数——CHANGELOG 给出的理由是它“仅面向高级场景”且其能力可以不依赖 meta 实现;后文可见该参数在 2.0.0-next.9(#848)以更规范的形态回归。 - 移除
onInit钩子——CHANGELOG 称“确实没有使用场景”。 - 新增插件钩子
onReducer与onRootReducer——当前消费点分别是 reduxStore.ts(每个模型 reducer 生成后依次交给各插件包裹)与 reduxStore.ts(root reducer 合并后交给插件包裹),插件类型定义见 types.ts 的Plugin接口。 dispatch与effects从插件下沉为 core 内置能力——CHANGELOG 的理由是“更易推理、更易写插件、类型声明更清晰”。当前源码印证:effects 由内置 middleware 处理(rematchStore.ts 的createEffectsMiddleware,先执行同名的 reducer action,再执行 effect 并返回其结果),dispatcher 构建在 core 的 dispatcher.ts 中,而非任何插件。- 改进类型定义——为 2.0.0-next 系列的大规模类型重写做铺垫。
1.x:从 alpha 到正式版的稳定化路径
1.0.0 正式版与 1.0.7(2018-09-27 / 2019-03-02)
CHANGELOG 记录 1.0.0 为里程碑版本(条目以一句“Happy 1.0!”收尾),1.0.7 则:
- 插件统一采用 MIT 许可证;
- 更新依赖与示例;
- 修复 IE11 上的问题;
- 建立 TypeScript 测试与 CI 构建。
1.0.0-beta 系列:多 store 时代的关键 API 定型
- beta.5(2018-06-27):新增
model.baseReducer,允许在模型内使用“普通 Redux reducer”先处理 action,model.reducers再在其结果之上运行以产出最终 state。当前 reduxStore.ts 完整保留了这一语义:
const modelBaseReducer = model.baseReducer let reducer = !modelBaseReducer ? combinedReducer : (state: TState = model.state, action: Action): TState => combinedReducer(modelBaseReducer(state, action), action)且 validateModel 允许state与baseReducer二者择一(只有两者都缺失才报model "state" is required)。
- beta.3(2018-06-23):破坏性变更——移除从 core 导入的全局
dispatch与getState,推荐从init()返回值上解构:
import { init } from '@rematch/core' const store = init() export const { getState, dispatch } = store export default store当前 index.ts 的init返回RematchStore,其类型继承自 Redux store 并额外暴露name、dispatch、addModel(types.ts),与这一推荐用法一致。同版本还新增:插件onStoreCreated可以返回一个对象,合并进init的返回值;当前消费点在 rematchStore.ts:rematchStore = onStoreCreated(rematchStore, bag) || rematchStore。
- beta.2(2018-06-16):
- 支持关闭 devtools(commit
9a17312)——对应 reduxStore.ts 中devtoolOptions.disabled的判断; - 支持在
init时给 store 命名(commit6c69529)——对应 config.ts 的initConfig.name ?? \Rematch Store ${count}``; - 插件开发可在内部访问 config——即 bag.ts 创建的 RematchBag(
models/reduxConfig/forEachPlugin/effects),注释明确其“故意对最终用户隐藏”。
- 支持关闭 devtools(commit
- beta.1(2018-06-12):修复懒加载 store 的更新问题(commit
9a44865)——与当前 rematchStore.ts 中addModel的实现呼应:动态addModel后通过reduxStore.replaceReducer(createRootReducer(bag))重建根 reducer 并派发@@redux/REPLACE触发重算。 - beta.0(2018-06-11):类型修复、支持 TS strict null checks。
1.0.0-alpha 系列:TypeScript、多 store 与插件 API 重写
- alpha.9 / alpha.8(2018-06-10 / 2018-06-02):修复 select 插件类型、修复 effects 中 rootState 问题;新增“用函数形式写 effects 以访问局部 dispatch”:
{ effects: dispatch => ({ async someEffect() { dispatch.someModel.someAction() }, }), }当前 dispatcher.ts 仍按此约定运行:effects是函数时以rematch.dispatch调用得到真实 effects,否则直接取对象。
- alpha.7 / alpha.3 / alpha.1(2018-06-02 至 2018-04-10):连续的类型改进——
createModel用于 TS 模型、getSelect用于 TS select、dispatch 自动补全,以及在 Redux DevTools 中展示 store 名称。 - alpha.0(2018-04-07):1.0 系列的起点,变更密集:
- 支持 TypeScript、支持多 store;
- 插件 API 变更以避免在插件中调用
init,共享依赖改经this访问(插件需全部升级适配); - 导入的全局
dispatch会触发所有 store、全局getState汇总所有 store 的 state; init({ name })作为 store.name,缺省则用索引号。
0.x 早期版本:API 雏形的形成
0.2.0 ~ 0.6.0 五个版本奠定了 Rematch 今天仍在使用的基础语义:
- 0.2.0(2018-02-03):用 rematch 的 dispatch 覆盖
store.dispatch,使配合 react-redux 使用时无需单独导入 dispatch。这一覆盖语义延续至今——RematchStore的dispatch字段类型是RematchDispatch<TModels>(types.ts),而非原生 redux dispatch。 - 0.3.0(2018-02-10):
dispatch调用返回 Promise——effect dispatcher 会返回 effect 执行的 Promise,CHANGELOG 中该条目与 rematchStore.ts 中 effects middleware “return its result” 的实现对应。 - 0.4.0(2018-02-18):
- 从 core 导出全局
getState(import { getState } from '@rematch/core');注意这一全局 API 在 1.0.0-beta.3 被移除,统一改为从 store 上解构——这是阅读 CHANGELOG 时容易踩的“同名字段跨版本语义不同”的典型例子; - dispatch 的
meta第二参数:dispatch.example.update(payload, { syncWithServer: true })等价于dispatch({ type: 'example/update', payload, meta: { syncWithServer } }),reducer / effect 以第三参读取 meta。该机制在 2.0 大版本中删除、又在 next.9 以 action.meta 的形态回归。
- 从 core 导出全局
- 0.5.0(2018-03-05):reducer 支持监听其他模型的 action——即 reducer key 直接写成完整 action 名:
const count2 = { state: 0, reducers: { // listens for action from other reducer 'count1/increment': state => state + 1, }, }当前实现见 reduxStore.ts 与 reduxStore.ts 的isAlreadyActionName:reducer key 含/时原样作为 action 名,否则自动拼为modelName/reducerKey。
- 0.5.3(2018-03-05):支持 devtool action creators(#281)。
- 0.6.0(2018-03-27):effects 开始派发可在 DevTools 中看到的 action——这正是今天 dispatcher.ts 中 effect dispatcher 同样走
type: \${modelName}/${actionName}`` 标准 action 通道的历史源头。
把 CHANGELOG 与当前源码、测试对上号
读完逐版本解读后,可以建立一个“变更 → 代码落点”的速查视图,便于日后排查问题或写插件时直接跳转:
| CHANGELOG 关键变更 | 版本 | 当前源码/测试落点 |
|---|---|---|
store 命名Rematch Store N、devtools 默认关闭判断 | 1.0.0-beta.2 / 2.0.0 | config.ts、reduxStore.ts |
| 插件配置合并(models/redux 两维) | 2.0.0 | config.ts |
| validate 函数化、收集全部错误、生产跳过 | 2.0.0 | validate.ts;测试 config.test.ts、validatePlugins.test.ts |
| dispatch/effects 内置化 | 2.0.0 | rematchStore.ts、dispatcher.ts |
新增onReducer/onRootReducer钩子 | 2.0.0 | reduxStore.ts |
| reducer 可选 payload、action.meta | next.7 / next.9 | dispatcher.ts |
models 入参Partial<T>、peerDeps redux>=4 | 2.1.0 | types.ts、package.json |
| reducer 可返回 void(immer 兼容) | 2.1.1 | reduxStore.ts;测试 immer.test.ts |
| addModel 时 context 绑定 | 2.1.0 | dispatcher.ts、rematchStore.ts |
| 循环模型解构(works with all models) | 2.2.0 | rematchStore.ts;测试 circurlarmodels.test.ts |
自定义devtoolComposer | 2.2.0 | types.ts、reduxStore.ts |
| 类型推断链路(state/dispatch/rootState) | next.3 | test/ts_typings(含 circular-references、dispatcher-typings 测试) |
两点使用提醒:
- 适用前提:以上源码行号与实现均对应当前仓库中
@rematch/core@2.2.0的代码(packages/core/package.json 的version字段),peerDependencies要求redux >= 4,Node 引擎要求>=10(package.json)。若你使用其他版本的 core,部分行为(尤其 2.0 前后 meta、全局getState/dispatch的存废)需以对应版本的 CHANGELOG 为准。 - 阅读方法:Conventional Commits 格式的条目中,
fix:/feat:前缀与版本号升档(semver)一一对应——patch 版本(如 2.1.1)通常只含类型或行为修复,minor/major(如 2.2.0、2.0.0)才会出现 Features 或破坏性变更;遇到“regression”字样(next.4、next.5)时,优先查 test/v1_regressions 与对应ts_typings测试来确认该回归是否已有守护用例。
小结
packages/core/CHANGELOG.md 完整记录了@rematch/core从“覆盖 store.dispatch 的轻量增强”(0.2.0)到“monorepo + 全类型推断 + 插件钩子体系”(2.x)的演进主线:1.x 完成了多 store、插件 API 与 devtools 集成等 API 定型;2.0 以旧格式条目说明了 monorepo 重组、validate 函数化、dispatch/effects 内置化等架构决策;2.0.0-next 十个预发布版本集中重写了类型系统并两次瘦身 bundle;2.1/2.2 则把类型推断与运行时行为打磨到当前仓库的形态。CHANGELOG 中每一条 fix 几乎都能在 packages/core/src 找到对应实现,在 packages/core/test 找到守护测试——这也正是这份变更记录对排查历史问题、评估升级风险最有价值的地方。
- 前端
【免费下载链接】rematch
The Redux Framework
相关推荐
Ionic Framework @ionic/core 版本演进全解:从 v6 到 v9 的 CHANGELOG 深度导读
Ionic Framework @ionic/core 版本演进全解:从 v6 到 v9 的 CHANGELOG 深度导读 本篇技术指南以开源仓库 gh_mir
前端移动开发跨平台Gensim 版本演进全解:从 0.2 到 4.4 的 API 变迁、性能优化与迁移指南
Gensim 版本演进全解:从 0.2 到 4.4 的 API 变迁、性能优化与迁移指南 本篇技术指南以仓库根目录 CHANGELOG.md https://l
人工智能NLP机器学习深度学习rrweb 2.x 版本演进全解析:从 2.0 架构重组到 2.1 性能打磨
rrweb 2.x 版本演进全解析:从 2.0 架构重组到 2.1 性能打磨 rrweb(record and replay the web)是开源社区中用于
前端可观测性开发工具
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考