前言
Git 在我心目中,是当之无愧的最佳文本管理工具。它具有以下特点:可版本追踪、可保存提交信息、差异存储,十分适合对文本更改进行追踪。
最近恰好在重写 CMS 系统,需要做文章的版本管理,于是写了个 NPM 库,实现类似于 Git 一样的文本版本管理系统:
https://github.com/ravelloh/text-version
你也可以试试在线 demo:
https://ravelloh.github.io/text-version

简单来说,相比于传统的文本版本记录方式,此库能让你直接使用一串字符串来管理文本的版本。这样,就不需要在数据库中单独做个表,每次有更新的时候就创建新的记录了。这也有助于减少空间占用。
介绍
目前已经实现这些功能:
- 差异存储。仅存储变更部分代码,减少重复占用
- 版本记录。类似于 Git ,你可以为每个编辑提供一个 commit message ,便于版本记录。
- 版本引用。详见 #版本引用
- 混合存储。同时支持快照、差异、版本引用,选择其中占用最小的方式。
使用
安装
这次抢到了个好名字(喜):
npm install text-version // or
pnpm install text-version // or
yarn add text-version
基本用法
导入
// ES6 模块
import { TextVersion } from 'text-version';
// CommonJS
const { TextVersion } = require('text-version');
创建实例
const tv = new TextVersion();
使用示例
// 创建实例
const tv = new TextVersion();
// 提交新版本
let storage = tv.commit('', '你好,世界!', 'v1');
storage = tv.commit(storage, '你好,世界!\n 这是第二行。', 'v2');
storage = tv.commit(storage, '你好,TypeScript !\n 这是第二行。');
// 查看版本历史
console.log(tv.log(storage));
//[
// { version: 'v1', isSnapshot: true },
// { version: 'v2', isSnapshot: false },
// { version: 'ycdf93', isSnapshot: false }
//]
// 查看指定版本
console.log(tv.show(storage, 'v1'));
// "你好,世界!"
// 查看最新版本
console.log(tv.latest(storage));
// "你好,TypeScript !\n 这是第二行。"
console.log(storage);
// :2:v1:你好,世界!
// 2:v2:R6I8:\\n 这是第二行。
// 6:ycdf93:R3D4I11:TypeScript !
// 重置到指定版本
storage = tv.reset(storage, 'v2');
// 压缩存储空间 - 将 v2 设为快照,删除 v1
storage = tv.squash(storage, 'v2'); // v1 版本将被永久删除,v2 成为新的起始快照
高级示例详见 Github README.
https://github.com/RavelloH/text-version/blob/main/docs/README-CN.md
API 参考
TextVersion
构造函数
new TextVersion(compressionProvider?: CompressionProvider)
API 方法
commit(storage: string, text: string, version?: string): string
提交新版本,保存文本更改。
storage: 当前存储字符串text: 要保存的文本内容version: 可选的版本名,默认使用内容哈希
show(storage: string, version: string): string | null
显示指定版本的文本内容。
storage: 存储字符串version: 要查看的版本名- 返回: 文本内容,如果版本不存在则返回 null
log(storage: string): VersionInfo[]
显示版本历史日志,获取所有版本信息。
storage: 存储字符串- 返回: 版本信息数组
latest(storage: string): string
获取最新版本的文本内容。
storage: 存储字符串- 返回: 最新版本的文本内容
reset(storage: string, targetVersion: string): string
重置到指定版本,删除目标版本之后的所有版本。
storage: 存储字符串targetVersion: 要重置到的版本- 返回: 重置后的存储字符串
squash(storage: string, targetVersion: string): string
将指定版本设为快照并删除之前的版本,用于减少存储空间占用。
storage: 存储字符串targetVersion: 要设为快照的版本(该版本之前的所有版本将被删除)- 返回: 压缩后的存储字符串
注意: 此操作不可逆,会永久删除目标版本之前的所有版本历史。适用于当版本历史过长时进行存储空间优化。