hexo NexT custom js
想要把自己的 js 檔嵌入自己的 hexo blog 使用,其方法有二
一、利用 custom_file_path 項目
你去看 \themes\hexo-theme-next\scripts\events\lib\injects-point.js 裡的內容如下,
'use strict'; module.exports = { views: [ 'head', 'header', 'sidebar', 'postMeta', 'postBodyEnd', 'footer', 'bodyEnd', 'comment' ], styles: [ 'variable', 'mixin', 'style' ] };
會發現有好幾個注入點,其對應到 \themes\hexo-theme-next\_config.yml,裡的 custom_file_path 項目
# Define custom file paths. # Create your custom files in site directory `source/_data` and uncomment needed files below. custom_file_path: #head: source/_data/head.swig #header: source/_data/header.swig #sidebar: source/_data/sidebar.swig #postMeta: source/_data/post-meta.swig #postBodyEnd: source/_data/post-body-end.swig #footer: source/_data/footer.swig #bodyEnd: source/_data/body-end.swig #variable: source/_data/variables.styl #mixin: source/_data/mixins.styl #style: source/_data/styles.styl
其各個注入點預設是被註解起來。
假設我有一個名為 hello.swig 檔,其內容如下
<script> (function () { console.log("Hello world!!!"); } )(); </script>
我想將該 hello.swig 檔放在網站內被執行,要如何做呢?
1、將 hello.swig 檔放在 root site directory 裡的 \source\_data 路徑。
2、然後再到 \themes\hexo-theme-next\_config.yml,裡的 custom_file_path 項目,
例如我想要將 hello.swig 檔注入 bodyEnd 區段,則修改如下
# Define custom file paths. # Create your custom files in site directory `source/_data` and uncomment needed files below. custom_file_path: #head: source/_data/head.swig #header: source/_data/header.swig #sidebar: source/_data/sidebar.swig #postMeta: source/_data/post-meta.swig #postBodyEnd: source/_data/post-body-end.swig #footer: source/_data/footer.swig bodyEnd: source/_data/hello.swig #variable: source/_data/variables.styl #mixin: source/_data/mixins.styl #style: source/_data/styles.styl
3、接下來就是重編譯、部署即可。
二、
你去看 \themes\hexo-theme-next\scripts\filters\default-injects.js 裡的內容如下,
/* global hexo */ 'use strict'; const points = require('../events/lib/injects-point'); hexo.extend.filter.register('theme_inject', injects => { let filePath = hexo.theme.config.custom_file_path; if (!filePath) return; points.views.forEach(key => { if (filePath[key]) { injects[key].file('custom', filePath[key]); } }); points.styles.forEach(key => { if (filePath[key]) { injects[key].push(filePath[key]); } }); }, 99);
這是實作把 \themes\hexo-theme-next\_config.yml,裡的 custom_file_path 路徑的內容,
將其注入到 injects-point.js 裡所列的注入點裡面。
那我們要做的是去改動 default-injects.js 裡的內容,
插入一段用來「注入某區段,我們客制的 script」的程式,有兩種方式可做到:
1、injects.bodyEnd.raw()
/* global hexo */ 'use strict'; const points = require('../events/lib/injects-point'); hexo.extend.filter.register('theme_inject', injects => { injects.bodyEnd.raw('hello.swig','<script>(function () {console.log("Hello world!!!");})();</script>'); let filePath = hexo.theme.config.custom_file_path; if (!filePath) return; points.views.forEach(key => { if (filePath[key]) { injects[key].file('custom', filePath[key]); } }); points.styles.forEach(key => { if (filePath[key]) { injects[key].push(filePath[key]); } }); }, 99);
接下來就是重編譯、部署即可。
2、injects.bodyEnd.file()
我們之前有做了一個 hello.swig 檔,
也是一樣將 hello.swig 檔放在 root site directory 裡的 \source\_data 路徑,
然後在 default-injects.js 裡改動的內容如下
/* global hexo */ 'use strict'; const points = require('../events/lib/injects-point'); hexo.extend.filter.register('theme_inject', injects => { injects.bodyEnd.file('hello.swig', 'source/_data/hello.swig'); let filePath = hexo.theme.config.custom_file_path; if (!filePath) return; points.views.forEach(key => { if (filePath[key]) { injects[key].file('custom', filePath[key]); } }); points.styles.forEach(key => { if (filePath[key]) { injects[key].push(filePath[key]); } }); }, 99);
接下來就是重編譯、部署即可。
參考資料: