前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >URL存储解锁数据管理的新思路,重新定义数据传输与共享(@vue/repl)

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

作者头像
奋飛
发布于 2023-08-02 01:09:31
发布于 2023-08-02 01:09:31
32400
代码可运行
举报
文章被收录于专栏:Super 前端Super 前端
运行总次数:0
代码可运行

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

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

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

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

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

源码解析

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 调用
import { ReplStore } from '@vue/repl'

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

源码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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,用于编码数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 借助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压缩和解压库。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 编码的字符串进行解码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let encodedData = window.btoa("Hello, world"); // 编码
let decodedData = window.atob(encodedData); // 解码

总结

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-07-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
19·灵魂前端工程师养成-JavaScript数据类型和运算符
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
9860
19·灵魂前端工程师养成-JavaScript数据类型和运算符
谁说前端不需要懂二进制
作为一名前端,在工作中也会遇到很多有关二进制处理的需求,如 EXCEL 表格的导出,PDF 的生成,多个文件的打包,音频的处理。
山月
2020/06/18
1.2K0
base64是什么?怎么用的?
它可以用于在文本协议中传输二进制数据,例如在电子邮件中传输图片或在网页中嵌入图像等。Base64编码使用64个字符集(A-Z、a-z、0-9和"+"、"/")来表示二进制数据。
王小婷
2023/10/23
5320
base64是什么?怎么用的?
面试官昨天问我对base64的理解,着实被问懵了
我们知道一个字节可表示的范围是 0 ~ 255(十六进制:0x00 ~ 0xFF), 其中 ASCII 值的范围为 0 ~ 127(十六进制:0x00 ~ 0x7F);而超过 ASCII 范围的 128~255(十六进制:0x80 ~ 0xFF)之间的值是不可见字符。
用户3806669
2021/03/25
4.6K0
面试官昨天问我对base64的理解,着实被问懵了
atob和btoa的趣谈 原
不了解的人突然看到window对象的atob和btoa 函数,估计会认为哪个臭小子添加全局函数了。
申君健
2018/12/19
1.6K0
了不起的Base64
在我们项目开发中,Base64想必大家都不会很陌生,Base64是将「二进制数据」转换为文本的一种优雅方式,使存储和传输变得容易。但是,作为一个合格的程序员,我们应该有一种打破砂锅问到底的求助欲望。
前端柒八九
2023/11/08
5180
了不起的Base64
GET与大数据的完美融合:实现高效数据传递
在网络应用中,基于Web的数据传输主要采用POST和GET两种方法。POST方法能够传输较大的数据量,并且在安全性方面表现更优。相比之下,GET方法以明文形式传输数据,虽然使用起来较为便捷,但对于大量数据的传输则显得力不从心。
谭广健
2024/04/23
1580
19.6 Boost Asio 文本压缩传输
Base64是一种二进制到文本的编码方案,用于将二进制数据转换为ASCII字符串格式。它通过将二进制数据流转换为一系列64个字符来工作,这些字符都可以安全地传输到设计用于处理文本数据的系统中。
王瑞MVP
2023/11/08
3020
19.6 Boost Asio 文本压缩传输
斗智斗勇的反爬取实践
JSON - https://www.cnblogs.com/lanston1/p/11024147.html
全栈工程师修炼指南
2022/09/28
4420
斗智斗勇的反爬取实践
blob和base64互转
交易场上的朋友胜过柜子里的钱款——托·富勒 blob转base64 // blob转base64 async function blobToBase64(blob) { let buffer = await blob.arrayBuffer() let bytes = new Uint8Array(buffer); console.log(bytes) // do anything with the byte array here let binary = '
阿超
2022/09/27
3780
记一次对bookworm的渗透测试绕过csp
朋友们现在只对常读和星标的公众号才展示大图推送,建议大家把“亿人安全“设为星标”,否则可能就看不到了啦
亿人安全
2024/06/27
1690
记一次对bookworm的渗透测试绕过csp
手把手教你前端本地文件操作与上传
前端无法像原生APP一样直接操作本地文件,否则的话打开个网页就能把用户电脑上的文件偷光了,所以需要通过用户触发,用户可通过以下三种方式操作触发: 通过input type=”file” 选择本地文件 通过拖拽的方式把文件拖过来 在编辑框里面复制粘贴 第一种是最常用的手段,通常还会自定义一个按钮,然后盖在它上面,因为type=”file”的input不好改变样式。如下代码写一个选择控件,并放在form里面: 然后就可以用FormData获取整个表单的内容: $("#file-input").on("chang
企鹅号小编
2018/03/01
1.9K0
手把手教你前端本地文件操作与上传
初探Base64
hello,宝宝们,感觉好久没见!昨天去了十渡,风景真的很好,有山有水,大饱眼福,尽管很累。各位宝宝也要常出去走走哦,不要总憋在家里~
用户3258338
2019/07/19
1K0
初探Base64
JS 图片压缩
说起图片压缩,大家想到的或者平时用到的很多工具都可以实现,例如,客户端类的有图片压缩工具 PPDuck3, JS 实现类的有插件 compression.js ,亦或是在线处理类的 OSS 上传,文件上传后,在访问文件时中也有图片的压缩配置选项,不过,能不能自己撸一套 JS 实现的图片压缩代码呢?当然可以,那我们先来理一下思路。
政采云前端团队
2020/04/27
26.4K0
前端Base64编码知识,一文打尽
本文将详细的介绍前端 Base64 编码知识,探索起源,让大家对开发经常用到的 Base64 有个更全面深入的认知。
coder_koala
2021/08/26
1.3K0
【JS】2026- JavaScript 中的 btoa 和 atob 全局函数
btoa() 方法用于将一个字符串进行 Base64 「编码」。例如,以下代码将字符串 "Hello, world!" 进行 Base64 编码:
pingan8787
2024/04/25
5.1K0
【JS】2026- JavaScript 中的 btoa 和 atob 全局函数
URL安全的Base64编码
Base64编码可用于在HTTP环境下传递较长的标识信息。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。 然而,标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的「/」和「+」字符变为形如「%XX」的形式,而这些「%」号在存入数据库时还需要再进行转换,因为ANSI SQL中已将「%」号用作通配符。 为解决此问题,可采用一种用于
张善友
2018/01/22
7.2K1
base64与二进制互转,保存内容,文件读写:Blob/FileReader/URL/FormData
html5开发常用的对象有:FileReader  FormData File URL  Blob createObjectURL Uint8Array等,这些在日常开发中,需要做图片转base64,base64转而二进制文件,页面截图让用户下载。
周陆军博客
2023/05/07
3K0
js导入excel
<input type="file"onchange="importf(this)" /> <p id="excelContent"></p> <script src="https://blog-static.cnblogs.com/files/zpblogs/xlsx.js"></script> <script> /** * FileReader共有4种读取方法: * 1.readAsArrayBuffer(file):将文件读取为Arra
小语雀网
2022/05/09
1.6K0
原生JS实现base64解码与编码
base64是用规定的64种字符来表示任意二进制数据的一种编码格式,而且这64种字符均是可见字符,而之所以要是可见的是因为在不同设备上处理不可见字符时可能发生错误。通常,电子邮件数据、公钥证书会经常使用。
IMWeb前端团队
2019/12/03
11.6K1
相关推荐
19·灵魂前端工程师养成-JavaScript数据类型和运算符
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档