Problema del bundle di React React Server Components aiuterà a risolvere i due problemi di cui sopra e molto altro.
Come funziona React Server Components
Perché React Server Components è ancora in fase sperimentale, i dettagli di implementazione di questa caratteristica potrebbero cambiare. Anche così, è possibile afferrare alcuni dei suoi concetti fondamentali guardando la demo.
La prima cosa da notare è che ci sono diversi pacchetti con una versione sperimentale nel file package.json
:
"react": "0.0.0-experimental-3310209d0", "react-dom": "0.0.0-experimental-3310209d0", "react-fetch": "0.0.0-experimental-3310209d0", "react-fs": "0.0.0-experimental-3310209d0", "react-pg": "0.0.0-experimental-3310209d0", "react-server-dom-webpack": "0.0.0-experimental-3310209d0",
Il react
, react-dom
e react-server-dom-webpack
sta usando una versione sperimentale che abilita React Server Component, mentre react-fetch
, react-fs
e react-pg
è un gruppo di pacchetti wrapper utilizzati per interagire con il sistema di input/output (Sono chiamati React IO Libraries)
Il prossimo punto è che questa demo è alimentata da Express.js, il che ha senso perché è necessario un server per renderizzare i componenti. Ma questo solleva anche la domanda: questo significa che i componenti del server funzionano solo in un ambiente JavaScript? Che dire di Go, Java, e altri ambienti server-side?
Potremmo vedere il supporto per altri ambienti in futuro, quindi mettiamo da parte questo punto per ora.
Ovviamente, tutti questi dettagli di implementazione potrebbero cambiare in futuro, con il progredire della ricerca.
Passando al codice all’interno della cartella src/
, si possono vedere tre tipi di estensioni per i file dei componenti:
.server.js
estensione indica un Server Components
.client.js
estensione indica React Client Components
La regolare .js
estensione è per i componenti condivisi. Questi componenti possono essere eseguiti sul server o sul client, a seconda di chi li importa.
Quando avvii l’applicazione con il comando npm start
, due compiti saranno eseguiti contemporaneamente:
Il server Node in esecuzione utilizzando lo script server/api.server.js
La build di Webpack per il bundle React lato client, utilizzando lo script scripts/build.js
Guardando lo script del server, puoi vedere che il app.server.js
viene importato nel file:
const ReactApp = require('../src/App.server').default;
E successivamente viene elaborato come Node Writable stream:
const {pipeToNodeWritable} = require('react-server-dom-webpack/writer');async function renderReactTree(res, props) { await waitForWebpack(); const manifest = readFileSync( path.resolve(__dirname, '../build/react-client-manifest.json'), 'utf8' ); const moduleMap = JSON.parse(manifest); pipeToNodeWritable(React.createElement(ReactApp, props), res, moduleMap); }
Il codice sotto l’estensione .server.js
comprese le sue dipendenze non è incluso nel bundle del client, il che significa che ha effetto zero sulla dimensione del bundle.
I componenti server hanno accesso diretto al database o al filesystem sul server, quindi puoi prendere qualsiasi dato di cui hai bisogno e inviarlo al client al primo rendering. Puoi vedere l’esempio nel file NoteList.server.js
:
export default function NoteList({searchText}) {const notes = db.query( `select * from notes where title ilike order by id desc`, ).rows; return notes.length > 0 ? ( <ul className="notes-list"> {notes.map((note) => ( <li key={note.id}> <SidebarNote note={note} /> </li> ))} </ul> ) : ( <div className="notes-empty"> {searchText ? `Couldn't find any notes titled "${searchText}".` : 'No notes created yet!'}{' '} </div> ); }
I componenti server non possono avere alcuna interattività, il che significa che non puoi useState
o creare ascoltatori sul lato server. Devi mettere lo stato nel tuo lato client e importarlo dai componenti server.
I componenti server sono caricati con dati dal server
Qual è il vantaggio di React Server Component?
I componenti server non sono inclusi nel bundle. Non vengono mai scaricati dal browser, avendo zero effetto sulla dimensione del bundle
Puoi ridurre la dimensione del tuo bundle spostando i componenti statici e di solo rendering sul lato server e mantenendo i componenti interattivi-statali sul lato client
I componenti server possono accedere alle risorse lato server. Puoi recuperare dati dal database o dal filesystem direttamente, e puoi anche recuperare dalle API proprio come sul lato client
I componenti server possono anche leggere query GraphQL
Come è diverso dal Server Side Rendering?
SSR come funziona oggi nelle applicazioni React è semplicemente l’invio di componenti renderizzati come HTML nel client in modo che la tua app sembri avere una risposta veloce. L’utente non può fare nulla con la tua app finché il JavaScript non viene scaricato.
React Server Components è diverso. Come mostrato nella demo, i Server Components non sono resi come HTML, ma come formato speciale che viene trasmesso al client. Il flusso non ha un protocollo standard per ora, ma assomiglia molto al formato JSON. Ecco un pezzo della risposta:
M1:{"id":"./src/SearchField.client.js","chunks":,"name":""}
Mentre SSR è usato solo una volta per il rendering iniziale, i Server Components possono essere ri-fetched più volte per ri-renderne i dati (nel caso della demo, i post markdown).
Conclusione
React Server Components è una nuova eccitante caratteristica che potrebbe cambiare il modo in cui gli sviluppatori scrivono le loro applicazioni React. Permette alle applicazioni React di importare pacchetti senza impattare la dimensione del bundle del client, creando una rappresentazione statica dell’applicazione che può essere resa interattiva utilizzando i Client Components.
Gli sviluppatori possono anche utilizzare sia i Server Components che i Client Components sotto un singolo albero DOM, permettendo di recuperare i componenti server senza distruggere lo stato dei componenti client.
Ma poiché questa caratteristica è ancora sperimentale, è difficile determinare come sarà veramente utile in natura. Per esempio, questa caratteristica può essere utilizzata solo sotto l’ambiente server di Node.js attualmente.
Il team di React è attualmente concentrato nel portare questa caratteristica in meta-frameworks come Next.js e Gatbsy, il che significa che potrebbe passare del tempo (se mai) prima di vedere il supporto per altri linguaggi lato server come PHP, Python, Go o Ruby.
Per ricapitolare, React lato client non sta scomparendo. React lato server è opzionale.
Inoltre, ho condiviso i miei pensieri su Should you create a design system for React Server Components? che potrebbe interessarvi.