
Questa repo può servire da supporto per presentare uno o più meetup. Il percorso è il seguente...
Questo lavoro si basa principalmente su due fonti:
1-csr-load-data vanilla react SPA caricamento dati[!IMPORTANT] CSR (Client-Side Rendering): il codice React viene consegnato al browser, che genera contenuti inseriti nel DOM.

cd 1-csr-load-data
npm start

2-csr-router vanilla react SPA routing[!IMPORTANT] Dopo il primo caricamento della pagina, la navigazione verso altre pagine dello stesso sito utilizza JavaScript per ri-renderizzare parti della pagina senza richiedere un aggiornamento completo della pagina.
cd 2-csr-router
npm start

3-rsc-load-data React Server Components (implementazione Next.js) caricamento dati[!IMPORTANT] Componenti React scritti per essere eseguiti solo sul server, piuttosto che nel browser.

cd 3-rsc-load-data
npm run build
npm run start

4-rsc-router React Server Components (implementazione Next.js) routing[!IMPORTANT] I componenti vengono eseguiti solo sul server. Il comportamento predefinito è il rendering statico: i componenti vengono eseguiti in fase di build.
cd 4-rsc-router
npm run build
npm run start

5-SSR SSR Server Side Rendering[!IMPORTANT] SSR significa prerenderizzare i componenti client sul server. Il codice React viene eseguito nel momento in cui viene richiesto. Il risultato può essere memorizzato nella cache per richieste future.
Buona pratica: definire i componenti 'use client'; il più in basso possibile nell'albero dei componenti.
[!IMPORTANT] "In React, “hydration” è il modo in cui React si “aggancia” all'HTML esistente che è già stato renderizzato da React in un ambiente server. Durante l'hydration, React tenterà di collegare i listener di eventi al markup esistente e di subentrare nel rendering dell'app sul client. Nelle app completamente costruite con React, di solito si idrata una sola “root”, una volta all'avvio dell'intera app."
https://react.dev/reference/react-dom/client/hydrateRoot
https://www.gatsbyjs.com/docs/conceptual/partial-hydration/
cd 5-ssr
npm run build
npm run start

6-pages-router-ssg (implementazione Next.js)[!IMPORTANT] SSG (Static Site Generation) con il pages router: il codice React viene eseguito quando compili l'applicazione e l'output generato è statico.
cd 6-pages-router-ssg
npm run build
npm run start
7-pages-router-isr (implementazione Next.js)[!IMPORTANT] ISR (con il pages router): "Next.js ti consente di creare o aggiornare pagine statiche dopo aver creato il tuo sito. L'Incremental Static Regeneration (ISR) ti permette di usare la generazione statica in base alla singola pagina, senza dover ricostruire l'intero sito. Con l'ISR puoi mantenere i vantaggi della staticità scalando fino a milioni di pagine."
cd 7-pages-router-isr
npm run build
npm run start
"i dati potrebbero diventare obsoleti al momento della richiesta"
https://vercel.com/blog/nextjs-server-side-rendering-vs-static-generation
https://react.dev/reference/rsc/server-actions
...
8-ssrf-14.1.0https://www.assetnote.io/resources/research/digging-for-ssrf-in-nextjs-apps
14.1.1redirect(/blog/${inputValue});Fonte: https://www.assetnote.io/resources/research/digging-for-ssrf-in-nextjs-apps
Next.JS esegue la richiesta lato server, poi restituisce il risultato al browser:
redirect('/blog/123'); costruisce l'URL http://207.154.209.99/blog/123.
Per costruire questo URL, Next.JS recupera in particolare l'host 207.154.209.99 dall'header HTTP della richiesta iniziale.Content-Type: text/x-component, allora Next.JS interroga l'URL con una richiesta HTTP GET.Per ottenere un SSRF sul server di destinazione, è quindi necessario eseguire un altro server:
Content-Type: text/x-component, per ogni richiesta HEAD
8-ssrf-14.1.0In /etc/nginx/sites-available/nextjs
Prima:
server {
listen 80 default_server;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
Dopo:
server {
listen 80;
server_name 207.154.209.99;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host 207.154.209.99;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
Rischio di effetti collaterali...
https://nginxtutorials.com/nginx-proxy_set_header-directive/
https://github.com/vercel/next.js/security/advisories/GHSA-fr5h-rqp8-mj6g

Le pagine nella directory app sono Server Components per impostazione predefinita. Questo è diverso dalla directory pages, dove le pagine sono Client Components.
L'aggiornamento a Next.js 13 non richiede l'uso del nuovo App Router. Puoi continuare a usare le pagine con le nuove funzionalità che funzionano in entrambe le directory
Se si vogliono confrontare le performance di caricamento delle diverse soluzioni, si possono aggiungere le metriche Core Web Vitals in console.log.
https://web.dev/articles/fcp?hl=fr
https://rsc-parser.vercel.app/
https://github.com/reactjs/rfcs/blob/main/text/0188-server-components.md#does-this-replace-ssr
https://www.youtube.com/watch?v=jEJEFAc8tSI
ISR usando l'App router?
Nel Next.js App Router, tutti i dati recuperati sono ora statici per impostazione predefinita, renderizzati in fase di build. Tuttavia, questo può essere facilmente modificato: Next.js estende l'oggetto delle opzioni di fetch per fornire flessibilità nelle regole di caching e revalidation. Puoi usare l'opzione {next: {revalidate: number}} per aggiornare i dati statici a intervalli prestabiliti o quando si verificano modifiche al backend (Incremental Static Regeneration), mentre l'opzione {cache: 'no-store'} può essere passata nella richiesta fetch per i dati dinamici (server-side rendering).
https://www.telerik.com/blogs/current-state-react-server-components-guide-perplexed
https://github.com/reactjs/server-components-demo
https://dev.to/vteacher/let-s-make-a-web-application-with-react-server-components-5dmg
https://react.dev/blog/2024/04/25/react-19
https://react.dev/reference/rsc/server-components
https://www.youtube.com/watch?v=ePAPd9qzGyM
https://www.joshwcomeau.com/react/server-components/
https://nextjs.org/docs/pages/building-your-application/rendering/static-site-generation
https://nextjs.org/docs/pages/building-your-application/data-fetching/get-static-props
https://react.dev/reference/rsc/server-components#server-components-without-a-server