Fermer

décembre 27, 2021

Créer des thèmes Gatsby pour les sites Web basés sur WordPress —


Résumé rapide ↬

Avez-vous déjà créé et publié un thème Gatsby ? Dans cet article, Paulina Hetman explique comment fonctionnent les thèmes Gatsby et quels problèmes ils peuvent résoudre en comparant les thèmes Gatsby avec leurs homologues WordPress.

Gatsby est un framework open source construit sur React. Avec Gatsby, vous pouvez extraire des données de (presque) n'importe où et les utiliser pour générer des sites Web statiques ou dynamiques. Les données peuvent être extraites d'un CMS, ce qui amène définitivement WordPress à la table. Vous bénéficiez des avantages d'un site web statique (vitesse, sécurité, hébergement statique) tout en continuant à gérer votre contenu via un tableau de bord WordPress.

Une des particularités du Gatsby framework est qu'il propose des thèmes comme un outil de personnalisation. En tant que personne ayant une solide expérience dans WordPress, je trouve le concept des thèmes Gatsby particulièrement attrayant. J'avais l'habitude de concevoir et de développer des thèmes WordPress. Cependant, avec l'intérêt croissant pour les solutions Jamstack, je me suis progressivement tourné vers WordPress en tant que CMS sans tête. Dans cet article, je voudrais partager quelques concepts que j'ai appris de cette transition.

Note : Avant d'aller plus loin, concentrons-nous sur les outils que nous allons utiliser. Gatsby fournit un plugin officiel gatsby-source-wordpress. Pour que cela fonctionne, nous devons préparer notre fin WordPress. Plus précisément, nous devons exposer les données WordPress à la saveur de Gatsby via une API GraphQL. En pratique, cela signifie installer deux plugins WordPress WPGraphQL et WPGatsby. Les deux sont disponibles via le référentiel officiel des plugins WordPress et ne nécessitent aucune configuration. Un thème est donc destiné à être publié (dans un registre comme npm) et réutilisé comme dépendance installable.

Puisque nous parlons ici de Gatsby et WordPressje vais le préciser tout de suite — il y a des similitudes avec les thèmes WordPress, mais il ne faut pas assimiler la notion de thèmes WordPress aux thèmes Gatsby. Pour quelqu'un avec un background WordPress (comme moi), la dissociation peut être difficile au début.

Un thème WordPress est un système obligatoire de modèles qui définit ce que nous voyons sur le front-end. La responsabilité d'un bon thème WordPress s'arrête ici. Il ne doit introduire aucune fonctionnalité puisque les fonctionnalités sont le territoire des plugins. Il y a donc une séparation stricte entre les thèmes et les plugins dans l'écosystème WordPress. Les thèmes doivent s'occuper de la couche de présentation et les plugins s'occuper des aspects fonctionnels.

Selon la définition de Gatsby, les thèmes sont responsables des fonctionnalités. Ne devrions-nous pas les appeler plugins alors ? En fait, Gatsby, comme WordPress, a à la fois des plugins et des thèmes. Les plugins, tout comme les thèmes, sont des packages Node.js installables qui implémentent les API Gatsby. Et en fait, un thème Gatsby est un plugin Gatsby. Si un plugin possède une section, une page ou une partie d'une page sur un site — nous l'appelons un thème.

 Une illustration représentant les plugins et les thèmes sous forme d'ensembles ovales. Les plugins et thèmes WordPress sont des ensembles séparés, car les thèmes Gatsby sont un sous-ensemble de plugins.

La relation entre les plugins et les thèmes dans WordPress et dans Gatsby. ( Grand aperçu)

De plus, contrairement à WordPress, Gatsby ne nécessite pas l'utilisation de thèmes pour créer un site. Au lieu de cela, vous commenceriez probablement à créer votre site en mettant en place un projet structuré comme ci-dessous :

 Une illustration d'une structure de dossiers sur la gauche, contenant des modules de nœud, src avec des composants, des pages et des modèles, gatsby-config.js et gatsby -node.js fichier. Deux flèches pointent vers l'écran d'ordinateur sur la droite. L'un commence à la structure des dossiers, l'autre à l'icône WP.

Comment vous structurez généralement votre projet Gatsby. ( Grand aperçu)

Ce n'est pas grave jusqu'à ce que vous ayez plus d'un site à gérer. Dans ce cas, vous souhaiterez peut-être faire abstraction des parties communes du processus et les gérer (version et mise à jour) séparément. fichier gatsby-config.js et gatsby-node.js. Une partie du src, gatsby-config.js et gatsby-node.js sont encerclés ensemble. Cette partie est liée à des textes : communs à tous les projets Gatsby + WP et publions en tant que thème Gatsby. »/>

Repenser la structure du projet vers l'utilisation d'un thème Gatsby. ( Grand aperçu)

Grâce au système de thèmes Gatsby, vous pouvez regrouper les parties partagées dans un package (ou plusieurs packages), publier les packages et enfin les installer dans de nombreuses applications. Notez que j'ai utilisé la forme plurielle packages — vous pouvez combiner plusieurs thèmes au sein d'un projet.

En savoir plus après le saut ! Continuez à lire ci-dessous ↓

Child Themes And Shadowing

Lorsque vous travaillez avec Gatsby et WordPress, vous identifierez certaines fonctionnalités de base communes à tous les projets. Je veux dire ici : rechercher les données et créer les pages de manière dynamique. Il semble intéressant d'avoir un thème qui s'occupe de la logique de sourcing des données et de la création des pages. En revanche, la façon dont vous décidez d'afficher vos pages peut changer d'un projet à l'autre. Quoi que vous ayez défini au niveau du noyau, vous devrez probablement le remplacer à un moment donné.

L'une des approches possibles consiste à avoir un thème principal (parent) et à créer des thèmes enfants au-dessus du noyau. un.

Qu'est-ce que j'entends par thème enfant Gatsby ?

Comparons les thèmes enfants WordPress. Les thèmes enfants WordPress nous permettent d'ajouter des fonctionnalités et de remplacer les modèles. Ils offrent un moyen sûr d'améliorer et de modifier un thème existant.

Un thème enfant Gatsby utilise un thème parent comme plug-in. Nous pouvons alors utiliser le concept de shadowing qui donne au thème enfant la possibilité de remplacer les fichiers du thème parent ; cela revient à remplacer les modèles WordPress dans un thème enfant. L'ombrage signifie que nous pouvons remplacer les fichiers du répertoire src inclus dans le bundle webpack. Il convient de souligner que l'observation est possible au niveau du projet (où nous consommons nos thèmes sous forme de packages). Nous le verrons en action plus loin dans cet article.

Avec WordPress, nous sommes limités à un seul thème parent, un seul thème enfant, et aucun autre chaînage n'est possible. Avec la flexibilité des thèmes Gatsby, nous pouvons aller beaucoup plus loin. Il est possible de construire différentes configurations de chaînes enfant-parent. plusieurs thèmes. »/>

Structure des thèmes dans WordPress vs Gatsby. ( Grand aperçu)

Voyons maintenant le thème de Gatsby en action. Dans notre exemple, nous allons construire deux thèmes, gatsby-theme-wp-parent et son thème enfant gatsby-theme-wp-child. J'ai choisi cette configuration par souci de simplicité. Dans un scénario réel, vous souhaiterez peut-être décomposer vos fonctionnalités en plusieurs thèmes, chacun avec une responsabilité spécifique.

Nous publierons nos thèmes, les installerons dans un projet et ajouterons une personnalisation supplémentaire via l'observation au niveau du projet.

 Une illustration représentant un dossier de site contenant gatsby-theme-wp-parent et gatsby-theme-wp-child dans les modules de nœud, ainsi que src contenant des surcharges supplémentaires (ombrage) et le fichier gatsby-config.js. Une flèche du texte « nous allons les construire » pointe vers gatsby-theme-wp-parent et gatsby-theme-wp-child

Structure de fichiers simplifiée pour le projet final. ( Grand aperçu)

Configuration du développement

La dernière illustration représente la structure du projet de l'utilisateur final (site)où les thèmes sont consommés. Ils sont installés en tant que dépendances du projet. Cette configuration suppose que les thèmes sont disponibles via un référentiel npm, ce qui signifie que nous les avons déjà publiés. Nous n'en sommes pas encore là. Nous devons d'abord construire les thèmes parent et enfant. Mais à quoi ressemble la configuration de développement ? Nos thèmes sont deux packages indépendants, mais nous devons les travailler en parallèle au sein d'un même projet pendant le développement. De plus, nous souhaitons mettre en place une démo au sein du même projet qui implémente directement les thèmes.

L'une des solutions possibles est les espaces de travail en fil. Avec les espaces de travail de fil, nous travaillons dans un seul dépôt mono avec un seul fichier de verrouillage au niveau de la racine du projet. De plus, les dépendances peuvent être liées entre elles, ce qui signifie que les espaces de travail dépendent les uns des autres, et nous utilisons les versions locales lors du développement.

Comment mettre en place des espaces de travail fil? Tout d'abord, assurez-vous que le fil est installé globalement. Ensuite, à la racine de votre monorepo, ajoutez le fichier package.json qui précise les espaces de travail :

{
  "privé": vrai,
  "espaces de travail" : [
    "packages/*",
    "demo"
  ]
}

Maintenant, chaque thème est un sous-dossier dans packages avec son propre fichier package.json et une entrée principale vide index.js. Je procède ainsi à chaque thème que j'ajoute :

mkdir packages/gatsby-theme-wp-parent
touch packages/gatsby-theme-wp-parent/package.json packages/gatsby-theme-wp-parent/index.js

Avec le package.json comme suit :

{
  "nom": "@pehaa/gatsby-theme-wp-parent",
  "version": "1.0.0",
  "licence": "MIT",
  "main": "index.js"
}

Nous discuterons un peu plus de la publication thématique. Mais, pour le moment, notons que nous publierons nos thèmes sous forme de packages scoped ; J'utilise mon pseudo @pehaa comme portée ici. N'oubliez pas que, si vous décidez de publier des packages délimités dans le registre public npm https://registry.npmjs.orgvous devez indiquer explicitement l'accès public et ajouter ce qui suit à leur package.json Fichiers  :

"publishConfig" : {
  "accès": "public"
}

En plus des thèmes, nous aurons également besoin d'un espace de travail demo à partir duquel nous testerons notre code. La démo doit être un package "privé" car elle n'est pas censée être publiée.

//demo/package.json
{
  "privé": vrai,
  "nom": "démo",
  "version": "1.0.0",
  "scripts": {
    "build": "gatsby build",
    "develop": "gatsby develop",
    "clean": "gatsby clean"
  }
}

Avec la configuration des espaces de travail, nous pouvons exécuter les scripts de développement ou de construction de n'importe où dans notre monorepo en spécifiant le script et l'espace de travail comme suit : à une seule démo. Par exemple, notre monorepo GatsbyWPThemes contient plusieurs démos que nous ajoutons au répertoire examples. Dans ce cas, le fichier de niveau racine package.json définit les espaces de travail comme suit :

"workspaces": [
  "packages/*",
  "examples/*"
]

Building Gatsby Themes

Tout d'abord, nous devons installer reactreact-dom et gatsby. Nous devons installer ces trois en tant que dépendances de pairs (-P) dans chaque thème et en tant que dépendances dans notre démo. Nous installons également le thème parent en tant que dépendance du thème de l'enfant et le thème enfant en tant que dépendance de la démo.
espace de travail de fil @pehaa/gatsby-theme-wp-child add -P react react-dom gatsby
espace de travail de fil @pehaa/gatsby-theme-wp-child ajouter "@pehaa/gatsby-theme-wp-parent@*"
Démo de l'espace de travail de fil ajouter react-dom gatsby "@pehaa/gatsby-theme-wp-child@*"

Remarque : Vous ne pouvez pas ajouter @pehaa/gatsby- theme-wp-parent ou @pehaa/gatsby-theme-wp-child sans numéro de version. Vous devez le spécifier sous la forme @* ou @1.0.0. Sans cela, npm essaiera de récupérer le package du référentiel au lieu d'utiliser le package local. Plus tard, lorsque nous publierons nos packages avec Lerna, tous les * seront automatiquement mis à jour vers les versions du thème actuel et synchronisés.

Parent Theme

Concentrons-nous maintenant sur le thème parent et ses dépendances :

espace de travail de fil @pehaa/gatsby-theme-wp-parent add gatsby-source-wordpress gatsby-plugin-image gatsby-plugin-sharp gatsby-transformer-sharp gatsby-awesome-pagination

Notre thème parent est la responsabilité est de charger le plugin source et les trois plugins nécessaires au traitement et à l'affichage des images. Nous les chargeons tous dans le fichier gatsby-config.js.

//gatsby-config.js
module.exports = (options) => {
  retourner {
    plug-ins : [
      'gatsby-plugin-sharp', // must have for gatsby
      'gatsby-transformer-sharp', // must have for gatsby images
      'gatsby-plugin-image',
      {
        resolve: 'gatsby-source-wordpress',
        options: {
          url: `${options.wordPressUrl}/graphql`,
        },
      },
    ],
  }
}

En plus de rechercher le contenu, nous devons créer des itinéraires pour notre contenu WordPress de manière dynamique. Nous devons créer des itinéraires pour les pages statiques WordPress, les articles individuels, les archives de blogs, les archives de catégories et les archives de balises. Gatsby fournit l'API createPages dans le cadre de Gatsby Node API. Examinons le code responsable de la création de publications individuelles.

exports.createPages = async ({ graphql, actions }) => {
  const { createPage } = actions
  const postsQuery = wait graphql(`
    requête GET_POSTS {
      allWpPost(sort : {ordre : DESC, champs : date}) {
        bords {
          nœud {
            uri
            identifiant
          }
        }
      }
    }
  `)
  const posts = postsQuery.data.allWpPost.edges
  posts.forEach(({ nœud }) => {
    créer une page({
      chemin : node.uri,
      composant : path.resolve('../src/templates/post-query.js'),
      le contexte: {
        // Les données transmises au contexte sont disponibles dans les requêtes de page en tant que variables GraphQL
        // nous devons ajouter l'identifiant du message ici
        // afin que notre modèle d'article de blog sache quel article de blog il doit afficher
        identifiant : node.id
      },
    })
  })
}

Vous pouvez trouver le code complet dans ce référentiel GitHub. Vous remarquerez peut-être que cela varie en fonction du type de page. Il en va différemment pour un article, une page, ou une archive, notamment avec la pagination mise en place pour cette dernière. Toujours, il suit le même modèle :

  • exécuter une requête async graphql « get items » ;
  • boucler sur les éléments résultants et exécuter la fonction d'assistance createPage pour chaque élément , qui passe:
    • le chemin,
    • composant — le fichier modèle ; Gatsby doit savoir ce que chaque page doit afficher,
    • context — quelles que soient les données dont le modèle (fourni dans le champ component) pourrait avoir besoin.

Comme nous ne voulons pas. s'inquiéter de la partie de l'interface utilisateur dans le thème parent – nous la déléguons au composant que nous allons occulter dans le thème enfant.

// src/templates/post-query.js
importer { graphql } de "gatsby"
importer la publication de "../components/Post"
exporter la publication par défaut

exporter const pageQuery = graphql`
  requête ($id : chaîne !) {
    wpPost(id : { eq : $id }) {
      # interroger toutes les données utiles
    }
  }
`

Le composant Post a accès aux données de la requête de page graphql définie dans le fichier modèle. Notre composant reçoit les résultats de la requête via les accessoires en tant que props.data. Notre fichier de composant est séparé du modèle mais a accès à ses données. Avec cette configuration, nous pouvons observer le composant Post sans avoir à réécrire la requête.

// src/components/Post.js
importer React à partir de 'react'
const Post = (accessoires) => {
  return 
{JSON.stringify(props.data, null, 2)}

}
export default Post

Child Theme

Maintenant, passons au thème enfant et ajoutons ses dépendances.

Remarque : J'ai choisi d'utiliser Chakra UI en tant que bibliothèque de composants, elle est basée sur emotion et est livrée avec son propre Gatsby plugin. Nous devons également installer des styles spécifiques au contenu WordPress à partir de @wordpress/block-library.

yarn workspace @pehaa/gatsby-theme-wp-child add @chakra-ui/gatsby -plugin @chakra-ui/react @emotion/react @emotion/styled @wordpress/block-library framer-motion gatsby-plugin-webfonts html-react-parser

La responsabilité du thème enfant est la partie interface utilisateur, et nous avons besoin pour remplacer la sortie nue générée par le thème parent. Pour que l'ombrage fonctionne, nous devons suivre la structure des fichiers du thème parent. Par exemple, pour remplacer le composant Post de gatsby-theme-wp-parent/src/components/Post.jsnous devons créer un Post.js fichier dans gatsby-theme-wp-child/src/@pehaa/gatsby-theme-wp-parent/components. Le dossier intermédiaire @pehaa correspond au périmètre du package gatsby-theme-wp-parent.

 A gauche la structure des fichiers du shadowed gatsby-theme-wp- parent sur la droite la structure des fichiers de gatsby-theme-wp-child où l'observation se produit.

Structure des fichiers pour l'observation des composants. ( Grand aperçu)

Passage d'options aux thèmes

Nous chargeons et configurons les plugins gatsby dans un fichier gatsby-config.js. Nous aurons trois fichiers de configuration dans notre configuration, un à chaque niveau, notre thème parent, le thème enfant et la démo.

├── démo
└── gatsby-config.js
paquets
├── gatsby-theme-wp-child
│ └── gatsby-config.js
└── gatsby-theme-wp-parent
└── gatsby-config.js
└── ...

Au niveau de la démo, la config charge le thème enfant comme ceci :

//demo/gatsby-config.js
module.exports = {
  plug-ins : [
    {
      resolve: '@pehaa/gatsby-theme-wp-child',
      options: {
        wordPressUrl: process.env.GATSBY_WP_URL,
        /* other options */
      },
    },
  ],
}

Comme vous pouvez le voir ci-dessus, nous passons des options au thème enfant. Ceux-ci seront disponibles dans le fichier de configuration au niveau du thème enfant. C'est possible puisque les plugins Gatsby ont une configuration exportée en tant que fonction. Ainsi, lorsque nous chargeons un plugin fournissant des options, le plugin les reçoit en argument de sa fonction de configuration. En particulier, les options que nous passons à un thème peuvent être « transférées » vers son thème de niveau parent comme suit :

// ​​gatsby-theme-wp-child/gatsby-config.js
const defaultFonts = ...
module.exports = (options) => {
  // option de structure pour extraire les polices
  const {fonts, ...rest} = options
  retourner {
    plug-ins : [
      {
        resolve: `@pehaa/gatsby-theme-wp-parent`,
        options: {
          // "forward" the options gatsby-theme-wp-child options to its parent theme
          ...rest
        }
      },
      '@chakra-ui/gatsby-plugin',
      {
        resolve: `gatsby-plugin-webfonts`,
        options: {
          fonts: fonts || defaultFonts
        },
      },
    ],
  }
}

Regardons à nouveau le code ci-dessus. Notez que nous définissons les polices au niveau du thème enfant, mais nous gardons la possibilité de les modifier via les options du thème.

//demo/gatsby-config.js
module.exports = {
  plug-ins : [
    {
      resolve: `@pehaa/gatsby-theme-wp-child`,
      options: {
        wordPressUrl: process.env.GATSBY_WP_URL,
        fonts: {
          google: [{family: "Rubik"}],
        },
      },
    },
  ],
}

Lors de la configuration de nos thèmes, nous devons nous rappeler qu'un thème n'est qu'un package et que l'utilisateur final n'accède pas directement à son code. Par conséquent, c'est une bonne idée d'anticiper et d'exposer les paramètres appropriés. Si notre thème charge un plugin qui nécessite une configuration, nous devrions probablement transmettre les options des plugins du niveau du projet (démo) jusqu'en bas.

Regardons un exemple. Notre thème parent utilise le plugin gatsby-source-wordpress qui récupère les données de WordPress. Ce plugin est livré avec un tas d'optionsdont certaines peuvent être critiques pour le processus de construction, comme schema.requestConcurrencyou schema.timeout. Mais, encore une fois, le thème parent n'est qu'un package et l'utilisateur final ne peut pas modifier son fichier gatsby-config. Cela peut sembler évident, mais nous l'avons quelque peu manqué dans la version initiale de Gatsby WP Themes. Cependant, avec une solution rapide, l'utilisateur peut passer les options gatsby-plugin-source-wordpress à partir de la configuration du projet…

 // projet de l'utilisateur gatsby-config.js
module.exports = {
  plug-ins : [
    {
      resolve: `@pehaa/gatsby-theme-wp-child`,
      options: {
        wordPressUrl: process.env.GATSBY_WP_URL,
        gatsbySourceWordPressOptions: {},
        // ...
      },
    },
  ],
}

… via le thème enfant et parent vers le plugin de destination :

// packages/gatsby-theme-wp-parent/gatsby-config.js
module.exports = (options) => {
  retourner {
    plug-ins : [
      // ...
      {
        resolve: `gatsby-plugin-source-wordpress`,
        options: {
          url: `${options.wordPressUrl}/graphql`,
          ...options.gatsbySourceWordPressOptions
        },
      },
    ],
  }
}

Thème CSS

Les solutions CSS-in-JS qui prennent en charge les thèmes semblent bien adaptées aux thèmes Gatsby. Notre thème enfant Gatsby utilisera Chakra UI frameworket nous personnaliserons légèrement son thème CSS. Oui, Chakra UI utilise également la notion de « thème ». Dans ce contexte, un thème est un objet JavaScript qui stocke les valeurs de style du système de conception, les échelles et/ou les jetons de conception. Pour éviter toute confusion, je l'appellerai "thème CSS". Nous avons déjà installé les packages requis @chakra-ui avec le plugin Gatsby @chakra-ui/gatsby-plugin. Explorons le code du plugin pour découvrir comment cela fonctionne. Il encapsule en fait notre application Gatsby dans le ChakraProvider et expose le fichier src/theme.js pour l'observation, afin que nous puissions procéder comme ceci :

/* packages/gatsby- theme-wp-child/src/@chakra-ui/gatsby-plugin/theme.js */
importer { extendTheme } depuis "@chakra-ui/react"
thème const = {
  polices : {
    corps : "Karma, sans-serif",
    rubrique : "Poppins, sans-serif",
  },
  modes: {
    global: {
      corps: {
        couleur: "gris.700",
        fontSize : "xl",
      },
    },
  },
  Composants: {
    Bouton: {
      baseStyle : {
        borderRadius: "3xl",
      },
      defaultProps : {
        colorScheme : "rouge",
      },
    },
  },
}
export default extendTheme(theme)

Encore une fois, nous avons utilisé le concept d'ombrage. L'aspect clé ici est l'emplacement où nous avons créé le fichier theme.js.

Plus tard, nous verrons comment masquer le thème CSS au niveau du projet de l'utilisateur.

Publier des thèmes avec Lerna

Une fois vos thèmes prêts, vous devez les publier. Si vous souhaitez partager votre code publiquement, vous le publierez très probablement dans le registre public npm. Et si vous n'avez jamais publié de package auparavant, vous pouvez vous familiariser avec le processus en jouant avec Verdaccio sur votre ordinateur local.

À Gatsby WP Themesnous utilisons un service premium de Cloudsmith. Cloudsmith prend en charge les registres complets pour les packages npm avec l'option premium pour les registres privés et une solution gratuite pour les registres publics. Je vais continuer avec une solution Cloudsmith gratuite. Une fois que vous avez créé votre compte, créez un nouveau référentiel ; le mien est pehaa/gatsby-wp-theming.

Capture d'écran de l'interface de l'application Cloudsmith avec la liste des référentiels contenant pehaa/gatsby-wp-theming.

Mes référentiels dans l'application Cloudsmith. ( Grand aperçu)

Afin d'apporter des modifications à votre registre Cloudsmith via votre ligne de commande, vous devrez fournir vos identifiants de connexion pour ce registre. Tapez simplement :

npm login --registry=https://npm.cloudsmith.io/organistion/repository_name/

et il vous sera demandé votre nom d'utilisateur, votre mot de passe (qui est votre clé API) et votre email.

Avec un référentiel git multi-paquets, vous pouvez utiliser Lerna pour faciliter la publication. Lerna s'accorde bien avec les espaces de travail en laine. Vous pouvez installer Lerna CLI globalement avec npm install --global lerna. Pour l'initier dans notre projet, nous exécuterons la commande suivante :

lerna init --independent

La commande ci-dessus créera un fichier lerna.json à la racine du monorepo. Vous devrez ajouter les "useWorkspaces" : true et "npmClient": "yarn" manuellement ; vous devrez peut-être également spécifier le command.publish.registry s'il ne s'agit pas du npm public par défaut.

{
  "npmClient": "fil",
  "useWorkspaces": vrai,
  "version": "indépendant",
  "commande": {
    "publier": {
      "registre": "https://cloudsmith.io/organisation/repository_name"
    }
  }
}

Ensuite, la commande lerna publish publie les packages qui ont été modifiés depuis la dernière version. Par défaut, Lerna exécute des invites pour le changement de version de chaque package en cours de mise à jour. Vous pouvez ignorer les invites en exécutant :

lerna publish [major|minor|patch|premajor|preminor|prepatch|prerelease] --yes

Vous pouvez également configurer Lerna pour utiliser la Conventional Commits Specification pour déterminer le changement de version et générez des fichiers CHANGELOG.md. Avec toutes les options disponibles, vous devriez pouvoir adapter la façon dont vous utilisez Lerna à votre flux de travail.

Utiliser un thème dans un projet

Maintenant, arrêtons le serveur de développement et prenons le point de vue de l'utilisateur. Nous allons créer un nouveau projet, gatsby-wp-sitequi implémente gatsby-theme-wp-child en tant que package installé à partir du référentiel npm. Dans notre dossier de projet, nous allons installer nos quatre dépendances : gatsbyreactreact-dom et le thème lui-même. Puisque nous avons utilisé Cloudsmith pour publier des packages à portée @pehaanous devrons ajouter un fichier .npmrc dans lequel nous spécifions un référentiel à portée @pehaa comme ceci :

mkdir gatsby-wp-site
cd gatsby-wp-site
echo "@pehaa:registry=https://npm.cloudsmith.io/pehaa/gatsby-wp-theming/" >> .npmrc
initialisation du fil -yp
fil ajouter réagir réagir-dom gatsby @pehaa/gatsby-theme-wp-child

Notre site est presque prêt. Nous n'avons qu'à créer un gatsby-config.file pour charger le thème et fournir l'URL WordPress. Une fois cela fait, nous sommes prêts à exécuter gatsby build.

// gatsby-config.js
module.exports = {
  plug-ins : [
    {
      resolve: "@pehaa/gatsby-theme-wp-child",
      options: {
        wordPressUrl: "https://yourwordpress.website"
      }
    }
  ]
}

Notre site est prêt.

Une illustration avec une capture d'écran de la construction du site sur un écran d'ordinateur.

Notre version est prête. ( Grand aperçu)

Qu'en est-il de la personnalisation ? Nous pouvons encore profiter de l'ombrage. De plus, le niveau du projet est toujours prioritaire en termes d'ombrage. Voyons-le en action en remplaçant le composant Footer. À l'heure actuelle, notre pied de page est défini dans @pehaa/gatsby-theme-wp-child/src/components/Footer.js. Nous devons créer le dossier src et recréer la structure de fichiers suivante :

gatsby-wp-site
src
@pehaa
└── gatsby-theme-wp-child
└── composants
│ └── Footer.js

Avec la structure de fichiers ci-dessus, nous sommes prêts à fournir une nouvelle version du pied de page du site. Par exemple :

importer React à partir de "react"
importer { useStaticQuery, graphql } de "gatsby"
importer {Boîte } de "@chakra-ui/react"
const Pied de page = () => {
  données const = useStaticQuery(graphql`
    requete {
      wp {
        réglages généraux {
          Titre
        }
      }
    }
  `)
  retourner (
    
      {data.wp.generalSettings.title} - Construit avec WordPress et GatsbyJS
    
  )
}
export default Footer

Enfin, voyons comment nous pouvons travailler avec le thème CSS. Avec le code ci-dessous, correctement situé dans src/@chakra-ui/gatsby-plugin/theme.jsvous pouvez étendre le thème par défaut au sein du projet.

// src/@chakra-ui /gatsby-plugin/theme.js
importer { extendTheme } depuis "@chakra-ui/react"
thème const = {
  /* ... */
}
export default extendTheme(theme)

Dans la plupart des cas, ce n'est pas exactement ce dont vous avez besoin. Le nouveau thème CSS ignore celui de gatsby-theme-wp-childalors que vous voudriez plutôt étendre le thème CSS défini dans le thème enfant Gatsby. Ce dernier est possible puisque la fonction extendTheme permet de passer plusieurs objets. Pour le faire fonctionner, vous devez importer le thème CSS de gatsby-theme-wp-child et le passer comme deuxième argument à la fonction extendTheme :

// ​​src /@chakra-ui/gatsby-plugin/theme.js
importer le thème de "@pehaa/gatsby-theme-wp-child/src/@chakra-ui/gatsby-plugin/theme"
importer { extendTheme } depuis "@chakra-ui/react"
const ExtendedTheme = {
  polices : {
    corps : "Rubik, sans empattement",
    rubrique : "Rubik, sans empattement",
  },
  /* ... */
}
exportez le extendTheme par défaut (extendedTheme, theme) 

 Une illustration avec une capture d'écran du site construit sur un écran d'ordinateur.

Ajoutons un peu d'ombrage. ( Grand aperçu)

Vous pouvez voir le site en direct iciil est déployé à partir de la branche principale de ce repo GitHub.

Wrapping Up

Vous venez de voir le thème de Gatsby dans action. Avec l'approche thématique, vous pouvez rapidement configurer plusieurs sites Gatsby avec la plupart de leur code conservé dans les packages thématiques. Nous avons également vu comment séparer des parties du projet en packages et comment tirer parti de l'ombrage.

Dans notre exemple, nous avons suivi la configuration à deux thèmes avec une relation parent-enfant entre les thèmes. Ce n'est peut-être pas toujours un choix idéal.

Parfois, vous voudrez peut-être aller assez loin avec la personnalisation de l'interface utilisateur. Dans ce cas, vous pouvez envisager de charger et d'observer directement le thème parent au lieu d'utiliser le thème enfant. Dans un scénario du monde réel, vous opteriez probablement pour quelques thèmes au niveau enfant responsables de différentes parties réutilisables de l'interface utilisateur (par exemple, commentaires, formulaires ou recherche).

Further Reading On Smashing Magazine

Smashing Editorial" width="35" height="46" loading="lazy" decoding="async(vf, yk, il)




Source link

Revenir vers le haut