请问思源挂件数据持久化有哪些解决方案呢?有官方的存储方案吗?

本贴最后更新于 519 天前,其中的信息可能已经水流花落

最近在开发一款挂件,想要永久存储用户的配置数据到本地,发现数据持久化让我比较头疼

想了几种,感觉都有缺点:

  1. localStorage: 这个我暂时没用过,因为我记得在某版的思源发布后,有挂件作者反映 localstorage 不好用还是怎么的(存疑),而且也不符合我的使用场景,因为我要保存的是用户的配置数据,需要一直保存,且多端同步保存

    1. 官方我看到有如下 api:(没研究过 go 语言,还不知道该传啥参数)

      ginServer.Handle("POST","/api/storage/setLocalStorage",model.CheckAuth,setLocalStorage)
      ginServer.Handle("POST", "/api/storage/getLocalStorage", model.CheckAuth, getLocalStorage)
      ginServer.Handle("POST", "/api/storage/setLocalStorageVal", model.CheckAuth, setLocalStorageVal)
      ginServer.Handle("POST", "/api/storage/removeLocalStorageVal", model.CheckAuth, removeLocalStorageVal)2.
  2. 存储到特定文档或者某个特定的 block 的属性中,这种也不太好,因为万一那个文档或者 block,用户不再需要,删除了,那数据就清空了。(此方案的衍生方案:向特定的文档写入 html 片段,数据放在 html 片段 的 dataset 属性上,但是如果此 html 片段被误删,那配置文件也就没了)

  3. 引导用户新建一个设置文档,在此设置文档的属性上面或者文档内的特定 block 的属性上存储数据,此方案的优点是:

    1.可以确保用户不会轻易删除自己的配置,即使误删,也有官方的回收站做背书,数据比较不容易丢;

    2.可以在文档内的不同 block 的属性上存入数据,以此达到,一个设置文档,管理多个挂件的数据(当然,需要各个挂件的作者都把数据存入这个文档内的特定 block 上)

    3.可以开发一个挂件,可视化编辑此文档中存储的各个挂件的配置,(模板作者也可以存储数据到此文档);

    4.如果要删除某个挂件的配置,只需要删除存储了那个挂件配置的 block 即可,可视化操作(缺点是 block 太容易删除了,都没有弹框确认,或许可以官方下场,哈哈哈哈);
    5.用户掌控所有数据,包括挂件的,完美契合思源笔记的设计哲学;

    缺点:

    1.太有侵入性了(大胆!小小挂件,竟然胆敢让本王在朕的数字花园新建一个文档!)

    2.存储的数据单一,只能存储文本类的配置数据(但是大多数挂件似乎也不太需要更高级的数据类型了?反正我不需要)

    3.删除挂件,需要用户手动删除相关 block,有误删成其它 block 的可能性

  4. 思源官方提供 api,将数据存储在用户的本地数据目录下(或许已经有了?只是我不知道?有的话请大佬们告诉我)

  5. 将数据存储在某个挂件本身挂载的 block 的属性上:这种是个人感觉挺好的方法了 😄

    1. 优点:当用户不再需要这个挂件了,直接移除即可,相应的配置数据也一并移除了,没有额外的操作,也没有垃圾数据残留;并且多个相同挂件的数据互不影响,方便隔离
    2. 缺点:目前没有找到啥 api 能在挂件内准确的获取该挂件所在 block 的 id

总结:还有一些其它的基于云端的方案,都被我率先放弃,毕竟本地优先,个人认为,上述方案 4 和 5 是我能想到的比较不错的方案,但是都需要额外的官方 api 支撑。如果大家有什么好的解决方案,欢迎讨论指导,如果我的描述大家有疑惑,也欢迎指出~谢谢大家看到这里,感谢

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    19811 引用 • 75861 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    6888 引用 • 31055 回帖 • 230 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • localStorage 不会进行数据同步,需要数据同步的场景不要用。正如其他开发者提到的,建议使用文件读写 API,但是需要注意的是数据同步以后再去获取数据。

    目前启动时会进行首次数据同步,但是启动时的同步只是获取变更列表,并不会实际同步数据,获取到变更列表后 7s 才会再次发起实际数据同步请求。这段时间内我们会锁定待变更的文档以防止用户编辑后产生冲突,但是这个逻辑目前尚未推广到更通用的场景上,可能还需要和大家讨论一下这里的设计。

  • 其他回帖
  • suka

    用的第 5 种,具体可以参考帖子里面其他人的回帖或者这里:
    https://github.com/suka233/siyuan-calendiary/blob/dev/src/utils/index.ts

    1. 我看 HbuilderX 主题里面用了以下代码(/conf/appereance/themes/HBuilderX-light/theme.js);补充 API 文档-获取/写入文件
    写入文件("/data/widgets/HBuilderX-Light.config.json", JSON.stringify(window.HBuilderXLight.config, undefined, 4), (a) => { funs() });
    
       async function 写入文件(path, filedata, then = null, obj = null, isDir = false, modTime = Date.now()) {
       
           let blob = new Blob([filedata]);
           let file = new File([blob], path.split('/').pop());
           let formdata = new FormData();
           formdata.append("path", path);
           formdata.append("file", file);
           formdata.append("isDir", isDir);
           formdata.append("modTime", modTime);
           await fetch(
               "/api/file/putFile", {
               body: formdata,
               method: "POST",
               headers: {
                   Authorization: `Token ""`,
               },
           }).then((v) => {
               setTimeout(() => {
                   if (then) then(obj);
               }, 200)
           });
       }
    
    
    
    async function 获取文件(path, then = null, obj = null) {
        let url = '/api/file/getFile';
        await 向思源请求数据(url, {
            path: path
        }).then((v) => {
            if (then) then(v, obj);
        });
    }
    
    1. 我不了解 api,我一般用这个从页面上获取挂件 id:window.frameElement.parentElement.parentElement.dataset.nodeId;

    `

    1 操作
    Undii 在 2023-01-31 21:12:00 更新了该回帖
  • RenaEmiya

    嗯确实直接获取挂件块,读挂件块的属性就行

        var node = window.frameElement.parentElement.parentElement;
        var conf = node.getAttribute("custom-conf")
    
  • 查看全部回帖

推荐标签 标签

  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 356 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 649 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    207 引用 • 2031 回帖
  • 职场

    找到自己的位置,萌新烦恼少。

    126 引用 • 1699 回帖
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 645 关注
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    51 引用 • 37 回帖 • 2 关注
  • OnlyOffice
    4 引用 • 16 关注
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    76 引用 • 390 回帖
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    165 引用 • 407 回帖 • 514 关注
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖 • 181 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    86 引用 • 896 回帖
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    180 引用 • 400 回帖
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    130 引用 • 793 回帖
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    184 引用 • 461 回帖
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    28 引用 • 66 回帖
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖 • 1 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 52 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 518 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 355 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖
  • abitmean

    有点意思就行了

    29 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 407 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 437 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 560 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    51 引用 • 226 回帖