🔧 阿川の電商水電行
Shopify 顧問、維護與客製化
💡
小任務 / 單次支援方案
單次處理 Shopify 修正/微調
⭐️
維護方案
每月 Shopify 技術支援 + 小修改 + 諮詢
🚀
專案建置
Shopify 功能導入、培訓 + 分階段交付

我目前正在開發一款對話式人工智慧 Web 應用。我完全從零開始建造它,遵循結構化的 SDLC 方法。

目前,我正處於第 3 階段:前端交互,我正在致力於動態呈現聊天訊息。

最初,我採用了一種常見的方法:使用insertAdjacentHTML()將使用者和 AI 訊息氣泡直接加入到 DOM 中。這種方法雖然有效,但我的 JavaScript 檔案卻變得混亂,充斥著大量重複的 HTML 程式碼。

它看起來是這樣的。

⛔ 問題:JavaScript 中 HTML 過多

<div id="messages-container"></div>
const messagesContainer = document.getElementById('messages-container');
const messageHTML = `
  <div class="flex justify-start mb-4 animate-slide-in">
    <div class="bg-gray-100 dark:bg-gray-800 rounded-lg px-4 py-2 max-w-[70%]">
      <p class="text-gray-800 dark:text-gray-200">${text}</p>
    </div>
  </div>
`;
messagesContainer.insertAdjacentHTML('beforeend', messageHTML);

這對於單一訊息類型來說效果很好,但是一旦我需要處理 AI 訊息(具有不同的佈局),我意識到我在多個地方重複了相同的結構。

它缺乏簡單性,也不具備可擴展性。

我需要一種更易於維護的方法來區分邏輯(JS)和結構(HTML)。

那時,我發現了<template>標籤,一個原生功能。

✅ 解決方案: <template>標籤

它允許您定義可重複使用的 HTML 部分,這些部分保持非活動狀態,直到您有意使用 JavaScript 來呈現它們。

簡單來說:

  • 瀏覽器解析裡面的 HTML ,但不顯示。

  • 每當您需要動態呈現它時,都可以使用template.content.cloneNode(true)透過 JS 複製其內容。

透過這樣做,您可以建立清晰的聲明性 HTML,然後在腳本中使用它,而不會用原始 HTML 字串弄亂您的 JS 檔案。

這是結構。

<template id="user-message-template">
  <div class="flex justify-start mb-4 animate-slide-in">
    <div class="bg-gray-100 dark:bg-gray-800 rounded-lg px-4 py-2 max-w-[70%]">
      <p class="text-gray-800 dark:text-gray-200 message-text"></p>
    </div>
  </div>
</template>

<div id="messages-container"></div>

🛠️ 工作原理

當瀏覽器遇到,它解析標記但不呈現它。

這意味著:

  • 裡面的內容不會出現在 DOM 中。

  • 其中的腳本或映像將無法執行或載入。

  • 它靜靜地等待著被複製的時機。

要使用它,請透過 JavaScript 擷取模板的內容來複製它:

const messagesContainer = document.getElementById('messages-container');
const userTemplate = document.getElementById('user-message-template');

function addUserMessage(text) {
  // Clone the content of the template
  const messageClone = userTemplate.content.cloneNode(true);

  // Modify the cloned node
  messageClone.querySelector('.message-text').textContent = text;

  // Append it to the container
  messagesContainer.appendChild(messageClone);
}

// Example usage
const btn = document.getElementById('sendBtn');
btn.addEventListener('click', function () {
     addUserMessage('This is test user message');
});

您的 HTML 現在是可擴展的、可讀的和模組化的。

如果我稍後決定加入 AI 訊息,我的 JavaScript 程式碼中不會出現任何混亂的 HTML 重複。我只需定義一個樣式略有不同的模板即可。

🧐 為什麼這很重要?

  • 清潔器:JS 不包含任何 HTML 字串。

  • 更易於維護:結構可以輕鬆改變而不影響邏輯。

  • 更安全:不太可能出現注入問題或格式錯誤的 HTML

  • 可擴展:輕鬆調整以適應更複雜的訊息格式。

這些小的改進在現實世界的聊天應用程式中會累積起來,特別是經過多個開發階段的聊天應用程式。

這種結構保持一致性,並有助於在 UI 成長時進行除錯。

🔚 結論

<template>標籤悄悄地解決了一個實際問題:在動態 UI 中保持標記和邏輯分離。

它將 JavaScript 中混亂的部分轉變為適合我的專案的清晰、可重複使用的系統。

最好的部分是什麼?因為它是純 JavaScript,所以不需要額外的依賴項。

有時,最簡潔的解決方案已經內建在瀏覽器中。你只需要仔細觀察。


原文出處:https://dev.to/richa-parekh/the-tag-a-core-html-feature-that-simplified-my-js-3m1o


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝23   💬9   ❤️6
629
🥈
我愛JS
📝4   💬14   ❤️7
276
🥉
御魂
💬1  
3
#4
2
#5
1
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
🔧 阿川の電商水電行
Shopify 顧問、維護與客製化
💡
小任務 / 單次支援方案
單次處理 Shopify 修正/微調
⭐️
維護方案
每月 Shopify 技術支援 + 小修改 + 諮詢
🚀
專案建置
Shopify 功能導入、培訓 + 分階段交付