Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
3 Le routing
4 La configuration
5 La donne
7 CI et CD
1 Introduction
Quelques dfinitions :
Vocabulaire
SSR (server side rendering) : Le markup HTML dune page
est retourn par le serveur (NodeJS, java, PHP, ).
Raliser une application isomorphique avec JavaScript ?
Introduction
Cest envisageable depuis que :
source : https://aerotwist.com/blog/when-everything-is-important-nothing-is/
Server side rendering (SSR)
source : https://aerotwist.com/blog/when-everything-is-important-nothing-is/
Quand raliser une web
app isomorphique plutt
quune SPA (single page
app) ?
2 Comment cela fonctionne ?
React
Comment cela React nest pas un framework MVC !
fonctionne ?
Ce nest que la couche vue. On peut donc sen servir pour
gnrer des templates partir de composants partags entre
client et serveur.
<div id='app'></div>
ReactDOM.render(<App />,
document.querySelector('#app'));
Exemple minimaliste de structure
Comment cela
fonctionne ? src
shared (composants React partags)
| app.js
| app.spec.js
| menu.js
| content.js
| autres composants ReactJS
client
| index.js (point dentre client)
server
| index.js (point dentre serveur)
Composant React partag (shared/app.js)
Comment cela
fonctionne ? import React from 'react';
import Menu from 'shared/Menu';
import Content from 'shared/Content';
import Footer from 'shared/Footer';
const App = (
<div className="app">
<Menu />
<Content />
<Footer />
</div>
);
Comment cela
fonctionne ? import { renderToString } from 'react-dom/server';
import App from '../shared/App';
Comment cela
fonctionne ? import ReactDOM from 'react-dom';
import React from 'react';
import App from '../shared/App';
ReactDOM.render(<App />,
document.querySelector(#app'));
Quelques points dattention
Comment cela
On peut utiliser un CDN ou un cache HTTP (Akamai,
fonctionne ? CloudFront, Varnish, ) pour mettre en cache la page HTML
rendue par le serveur.
Le NodeJS est alors plus rarement sollicit,
On peut dfinir un TTL assez bref pour grer linvalidation,
On choisit de grer les donnes variables (informations
utilisateur, ) en CSR et de laisser des placeholders ct
serveur pour ces blocs.
Le routing
React Router met notre disposition BrowserRouter (pour le
client) et StaticRouter (pour le serveur).
ReactDOM.render(
<BrowserRouter>
<App />
</BrowserRouter>,
document.getElementById('root')
);
client/index.js
Ct serveur (utilise request.url dexpress)
if (context.url) {
// Somewhere a `<Redirect>` was rendered
redirect(301, context.url)
} else {
// app rendering ...
}
server/index.js
4 La configuration
La configuration est issue de node-config
La configuration
$ yarn add config (ou npm install config)
$ mkdir config
$ vi config/default.json
{
Config prive non envoye ct client
"settings": {
"port": "1337",
"publicFolder": "./public"
},
"public": {
"api": {
"login": "https://foo"
}
}
Config publique envoye ct client
}
node-config
La configuration
On a la possibilit de dfinir des
surcharges de configuration
pour les diffrents environnements
utiliss.
urls de webservices,
port sur lequel lancer le serveur,
API keys,
Ct serveur (on peut accder toute la config simplement)
<script type="text/javascript">
window.APP_CONFIG={"api":{"login":"https:\u002F\u002Ffoo"}};
</script>
Config publique injecte uniquement
On peut alors faire un utilitaire universel
Utilisable dans les composants shared (SSR ou CSR).
La configuration
5 La donne
Quelques solutions pour rcuprer la donne :
OU
Chaque page effectue toujours une seule et unique requte
en fonction de son URL courante vers une API
dagrgation. Exemples :
Server
(NodeJS)
CMS
+
HTTP HTTP API dagrgation
API 1
(GraphQL, custom, )
HTML JSON
API 2
Client
source : https://medium.com/@herablog/ameblo-2016-with-react-redux-2d496b868f15
Initialiser Redux (server side)
La donne Ct serveur, la page retourne rsulte dun store rempli par une action.
server/index.js
Initialiser Redux (server side)
<script type="text/javascript">
window.APP_STATE={"page":{"data":"..."}};
</script> server/index.js
Initialiser Redux (client side)
ReactDOM.render(
<BrowserRouter>
<Provider store={store}>
<App />
</Provider>
</BrowserRouter>,
document.getElementById('root')
);
client/index.js
6 Code splitting / lazy loading
Lazy loading avec Webpack 2
Code splitting
Ct client, on voudrait viter davoir tout le code source dans
un seul et unique fichier javascript qui pourrait devenir massif.
Code splitting
Ct serveur, si lon veut que les composants issus des chunks
soient dans le render initial. On peut par exemple utiliser un
plugin babel.
babel-plugin-system-import-transformer
require(./component');