
Serializa de forma segura las expresiones de JavaScript a un superconjunto de JSON, que incluye fechas, bigints y más.

getServerSideProps y getInitialProps En Blitz, hemos luchado con las limitaciones de JSON. A menudo nos encontramos trabajando con Date , Map , Set o BigInt , ¡pero JSON.stringify no es compatible con ninguno de ellos sin pasar por la molestia de convertir manualmente!
Superjson resuelve estos problemas al proporcionar una envoltura delgada sobre JSON.stringify y JSON.parse .
Logotipo de Superjson por NUMI:
Instale la biblioteca con su administrador de paquetes de elección, por ejemplo, por ejemplo:
yarn add superjson
La forma más fácil de usar Superjson es con sus funciones stringify y parse . Si sabe cómo usar JSON.stringify , ¡ya conoces a Superjson!
Stringifique fácilmente cualquier expresión que desee:
import superjson from 'superjson' ;
const jsonString = superjson . stringify ( { date : new Date ( 0 ) } ) ;
// jsonString === '{"json":{"date":"1970-01-01T00:00:00.000Z"},"meta":{"values":{date:"Date"}}}'Y analiza tu json así:
const object = superjson . parse <
{ date : Date }
> ( jsonString ) ;
// object === { date: new Date(0) } Para los casos en que desee acceso de nivel inferior a los datos json y meta en la salida, puede usar las funciones serialize y deserialize .
Un gran caso de uso para esto es donde tiene una API que desea ser compatible con JSON para todos los clientes, pero también desea transmitir los meta datos para que los clientes puedan usar SuperJSON para deserializarlo por completo.
Por ejemplo:
const object = {
normal : 'string' ,
timestamp : new Date ( ) ,
test : / superjson / ,
} ;
const { json , meta } = superjson . serialize ( object ) ;
/*
json = {
normal: 'string',
timestamp: "2020-06-20T04:56:50.293Z",
test: "/superjson/",
};
// note that `normal` is not included here; `meta` only has special cases
meta = {
values: {
timestamp: ['Date'],
test: ['regexp'],
}
};
*/ getServerSideProps , getInitialProps y getStaticProps Hooks proporcionados por Next.js no le permite transmitir objetos JavaScript como fechas. Errorará a menos que convierta las fechas en cadenas, etc.
¡Afortunadamente, Superjson es una herramienta perfecta para evitar esa limitación!
Los complementos Next.js SWC son experimentales, pero prometen una aceleración significativa. Para usar el complemento Superjson SWC, instálelo y agréguelo a su next.config.js :
yarn add next-superjson-plugin // next.config.js
module . exports = {
experimental : {
swcPlugins : [
[
'next-superjson-plugin' ,
{
excluded : [ ] ,
} ,
] ,
] ,
} ,
} ;Instale la biblioteca con su administrador de paquetes de elección, por ejemplo, por ejemplo:
yarn add babel-plugin-superjson-nextAgregue el complemento a su .babelrc. Si no tienes uno, crealo.
{
"presets" : [ "next/babel" ] ,
"plugins" : [
...
"superjson-next" // ?
]
} ¡Hecho! Ahora puede usar todos los tipos de datos JS en su getServerSideProps / etc.
Serializa cualquier valor de JavaScript en un objeto compatible con JSON.
const object = {
normal : 'string' ,
timestamp : new Date ( ) ,
test : / superjson / ,
} ;
const { json , meta } = serialize ( object ) ; Devuelve json y meta , ambos valores compatibles con JSON.
Deserializa la salida de SuperJson nuevamente en su valor original.
const { json , meta } = serialize ( object ) ;
deserialize ( { json , meta } ) ; Devuelve your original value .
Serializa y luego acumula su valor de JavaScript.
const object = {
normal : 'string' ,
timestamp : new Date ( ) ,
test : / superjson / ,
} ;
const jsonString = stringify ( object ) ; Devuelve string .
Analiza y luego deserializa la cadena JSON devuelta por stringify .
const jsonString = stringify ( object ) ;
parse ( jsonString ) ; Devuelve your original value .
Superjson admite muchos tipos adicionales que JSON no. Puedes serializar todo esto:
| tipo | ¿Apoyado por JSON Standard? | ¿Apoyado por Superjson? |
|---|---|---|
string | ✅ | ✅ |
number | ✅ | ✅ |
boolean | ✅ | ✅ |
null | ✅ | ✅ |
Array | ✅ | ✅ |
Object | ✅ | ✅ |
undefined | ✅ | |
bigint | ✅ | |
Date | ✅ | |
RegExp | ✅ | |
Set | ✅ | |
Map | ✅ | |
Error | ✅ | |
URL | ✅ |
Superjson, por defecto, solo admite los tipos de datos incorporados para mantener el tamaño del paquete lo más bajo posible. Aquí hay algunas recetas que puede usar para extenderse a los tipos de datos no deformes.
Coloque en algún archivo de utilidad central y asegúrese de que se ejecuten antes de cualquier otra llamada SuperJSON . En un proyecto Next.js, _app.ts sería un buen lugar para eso.
Decimal.js / Prisma.Decimal import { Decimal } from 'decimal.js' ;
SuperJSON . registerCustom < Decimal , string > (
{
isApplicable : ( v ) : v is Decimal => Decimal . isDecimal ( v ) ,
serialize : v => v . toJSON ( ) ,
deserialize : v => new Decimal ( v ) ,
} ,
'decimal.js'
) ; Gracias a estas maravillosas personas (Key Emoji):
Dylan Brookes ? | Simon Knott ? | Brandon Bayer ? | Jeremy Liberman | Joris | tomhooijenga ? | Ademílson F. Tonato |
Piotr Monwid-Olechnowicz ? | Alex Johansson | Simon Edelmann ? ? | Sam Garson ? | Mark Hughes ? | Lxxyx | Máximo Mussini |
Peter Dekkers ? | Gabe O'Leary | Benjamín | Florescu ionut-cristiano ? | Chris Johnson | Nicholas Chiang ? | Datner |
ruessej ? | Jh.lee | narumincho | Markus Greystone ? | Dartmaim | Max Malm | Tyler Collier |
Nick Quebbeman | Tom MacWright ? | Peter Budai ? |
Este proyecto sigue la especificación de todos los contribuyentes. ¡Contribuciones de cualquier tipo bienvenido!
Otras bibliotecas que tienen como objetivo resolver un problema similar: