2026.06.11 (Jeu)

✹ RĂ©sumĂ© de GPT-5.5  

Journal du remplacement des cartes de recherche assemblĂ©es par chaĂźnes JavaScript par une carte Liquid partagĂ©e, afin que date, catĂ©gories, vues et layout de l’overlay suivent les mĂȘmes rĂšgles que les listes normales.

Les rĂ©sultats de recherche avaient l’air anciens.

Sur l’accueil et les pages de catĂ©gories, les cartes d’articles Ă©taient dĂ©jĂ  plus cohĂ©rentes. Sous le titre, on voyait la date, les badges de catĂ©gorie et le nombre de vues dans la mĂȘme ligne de mĂ©tadonnĂ©es.

Mais en ouvrant la recherche, une ancienne UI apparaissait.

Elle affichait seulement le titre et l’extrait. On ne voyait pas immĂ©diatement quand l’article avait Ă©tĂ© Ă©crit. Il n’y avait ni catĂ©gorie ni vues. Le mĂȘme article avait du contexte dans les listes normales, mais le perdait dans les rĂ©sultats de recherche.

La cause était que les résultats de recherche étaient encore rendus par une chaßne HTML séparée en JavaScript.

Le rendu par chaĂźnes JavaScript vieillissait la recherche

Lunr continue de gérer la recherche.

Pour un blog Jekyll statique, construire un store de recherche au moment du build puis l’interroger en JavaScript cĂŽtĂ© navigateur est logique.

Le problÚme était que JavaScript construisait aussi la carte du résultat.

Les listes normales étaient rendues par _includes/archive-single.html, tandis que les résultats de recherche étaient assemblés en chaßnes dans assets/js/lunr/lunr-en.js.

La structure ressemblait Ă  ceci :

Regular listing
-> Liquid include
-> archive__item
-> date, category, views

Search results
-> Lunr JS
-> hand-built HTML string
-> title and excerpt only

C’était la source du problĂšme.

Si j’ajoutais des badges de catĂ©gorie aux listes normales, la recherche ne changeait pas. Si je modifiais la rĂšgle d’affichage de date, la recherche ne changeait pas. Si je retouchais les vues, la recherche restait identique.

La mĂȘme carte d’article Ă©tait maintenue Ă  deux endroits.

J’ai sĂ©parĂ© la carte d’article dans un include partagĂ©

Au lieu de grossir le JavaScript de recherche, je lui ai fait produire moins de HTML.

J’ai ajoutĂ© des includes partagĂ©s.

_includes/archive-item-card.html
_includes/archive-item-meta-row.html
_includes/archive-item-categories.html

archive-item-card.html reçoit un document et rend la mĂȘme structure que les listes d’archive existantes.

list__item
archive__item
archive__item-title
archive__item-meta-row
archive__item-excerpt

archive-item-meta-row.html regroupe date, vues et catĂ©gories sur une ligne. La date et les vues continuent d’utiliser page__meta.html, tandis que les catĂ©gories passent par archive-item-categories.html.

Ensuite, _includes/archive-single.html est devenu un wrapper mince.

{% include archive-item-card.html document=post type=include.type context="archive" %}

Les listes normales et les rĂ©sultats de recherche utilisent maintenant le HTML gĂ©nĂ©rĂ© par le mĂȘme include.

J’ai mis le HTML complet de la carte dans le store Lunr

Lunr fait toujours la recherche.

Mais JavaScript ne construit plus le HTML de la carte.

Au build Jekyll, assets/js/lunr/lunr-store.js rend l’include de carte pour chaque document et place le rĂ©sultat dans le champ html.

title
excerpt
categories
tags
lang
locale
html
url
teaser

Le JavaScript de recherche prend maintenant entry.html et l’insùre.

Avant, il mĂ©langeait liens de titre, image teaser, dĂ©coupe d’extrait et assemblage de chaĂźnes HTML.

var renderSearchResult = function (entry) {
  return entry.html || '';
};

Le JS de recherche garde seulement la recherche, le filtrage par locale, l’affichage du nombre de rĂ©sultats et l’insertion.

Les vues en recherche sont affichées, pas enregistrées

Il fallait décider si les résultats de recherche devaient aussi afficher les vues.

Au dĂ©but, j’ai envisagĂ© de les retirer. Les rĂ©sultats pouvaient devenir chargĂ©s, et le DOM insĂ©rĂ© dynamiquement demandait un traitement sĂ©parĂ©.

Mais si la carte doit correspondre aux listes normales, retirer uniquement les vues est aussi étrange.

Les rĂ©sultats de recherche affichent donc les vues. L’affichage et l’enregistrement restent sĂ©parĂ©s.

Search result exposure is not a visit.
The view count in search results is display-only.
Actual visit tracking belongs only to the currently opened page.

Les Ă©lĂ©ments de vues du blog ont data-page-view-path. La vraie cible de tracking est l’élĂ©ment de la page courante avec data-page-view-track="true".

Les cartes de recherche ont seulement data-page-view-path; elles n’ont pas data-page-view-track="true".

Donc l’apparition d’un article dans la recherche n’incrĂ©mente pas ses vues.

Elle affiche seulement le nombre.

Je réapplique les vues aux résultats dynamiques

Les résultats de recherche ne sont pas dans le DOM au chargement initial.

Ils sont insĂ©rĂ©s aprĂšs la saisie de l’utilisateur. Si le script de vues ne collecte les Ă©lĂ©ments qu’une fois au chargement, les vues dans les rĂ©sultats ne seront jamais remplies.

J’ai donc aussi modifiĂ© assets/js/custom/visitor-stats.js.

Au lieu de fixer document.querySelectorAll("[data-page-view-path]") au début du fichier, il recherche ces éléments à chaque rendu des vues.

J’ai aussi mis en cache le payload analytics.

latestAnalyticsPayload

AprÚs le rendu des résultats, le script de recherche déclenche hyuk:search-results-rendered.

Le script visitor stats Ă©coute cet Ă©vĂ©nement et, s’il a dĂ©jĂ  un payload, rĂ©applique les vues au nouveau DOM.

Il ne rappelle pas l’API.

Si chaque changement de saisie appelait l’API de vues, la recherche interfĂ©rerait avec le compteur. Les rĂ©sultats changent souvent, donc les requĂȘtes rĂ©seau ne doivent pas suivre chaque touche.

Le flux devient :

Page load
-> receive analytics payload once
-> render views for existing listing/current page

Search results render
-> dispatch event
-> reuse cached payload for newly inserted DOM

Ainsi les résultats de recherche ne polluent pas le compteur.

Les métadonnées multilingues suivent chaque locale

AprÚs le travail multilingue du blog, le site a des pages et collections par locale comme /en/, /ja/ et /zh-Hans/. La recherche ne doit pas mélanger les locales.

Le store de recherche contient lang et locale, et le HTML de la carte utilise la locale du document pour les labels. En anglais on voit Views, en japonais é–Č芧数, et en français Vues.

Les catĂ©gories suivent la mĂȘme rĂšgle.

Le préfixe de locale ne doit pas devenir un badge de catégorie. archive-item-categories.html ignore donc ce segment et affiche seulement les vraies catégories.

J’ai restaurĂ© la sidebar et une largeur plus grande dans l’overlay

Aligner la carte ne suffisait pas.

À l’ouverture de la recherche, la largeur des rĂ©sultats restait trop Ă©troite. MĂȘme avec le mĂȘme HTML que les listes normales, l’espace Ă  droite n’était pas utilisĂ©.

Il y avait aussi un problÚme plus large : ouvrir la recherche faisait disparaßtre les catégories latérales.

L’overlay de recherche n’est pas posĂ© au-dessus du corps existant. À l’ouverture, .initial-content est masquĂ© et une zone sĂ©parĂ©e #site-search s’affiche.

La sidebar de la page normale disparaĂźt donc aussi. MĂȘme avec une carte partagĂ©e, l’écran de recherche paraĂźt sĂ©parĂ© si le layout autour change.

J’ai donc inclus la sidebar dans _includes/search/search_form.html.

<div class="search-content__inner-wrap">
  {% include sidebar.html %}
  <div class="archive search-content__archive">
    ...
  </div>
</div>

J’ai aussi enveloppĂ© les rĂ©sultats dans archive search-content__archive, pour qu’ils suivent le layout d’archive.

Puis j’ai retirĂ© la rĂšgle CSS qui rĂ©trĂ©cissait les cartes.

Minimal Mistakes avait cette rĂšgle pour la recherche :

.search-content .archive__item {
  @include breakpoint($large) {
    width: 75%;
  }

  @include breakpoint($x-large) {
    width: 50%;
  }
}

L’apparence ancienne ne venait donc pas seulement du HTML. Sur grand Ă©cran, la carte Ă©tait rĂ©duite de moitiĂ©.

Dans le SCSS personnalisé, les cartes de recherche reprennent toute la largeur.

.search-content .archive__item {
  width: 100%;
}

Il restait un autre détail.

L’archive normale rĂ©serve de l’espace Ă  droite avec padding-inline-end pour la sidebar droite. L’overlay de recherche n’a pas cette sidebar. Garder ce padding rend les rĂ©sultats trop Ă©troits.

J’ai donc supprimĂ© ce padding seulement pour l’archive de l’overlay.

.search-content .search-content__archive {
  padding-inline-end: 0;
}

Les rĂšgles de rendu de carte restent partagĂ©es avec les listes normales ; seul le layout de l’overlay est ajustĂ© pour la recherche.

J’ai vĂ©rifiĂ© desktop et mobile

J’ai lancĂ© le build et les checks de syntaxe.

bundle exec jekyll build
node --check _site/assets/js/lunr/lunr-store.js
node --check _site/assets/js/lunr/lunr-en.js
node --check _site/assets/js/custom/visitor-stats.js

Le store généré contient page__views et data-page-view-path.

Le HTML de carte de recherche ne contient pas data-page-view-track="true", ce qui évite de mélanger exposition dans la recherche et tracking de visite.

J’ai ensuite ouvert la recherche dans plusieurs pages locale et testĂ© des requĂȘtes comme :

References
Keymory
Daily review

Les cartes affichaient date, catĂ©gorie et vues dans la mĂȘme ligne de mĂ©tadonnĂ©es que les listes normales. Les labels suivaient chaque locale : Views, é–Č芧数, Vues et les autres.

Dans les rĂ©sultats, data-page-view-track="true" Ă©tait absent. Sur les pages d’articles, l’élĂ©ment de tracking de la page courante apparaissait toujours une seule fois.

L’overlay de recherche avait de nouveau la sidebar. À 1280px de large sur desktop, la sidebar avait 22 Ă©lĂ©ments et la carte de rĂ©sultat atteignait environ 974px de largeur.

À 390px sur mobile, la sidebar se plaçait au-dessus et la carte utilisait 345px pour le titre, les mĂ©tadonnĂ©es et l’extrait.

La console du navigateur n’affichait aucune erreur.

Laisser un commentaire