Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Expérimentation perfs : Gridsome #273

Closed
wants to merge 34 commits into from
Closed

Expérimentation perfs : Gridsome #273

wants to merge 34 commits into from

Conversation

gaeldestrem
Copy link
Contributor

@gaeldestrem gaeldestrem commented Aug 31, 2021

🛠 Description de la PR

Expérimentation de passer le projet de vue-cli à Gridsome pour gagner en performances avec en tete les sujets suivants:

  • Génération HTML des pages non connectés (SEO + Performances)
  • Code splitting js (Actuellement, notre bundle js fait 6,3 MB et est chargé sur toutes les pages)
  • Resize + Optimisation des assets (On a plusieurs images qui pesent plusieurs mb dont une qui fait 10 sur la landing...)
  • (Bonus: Pouvoir etre future proof si on doit créer des pages de contenu / blog en externalisant sur un CMS headless)

Ce que j'ai fait

  • Ajouter Gridsome + Arriver à faire un yarn gridsome develop/build avec uniquement la Landing page
    J'ai fait un POC séparé du projet pour voir à quoi ressemblait la structure de gridsome et je l'ai ensuite intégré au projet + réglé quelques qui faisait que le yarn installait fonctionnait pas à cause de Sharp et de l'archi m1. J'ai du changé d'image docker + forcer la résolution de sharp dans le package.json. J'ai aussi recréer un fichier main.js qui permet de charger du js au chargement de l'app à la place de src/js/index.js

  • Corriger le code splitting
    Je me suis rendu compte que meme en ayant que la LandingPage + fichier main.js en point d'entrée, on buildait tout le javascript. J'ai corrigé cela en éliminant les références vers #router dans des sous dépendances du fichier main.js

  • Modifier le routing pour gérer le prerendering + guardians
    De base, Gridsome attend des fichier .vue situés dans /src/pages/ pour le routing et la génération des pages. Une autre possibilité est de générer les pages via un fichier de config gridsome.server.js. J'ai essayé cette approche. Cela fonctionne globalement bien meme si il y'a quelques soucis au niveau des pages connectés à corriger (getConfig qui est null au moment de la géneration des pages + les composants qui dépendent de window/document qui posent soucis.).

  • Rename le dossier public en static
    Le site fonctionnait en local mais les assets étaient cassés car gridsome attend un dossier /static et non /public (à voir dans la doc si il y'a moyen de changer ça)

  • Déployer sur la préprod
    J'ai essayé de déployer sur la préprod au plus vite pour essayer de déminer le terrain. J'ai du corriger quelques soucis de permissions (le yarn build génère un dossier .temp qui avait pas les permissions). Les variables coté front n'étaient plus définis car le fichier js avait changé etc. J'ai aussi du corriger un soucis au niveau de la conf nginx qui faisaient que les URLS qui ne terminaient pas par un slash redirigeaient vers https://rb_frontend/stats/

Récap des principaux changements:

TODO

  • Corriger les différentes erreurs js qui trainent
  • Corriger les pages qui dépendent de window/document et qui sont commenté dans le router.js
  • Resize les assets sur la landing via https://gridsome.org/docs/images/
  • Clean les anciens fichiers (vue.config.js, router.js) + anciens packages (vue-cli) etc
  • S'assurer que le site continue de fonctionner sur les anciens navigateurs (polyfills)

@@ -1,7 +1,7 @@
# ====
# Development
# ====
FROM node:16.3-slim AS development
FROM node:16-bullseye-slim AS development
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correction d'un soucis avec Sharp & Archi M1 : lovell/sharp#2482

@@ -33,7 +33,7 @@ USER node
WORKDIR /home/node/app/

COPY --from=development --chown=root:root /home/node/app/node_modules ./node_modules
COPY . .
COPY --chown=node:node . .
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correction d'un soucis au build où le yarn build n'avait pas les permissions pour créer un dossier .temp

@@ -1,6 +1,6 @@
#!/bin/sh

ENV_FILE=$(find /usr/share/nginx/html/js/index.*.js)
ENV_FILE=$(find /usr/share/nginx/html/assets/js/app.*.js)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correction de l'initialisation des variables coté front

@@ -1,6 +1,7 @@
server {
listen 80;
server_name localhost;
absolute_redirect off;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Correction d'un soucis sur la conf nginx

https://preprod.resorption-bidonvilles.beta.gouv.fr/stats renvoyait une 301 avec comme location http://rb_frontend/stats/


const { VUE_APP_SENTRY_RELEASE } = require("./src/js/env.js");

module.exports = {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

C'est globalement le meme fichier que vue.config.js

@@ -0,0 +1,84 @@
if (process.isClient) {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cela fait partie du fichier main.js qui est chargé au lancement de n'importe quelle page. J'ai repris cela du fichier de /src/js/index.js

@@ -0,0 +1,157 @@
const routes = require("./js/app/routes");
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fichier qui est chargé au lancement de n'importe quelle page

@@ -0,0 +1,443 @@
const path = require("path");
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Voici comment sont définis les routes maintenant (les routes commentés étant ceux posant des problèmes à cause de window/document)

});
appOptions.store = initStore(Vue);

router.beforeEach((to, from, next) => {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On execute les guards au lancement de l'app

},
setCurrentPage(state, page) {
state.towns.currentPage = page;
export default function(Vue) {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Le fichier main.js expose une fonction avec Vue en paramètre. J'ai du transformer l'initialisation du store en fonction pour pouvoir définir Vue.use(Vuex) depuis le Vue passé en paramètre

Le seul impact est aux endroits dans le code ou on utilisait le store depuis ce fichier. Il faut maintenant passer par this.$store

@gaeldestrem gaeldestrem changed the title Expérimentation perfs : Expérimentation perfs : Gridsome Aug 31, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant