
การแสดงออกของ JavaScript อย่างปลอดภัยไปยัง superset ของ JSON ซึ่งรวมถึงวันที่, bigints และอื่น ๆ

getServerSideProps และ getInitialProps ที่ Blitz เราได้ต่อสู้กับข้อ จำกัด ของ JSON เรามักจะพบว่าตัวเองทำงานกับ Date Map Set หรือ BigInt แต่ JSON.stringify ไม่สนับสนุนพวกเขาใด ๆ โดยไม่ต้องผ่านความยุ่งยากในการแปลงด้วยตนเอง!
Superjson แก้ปัญหาเหล่านี้ด้วยการจัดหาเสื้อคลุมบาง ๆ เหนือ JSON.stringify และ JSON.parse
โลโก้ Superjson โดย Numi:
ติดตั้งไลบรารีด้วยตัวจัดการแพ็คเกจที่คุณเลือกเช่น:
yarn add superjson
วิธีที่ง่ายที่สุดในการใช้ Superjson คือฟังก์ stringify และ parse หากคุณรู้วิธีใช้ JSON.stringify คุณรู้จัก Superjson อยู่แล้ว!
stringify นิพจน์ใด ๆ ที่คุณต้องการ:
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"}}}'และแยกวิเคราะห์ JSON ของคุณอย่างนั้น:
const object = superjson . parse <
{ date : Date }
> ( jsonString ) ;
// object === { date: new Date(0) } สำหรับกรณีที่คุณต้องการการเข้าถึงข้อมูล json และ meta ในระดับที่ต่ำกว่าในเอาต์พุตคุณสามารถใช้ฟังก์ชั่น serialize และ deserialize
กรณีการใช้งานที่ยอดเยี่ยมอย่างหนึ่งสำหรับสิ่งนี้คือที่ที่คุณมี API ที่คุณต้องการเข้ากันได้กับ JSON สำหรับลูกค้าทุกคน แต่คุณยังต้องการส่งข้อมูล Meta เพื่อให้ลูกค้าสามารถใช้ SuperJSON เพื่อ deserialize ได้อย่างเต็มที่
ตัวอย่างเช่น:
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 และ getStaticProps hooks ที่จัดทำโดย next.js ไม่อนุญาตให้คุณส่งวัตถุ JavaScript เช่นวันที่ มันจะเกิดข้อผิดพลาดเว้นแต่คุณจะแปลงวันที่เป็นสตริง ฯลฯ
โชคดีที่ Superjson เป็นเครื่องมือที่สมบูรณ์แบบในการข้ามข้อ จำกัด นั้น!
next.js ปลั๊กอิน SWC เป็นการทดลอง แต่สัญญาว่าจะเพิ่มความเร็วอย่างมีนัยสำคัญ หากต้องการใช้ปลั๊กอิน Superjson SWC ให้ติดตั้งและเพิ่มลงใน next.config.js ของคุณ:
yarn add next-superjson-plugin // next.config.js
module . exports = {
experimental : {
swcPlugins : [
[
'next-superjson-plugin' ,
{
excluded : [ ] ,
} ,
] ,
] ,
} ,
} ;ติดตั้งไลบรารีด้วยตัวจัดการแพ็คเกจที่คุณเลือกเช่น:
yarn add babel-plugin-superjson-nextเพิ่มปลั๊กอินลงใน. babelrc ของคุณ ถ้าคุณไม่มีให้สร้างมันขึ้นมา
{
"presets" : [ "next/babel" ] ,
"plugins" : [
...
"superjson-next" // ?
]
} เสร็จแล้ว! ตอนนี้คุณสามารถใช้ประเภทข้อมูล JS ทั้งหมดใน getServerSideProps / ฯลฯ ได้อย่างปลอดภัย
ทำให้ค่า JavaScript ใด ๆ อยู่ในวัตถุที่เข้ากันได้กับ JSON
const object = {
normal : 'string' ,
timestamp : new Date ( ) ,
test : / superjson / ,
} ;
const { json , meta } = serialize ( object ) ; ส่งคืน json และ meta ทั้งค่าที่เข้ากันได้กับ JSON
deserializes เอาต์พุตของ Superjson กลับสู่ค่าดั้งเดิมของคุณ
const { json , meta } = serialize ( object ) ;
deserialize ( { json , meta } ) ; ส่งคืน your original value
serializes แล้ว stringifies ค่า JavaScript ของคุณ
const object = {
normal : 'string' ,
timestamp : new Date ( ) ,
test : / superjson / ,
} ;
const jsonString = stringify ( object ) ; ส่ง string
การแยกวิเคราะห์แล้ว deserializes สตริง JSON ที่ส่งคืนโดย stringify
const jsonString = stringify ( object ) ;
parse ( jsonString ) ; ส่งคืน your original value
Superjson รองรับประเภทพิเศษมากมายที่ JSON ไม่ได้ คุณสามารถทำให้เป็นอนุกรมเหล่านี้ทั้งหมด:
| พิมพ์ | สนับสนุนโดย Standard JSON? | สนับสนุนโดย Superjson? |
|---|---|---|
string | ||
number | ||
boolean | ||
null | ||
Array | ||
Object | ||
undefined | ||
bigint | ||
Date | ||
RegExp | ||
Set | ||
Map | ||
Error | ||
URL |
SuperJSON โดยค่าเริ่มต้นรองรับชนิดข้อมูลในตัวเท่านั้นเพื่อให้ขนาดกลุ่มต่ำที่สุดเท่าที่จะทำได้ นี่คือสูตรบางอย่างที่คุณสามารถใช้เพื่อขยายไปยังประเภทข้อมูลที่ไม่ใช่ค่าเริ่มต้น
วางไว้ในไฟล์ยูทิลิตี้กลางบางไฟล์และตรวจสอบให้แน่ใจว่าพวกเขากำลังดำเนินการก่อนการโทร SuperJSON อื่น ๆ ในโครงการถัดไป js _app.ts จะเป็นจุดที่ดีสำหรับสิ่งนั้น
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'
) ; ขอบคุณไปที่คนที่ยอดเยี่ยมเหล่านี้ (คีย์อีโมจิ):
ดีแลนบรูกส์ - | Simon Knott - | แบรนดอนไบเออร์ - | Jeremy Liberman | joris | Tomhooijenga - | Ademílson F. Tonato |
Piotr Monwid-olechnowicz - | Alex Johansson | Simon Edelmann - - | แซมการ์สัน - | มาร์คฮิวจ์ - | lxxyx | Máximo Mussini |
Peter Dekkers - | Gabe O'Leary | เบนจามิน | Ionut-Cristian Florescu - | คริสจอห์นสัน | นิโคลัสเชียงราย - | ดาต้าเนอร์ |
รุสเจ - | jh.lee | Narumincho | Markus Greystone - | darthmaim | Max Malm | Tyler Collier |
Nick Quebbeman | Tom MacWright - | ปีเตอร์บูไบ - |
โครงการนี้เป็นไปตามข้อกำหนดทั้งหมดของผู้เข้าร่วม การมีส่วนร่วมทุกชนิดยินดีต้อนรับ!
ห้องสมุดอื่น ๆ ที่มีจุดมุ่งหมายเพื่อแก้ปัญหาที่คล้ายกัน: