From b469f42f73e98e2135538a2d948250bbb8242baf Mon Sep 17 00:00:00 2001 From: where where Date: Sat, 14 Mar 2026 17:41:30 +0800 Subject: [PATCH 1/8] Add options for next_vendors --- scripts/helpers/engine.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/scripts/helpers/engine.js b/scripts/helpers/engine.js index 6b2f703ac..8d150fa9a 100644 --- a/scripts/helpers/engine.js +++ b/scripts/helpers/engine.js @@ -19,7 +19,9 @@ hexo.extend.helper.register('next_inject', function(point) { hexo.extend.helper.register('next_js', function(file, { pjax = false, - module = false + module = false, + defer = true, + async = false } = {}) { const { next_version } = this; const { internal, custom_cdn_url } = this.theme.vendors; @@ -32,18 +34,21 @@ hexo.extend.helper.register('next_js', function(file, { custom : custom_cdn_url }); const src = links[internal] || links.local; - return ``; + return ``; }); -hexo.extend.helper.register('next_vendors', function(name) { +hexo.extend.helper.register('next_vendors', function(name, { + defer = false, + async = false +} = {}) { const { url, integrity } = this.theme.vendors[name]; const type = url.endsWith('css') ? 'css' : 'js'; if (type === 'css') { if (integrity) return ``; return ``; } - if (integrity) return ``; - return ``; + if (integrity) return ``; + return ``; }); hexo.extend.helper.register('next_data', function(name, ...data) { From 679b07fe5d4b8c6db8a91793592df1f3f965548c Mon Sep 17 00:00:00 2001 From: where where Date: Sat, 14 Mar 2026 17:55:45 +0800 Subject: [PATCH 2/8] Set all defer manually --- layout/_scripts/index.njk | 12 ++++++------ layout/_third-party/addtoany.njk | 2 +- layout/_third-party/chat/chatra.njk | 2 +- layout/_third-party/chat/tidio.njk | 2 +- layout/_third-party/fancybox.njk | 2 +- layout/_third-party/pace.njk | 2 +- layout/_third-party/search/algolia-search.njk | 5 ++--- layout/_third-party/search/localsearch.njk | 4 ++-- layout/_third-party/statistics/firestore.njk | 6 +++--- layout/_third-party/statistics/lean-analytics.njk | 2 +- layout/_third-party/tags/mermaid.njk | 2 +- layout/_third-party/tags/pdf.njk | 2 +- layout/_third-party/tags/wavedrom.njk | 2 +- scripts/helpers/engine.js | 2 +- 14 files changed, 23 insertions(+), 24 deletions(-) diff --git a/layout/_scripts/index.njk b/layout/_scripts/index.njk index 33212bb1b..c98baa72c 100644 --- a/layout/_scripts/index.njk +++ b/layout/_scripts/index.njk @@ -1,22 +1,22 @@ {%- include 'vendors.njk' -%} {%- if theme.injects.comment.length > 1 %} - {{- next_js('comments.js') }} + {{- next_js('comments.js', { defer: true }) }} {%- endif %} {{- next_js('utils.js') }} {%- if theme.motion.enable %} - {{- next_js('motion.js') }} + {{- next_js('motion.js', { defer: true }) }} {%- endif %} {%- if theme.sidebar.display !== 'remove' %} - {{- next_js('sidebar.js') }} + {{- next_js('sidebar.js', { defer: true }) }} {%- endif %} -{{- next_js('next-boot.js') }} +{{- next_js('next-boot.js', { defer: true }) }} {%- if theme.bookmark.enable %} - {{- next_js('bookmark.js') }} + {{- next_js('bookmark.js', { defer: true }) }} {%- endif %} {%- if theme.pjax %} - {{- next_js('pjax.js') }} + {{- next_js('pjax.js', { defer: true }) }} {%- endif %} diff --git a/layout/_third-party/addtoany.njk b/layout/_third-party/addtoany.njk index cbfa521e6..542eff221 100644 --- a/layout/_third-party/addtoany.njk +++ b/layout/_third-party/addtoany.njk @@ -1,3 +1,3 @@ {%- if theme.addtoany.enable %} - {{ next_js('third-party/addtoany.js') }} + {{ next_js('third-party/addtoany.js', { defer: true }) }} {%- endif %} diff --git a/layout/_third-party/chat/chatra.njk b/layout/_third-party/chat/chatra.njk index c0ebd1269..787e3f1be 100644 --- a/layout/_third-party/chat/chatra.njk +++ b/layout/_third-party/chat/chatra.njk @@ -1,3 +1,3 @@ {{ next_data('chatra', theme.chatra) }} -{{ next_js('third-party/chat/chatra.js') }} +{{ next_js('third-party/chat/chatra.js', { defer: true }) }} diff --git a/layout/_third-party/chat/tidio.njk b/layout/_third-party/chat/tidio.njk index 8b222cfdf..cb3505409 100644 --- a/layout/_third-party/chat/tidio.njk +++ b/layout/_third-party/chat/tidio.njk @@ -1,2 +1,2 @@ -{{ next_js('third-party/chat/tidio.js') }} +{{ next_js('third-party/chat/tidio.js', { defer: true }) }} diff --git a/layout/_third-party/fancybox.njk b/layout/_third-party/fancybox.njk index a42c37485..b3e2096f4 100644 --- a/layout/_third-party/fancybox.njk +++ b/layout/_third-party/fancybox.njk @@ -1,3 +1,3 @@ {%- if theme.fancybox %} - {{ next_js('third-party/fancybox.js') }} + {{ next_js('third-party/fancybox.js', { defer: true }) }} {%- endif %} diff --git a/layout/_third-party/pace.njk b/layout/_third-party/pace.njk index ffbadcd46..906605f66 100644 --- a/layout/_third-party/pace.njk +++ b/layout/_third-party/pace.njk @@ -1,3 +1,3 @@ {%- if theme.pace.enable %} - {{ next_js('third-party/pace.js') }} + {{ next_js('third-party/pace.js', { defer: true }) }} {%- endif %} diff --git a/layout/_third-party/search/algolia-search.njk b/layout/_third-party/search/algolia-search.njk index 6ab729ce1..32eaf09d7 100644 --- a/layout/_third-party/search/algolia-search.njk +++ b/layout/_third-party/search/algolia-search.njk @@ -1,3 +1,2 @@ -{{ next_vendors('algolia_search') }} - -{{- next_js('third-party/search/algolia-search.js') }} +{{ next_vendors('algolia_search', { async: true }) }} +{{- next_js('third-party/search/algolia-search.js', { defer: true }) }} diff --git a/layout/_third-party/search/localsearch.njk b/layout/_third-party/search/localsearch.njk index 8a8d52723..7485d33de 100644 --- a/layout/_third-party/search/localsearch.njk +++ b/layout/_third-party/search/localsearch.njk @@ -1,2 +1,2 @@ -{{ next_vendors('local_search') }} -{{ next_js('third-party/search/local-search.js') }} +{{ next_vendors('local_search', { async: true }) }} +{{ next_js('third-party/search/local-search.js', { defer: true }) }} diff --git a/layout/_third-party/statistics/firestore.njk b/layout/_third-party/statistics/firestore.njk index 2bc37a11e..f307d19a4 100644 --- a/layout/_third-party/statistics/firestore.njk +++ b/layout/_third-party/statistics/firestore.njk @@ -1,6 +1,6 @@ {%- if theme.firestore.enable %} - {{ next_vendors('firebase_app') }} - {{ next_vendors('firebase_firestore') }} + {{ next_vendors('firebase_app', { async: true }) }} + {{ next_vendors('firebase_firestore', { async: true }) }} {{ next_data('firestore', theme.firestore) }} - {{ next_js('third-party/statistics/firestore.js') }} + {{ next_js('third-party/statistics/firestore.js', { defer: true }) }} {%- endif %} diff --git a/layout/_third-party/statistics/lean-analytics.njk b/layout/_third-party/statistics/lean-analytics.njk index d3171c47e..d8e3fb23a 100644 --- a/layout/_third-party/statistics/lean-analytics.njk +++ b/layout/_third-party/statistics/lean-analytics.njk @@ -1,4 +1,4 @@ {%- if theme.leancloud_visitors.enable %} {{ next_data('leancloud_visitors', theme.leancloud_visitors) }} - {{ next_js('third-party/statistics/lean-analytics.js') }} + {{ next_js('third-party/statistics/lean-analytics.js', { defer: true }) }} {%- endif %} diff --git a/layout/_third-party/tags/mermaid.njk b/layout/_third-party/tags/mermaid.njk index 1487cb7fb..f83472cfe 100644 --- a/layout/_third-party/tags/mermaid.njk +++ b/layout/_third-party/tags/mermaid.njk @@ -2,5 +2,5 @@ {{ next_data('mermaid', theme.mermaid, { js: theme.vendors.mermaid }) }} - {{ next_js('third-party/tags/mermaid.js') }} + {{ next_js('third-party/tags/mermaid.js', { defer: true }) }} {%- endif %} diff --git a/layout/_third-party/tags/pdf.njk b/layout/_third-party/tags/pdf.njk index d86927cd2..9038b57fe 100644 --- a/layout/_third-party/tags/pdf.njk +++ b/layout/_third-party/tags/pdf.njk @@ -3,5 +3,5 @@ object_url: theme.vendors.pdfobject, url: url_for('lib/pdf/web/viewer.html') }) }} - {{ next_js('third-party/tags/pdf.js') }} + {{ next_js('third-party/tags/pdf.js', { defer: true }) }} {%- endif %} diff --git a/layout/_third-party/tags/wavedrom.njk b/layout/_third-party/tags/wavedrom.njk index 1ff9f4681..058f57afe 100644 --- a/layout/_third-party/tags/wavedrom.njk +++ b/layout/_third-party/tags/wavedrom.njk @@ -5,5 +5,5 @@ {{ next_data('wavedrom_skin', theme.wavedrom, { js: theme.vendors.wavedrom_skin }) }} - {{ next_js('third-party/tags/wavedrom.js') }} + {{ next_js('third-party/tags/wavedrom.js', { defer: true }) }} {%- endif %} diff --git a/scripts/helpers/engine.js b/scripts/helpers/engine.js index 8d150fa9a..a1b5f99df 100644 --- a/scripts/helpers/engine.js +++ b/scripts/helpers/engine.js @@ -20,7 +20,7 @@ hexo.extend.helper.register('next_inject', function(point) { hexo.extend.helper.register('next_js', function(file, { pjax = false, module = false, - defer = true, + defer = false, async = false } = {}) { const { next_version } = this; From d38bdb5abe19067f3cc37cde9d5ab36f2625f5a4 Mon Sep 17 00:00:00 2001 From: where where Date: Sat, 14 Mar 2026 18:52:35 +0800 Subject: [PATCH 3/8] Treat every script load by next_js as user scripts config.js may used by users so treat it as dependence comments.js utils.js motion.js sidebar.js next-boot.js bookmark.js pjax.js should load by order --- layout/_partials/comments.njk | 2 +- layout/_partials/page/schedule.njk | 2 +- layout/_scripts/index.njk | 2 +- layout/_third-party/analytics/baidu-analytics.njk | 2 +- layout/_third-party/analytics/google-analytics.njk | 2 +- layout/_third-party/analytics/growingio.njk | 2 +- layout/_third-party/analytics/matomo.njk | 2 +- layout/_third-party/comments/changyan.njk | 2 +- layout/_third-party/comments/disqus.njk | 2 +- layout/_third-party/comments/disqusjs.njk | 2 +- layout/_third-party/comments/gitalk.njk | 2 +- layout/_third-party/comments/isso.njk | 2 +- layout/_third-party/comments/livere.njk | 2 +- layout/_third-party/comments/utterances.njk | 2 +- layout/_third-party/math/katex.njk | 2 +- layout/_third-party/math/mathjax.njk | 2 +- layout/_third-party/quicklink.njk | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/layout/_partials/comments.njk b/layout/_partials/comments.njk index b9cf3adc1..44bc8c2d0 100644 --- a/layout/_partials/comments.njk +++ b/layout/_partials/comments.njk @@ -14,7 +14,7 @@ {{ partial(inject_item.layout, inject_item.locals, inject_item.options) }} {%- endfor %} - {{- next_js('comments-buttons.js', { pjax: true }) }} + {{- next_js('comments-buttons.js', { pjax: true, async: true }) }} {%- elif theme.comments.style == 'tabs' %}