V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
RavelloH
V2EX  ›  分享创造

分享一个 NPM 库,让你像使用 Git 一样对文本进行版本管理

  •  
  •   RavelloH ·
    RavelloH · 24 天前 · 1955 次点击

    前言

    Git 在我心目中,是当之无愧的最佳文本管理工具。它具有以下特点:可版本追踪、可保存提交信息、差异存储,十分适合对文本更改进行追踪。

    最近恰好在重写 CMS 系统,需要做文章的版本管理,于是写了个 NPM 库,实现类似于 Git 一样的文本版本管理系统:

    https://github.com/ravelloh/text-version

    你也可以试试在线 demo:

    https://ravelloh.github.io/text-version

    image

    简单来说,相比于传统的文本版本记录方式,此库能让你直接使用一串字符串来管理文本的版本。这样,就不需要在数据库中单独做个表,每次有更新的时候就创建新的记录了。这也有助于减少空间占用。

    介绍

    目前已经实现这些功能:

    • 差异存储。仅存储变更部分代码,减少重复占用
    • 版本记录。类似于 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: 要设为快照的版本(该版本之前的所有版本将被删除)
    • 返回: 压缩后的存储字符串

    注意: 此操作不可逆,会永久删除目标版本之前的所有版本历史。适用于当版本历史过长时进行存储空间优化。

    4 条回复    2025-11-17 14:09:56 +08:00
    qi1070445109
        1
    qi1070445109  
       23 天前 via Android
    和 git 比有什么好处呢?
    AsuorZ
        2
    AsuorZ  
       23 天前
    gist 不香吗
    RavelloH
        3
    RavelloH  
    OP
       19 天前
    @qi1070445109 其实是我为自己的 CMS 准备的,使用一个字段来存文本记录就行,不用单独再创个表来存历史版本
    RavelloH
        4
    RavelloH  
    OP
       19 天前
    @AsuorZ gist 更像是一个成熟的产品,而不是能应用到 app 里面的工具库
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   2409 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 227ms · UTC 02:01 · PVG 10:01 · LAX 18:01 · JFK 21:01
    ♥ Do have faith in what you're doing.