
Serialize dengan aman ekspresi JavaScript ke superset JSON, yang meliputi tanggal, bigints, dan banyak lagi.

getInitialProps selanjutnya getServerSideProps Di Blitz, kami telah berjuang dengan keterbatasan JSON. Kami sering mendapati diri kami bekerja dengan Date , Map , Set atau BigInt , tetapi JSON.stringify tidak mendukung mereka tanpa mengalami kerumitan konversi secara manual!
Superjson memecahkan masalah ini dengan menyediakan pembungkus tipis di atas JSON.stringify dan JSON.parse .
Logo Superjson oleh Nui:
Instal Perpustakaan dengan Paket Manajer Pilihan Anda, misalnya:
yarn add superjson
Cara termudah untuk menggunakan SuperJson adalah dengan fungsi stringify dan parse -nya. Jika Anda tahu cara menggunakan JSON.stringify , Anda sudah tahu superjson!
Mudah merangkai ekspresi apa pun yang Anda inginkan:
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"}}}'Dan parse json Anda seperti itu:
const object = superjson . parse <
{ date : Date }
> ( jsonString ) ;
// object === { date: new Date(0) } Untuk kasus di mana Anda menginginkan akses tingkat yang lebih rendah ke data json dan meta dalam output, Anda dapat menggunakan fungsi serialize dan deserialize .
Salah satu kasus penggunaan yang bagus untuk ini adalah di mana Anda memiliki API yang ingin Anda kompatibel dengan JSON untuk semua klien, tetapi Anda juga masih ingin mengirimkan data meta sehingga klien dapat menggunakan SuperJson untuk sepenuhnya deserialisasi.
Misalnya:
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 , dan getStaticProps data yang disediakan oleh Next.js tidak memungkinkan Anda untuk mengirimkan objek JavaScript seperti tanggal. Itu akan kesalahan kecuali Anda mengonversi tanggal menjadi string, dll.
Untungnya, SuperJson adalah alat yang sempurna untuk memotong batasan itu!
Plugin SWC Next.js bersifat eksperimental, tetapi menjanjikan percepatan yang signifikan. Untuk menggunakan plugin SuperJson SWC, instal dan tambahkan ke next.config.js Anda:
yarn add next-superjson-plugin // next.config.js
module . exports = {
experimental : {
swcPlugins : [
[
'next-superjson-plugin' ,
{
excluded : [ ] ,
} ,
] ,
] ,
} ,
} ;Instal Perpustakaan dengan Paket Manajer Pilihan Anda, misalnya:
yarn add babel-plugin-superjson-nextTambahkan plugin ke .BabelRC Anda. Jika Anda tidak memilikinya, buatlah.
{
"presets" : [ "next/babel" ] ,
"plugins" : [
...
"superjson-next" // ?
]
} Selesai! Sekarang Anda dapat menggunakan semua tipe data JS dengan aman di getServerSideProps / dll.
Serialisasi nilai JavaScript ke dalam objek yang kompatibel dengan JSON.
const object = {
normal : 'string' ,
timestamp : new Date ( ) ,
test : / superjson / ,
} ;
const { json , meta } = serialize ( object ) ; Mengembalikan json dan meta , keduanya nilai yang kompatibel dengan JSON.
Deserialisasi output SuperJson kembali ke nilai asli Anda.
const { json , meta } = serialize ( object ) ;
deserialize ( { json , meta } ) ; Mengembalikan your original value .
Serialisasi dan kemudian merangkai nilai JavaScript Anda.
const object = {
normal : 'string' ,
timestamp : new Date ( ) ,
test : / superjson / ,
} ;
const jsonString = stringify ( object ) ; Mengembalikan string .
Parse dan kemudian deserialisasi string JSON yang dikembalikan oleh stringify .
const jsonString = stringify ( object ) ;
parse ( jsonString ) ; Mengembalikan your original value .
SuperJson mendukung banyak jenis tambahan yang tidak dilakukan JSON. Anda dapat membuat serial semua ini:
| jenis | Didukung oleh Standard JSON? | Didukung oleh SuperJson? |
|---|---|---|
string | ✅ | ✅ |
number | ✅ | ✅ |
boolean | ✅ | ✅ |
null | ✅ | ✅ |
Array | ✅ | ✅ |
Object | ✅ | ✅ |
undefined | ✅ | |
bigint | ✅ | |
Date | ✅ | |
RegExp | ✅ | |
Set | ✅ | |
Map | ✅ | |
Error | ✅ | |
URL | ✅ |
SuperJson secara default hanya mendukung tipe data bawaan untuk menjaga ukuran bundel serendah mungkin. Berikut adalah beberapa resep yang dapat Anda gunakan untuk memperpanjang ke tipe data non-default.
Tempatkan mereka di beberapa file utilitas pusat dan pastikan mereka dieksekusi sebelum panggilan SuperJSON lainnya. Dalam proyek Next.js, _app.ts akan menjadi tempat yang baik untuk itu.
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'
) ; Terima kasih kepada orang -orang yang luar biasa ini (Kunci 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 | Benjamin | Ionut-Cristian Florescu ? | Chris Johnson | Nicholas Chiang ? | Datner |
Ruessej ? | JH.LEE | Narumincho | Markus Greystone ? | Darthmaim | Max Malm | Tyler Collier |
Nick Quebbeman | Tom Macwright ? | Peter Budai ? |
Proyek ini mengikuti spesifikasi semua-kontributor. Kontribusi apa pun yang baik!
Perpustakaan lain yang bertujuan untuk memecahkan masalah serupa: