Markdown 中的互動元件
最近我實現了一個日曆,結果非常好,我想記錄該方法並與更廣泛的受眾分享。我真的很想在文章中得到我的工作的實際可測試結果。
我已經調整我的網站一段時間了,這個想法開始了下一次迭代。最終導致了另一個全面重建,但這個故事並不是關於我與完美主義的鬥爭。這是關於轉動這個:
HTML comes with a lot of ready to use and flexible elements, but date selector has a handful of limitations and the need to write your own calendar / date input emerges sooner rather than later. In this tutorial I'll walk you through implementing a calendar view and show how you can extend its functionality to fit your booking widget or dashboard filter. Here's how the final result might look like: <!--render:custom-calendar-component/CalendarExample.ssi.tsx-->
進入此:
設定
我的網站在 Deno 上運行,並從最近開始使用 Hono 和 Hono/JSX,但該方法適用於任何基於 JS 的運行時和 JSX。
正如您已經注意到的,部落格文章是帶有屬性的 Markdown 文件,這些屬性在構建時使用 Marked 和 Front Matter 轉換為靜態 HTML。
經過一番反覆思考,我決定了這個工作流程:
- 我用markdown寫文章
- 我在與文章相同的資料夾中建立了一個 JSX 元件
- 我使用 HTML 註解在 Markdown 中「導入」元件
- 它的神奇功效
註解需要某種前綴,例如渲染並且基本上只是該元件的路徑:
<!--render:custom-calendar-component/CalendarExample.ssi.tsx-->
也可以在路徑後添加道具,但對於我的用例來說,不需要它,所以我跳過了這一部分。
渲染 HTML
在瀏覽器上新增任何內容之前,我們需要從 JSX 元件渲染 HTML。為此,我們「只」需要使用自訂渲染器覆蓋 HTML 渲染邏輯:
export default class Renderer extends Marked.Renderer { constructor(private baseUrl: string, options?: Marked.marked.MarkedOptions) { super(options); } override html(html: string): string { const ssiMatch = /<!--render:(.+)-->/.exec(html); if (ssiMatch?.length) { const filename = ssiMatch[1]; const ssi = SSIComponents.get(filename); if (!ssi) return html; const content = render(createElement(ssi.Component, {})); return [ content, `<script type="module" src="${ssi.script}"></script>`, ].join(""); } return html; } }
邏輯非常簡單:檢查 html 字串是否符合 // 然後渲染 JSX。如果您手邊有組件,那就很容易了。
編譯元件
我的部落格內容是靜態產生的,所以我很自然地採用了相同的方法:
- 掃描內容資料夾中的 *.ssi.tsx 元件(因此有字尾)
- 建立一個檔案來匯入它們並將其新增到地圖中,以便我可以輕鬆地透過路徑檢索它們
這是我的建置腳本的樣子:
const rawContent = await readDir("./content"); const content: Record<string, Article> = {}; const ssi: Array<string> = []; for (const pathname in rawContent) { if (pathname.endsWith(".ssi.tsx")) { ssi.push(pathname); continue; } } const scripts = await compileSSI(ssi.map((name) => `./content/${name}`)); const ssiContents = ` import type { FC } from 'hono/jsx'; const SSIComponents = new Map<string,{ Component: FC, script: string }>(); ${ scripts ? ssi .map( (pathname, i) => `SSIComponents.set("${pathname}", { Component: (await import("./${pathname}")).default, script: "${scripts[i]}" })` ) .join("\n") : "" } export default SSIComponents; `; await Deno.writeFile("./content/ssi.ts", new TextEncoder().encode(ssiContents));
不要太執著於 Deno 特定功能,它可以輕鬆地用 Node 或其他任何東西重寫。
神奇之處在於編寫類似 JavaScript 程式碼的文字檔。
這個腳本:
const ssiContents = ` import type { FC } from 'hono/jsx'; const SSIComponents = new Map<string,{ Component: FC, script: string }>(); ${ scripts ? ssi .map( (pathname, i) => `SSIComponents.set("${pathname}", { Component: (await import("./${pathname}")).default, script: "${scripts[i]}" })` ) .join("\n") : "" } export default SSIComponents; `;
傳回以下字串:
import type { FC } from 'hono/jsx'; const SSIComponents = new Map<string,{ Component: FC, script: string }>(); SSIComponents.set("custom-calendar-component/CalendarExample.ssi.tsx", { Component: (await import("./custom-calendar-component/CalendarExample.ssi.tsx")).default, script: "/content/custom-calendar-component/CalendarExample.ssi.js" }) export default SSIComponents;
然後可以在渲染器中匯入和使用:)
寫程式碼的程式碼!魔法!並且在過程中沒有任何人工智慧受到傷害:只是你的老式元程式設計。
最後,最後一個難題是滋潤前端的組件。我使用 esbuild,但我個人打算將其切換到 Vite 或 HMR 附帶的任何其他工具。
儘管如此,它看起來是這樣的:
HTML comes with a lot of ready to use and flexible elements, but date selector has a handful of limitations and the need to write your own calendar / date input emerges sooner rather than later. In this tutorial I'll walk you through implementing a calendar view and show how you can extend its functionality to fit your booking widget or dashboard filter. Here's how the final result might look like: <!--render:custom-calendar-component/CalendarExample.ssi.tsx-->
您可以注意到一個虛擬入口點,其值為零,但會強制 esbuild 在自己的資料夾中建立檔案並具有可預測的路徑。
且 ssi-tsconfig.json 非常通用:
<!--render:custom-calendar-component/CalendarExample.ssi.tsx-->
在實際的前端水合作用中,我選擇了簡單的方法,並將其添加到我的 .ssi.tsx 檔案的底部:
export default class Renderer extends Marked.Renderer { constructor(private baseUrl: string, options?: Marked.marked.MarkedOptions) { super(options); } override html(html: string): string { const ssiMatch = /<!--render:(.+)-->/.exec(html); if (ssiMatch?.length) { const filename = ssiMatch[1]; const ssi = SSIComponents.get(filename); if (!ssi) return html; const content = render(createElement(ssi.Component, {})); return [ content, `<script type="module" src="${ssi.script}"></script>`, ].join(""); } return html; } }
我相信讀者會找到一種更優雅的方式來做到這一點,但僅此而已!
隨意調整程式碼(以下是儲存庫的連結),添加您自己的風格並分享您的想法!
瓦萊裡婭·VG
/
valeriavg.dev
以上是Markdown 中的互動元件的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

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

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。
