本文適合許多發現 Ghost (https://ghost.org/docs/themes/helpers/) 提供的標準助手不夠的開發人員和主題創作者。尋找方法來擴展使用 Ghost 提供的 Handlebars 的主題的功能是完全正常的。在發表這篇文章並找到適合我的主題的解決方案之前,我搜尋了整個網路並親自對 Ghost 的原始程式碼進行了分析。
方法一(修改核心程式碼)
我發現可以使用額外的幫助程式來擴充 Ghost 的原始碼。我透過在 current/core/frontend/apps 中新增目錄來實現這一點。我使用了一個名為 amp 的現有「應用程式」的範例,其程式碼非常簡單,開始建立主題中可用的新助理。在這些現有的應用程式中,結構很簡單,因為助手在 lib/helpers 中註冊。在此過程的最後,您需要將 apps 中的目錄名稱新增至 apps.internal JSON 部分的 current/core/shared/config/overrides.json 中。
我們應用程式中的index.js 檔案的範例內容如下:
const path = require('path'); module.exports = { activate: function activate(ghost) { ghost.helperService.registerDir(path.resolve(__dirname, './lib/helpers')); } };
接下來,在此應用程式的 lib 目錄中,我們建立一個名為 helpers 的資料夾。在裡面,我們建立一個新文件,它將是要在 Handlebars 範本中呼叫的助手的名稱。例如,我們將其命名為 uppercase.js。
下面是此類助理程式碼的範例,它只是將助手參數中給定文字的字母轉換為大寫:
const {SafeString, escapeExpression} = require('../../../../services/handlebars'); module.exports = function uppercase(text) { return `${text.toUpperCase()}`; };
不要忘記將應用程式目錄的名稱加入 current/core/shared/config/overrides.json 中。重新啟動 Ghost 後,一切都應該準備就緒。
方法二(不修改核心程式碼)
我最近開發了這個方法,您不僅可以將其套用到自架 Ghost,還可以套用到主機供應商提供的 Ghost 執行個體。在後一種情況下,需要適當的架構規劃並購買一台小型伺服器來充當最終 Ghost 實例的代理。
我們將在此方法中使用的架構:
Nginx 伺服器 ← Node.js 中間件 ← Ghost 實例
使用者的瀏覽器向Nginx伺服器發送請求,Nginx伺服器包含中間件的上游。所有請求,無論位於何處,都將被代理到中間件。
中間件是一個在 Node.js 中運行的 Express 伺服器,增加了express-http-proxy (https://github.com/villadora/express-http-proxy) 庫,這顯著簡化了工作。我們配置代理來與 Ghost 實例通訊。 express-http-proxy 庫有一個 userResDecorator 屬性,我們可以使用它來「裝飾代理伺服器的回應」。簡單來說,我們可以在將 Ghost 的回應傳送到使用者的瀏覽器之前對其進行修改。
我們的 userResDecorator 將是非同步的,以免阻塞主執行緒。創建助手時我們將回到非同步處理的主題。目前,您需要知道並非使用者瀏覽器要求的所有內容都需要進行修飾。因此,第一步是檢查 Ghost 回應的內容類型標頭。您可以如下進行操作,然後比較是否為 text/html,僅裝飾傳回給使用者的 HTML 文件:
const path = require('path'); module.exports = { activate: function activate(ghost) { ghost.helperService.registerDir(path.resolve(__dirname, './lib/helpers')); } };
在這個條件語句中,我們可以開始修改htmlContent,但是為什麼我們需要它呢?讓我們先為 Ghost 主題中的自訂助手建立基礎!
在本文中,我將在主題的 index.hbs 檔案(首頁)中建立一個自訂助手。在 Handlebars 模板的可見位置,我新增了一個範例自訂助手,將其命名為 {{hello_world}}。
⚠️ 然後,我將其放在主頁上的可見位置 - 但請注意當我刷新 Ghost 頁面時會發生什麼!
const {SafeString, escapeExpression} = require('../../../../services/handlebars'); module.exports = function uppercase(text) { return `${text.toUpperCase()}`; };
在此變數中,我們將 Ghost 實例的回應作為頁面的完整 HTML。假設此回應是您的 Ghost 實例的主頁。 HTML 內容還將包括我們的純文字 {{hello_world}},它顯示為純文字。如果我們的自訂助手採用這種形式,我們可以在中間件中使用 Handlebars.js (https://handlebarsjs.com/) 來編譯它。請記住首先透過套件管理器安裝該庫,例如 npm:npm install handbars 並將其添加到您的程式碼中:const handbars = require("handlebars");。
// Where 'proxyRes' is your proxy response inside 'userResDecorator' const contentType = proxyRes.headers['content-type'] || ''; if (!contentType.includes('text/html')) { // Return original content if response is not 'text/html' return proxyResData; } let htmlContent = proxyResData.toString('utf8'); // Do something with 'htmlContent' and return return htmlContent;
哇!我們現在已經使用 Handlebars.js 編譯並渲染了 HTML——但我們還沒有完成。我們仍然需要註冊我們的自訂助手 {{hello_world}}。加入以下程式碼,最好在初始化 Handlebars.js 之後:
{{! <p>After refreshing, I get an error message from Ghost because the {{hello_world}} helper doesn’t exist in Ghost's default helpers. For our logic to work, we must escape this helper so that it’s not treated as a helper by Ghost’s built-in Handlebars.</p> <p>The correct way is to write this helper as \{{hello_world}}. This way, Ghost treats it as plain text. After refreshing the Ghost homepage, you should see the plain text {{hello_world}}. If this happens, you are on the right track. Let’s now return to the middleware server file, where we will use the response decorator.</p> <p>⚠️ Remember to escape custom helpers in your theme! Don’t forget to add the \ character.<br> </p> <pre class="brush:php;toolbar:false">let htmlContent = proxyResData.toString('utf8');
重新啟動中間件伺服器並註冊上述助手後,您應該在瀏覽器中看到渲染的助手,其中包含我們的助手返回的文字以及當前日期和時間。
在此階段,您可以使用其他自訂幫助程式來擴充 Ghost 主題,並將其新增至中間件伺服器程式碼。
安全
在某些時候,您可能想與助手一起歸還各種東西。預設情況下,該程式庫可防止 XSS 攻擊,但當您使用 SafeString 方法時,此保護將停止運作。盡可能避免使用它。
還有一件事!想像一下,用戶在貼文下的評論部分添加了這樣的助手,並在參數中添加了惡意內容。注意安全。例如,如果您完全渲染每個 HTML,則可能容易受到 XSS 攻擊。建議在特定的封閉區域編譯和渲染 Handlebars.js。您可以使用 Cheerio (https://cheerio.js.org/) 函式庫來解析 HTML 並在必要時渲染 Handlebars。以下是如何透過修改先前的渲染程式碼來保護自己的範例:
const path = require('path'); module.exports = { activate: function activate(ghost) { ghost.helperService.registerDir(path.resolve(__dirname, './lib/helpers')); } };
請記得在腳本開頭加入函式庫初始化:const asyncHelpers = require('handlebars-async-helpers');。如果您因為handlebars-async-helpers 和handlebars 之間的版本衝突而遇到安裝問題,只需將handlebars 降級到^4.7.6。不幸的是,非同步幫助器庫已經有一段時間沒有維護了,但它在實踐中仍然有效。
資料庫通訊和對象
如果你想在 Ghost 中進行資料庫查詢來獲取,例如當前的帖子,這是可能的,而且並不困難。您可以使用像 knex (https://knexjs.org/) 這樣的函式庫,它是一個清晰且快速的 SQL 查詢產生器。請記住,為此您需要handlebars-async-helpers。正確配置 knex 以連接到 Ghost 的資料庫。
將 knex 初始化為 db 變數並嘗試以下程式碼:
const {SafeString, escapeExpression} = require('../../../../services/handlebars'); module.exports = function uppercase(text) { return `${text.toUpperCase()}`; };
然後,在 Ghost 主題的 post.hbs 範本中,加入下列幫助器:{{post_title uuid="{{uuid}}"}}。在此範例中,{{uuid}} 將被檢索並作為 Ghost 中可用的幫助程式傳遞,填入我們的幫助程式的 uuid 欄位並使自訂幫助程式顯示貼文標題。
您也可以使用 axios 向 Ghost Content API 發出 HTTP 請求,但這比直接資料庫通訊慢得多。
表現
我知道基於中間件的解決方案在速度方面可能不是最好的,但我個人使用這個解決方案並且沒有註意到頁面載入時間顯著下降。單一請求的平均回應時間低於 100 毫秒(根據express-status-monitor),並且我使用自訂助理從每個頁面的資料庫中檢索一些值。
當然,您可以添加快取機制來提高中間件效能或使用替代解決方案來取代express-http-proxy。
架構的實現
使用 Docker 或其他容器化機制。我在我的專案中使用過它,效果很好。為 Ghost、Nginx 和 Node.js 映像新增 Ghost 和資料庫映像。將它們連接到共用網路(驅動程式:bridge),相應地配置 Nginx 和 Node.js 伺服器 - 這一切都非常簡單!
以上是在 Ghost 中製作自訂車把助手!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr

Node.js擅長於高效I/O,這在很大程度上要歸功於流。 流媒體匯總處理數據,避免內存過載 - 大型文件,網絡任務和實時應用程序的理想。將流與打字稿的類型安全結合起來創建POWE

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SublimeText3漢化版
中文版,非常好用

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中