Les pieds dans le tapis

Tête d'éléphant en bois

J’ai ouvert un ticket il y a quelques jours et j’ai commencé à voir comment implémenter un peu de code pour le fermer et j’ai tout mis à la poubelle.

Il s’agit, pour expliquer un peu, de trier les éléments présents dans l’élément head des pages HTML, en suivant un certain nombre de règles — que je ne détaillerai pas ici, ça n’est pas utile — en mettant en premier le plus important et le plus nécessaire pour accélérer le rendu de la page, ou dit autrement pour éviter de ralentir celui-ci.

Techniquement j’ai commencé par imaginer d’interpréter cet élément et son contenu à l’aide de la bibliothèque DOM (DOMDocument) mais j’ai appris au passage que le parser HTML était celui de la version 4 et pas celui de la version 5 qui est en cours d’intégration mais pas prévu avant PHP 8.4.

Ne sachant pas trop dans quel mesure ça peut impacter le résultat, alors je me suis tourné vers une autre solution en utilisant la bibliothèque SimpleXML, sauf que cette dernière n’est pas tolérante du tout et que le moindre problème de syntaxe dans la chaîne fournie aboutit à un résultat nul. Or si on maitrise plutôt bien ce qu’on positionne dans le head dans Dotclear, on ne contrôle absolument pas ce que les plugins et thèmes tiers peuvent y adjoindre.

Une troisième voie aurait été de faire ce tri à grand coup de recherche à l’aide d’expressions régulières, sauf que j’ai l’intuition que ça risque d’être assez couteux en temps de traitement côté serveur sans compter la difficulté de définir les bonnes expressions compte-tenu de l’aspect non totalement maitrisé du contenu de l’élément head.

Idéalement j’aimerais bien avoir quelques métriques sur le gain attendu suite au tri, mais je n’en trouve nulle part, ce qui me laisse dans l’expectative la plus complète et cette question non répondue : « Le tri vaut-il la chandelle ? ».

Une autre solution pourrait être de prévoir un fonctionnement différent dans Dotclear pour permettre au code tiers « d’alimenter » le contenu du head, toujours en fonction des règles citées plus haut ; j’attendrai toutefois d’avoir plus de billes sur l’efficacité de ce tri avant d’envisager ça.

Avec un exemple c’est mieux, alors voilà l’élément head du tableau de bord de mon environnement de développement, sachant que j’ai plus de 90 plugins installés et actifs et une vingtaine de thèmes installés et actifs également :

Code de l’élément head
<head>
  <meta charset="UTF-8">
  <meta name="ROBOTS" content="NOARCHIVE,NOINDEX,NOFOLLOW">
  <meta name="GOOGLEBOT" content="NOSNIPPET">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Tableau de bord - Open Eyes - DB : dc2 - 2.30-dev</title>
  <link rel="stylesheet" href="style/default.css" type="text/css" media="screen">
  <link rel="icon" type="image/png" href="images/favicon96-login.png">
  <link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon">
  <script type="application/json" id="dotclear_init-data">
  { "htmlFontSize": "62.5%", "hideMoreInfo": false, "servicesUri": "index.php?process=Rest", "servicesOff": false, "noDragDrop": false, "debug": true, "showIp": true }
  </script>
  <script src="js/prepend.js"></script>
  <script src="js/jquery/jquery.js"></script>
  <script type="application/json" id="dotclear_jquery-data">
  { "mute": false }
  </script>
  <script src="js/jquery-mute.js"></script>
  <script src="js/jquery/jquery-migrate.js"></script>
  <script type="application/json" id="dotclear-data">
  { "nonce": "3d85ae9a0b56f29e97954b5625ffd7c0ffc922c362120c0f5d1ba946978e75f53fbfc6d32f212ee2a228f5c85aaa8929876fa1fc74e2efb34a310a9b0cfa16c1", "img_plus_src": "images/expand.svg", "img_plus_txt": "\u25b6", "img_plus_alt": "r\u00e9cup\u00e9rer", "img_minus_src": "images/hide.svg", "img_minus_txt": "\u25bc", "img_minus_alt": "cacher" }
  </script>
  <script type="application/json" id="dotclear_msg-data">
  { "help": "Besoin d'aide ?", "new_window": "nouvelle fen\u00eatre", "help_hide": "Cacher", "to_select": "S\u00e9lectionner\u00a0:", "no_selection": "Pas de s\u00e9lection", "select_all": "Tout s\u00e9lectionner", "invert_sel": "Inverser la s\u00e9lection", "website": "Site web\u00a0:", "email": "Email\u00a0:", "ip_address": "Adresse IP\u00a0:", "error": "Erreur :", "entry_created": "Le billet a \u00e9t\u00e9 cr\u00e9\u00e9.", "edit_entry": "\u00c9diter la publication", "view_entry": "Voir la publication", "confirm_delete_posts": "\u00cates-vous s\u00fbr\u00b7e de vouloir supprimer les publications s\u00e9lectionn\u00e9es (%s) ?", "confirm_delete_medias": "\u00cates-vous s\u00fbr\u00b7e de vouloir supprimer les m\u00e9dias s\u00e9lectionn\u00e9s (%d) ?", "confirm_delete_categories": "\u00cates-vous s\u00fbr\u00b7e de vouloir supprimer les cat\u00e9gories s\u00e9lectionn\u00e9es (%s) ?", "confirm_delete_post": "\u00cates-vous certain\u00b7e de vouloir supprimer cette publication\u00a0?", "click_to_unlock": "Cliquez ici pour d\u00e9verrouiller le champ", "confirm_spam_delete": "\u00cates-vous certain\u00b7e de vouloir supprimer tous les ind\u00e9sirables\u00a0?", "confirm_delete_comments": "\u00cates-vous s\u00fbr\u00b7e de vouloir supprimer les commentaires s\u00e9lectionn\u00e9s (%s) ?", "confirm_delete_comment": "\u00cates-vous certain\u00b7e de vouloir supprimer ce commentaire\u00a0?", "cannot_delete_users": "Une utilisatrice ou un utilisateur avec des publications ne peut \u00eatre supprim\u00e9.", "confirm_delete_user": "\u00cates-vous s\u00fbr\u00b7e de vouloir supprimer les utilisatrices et les utilisateurs s\u00e9lectionn\u00e9es (%s) ?", "confirm_delete_blog": "\u00cates-vous s\u00fbr\u00b7e de vouloir supprimer les blogs s\u00e9lectionn\u00e9s (%s) ?", "confirm_delete_category": "\u00cates-vous certain\u00b7e de vouloir supprimer la cat\u00e9gorie \"%s\"\u00a0?", "confirm_reorder_categories": "\u00cates-vous s\u00fbr\u00b7e de vouloir r\u00e9ordonner toutes les cat\u00e9gories ?", "confirm_delete_media": "\u00cates-vous certain\u00b7e de vouloir supprimer le m\u00e9dia \"%s\"\u00a0?", "confirm_delete_directory": "\u00cates-vous certain\u00b7e de vouloir supprimer le r\u00e9pertoire \"%s\"\u00a0?", "confirm_extract_current": "\u00cates-vous certain\u00b7e de vouloir extraire cette archive dans le r\u00e9pertoire courant\u00a0?", "confirm_remove_attachment": "\u00cates-vous certain\u00b7e de vouloir supprimer l'annexe \"%s\"\u00a0?", "confirm_delete_lang": "\u00cates-vous certain\u00b7e de vouloir supprimer la langue \"%s\"\u00a0?", "confirm_delete_plugin": "\u00cates-vous certain\u00b7e de vouloir supprimer le plugin \"%s\"\u00a0?", "confirm_delete_plugins": "\u00cates-vous s\u00fbr\u00b7e de vouloir supprimer les plugins s\u00e9lectionn\u00e9s ?", "use_this_theme": "Utiliser ce th\u00e8me", "remove_this_theme": "Supprimer ce th\u00e8me", "confirm_delete_theme": "\u00cates-vous certain\u00b7e de vouloir supprimer le th\u00e8me \"%s\"\u00a0?", "confirm_delete_themes": "\u00cates-vous s\u00fbr\u00b7e de vouloir supprimer les th\u00e8mes s\u00e9lectionn\u00e9s ?", "confirm_delete_backup": "\u00cates-vous certain\u00b7e de vouloir supprimer cette sauvegarde\u00a0?", "confirm_revert_backup": "\u00cates-vous certain\u00b7e de vouloir restaurer cette sauvegarde\u00a0?", "zip_file_content": "Contenu de l'archive Zip", "xhtml_validator": "Validateur HTML", "xhtml_valid": "Le contenu HTML est valide.", "xhtml_not_valid": "Il y a des erreurs de balisage HTML.", "warning_validate_no_save_content": "Attention : audit d'un contenu qui n'est pas encore enregistr\u00e9.", "confirm_change_post_format": "Vous avez des modifications non enregistr\u00e9es. Changer le format de publication va perdre ces modifications. Continuer quand m\u00eame ?", "confirm_change_post_format_noconvert": "Attention : la modification du format de publication ne convertira pas le contenu existant. Vous devrez appliquer le nouveau format par vous-m\u00eame. Continuer quand m\u00eame ?", "load_enhanced_uploader": "Chargement de l'interface am\u00e9lior\u00e9e, veuillez patienter.", "module_author": "Auteur\u00b7rice\u00a0:", "module_details": "D\u00e9tails", "module_support": "Assistance", "module_help": "Aide :", "module_section": "Section\u00a0: ", "module_tags": "Mots-cl\u00e9s:", "close_notice": "Masquer ce message", "show_password": "Montrer le mot de passe", "hide_password": "Cacher le mot de passe", "set_today": "R\u00e9initialiser \u00e0 maintenant", "adblocker": "Une bloqueur de publicit\u00e9 a \u00e9t\u00e9 d\u00e9tect\u00e9 sur ce tableau de bord de Dotclear (Ghostery, Adblock plus, uBlock origin, \u2026) et il peut perturber certaines fonctionnalit\u00e9s. Dans ce cas vous devriez le d\u00e9sactiver. Notez que vous pouvez d\u00e9sactiver cette d\u00e9tection dans vos pr\u00e9f\u00e9rences." }
  </script>
  <script src="js/common.js"></script>
  <script src="js/services.js"></script>
  <script src="js/prelude.js"></script>
  <script type="application/json" id="dotclear_toggles-data">
  { "post_tags": true, "dcx_cat_id": true, "dcx_attachments": true, "dcx_post_password": true, "dcx_post_status": true, "dcx_post_format": true, "dcx_ajax_news": true, "dcx_post_dt": true, "dcx_post_lang": true, "dcx_featuredmedia": true, "post_url": true, "post_series": true, "dcx_comment_tb": true, "dcx_ping_services": true, "dcx_post_rosetta": true, "dcx_gmap_detail": true, "dcx_blog_pref_std": true, "dcx_blog_pref_plg": true, "dcx_blog_pref_adv": true }
  </script>
  <script src="js/toggles.js"></script>
  <script src="js/jquery/jquery-ui.custom.js"></script>
  <script src="js/jquery/jquery.ui.touch-punch.js"></script>
  <script type="application/json" id="dotclear_quickentry-data">
  { "post_published": 1, "post_pending": -2 }
  </script>
  <script src="js/_index.js"></script>
  <script type="application/json" id="dotclear_dragndrop-data">
  { "dragndrop_off": "L'ordonnancement par glisser-d\u00e9poser des zones du tableau de bord est d\u00e9sactiv\u00e9", "dragndrop_on": "L'ordonnancement par glisser-d\u00e9poser des zones du tableau de bord est activ\u00e9" }
  </script>
  <script type="application/json" id="legacy_editor-data">
  { "dialog_url": "popup.php", "base_url": "https://dc2-git.local", "switcher_visual_title": "visuel", "switcher_source_title": "source", "legend_msg": "Vous pouvez utiliser les raccourcis suivants pour formater votre texte.", "elements": { "blocks": { "title": "Format de bloc", "options": { "none": "-- aucun --", "nonebis": "-- format de bloc --", "p": "Paragraphe", "h1": "Ent\u00eate de niveau 1", "h2": "Ent\u00eate de niveau 2", "h3": "Ent\u00eate de niveau 3", "h4": "Ent\u00eate de niveau 4", "h5": "Ent\u00eate de niveau 5", "h6": "Ent\u00eate de niveau 6" } }, "strong": { "title": "Emphase forte" }, "em": { "title": "Emphase" }, "ins": { "title": "Ins\u00e9r\u00e9" }, "del": { "title": "Supprim\u00e9" }, "quote": { "title": "Citation en ligne" }, "code": { "title": "Code" }, "mark": { "title": "Marquer" }, "br": { "title": "Retour \u00e0 la ligne" }, "blockquote": { "title": "Bloc de citation" }, "pre": { "title": "Texte pr\u00e9format\u00e9" }, "ul": { "title": "Liste non ordonn\u00e9e" }, "ol": { "title": "Liste ordonn\u00e9e" }, "link": { "title": "Lien", "accesskey": "l", "href_prompt": "URL ?", "hreflang_prompt": "Langue ?" }, "img": { "title": "Image externe", "src_prompt": "URL ?" }, "img_select": { "title": "S\u00e9lecteur de m\u00e9dia", "accesskey": "m" }, "post_link": { "title": "Lien vers une publication" }, "removeFormat": { "title": "Retirer le formatage du texte" }, "preview": { "title": "Pr\u00e9visualiser" } }, "toolbar_bottom": false, "dynamic_height": true, "style": { "left": "media-left", "center": "media-center", "right": "media-right" }, "img_link_title": "Ouvrir le m\u00e9dia", "iframe_css": "body {\n    color: #000;\n    background: #f9f9f9;\n    margin: 0;\n    padding: 2px;\n    border: none;\n    \n}\ncode {\n    color: #666;\n    font-weight: bold;\n}\nbody \u003E p:first-child {\n    margin-top: 0;\n}" }
  </script>
  <link rel="stylesheet" href="index.php?pf=dcLegacyEditor/css/jsToolBar/jsToolBar.css" type="text/css" media="screen">
  <script src="index.php?pf=dcLegacyEditor/js/jsToolBar/jsToolBar.js"></script>
  <script src="index.php?pf=dcLegacyEditor/js/jsToolBar/jsToolBar.wysiwyg.js"></script>
  <script src="index.php?pf=dcLegacyEditor/js/jsToolBar/jsToolBar.dotclear.js"></script>
  <script src="index.php?pf=dcLegacyEditor/js/jsToolBar/jsToolBar.config.js"></script>
  <script type="application/json" id="legacy_editor_ctx-data">
  { "legacy_editor_context": "quickentry", "legacy_editor_syntax": "markdown", "legacy_editor_tags_context": { "quickentry": ["#post_content"] } }
  </script>
  <script src="index.php?pf=dcLegacyEditor/js/_post_editor.js"></script>
  <script type="application/json" id="md_options-data">
  { "style": { "class": true, "left": "media-left", "center": "media-center", "right": "media-right" }, "img_link_title": "Ouvrir le m\u00e9dia" }
  </script>
  <script type="application/json" id="md_editor-data">
  { "md_blocks": { "options": { "none": "-- aucun --", "nonebis": "-- format de bloc --", "p": "Paragraphe", "h1": "Ent\u00eate de niveau 1", "h2": "Ent\u00eate de niveau 2", "h3": "Ent\u00eate de niveau 3", "h4": "Ent\u00eate de niveau 4", "h5": "Ent\u00eate de niveau 5", "h6": "Ent\u00eate de niveau 6" } }, "md_strong": { "title": "Emphase forte", "icon": "index.php?pf=legacyMarkdown/img/bt_strong.svg" }, "md_em": { "title": "Emphase", "icon": "index.php?pf=legacyMarkdown/img/bt_em.svg" }, "md_ins": { "title": "Ins\u00e9r\u00e9", "icon": "index.php?pf=legacyMarkdown/img/bt_ins.svg" }, "md_del": { "title": "Supprim\u00e9", "icon": "index.php?pf=legacyMarkdown/img/bt_del.svg" }, "md_quote": { "title": "Citation en ligne", "icon": "index.php?pf=legacyMarkdown/img/bt_quote.svg", "cite_prompt": "URL source :", "lang_prompt": "Langue :" }, "md_code": { "title": "Code", "icon": "index.php?pf=legacyMarkdown/img/bt_code.svg" }, "md_mark": { "title": "Marquer", "icon": "index.php?pf=legacyMarkdown/img/bt_mark.svg" }, "md_foreign": { "title": "Locution \u00e9trang\u00e8re", "icon": "index.php?pf=legacyMarkdown/img/bt_foreign.svg", "lang_prompt": "Langue :" }, "md_br": { "title": "Passage \u00e0 la ligne", "icon": "index.php?pf=legacyMarkdown/img/bt_br.svg" }, "md_blockquote": { "title": "Bloc de citation", "icon": "index.php?pf=legacyMarkdown/img/bt_bquote.svg" }, "md_pre": { "title": "Texte pr\u00e9formatt\u00e9", "icon": "index.php?pf=legacyMarkdown/img/bt_pre.svg" }, "md_ul": { "title": "Liste non ordonn\u00e9e", "icon": "index.php?pf=legacyMarkdown/img/bt_ul.svg" }, "md_ol": { "title": "Liste ordonn\u00e9e", "icon": "index.php?pf=legacyMarkdown/img/bt_ol.svg" }, "md_details": { "title": "Bloc d\u00e9tails", "icon": "index.php?pf=legacyMarkdown/img/bt_details.svg", "title_prompt": "Titre :" }, "md_aside": { "title": "Bloc de c\u00f4t\u00e9", "icon": "index.php?pf=legacyMarkdown/img/bt_aside.svg" }, "md_link": { "title": "Lien", "icon": "index.php?pf=legacyMarkdown/img/bt_link.svg", "href_prompt": "URL :", "title_prompt": "Titre :", "lang_prompt": "Langue :" }, "md_img": { "title": "Image externe", "icon": "index.php?pf=legacyMarkdown/img/bt_img.svg", "src_prompt": "URL :", "title_prompt": "Titre (facultatif) :" }, "md_img_select": { "title": "S\u00e9lecteur de m\u00e9dia", "icon": "index.php?pf=legacyMarkdown/img/bt_img_select.svg", "open_url": "index.php?process=Media&popup=1&plugin_id=dcLegacyEditor", "disabled": false }, "md_post_link": { "title": "Liens vers une publication", "icon": "index.php?pf=legacyMarkdown/img/bt_post.svg", "open_url": "index.php?process=PostsPopup&plugin_id=dcLegacyEditor" }, "md_footnote": { "title": "Note de bas de page", "icon": "index.php?pf=legacyMarkdown/img/bt_footnote.svg" }, "md_preview": { "title": "Pr\u00e9visualiser", "icon": "index.php?pf=legacyMarkdown/img/bt_preview.svg" } }
  </script>
  <link rel="stylesheet" href="index.php?pf=legacyMarkdown/css/jsToolBar.css" type="text/css" media="screen">
  <script src="index.php?pf=legacyMarkdown/js/post.js"></script>
  <script type="application/json" id="mm_select-data">
  { "title": "Insertion multiple de m\u00e9dia", "icon": "index.php?pf=multipleMedia/icon.svg", "open_url": "index.php?process=Media&popup=1&plugin_id=dcLegacyEditor&select=2", "style": { "class": true, "left": "media-left", "center": "media-center", "right": "media-right" }, "img_link_title": "Ouvrir ce m\u00e9dia" }
  </script>
  <script src="index.php?pf=multipleMedia/js/legacy-post.js"></script>
  <script type="application/json" id="dc_editor_yash-data">
  { "title": "Coloration syntaxique", "icon": "index.php?pf=yash/icon.svg", "open_url": "index.php?process=Plugin&p=yash&popup=1" }
  </script>
  <script src="index.php?pf=yash/js/post.js"></script>
  <script type="application/json" id="hljs_editor-data">
  { "title": "Coloration syntaxique", "icon": "index.php?pf=hljs/icon.svg", "open_url": "index.php?process=Plugin&p=hljs&popup=1" }
  </script>
  <script src="index.php?pf=hljs/js/post.js"></script>
  <script type="application/json" id="dc_editor_extmedia-data">
  { "title": "M\u00e9dia externe", "icon": "index.php?pf=externalMedia/icon.svg", "open_url": "index.php?process=Plugin&p=externalMedia&popup=1", "style": { "class": true, "left": "media-left", "center": "media-center", "right": "media-right" } }
  </script>
  <script src="index.php?pf=externalMedia/js/post.js"></script>
  <script type="application/json" id="dc_editor_noembedmedia-data">
  { "title": "M\u00e9dia externe", "icon": "index.php?pf=noembedMedia/icon.svg", "open_url": "index.php?process=Plugin&p=noembedMedia&popup=1", "style": { "class": true, "left": "media-left", "center": "media-center", "right": "media-right" } }
  </script>
  <script src="index.php?pf=noembedMedia/js/post.js"></script>
  <script type="application/json" id="zenedit-data">
  { "msg": { "zenEdit": { "show": "Basculer dans le mode zen", "hide": "Sortir du mode zen" } }, "zenEdit": { "fullScreen": "0", "background": "dark/denim.png", "smallMargins": "1", "mode": 0, "icon": "index.php?pf=zenEdit/icon.svg", "base_url": "index.php?pf=zenEdit/img/background/" } }
  </script>
  <script src="index.php?pf=zenEdit/js/post.js"></script>
  <script type="application/json" id="maxedit-data">
  { "show": "Basculer en mode plein \u00e9cran", "hide": "Sortir du mode plein \u00e9cran", "context": "quickentry", "icon_on": "index.php?pf=maxEdit/img/max-on.svg", "icon_off": "index.php?pf=maxEdit/img/max-off.svg" }
  </script>
  <script src="index.php?pf=maxEdit/js/maxedit.js"></script>
  <script src="js/ads.js"></script>
  <script src="index.php?pf=antispam/js/dashboard.js"></script>
  <script src="index.php?pf=maintenance/js/dashboard.js"></script>
  <script type="application/json" id="dm_scheduled-data">
  { "dmScheduled_Monitor": true, "dmScheduled_Counter": true, "dmScheduled_Interval": 0 }
  </script>
  <script src="index.php?pf=dmScheduled/js/service.js"></script>
  <link rel="stylesheet" href="index.php?pf=dmScheduled/css/style.css" type="text/css" media="screen">
  <script type="application/json" id="dm_published-data">
  { "dmPublished_Monitor": true, "dmPublished_Interval": 0 }
  </script>
  <script src="index.php?pf=dmPublished/js/service.js"></script>
  <script type="application/json" id="dm_pending-data">
  { "dmPendingPosts_Counter": true, "dmPendingComments_Counter": true, "dmPending_Interval": 0 }
  </script>
  <script src="index.php?pf=dmPending/js/service.js"></script>
  <script src="index.php?pf=dmHelper/js/service.js"></script>
  <link rel="stylesheet" href="index.php?pf=dmHelper/css/style.css" type="text/css" media="screen">
  <script type="application/json" id="dm_lastcomments-data">
  { "dmLastComments_LastCommentId": "72814", "dmLastComments_AutoRefresh": true, "dmLastComments_Badge": true, "dmLastComments_LastCounter": 0, "dmLastComments_SpamCount": -1, "dmLastComments_Interval": 0 }
  </script>
  <script src="index.php?pf=dmLastComments/js/service.js"></script>
  <link rel="stylesheet" href="index.php?pf=dmLastComments/css/style.css" type="text/css" media="screen">
  <script type="application/json" id="dm_lastspams-data">
  { "dmLastSpams_LastSpamId": "72814", "dmLastSpams_AutoRefresh": true, "dmLastSpams_Badge": true, "dmLastSpams_LastCounter": 0, "dmLastSpams_SpamCount": -1, "dmLastSpams_Interval": 0 }
  </script>
  <script src="index.php?pf=dmLastSpams/js/service.js"></script>
  <link rel="stylesheet" href="index.php?pf=dmLastSpams/css/style.css" type="text/css" media="screen">
  <!-- Experimental (see https://daverupert.com/2023/05/getting-started-view-transitions/) -->
  <meta name="view-transition" content="same-origin" />
  <link rel="stylesheet" href="index.php?vf=plugins/tidyAdmin/admin.css" type="text/css" media="screen">
  <script src="index.php?vf=plugins/tidyAdmin/admin.js"></script>
  <script type="application/json" id="notify_me_config-data">
  { "title": "Dotclear : Open Eyes", "wait": false }
  </script>
  <script src="index.php?pf=notifyMe/js/notify.js"></script>
  <script src="index.php?pf=notifyMe/js/queue.js"></script>
  <script type="application/json" id="notify_me_comments-data">
  { "check": 30000, "id": "72786" }
  </script>
  <script src="index.php?pf=notifyMe/js/common.js"></script>
  <script type="application/json" id="debug_config-data">
  { "notify": false, "title": "DEBUG", "wait": false, "module": "index.php?pf=notifyMe/js/notify.mjs" }
  </script>
  <script type="module" src="index.php?pf=debug/js/module.mjs"></script>
  <script type="application/json" id="dm_hostingmonitor-data">
  { "dmHostingMonitor_Ping": true, "dmHostingMonitor_Offline": "Serveur hors-ligne", "dmHostingMonitor_Online": "Serveur en ligne", "dmHostingMonitor_Interval": 0 }
  </script>
  <script src="index.php?pf=dmHostingMonitor/js/service.js"></script>
</head>

Et même s’il ne paraît pas bien trié, les éléments les plus prioritaires sont tout de même au début, et la majeure partie est composée de scripts (javascript ou application/json) et de styles (CSS).

Un pis-aller serait de reprendre ma dernière idée (composition différenciée pour le code tiers) et d’avoir des behaviors pour ajouter des éléments script (javascript, module ou pas) qui viendront en premier, puis les éléments style qui viendront ensuite, puis les éléments script (application/json), et enfin le reste.

Ça devrait normalement suffire, quitte à mettre en dernier les ajouts des plugins et thèmes qui n’utiliseront pas encore ces nouveaux behaviors.

Cela dit il faudra y aller avec prudence parce que l’ordre de certains éléments, surtout pour du code javascript ancien, peut avoir son importance.

Une autre option est de dire que ça fonctionne très bien comme ça et qu’on devrait se préoccuper d’autre chose… ;-)

Ajouter un commentaire

Les champs suivis d'un * sont obligatoires

Les commentaires peuvent être formatés en utilisant la syntaxe Markdown Extra.

Ajouter un rétrolien

URL de rétrolien : https://open-time.net/trackback/16028

Haut de page