Non hai il rendering lato server, ma vuoi comunque velocizzare le prestazioni del tuo sito React? Prova il pre-rendering.
react-snap
è una terza parte
che esegue il prerendering delle pagine del tuo sito in file HTML statici. Questo può
migliorare
Prima colorazione
volte nella tua applicazione.
Ecco un confronto della stessa applicazione con e senza pre-rendering su una connessione 3G simulata e su un dispositivo mobile:
Perché è utile?
Il principale problema di prestazioni delle grandi applicazioni a pagina singola è che l'utente deve attendere la fine dei bundle JavaScript che compongono il sito scaricare prima di poter vedere contenuti reali. Più i pacchetti sono grandi, più a lungo l'utente dovrà attendere.
Per risolvere questo problema, molti sviluppatori adottano l'approccio di rendering dell'applicazione sul server invece di avviarlo solo sul browser. Con ogni pagina/percorso, il codice HTML completo viene generato sul server e inviato il browser, il che riduce i tempi di First Paint ma comporta un rallentamento Tempo per primo byte.
Il pre-rendering è una tecnica separata meno complessa del rendering ma offre anche un modo per migliorare i tempi di First Paint nel un'applicazione. Si utilizza un browser headless o senza interfaccia utente per generare file HTML statici di ogni route durante il tempo di creazione. Questi file possono essere spediti insieme ai bundle JavaScript necessari per un'applicazione.
reazione-snaps
react-snap
usa Puppeteer per
Creare file HTML prerenderizzati di diverse route nella tua applicazione. A
per iniziare, installalo come dipendenza di sviluppo:
npm install --save-dev react-snap
Quindi aggiungi uno script postbuild
in package.json
:
"scripts": {
//...
"postbuild": "react-snap"
}
Il comando react-snap
veniva eseguito automaticamente ogni volta che una nuova build di
le applicazioni effettuate (npm build
).
L'ultima cosa da fare è modificare la modalità di avvio dell'applicazione.
Modifica il file src/index.js
come segue:
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
ReactDOM.render(<App />, document.getElementById('root'));
const rootElement = document.getElementById("root");
if (rootElement.hasChildNodes()) {
ReactDOM.hydrate(<App />, rootElement);
} else {
ReactDOM.render(<App />, rootElement);
}
Anziché utilizzare solo ReactDOM.render
per il rendering dell'elemento React principale
direttamente nel DOM, questo controlla se sono già presenti nodi figlio
per stabilire se i contenuti HTML sono stati sottoposti a pre-rendering (o sottoposti a rendering
server web). In questo caso, per allegare l'evento viene invece utilizzato ReactDOM.hydrate
all'HTML già creato, invece di crearlo di nuovo.
Nello sviluppo dell'applicazione, ora verranno generati file HTML statici come payload per ogni percorso sottoposto a scansione. Puoi vedere come si presenta il payload HTML ad esempio facendo clic sull'URL della richiesta HTML e poi sul pulsante Anteprime in Chrome DevTools.
Flash di contenuti senza stile
Anche se ora il codice HTML statico viene eseguito quasi immediatamente, rimane senza stile per impostazione predefinita, che potrebbe causare il problema della visualizzazione di un "lampo di stile senza stile" contenuti". (FOUC). Ciò può essere notato in particolare se utilizzi un file CSS-in-JS libreria per generare selettori poiché il bundle JavaScript dovrà terminare prima di poter applicare gli stili.
Per evitare questo problema, il CSS critico o la quantità minima di CSS richiesta
necessari per la visualizzazione della pagina iniziale, possono essere incorporati direttamente nel tag <head>
del documento HTML. react-snap
utilizza un'altra raccolta di terze parti nel
cappuccio, minimalcss
, per estrarre
CSS fondamentale per diverse route. Puoi attivare questa funzionalità specificando
seguenti nel tuo file package.json
:
"reactSnap": {
"inlineCss": true
}
Se diamo un'occhiata all'anteprima della risposta in Chrome DevTools, ora viene visualizzata la pagina con stili applicati con CSS essenziali integrati.
Conclusione
Se la tua applicazione non presenta percorsi di rendering lato server, utilizza
react-snap
per pre-renderizzare il codice HTML statico agli utenti.
- Installalo come dipendenza per lo sviluppo e inizia con quello predefinito impostazioni.
- Utilizza l'opzione sperimentale
inlineCss
per incorporare codice CSS critico se funziona per il tuo sito. - Se utilizzi la suddivisione del codice a livello di componente all'interno di qualsiasi route,
fai attenzione a non eseguire il prerendering di uno stato di caricamento per gli utenti. La
react-snap
LEGGIMI la tratta in modo più dettagliato.