我已經寫了一篇關於如何使用這個模組來取代 Next.js 的文章,但在某些情況下它更像是一個輕量級版本。
現在,我們終於可以開始討論具體細節了,替換完全合理,而且並非牽強附會。這兩個模組都使用來自伺服器的 HTML,概念相似,所以這絕對是一個不錯的選擇。
好了,我們開始吧! 🏎️
讓我們從能想到的最簡單的例子開始——一個點擊器。你可以這樣做:
<body>
<div class="clicker-container">
<h1>HTMX Clicker</h1>
<div class="click-count" id="counter" hx-swap-oob="true">0</div>
<button
class="click-button"
hx-post="/click"
hx-target="#counter"
hx-swap="innerHTML"
>
Click!
</button>
</div>
</body>
乍看之下還不錯,最重要的是功能齊全。現在,我們來在 HMPL.js 上舉個例子:
<body></body>
<script>
const templateFn = hmpl.compile(`
<div class="clicker-container">
<h1>HMPL Clicker</h1>
<div class="click-count" id="counter">
{{#request src="/click" after="click:#btn"}}
{{/request}}
</div>
<button id="btn">Click!</button>
</div>
`);
const clicker = templateFn().response;
document.querySelector("body").append(clicker);
</script>
我們可以看到,我們有兩種不同的方法,其中一個模組完全依賴當前 DOM,而另一個模組則不依賴當前 DOM,而是透過 JS 產生的。但是,我們看到,總體而言,它們是使用通用方法的相同介面。只是在這裡,第一個也是最主要的問題是,在第一種情況下,我們對請求的設定盡可能少。
在 HTMX 中,它是專門為使開發人員對 js 的依賴最小化而製作的,所以這個模組最嚴重的問題就來自於此——幾乎沒有對請求進行任何自訂。
所以,是的,當然,您可以像這樣發送body
:
<button
class="click-button"
hx-post="/click"
hx-target="#counter"
hx-swap="innerHTML"
hx-vars='{"action": "increment"}'
>
Click!
</button>
但即便如此,如果我們想要更多,我們也會發現它不可能實現,或難以實現。而且,這又是故意為之,因為該模組的重點在於易用性。
另外,第二個問題是,我們確實有請求,但它們是透過XMLHTTPRequest
發送的,而這個標準已經有 25 年的歷史了。沒錯,最後一次加入是在 10 年代初期,但事實就是如此。
在 HMPL 中,使用了幾乎完全可自訂的fetch
,也就是說,認為 ECMAScript 中的所有新功能都已預設為支援。
讓我們使用一個更複雜的例子來展示如何在專案中取代 HTMX。
<div id="wrapper">
<form
id="form"
hx-post="/api/register"
hx-target="#response"
hx-indicator="#loading-indicator"
hx-swap="innerHTML"
hx-include="this"
>
<div class="form-example">
<label for="login">Login: </label>
<input type="text" name="login" id="login" required /><br/>
<label for="password">Password: </label>
<input type="password" name="password" id="password" required />
</div>
<div class="form-example">
<input type="submit" value="Register!" />
</div>
</form>
<div id="response"></div>
<div id="loading-indicator" class="htmx-indicator">
<p>Loading...</p>
</div>
</div>
現在,我們有一個要傳送到伺服器的表單。 hx-include
屬性將資料包含為FormData
。此外,還有一個請求指示。現在,讓我們嘗試在 HMPL 中執行相同的操作:
<body></body>
<script>
const templateFn = compile(
`<div id="wrapper">
<form onsubmit="function prevent(e){e.preventDefault();};return prevent(event);" id="form">
<div class="form-example">
<label for="login">Login: </label>
<input type="text" name="login" id="login" required /><br/>
<label for="password">Password: </label>
<input type="password" name="password" id="password" required />
</div>
<div class="form-example">
<input type="submit" value="Register!" />
</div>
</form>
<p>
{{#request
src="/api/register"
after="submit:#form"
repeat=true
}}
{{#indicator trigger="pending"}}
<div class="indicator">
<p>Loading...</p>
</div>
{{/indicator}}
{{/request}}
</p>
</div>`
);
const initFn = (ctx) => {
const event = ctx.request.event;
return {
body: new FormData(event.target, event.submitter),
credentials: "same-origin",
};
};
const obj = templateFn(initFn);
document.querySelector("body").append(obj.response);
</script>
這裡可以清楚地看到,我們可以做與 HTMX 中相同的操作,但是還有一個小問題,我們可以使用form
,從中獲取任何資料並修改我們的請求。
我不會對這一點保持沉默,但從這個角度來看,它仍然值得評估。使用 HTMX,你可以減少程式碼寫量。讓我們透過一個簡單的範例來比較應用程式的大小:
📦HTMX:
📦HMPL:
因為一切都非常小,所以 HTMX 在大小方面無可爭議地處於領先地位,但您可以看到,在這個例子中,應用程式的大小並沒有太大的差別。
雖然與其他方法相比,HMPL 在維度方面通常表現出良好的效果:
但是,當然,如果我們減少 js 的功能,基本上做到最低限度,那麼原始檔案的大小就會更小。
當然,您可以繼續使用 HTMX,但在本文中,我想提供現有選項的替代方案。任務各不相同,人們並不總是需要應用程式的最小規模,也並不總是願意因此犧牲功能。在使用伺服器時,如果是大型應用程式,您仍然需要以某種方式自訂請求。但一切都取決於任務。
非常感謝您閱讀這篇文章❤️!
你覺得這個方案怎麼樣?歡迎在留言區留言,一定會很有趣!
有用連結:
原文出處:https://dev.to/anthonymax/i-replaced-the-htmx-in-the-project-to-this-module-56bc