URL存储解锁数据管理的新思路,重新定义数据传输与共享(@vue/repl)

news2024/9/20 1:12:17

Thinking系列,旨在利用10分钟的时间传达一种可落地的编程思想。

近日,在了解 @vue/repl 相关内容,其通过 URL 进行数据存储,感觉思路惊奇,打开了新方式。

首先,通过 URL 存储最大的便利是:无需服务端且通过URL可以分享

比如:通过 这个URL 即可获取到个人编写的内容。

在这里插入图片描述

下面和大家一起解读一下,尤大是如何实现的?
这里需要充分考虑了URL字符限制,所以增加了压缩。

源码解析

// 调用
import { ReplStore } from '@vue/repl'

const store = new ReplStore({
  serializedState: location.hash.slice(1),
  // 其他配置项...
})

源码

if (serializedState) {
  // URL中有存储的数据
  const saved = JSON.parse(atou(serializedState))
  // 实现设置代码的逻辑
  for (const filename in saved) {
    setFile(files, filename, saved[filename])
  }
} else {
  // URL中没有存储的数据
  // 设置默认的代码
  setFile(files, defaultMainFile, welcomeCode)
}

这里调用了atou方法,用于解码数据,还有一个与之相对的utoa,用于编码数据。

// 借助vue3 watchEffect 实时响应,修改 URL
watchEffect(() => history.replaceState({}, '', store.serialize()))

serialize() {
   const files = this.getFiles()
   const importMap = files[importMapFile]
   if (importMap) {
     // 其他处理逻辑
   }
   return '#' + utoa(JSON.stringify(files))
 }

整个过程的核心是使用了base64编码和压缩算法。在存储阶段,数据首先经过base64编码,然后使用zlib压缩算法进行压缩。压缩后的数据再转换为二进制字符串,最终使用btoa方法将二进制字符串编码为Base64字符串。而在读取阶段,则按照相反的过程进行解码和解压缩。

  • 存储阶段:strToU8 => zlibSync => strFromU8 => btoa

  • 读取阶段:atob => strToU8 => unzlibSync => strFromU8

读取是存储的一个逆向过程。压缩和解压缩使用了开源框架 fflate – 号称是目前最快、最小、最通用的纯 JavaScript压缩和解压库。

import { zlibSync, unzlibSync, strToU8, strFromU8 } from 'fflate'

// 解码
export function atou(base64: string): string {
  const binary = atob(base64)

  // zlib header (x78), level 9 (xDA)
  if (binary.startsWith('\x78\xDA')) {
    const buffer = strToU8(binary, true)
    const unzipped = unzlibSync(buffer)
    return strFromU8(unzipped)
  }

  // old unicode hacks for backward compatibility
  // https://base64.guru/developers/javascript/examples/unicode-strings
  return decodeURIComponent(escape(binary))
}

// 编码
export function utoa(data: string): string {
  const buffer = strToU8(data)
  const zipped = zlibSync(buffer, { level: 9 })
  // 二个参数传了true,代表转换成二进制字符串,因为js内置的btoa和atob方法不支持Unicode字符串,而我们的代码内容显然不可能只使用ASCII的256个字符
  const binary = strFromU8(zipped, true)
  return btoa(binary)
}

btoa() 方法可以将一个二进制字符串(例如,将字符串中的每一个字节都视为一个二进制数据字节)编码为 Base64 编码的 ASCII 字符串。

atob() 对经过 base-64 编码的字符串进行解码。

在这里插入图片描述

在这里插入图片描述

let encodedData = window.btoa("Hello, world"); // 编码
let decodedData = window.atob(encodedData); // 解码

总结

通过这种方式,@vue/repl 实现了将数据存储在URL中的功能。这样做的好处是可以避免服务器的繁琐配置和费用,并且方便快捷地分享给其他人。

该插件支持 CodeMirror Editor、Monaco Editor 两款主流编辑器,如果大家项目中有需要代码编辑器的可以直接“借鉴使用”。

好的技术方案一定是根据场景来的!且通过阅读源码,我们可以获取到一写比较不错且小巧的开源库,如上述的 fflate。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/816120.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IDEA中连接虚拟机 管理Docker

IDEA中连接虚拟机 管理Docker 📔 千寻简笔记介绍 千寻简笔记已开源,Gitee与GitHub搜索chihiro-notes,包含笔记源文件.md,以及PDF版本方便阅读,且是用了精美主题,阅读体验更佳,如果文章对你有帮…

android 如何分析应用的内存(十三)——perfetto

android 如何分析应用的内存(十三) 本篇文章是native内存的最后一篇文章——perfetto perfetto简介 从2018年始,android开发者峰会正式推出perfetto工具。从此perfetto成为安卓最重要的工具之一。在2018年以前,android使用syst…

率失真优化

文章目录 率失真优化率失真优化技术率失真理论1.互信息量2.失真度3.率失真函数4.率失真信源编码定理 视频编码中的率失真优化1.视频失真测度2.视频率失真曲线3.视频编码率失真优化 率失真优化 编码比特率和失真度相互制约、相互矛盾 因此,视频编码的主要目的就是在…

浅析Java中的内存泄漏

浅析Java中的内存泄漏 Java最明显的一个优势就是它的内存管理机制。你只需简单创建对象,java的垃圾回收机制负责分配和释放内存。然而情况并不像想像的那么简单,因为在Java应用中经常发生内存泄漏。 本教程演示了什么是内存泄漏,为什么会发生…

CAN转ETHERCAT网关can协议是什么意思

大家好,今天要跟大家分享一款自主研发的通讯网关,JM-ECT-CAN。这款产品能够将各种CAN总线和ETHERCAT网络连接起来,实现高效的数据传输和通信。那么,这款通讯网关具体有哪些功能和特点呢?接下来,我们就一起来…

vscode配置c++环境

第一步:安装vscode编辑器 预先安装: vscode(https://code.visualstudio.com/)在vscode中安装 C/C extension for VS Code(在左侧扩展栏中搜索 “C”) 第二步:安装MinGW-w64工具链 MinGW 提供…

web浏览器脚本的调试

水一贴。 在浏览器中按F12点击"source"或者"源程序"点击html、js、css等源码文件所在的窗口的左边,此时点击处显示为蓝色光标,表示断点中断已经设置完毕。配合窗口右上角的"继续" “下一步” "跳过"等控制按钮…

计算机SCI期刊,和计算机会议哪个更权威? - 易智编译EaseEditing

在计算机学科领域,SCI期刊和计算机会议都有其特点和优势,但两者在权威性方面可能存在一些差异。 SCI期刊是指被SCI(Science Citation Index)收录的学术期刊,SCI是Web of Science(科学引文索引)的…

[内测招募] IDEA 插件 X-ChatGPT 内测预览版 支持自定义 ChatGPT 回调函数 释放 AI 的无限可能性

X-ChatGPT 独创的 [项目感知] 功能 打造更精准、更智能、更懂你 的专属 ai 编程助手 这个插件是一款基于开源项目 ChatGPT-Next-Web的 IntelliJ IDEA 平台的插件 价格 :免费、速率限制 每小时/100 次/ip 使用方式 :在 IDEA 插件商店中搜索 X-ChatGPT…

信号三表block,pending、handler

目录 前序: 信号流程图: pending表(信号未决表 block表(信号阻塞表 handler表(信号递达表 小知识点 1:handler保存的是什么 前序: 进程信号中的三大表格 首先在了解进程信号中的三大表格…

SpringBoot Aop进行身份验证

忘了好复制🤣 创建一个注解,可以应用于类或者方法上的,进行表示身份认证。 Target({ElementType.TYPE, ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) public interface VerifyLogin { }定义一个没有登录的异常和全局异常处理器…

找样机素材,就上这5个网站,免费下载~

设计师经常需要用到各种样机模型来展示直接的作品,今天我就分享几个可以免费下载样机模型的网站,大家赶紧收藏起来! 菜鸟图库 https://www.sucai999.com/searchlist/3217.html?vNTYxMjky 菜鸟图库有多种类型的设计素材,像平面、…

fiddler过滤器

1、fiddler Fiddler是一个免费、强大、跨平台的HTTP抓包工具。下载地址 2、为什么适用过滤器 不适用过滤器时,所有的报文都会被抓包。 我们在开发或测试时,只需要抓包某个域名下的报文 ,以“www.baidu.com”为例,不设置过滤器&…

数据中台系列2:rabbitMQ 安装使用之 window 篇

RabbitMQ 是一个开源的消息队列系统,是高级消息队列协议(AMQP)的标准实现,用 erlang 语言开发。 因此安装 RabbitMQ 之前要先安装好 erlang。 1、安装 erlang 到 这里 下载本机能运行的最新版 erlang 安装包。如果本机没有装过 …

64核RISC-V服务器能打了吗?

作者:西风烈 最近看到“澎峰科技”的微信公众号,看到他们发布了第一款RISC-V服务器,芯片是算能的SG2042,带64个RISC-V核心(阿里平头哥的C910v核),2.0GHz主频,最大支持128GB内存。这…

【visual studio2019】如何打开即时窗口

在 Visual Studio2019 中打开即时窗口,有两种方法: 1、可以通过“调试”菜单,然后选择“窗口”下的“即时窗口”选项 2、直接使用快捷键“Ctrl Alt I” 此时即时窗口将显示在 Visual Studio2019 的底部。在即时窗口中,可以执…

Mybatis增强框架Mybatis-Flex

一、Mybatis-Flex是什么? Mybatis-Flex 是一个优雅的 Mybatis 增强框架,它非常轻量、同时拥有极高的性能与灵活性。我们可以轻松的使用 Mybaits-Flex 链接任何数据库,其内置的 QueryWrapper^亮点 帮助我们极大的减少了 SQL 编写的工作的同时…

Openlayers实战:绘制多边形,导出CSV文件

CSV(Comma-Separated Values)是一种常用的数据交换格式,是一种纯文本文件格式。在Openlayers的交互中,经常性的我们要导出一些数据,在这个实战中,演示的是导出CSV文件。 安装依赖 npm install file-saver --save npm install papaparse --save 效果图 导出的文件 源代码…

docker安装nginx并配置SSL

1、拉取镜像 docker pull nginx2、启动nginx容器,复制一份默认配置文件出来 // 以nginx镜像为基础镜像创建一个名为nginx01的容器 docker run -d -p 80:80 --name nginx01 nginx创建成功后会看到nginx的欢迎页面 3、挂载nginx目录 拷贝nginx的配置信息到主机目录…

【CAS6.6源码解析】深度解析默认票据存储策略及其拓展支持-探究存储策略的设计

CAS作为一款企业级中央认证服务系统,其票据的生成是非常重要的一环,在票据的生成中,还有一个比较重要的点是票据的存储,本文将默认票据存储策略及其拓展支持,并延伸到探究存储策略的设计。 文章重点分析源码的过程&…