跳到主要内容

superjson

将对象安全的转换为字符串,后续可以还原回来。

举一个例子:

const obj = {
str: 'abc',
time: new Date(),
re: /\d+/,
fn() {
return 5
}
}

console.log(JSON.stringify(obj))
// "{\"str\":\"abc\",\"time\":\"2024-04-01T13:20:31.009Z\",\"re\":{}}"

可以看出,常规字符串是正常的,但是时间已经被转化为具体的值了,正则变成了空对象,函数消失了。

我们没办法把这个 obj 进行缓存,直接存储会导致数据丢失。

如果用 superjson 就可以解决部分问题了。

import superjson from 'superjson'

const obj = {
str: 'abc',
time: new Date(),
re: /\d+/,
fn() {
return 5
}
}

const result = superjson.stringify(obj)
console.log(result)
// '{"json":{"str":"abc","time":"2024-04-01T13:40:23.031Z","re":"/\\\\d+/"},"meta":{"values":{"time":["Date"],"re":["regexp"]}}}'
console.log(superjson.parse(result))
// {
// str: 'abc',
// time: new Date(), // 是 parse 时候的时间
// re: /\d+/
// }

根据文档,superjson 与 JSON.stringify 支持的区别是:

类型JSON.stringifysuperjson
string✅✅
number✅✅
boolean✅✅
null✅✅
Array✅✅
Object✅✅
undefined❌✅
bigint❌✅
Date❌✅
RegExp❌✅
Set❌✅
Map❌✅
Error❌✅
URL❌✅

superjson 也不是万能的,比如上面的例子中,函数就不行。