diff --git a/layout/_partials/comments.njk b/layout/_partials/comments.njk index b9cf3adc1e..44bc8c2d03 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' %}
diff --git a/layout/_partials/head/head.njk b/layout/_partials/head/head.njk index fabf711a00..6fff6c3933 100644 --- a/layout/_partials/head/head.njk +++ b/layout/_partials/head/head.njk @@ -48,7 +48,7 @@ {{ next_font() }} -{{ next_vendors('fontawesome') }} +{{ next_vendors('fontawesome', { async: true }) }} {%- if theme.motion.enable %} {{ next_vendors('animate_css') }} @@ -60,7 +60,7 @@ {%- if theme.pace.enable %} {{ next_vendors('pace_css') }} - {{ next_vendors('pace_js') }} + {{ next_vendors('pace_js', { async: true }) }} {%- endif %} {{ next_data('main', next_config()) }} diff --git a/layout/_partials/page/schedule.njk b/layout/_partials/page/schedule.njk index 9deaec163f..d97e5ea3b0 100644 --- a/layout/_partials/page/schedule.njk +++ b/layout/_partials/page/schedule.njk @@ -1,3 +1,3 @@
-{{- next_js('schedule.js', { pjax: true }) }}
+{{- next_js('schedule.js', { pjax: true, async: true }) }}
diff --git a/layout/_scripts/index.njk b/layout/_scripts/index.njk
index 33212bb1bf..7a1a4ec6b1 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') }}
+{{- next_js('utils.js', { defer: true }) }}
{%- 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/_scripts/vendors.njk b/layout/_scripts/vendors.njk
index ed5e147e3b..2b415efb9f 100644
--- a/layout/_scripts/vendors.njk
+++ b/layout/_scripts/vendors.njk
@@ -2,6 +2,6 @@
{%- endif %}
-{%- for name in js_vendors() %}
- {{ next_vendors(name) }}
+{%- for name, options in js_vendors() %}
+ {{ next_vendors(name, options) }}
{%- endfor %}
diff --git a/layout/_third-party/addtoany.njk b/layout/_third-party/addtoany.njk
index cbfa521e64..542eff2215 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/analytics/baidu-analytics.njk b/layout/_third-party/analytics/baidu-analytics.njk
index 2e1e42926c..d7f8db88b8 100644
--- a/layout/_third-party/analytics/baidu-analytics.njk
+++ b/layout/_third-party/analytics/baidu-analytics.njk
@@ -1,4 +1,4 @@
{%- if theme.baidu_analytics %}
- {{ next_js('third-party/analytics/baidu-analytics.js') }}
+ {{ next_js('third-party/analytics/baidu-analytics.js', { async: true }) }}
{%- endif %}
diff --git a/layout/_third-party/analytics/google-analytics.njk b/layout/_third-party/analytics/google-analytics.njk
index b0ffd9c78a..816ee3e8b9 100644
--- a/layout/_third-party/analytics/google-analytics.njk
+++ b/layout/_third-party/analytics/google-analytics.njk
@@ -3,5 +3,5 @@
{%- endif %}
{{ next_data('google_analytics', theme.google_analytics) }}
- {{ next_js('third-party/analytics/google-analytics.js') }}
+ {{ next_js('third-party/analytics/google-analytics.js', { async: true }) }}
{%- endif %}
diff --git a/layout/_third-party/analytics/growingio.njk b/layout/_third-party/analytics/growingio.njk
index 0c0c496bcc..ce105f9562 100644
--- a/layout/_third-party/analytics/growingio.njk
+++ b/layout/_third-party/analytics/growingio.njk
@@ -1,5 +1,5 @@
{%- if theme.growingio_analytics %}
{{ next_data('growingio_analytics', theme.growingio_analytics) }}
- {{ next_js('third-party/analytics/growingio.js') }}
+ {{ next_js('third-party/analytics/growingio.js', { async: true }) }}
{%- endif %}
diff --git a/layout/_third-party/analytics/matomo.njk b/layout/_third-party/analytics/matomo.njk
index ed64d1141a..fa3909ff7d 100644
--- a/layout/_third-party/analytics/matomo.njk
+++ b/layout/_third-party/analytics/matomo.njk
@@ -1,4 +1,4 @@
{%- if theme.matomo.enable %}
{{ next_data('matomo', theme.matomo) }}
- {{ next_js('third-party/analytics/matomo.js') }}
+ {{ next_js('third-party/analytics/matomo.js', { async: true }) }}
{%- endif %}
diff --git a/layout/_third-party/chat/chatra.njk b/layout/_third-party/chat/chatra.njk
index c0ebd1269a..787e3f1be0 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 8b222cfdf1..cb35054093 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/comments/changyan.njk b/layout/_third-party/comments/changyan.njk
index 677c45aafd..81b2bd78ac 100644
--- a/layout/_third-party/comments/changyan.njk
+++ b/layout/_third-party/comments/changyan.njk
@@ -1,2 +1,2 @@
{{ next_data('changyan', theme.changyan) }}
-{{ next_js('third-party/comments/changyan.js') }}
+{{ next_js('third-party/comments/changyan.js', { defer: true }) }}
diff --git a/layout/_third-party/comments/disqus.njk b/layout/_third-party/comments/disqus.njk
index 3876f003f1..67040a852f 100644
--- a/layout/_third-party/comments/disqus.njk
+++ b/layout/_third-party/comments/disqus.njk
@@ -3,4 +3,4 @@
disqus: __('disqus')
}
}) }}
-{{ next_js('third-party/comments/disqus.js') }}
+{{ next_js('third-party/comments/disqus.js', { defer: true }) }}
diff --git a/layout/_third-party/comments/disqusjs.njk b/layout/_third-party/comments/disqusjs.njk
index d15e2b3796..ab531900d7 100644
--- a/layout/_third-party/comments/disqusjs.njk
+++ b/layout/_third-party/comments/disqusjs.njk
@@ -3,4 +3,4 @@
{{ next_data('disqusjs', theme.disqusjs, {
js: theme.vendors.disqusjs_js
}) }}
-{{ next_js('third-party/comments/disqusjs.js') }}
+{{ next_js('third-party/comments/disqusjs.js', { defer: true }) }}
diff --git a/layout/_third-party/comments/gitalk.njk b/layout/_third-party/comments/gitalk.njk
index d1cee1d0ae..c921867528 100644
--- a/layout/_third-party/comments/gitalk.njk
+++ b/layout/_third-party/comments/gitalk.njk
@@ -4,4 +4,4 @@
js: theme.vendors.gitalk_js,
path_md5: gitalk_md5(page.path)
}) }}
-{{ next_js('third-party/comments/gitalk.js') }}
+{{ next_js('third-party/comments/gitalk.js', { defer: true }) }}
diff --git a/layout/_third-party/comments/isso.njk b/layout/_third-party/comments/isso.njk
index 86e86b525d..c7c34078f8 100644
--- a/layout/_third-party/comments/isso.njk
+++ b/layout/_third-party/comments/isso.njk
@@ -1,2 +1,2 @@
{{ next_data('isso', theme.isso) }}
-{{ next_js('third-party/comments/isso.js') }}
+{{ next_js('third-party/comments/isso.js', { defer: true }) }}
diff --git a/layout/_third-party/comments/livere.njk b/layout/_third-party/comments/livere.njk
index 331535b4f7..c575211a01 100644
--- a/layout/_third-party/comments/livere.njk
+++ b/layout/_third-party/comments/livere.njk
@@ -1 +1 @@
-{{ next_js('third-party/comments/livere.js') }}
+{{ next_js('third-party/comments/livere.js', { defer: true }) }}
diff --git a/layout/_third-party/comments/utterances.njk b/layout/_third-party/comments/utterances.njk
index b3656ffcd3..3bb6763208 100644
--- a/layout/_third-party/comments/utterances.njk
+++ b/layout/_third-party/comments/utterances.njk
@@ -1,2 +1,2 @@
{{ next_data('utterances', theme.utterances) }}
-{{ next_js('third-party/comments/utterances.js') }}
+{{ next_js('third-party/comments/utterances.js', { defer: true }) }}
diff --git a/layout/_third-party/fancybox.njk b/layout/_third-party/fancybox.njk
index a42c374852..b3e2096f4b 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/math/katex.njk b/layout/_third-party/math/katex.njk
index 62a64c2c9f..064f7a2676 100644
--- a/layout/_third-party/math/katex.njk
+++ b/layout/_third-party/math/katex.njk
@@ -1,7 +1,7 @@
-{{ next_vendors('katex') }}
+{{ next_vendors('katex', { defer: true }) }}
{%- if theme.math.katex.copy_tex %}
{{ next_data('katex', {
copy_tex_js: theme.vendors.copy_tex_js
}) }}
- {{ next_js('third-party/math/katex.js') }}
+ {{ next_js('third-party/math/katex.js', { defer: true }) }}
{%- endif %}
diff --git a/layout/_third-party/math/mathjax.njk b/layout/_third-party/math/mathjax.njk
index a20bb8beb1..4894cda878 100644
--- a/layout/_third-party/math/mathjax.njk
+++ b/layout/_third-party/math/mathjax.njk
@@ -1,4 +1,4 @@
{{ next_data('mathjax', theme.math.mathjax, {
js: theme.vendors.mathjax
}) }}
-{{ next_js('third-party/math/mathjax.js') }}
+{{ next_js('third-party/math/mathjax.js', { defer: true }) }}
diff --git a/layout/_third-party/pace.njk b/layout/_third-party/pace.njk
index ffbadcd465..906605f661 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/quicklink.njk b/layout/_third-party/quicklink.njk
index e027a982e5..4e2f74943d 100644
--- a/layout/_third-party/quicklink.njk
+++ b/layout/_third-party/quicklink.njk
@@ -1,7 +1,7 @@
{%- if theme.quicklink.enable %}
- {{ next_vendors('quicklink') }}
+ {{ next_vendors('quicklink', { defer: true }) }}
{{ next_data('quicklink', page.quicklink, {
url: url | replace(r/index\.html$/, '')
}) }}
- {{ next_js('third-party/quicklink.js') }}
+ {{ next_js('third-party/quicklink.js', { defer: true }) }}
{%- endif %}
diff --git a/layout/_third-party/search/algolia-search.njk b/layout/_third-party/search/algolia-search.njk
index 6ab729ce1a..71f2a9a38c 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', { defer: 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 8a8d527238..b9c3eef7db 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', { defer: 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 2bc37a11e0..e408a733c6 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', { defer: true }) }}
+ {{ next_vendors('firebase_firestore', { defer: 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 d3171c47e1..d8e3fb23ae 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 1487cb7fbc..f83472cfe5 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 d86927cd2f..9038b57fe3 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 1ff9f46813..058f57afe2 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 6b2f703ac4..65a02f7241 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 = false,
+ async = false
} = {}) {
const { next_version } = this;
const { internal, custom_cdn_url } = this.theme.vendors;
@@ -32,18 +34,29 @@ hexo.extend.helper.register('next_js', function(file, {
custom : custom_cdn_url
});
const src = links[internal] || links.local;
- return ``;
+ if (defer && async) {
+ hexo.log.warn('Both `defer` and `async` are set to true for', file, 'in next_js helper. `defer` will be ignored.');
+ defer = false;
+ }
+ 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 (defer && async) {
+ hexo.log.warn('Both `defer` and `async` are set to true for', name, 'in next_vendors helper. `defer` will be ignored.');
+ defer = false;
+ }
+ if (integrity) return ``;
+ return ``;
});
hexo.extend.helper.register('next_data', function(name, ...data) {
diff --git a/scripts/helpers/next-vendors.js b/scripts/helpers/next-vendors.js
index 0c06549303..c862777017 100644
--- a/scripts/helpers/next-vendors.js
+++ b/scripts/helpers/next-vendors.js
@@ -4,27 +4,28 @@
hexo.extend.helper.register('js_vendors', function() {
const { config, theme } = this;
- const vendors = ['anime'];
+ const vendors = { anime: {} };
if (theme.prism.enable && !config.prismjs.preprocess) {
- vendors.push('prism', 'prism_autoloader');
+ vendors.prism = {};
+ vendors.prism_autoloader = {};
if (config.prismjs.line_number) {
- vendors.push('prism_line_numbers');
+ vendors.prism_line_numbers = {};
}
}
if (theme.pjax) {
- vendors.push('pjax');
+ vendors.pjax = { defer: true };
}
if (theme.fancybox) {
- vendors.push('fancybox_js');
+ vendors.fancybox_js = {};
}
if (theme.mediumzoom) {
- vendors.push('mediumzoom');
+ vendors.mediumzoom = {};
}
if (theme.lazyload) {
- vendors.push('lazyload');
+ vendors.lazyload = { defer: true };
}
if (theme.pangu) {
- vendors.push('pangu');
+ vendors.pangu = {};
}
return vendors;
});