Comment utiliser Shiki 式 Syntax highlighter avec NextJS et Tailwind
Créez votre projet Next.js
Avant toute chose, si vous n'avez pas encore de projet Next.js, démarrez avec une commande magique :
Vous pouvez ensuite répondre au question du bootstrap
Et voilà, vous avez un projet tout frais, prêt à développer un CodeBlock
aux petits oignons.
Téléchargez les fichiers de votre thème VS Code préféré
Allez dans votre éditeur VS Code et trouver votre thème favoris. Un big shout-out au créateur de Pace Theme pour ce magnifique style !
Ensuite, copiez les fichiers de thème, en json
, vers votre projet Next.js, par exemple dans lib/themes
.
Placez-les dans un dossier dédié pour garder votre structure de fichiers propre. Par exemple, ici pour un dual theme :
./lib/themes/dark.json
et ./lib/themes/light.json
Installez Shiki
Créez une fonction highlightCode
Maintenant, attaquons-nous à l'essentiel, une fonction highlightCode
qui va transformer votre code en une œuvre d’art. Ajoutez ce petit bijoux :
Créez un composant Server pour injecter le code stylisé
Maintenant, créons un composant qui va nous permettre d’injecter tout ce code avec style dans notre page ! Créez code-block.tsx
dans votre dossier components
:
Créez un composant wrapper Client Side pour un style au top
On va ajouter un wrapper client pour donner un peu de vie au bloc de code avec une option de copie, des défilements, et autres bonus sympas. Voici CodeBlockWrapper
:
Configurer le thème sombre et clair pour Shiki
Avant d'utiliser notre composant CodeBlockWrapper
, il nous faut ajouter un peu de CSS pour que les thèmes sombre et clair s'adaptent automatiquement.
Ajoutez ce code dans votre fichier CSS global :
Utilisez le composant et admirez
Enfin, le moment est venu de voir le résultat ! Appelez CodeBlockWrapper
, passez-lui votre code, et admirez le rendu:
PS : tous les blocs de code de mon portfolio sont générés comme ça ! Pas mal, non ?
Et voilà ! Votre code est maintenant prêt à briller avec Shiki
, et dans le thème de votre choix. 🎉
Si vous voulez aller plus en profondeur dans le code, voici le repo de mon portfolio où j'explique exactement comment j'ai fait : components/utils/code-block-wrapper.tsx