跳到主要内容

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+/
// }

根据文档,superjsonJSON.stringify 支持的区别是:

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

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