<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>網頁東東</title><description>是什麼原因導致網頁建構上遭遇瓶頸？以及如何突破？網頁東東用最親切簡單的方式描述如何設計與架構網頁，著重於圖像化以及實例操作，累積教學上的經驗降低每次學習新事物的成本</description><link>https://www.webdong.dev/</link><item><title>學會挑選合適的模型透過 Ollama 本地運行 LLM</title><link>https://www.webdong.dev/zh-tw/post/run-ai-locally-using-ollama/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/run-ai-locally-using-ollama/</guid><description>雖然在 AI 出現之前很難想像，但 2026 年工作上我已經很少「手寫程式」而是透過 AI 更有效率的輔助開發，我相信在 AI 百家爭鳴的時代不用特別執著用哪個模型或工具，挑個最新順手的免費方案就夠了，未來模型只會更便宜更有效率。</description><pubDate>Wed, 08 Apr 2026 00:00:00 GMT</pubDate><category>AI</category><category>unsorted</category></item><item><title>Backend Integration Testing with Testcontainers</title><link>https://www.webdong.dev/en/post/testcontainers/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/testcontainers/</guid><description>Frontend tests focus on browsers; backend tests face distributed services and state. This shows using Testcontainers to run Docker-based integration tests.</description><pubDate>Sat, 04 Apr 2026 00:00:00 GMT</pubDate><category>Software Testing</category><category>unsorted</category></item><item><title>使用 Testcontainers 实现后端集成测试</title><link>https://www.webdong.dev/zh-cn/post/testcontainers/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/testcontainers/</guid><description>前端测试主要重点在与浏览器打交道（Jsdom、Headless Browser）且通常只与单一后端进行沟通，而后端测试则是面临截然不同的难题：分散服务与状态。这篇文章介绍实战上我如何透过 Testcontainers 创建 Docker 测试环境来达成完整的后端整合测试流程。</description><pubDate>Sat, 04 Apr 2026 00:00:00 GMT</pubDate><category>Software Testing</category><category>unsorted</category></item><item><title>使用 Testcontainers 實現後端整合測試</title><link>https://www.webdong.dev/zh-tw/post/testcontainers/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/testcontainers/</guid><description>前端測試主要重點在與瀏覽器打交道（Jsdom、Headless Browser）且通常只與單一後端進行溝通，而後端測試則是面臨截然不同的難題：分散服務與狀態。這篇文章介紹實戰上我如何透過 Testcontainers 創建 Docker 測試環境來達成完整的後端整合測試流程。</description><pubDate>Sat, 04 Apr 2026 00:00:00 GMT</pubDate><category>Software Testing</category><category>unsorted</category></item><item><title>Understand AES best practices, block padding, and modes</title><link>https://www.webdong.dev/en/post/aes-encryption/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/aes-encryption/</guid><description>AES is the most widely used symmetric cipher—used in HTTPS/TLS, Wi‑Fi, full-disk encryption, and messaging. Understanding AES clarifies modern encryption.</description><pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>unsorted</category></item><item><title>了解 AES 最佳实践、区块填充与模式</title><link>https://www.webdong.dev/zh-cn/post/aes-encryption/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/aes-encryption/</guid><description>AES（Advanced Encryption Standard）是最广泛使用的对称加密，HTTPS/TLS、Wi-Fi（WPA2/3）、全硬盘加密（BitLocker、FileVault）……通过理解 AES 如何运作有助于了解现代安全加密如何实践。</description><pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>unsorted</category></item><item><title>了解 AES 最佳實踐、區塊填充與模式</title><link>https://www.webdong.dev/zh-tw/post/aes-encryption/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/aes-encryption/</guid><description>AES（Advanced Encryption Standard）是最廣泛使用的對稱加密，HTTPS/TLS、Wi-Fi（WPA2/3）、全硬碟加密（BitLocker、FileVault）⋯⋯透過理解 AES 如何運作有助於了解現代安全加密如何實踐。</description><pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>unsorted</category></item><item><title>Practical FIDO: Implementing Passwordless Login</title><link>https://www.webdong.dev/en/post/fido-auth/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/fido-auth/</guid><description>Managing many site passwords is risky. FIDO (Fast IDentity Online) enables passwordless login using fingerprint or face scan.</description><pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>unsorted</category></item><item><title>实战 FIDO 验证实现无密码登录</title><link>https://www.webdong.dev/zh-cn/post/fido-auth/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/fido-auth/</guid><description>不同网站的密码需要管理，不仅容易忘记，也存在被窃取或重复使用的风险。如果只需要扫描指纹或使用面部识别，就能立即完成注册与登录——这正是 FIDO（Fast IDentity Online）所推动的“无密码身份验证”愿景。</description><pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>unsorted</category></item><item><title>實戰 FIDO 驗證實現無密碼登入</title><link>https://www.webdong.dev/zh-tw/post/fido-auth/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/fido-auth/</guid><description>不同網站的密碼需要管理，不僅容易忘記，也存在被竊取或重複使用帶來的風險。如果只需要掃描指紋或使用臉部識別，就能立即完成註冊與登入——這正是 FIDO（Fast IDentity Online）所推動的「無密碼身分驗證」願景。</description><pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>unsorted</category></item><item><title>Idiomatic Go Testing: Table Driven Test</title><link>https://www.webdong.dev/en/post/table-driven-test/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/table-driven-test/</guid><description>I noticed a widely praised convention in Go testing: Table Driven Tests. I thought tests should be simple, but this pattern reflects programmers&apos; laziness.</description><pubDate>Tue, 10 Mar 2026 00:00:00 GMT</pubDate><category>Software Testing</category><category>unsorted</category></item><item><title>Go 测试的地道写法：Table Driven Test</title><link>https://www.webdong.dev/zh-cn/post/table-driven-test/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/table-driven-test/</guid><description>最近在写 Go 测试时发现官方与社群中有一种大力推崇的惯例：TableDrivenTest，我一直以为测试应该要保持简单愚蠢，但这种做法让我想到程式人的三大美德之一：「懒惰」。可能是因为这种模式通常只是测试框架包装下的方便手段，而 Go 社群文化下人人对于追求简单程式有一种莫名的执着。</description><pubDate>Tue, 10 Mar 2026 00:00:00 GMT</pubDate><category>Software Testing</category><category>unsorted</category></item><item><title>Go 測試道地寫法：Table Driven Test</title><link>https://www.webdong.dev/zh-tw/post/table-driven-test/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/table-driven-test/</guid><description>最近在寫 Go 測試時發現官方與社群中有一種大力推崇的慣例：TableDrivenTest，我一直以為測試應該要保持簡單愚蠢，但這種做法讓我想到程式人的三大美德之一：「懶惰」。可能是因為這種模式通常只是測試框架包裝下的方便手段，而 Go 社群文化下人人對於追求簡單程式有一種莫名的執著。</description><pubDate>Tue, 10 Mar 2026 00:00:00 GMT</pubDate><category>Software Testing</category><category>unsorted</category></item><item><title>Idiomatic Go Set</title><link>https://www.webdong.dev/en/post/go-set/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/go-set/</guid><description>Notes on implementing a Set while migrating from JavaScript to Go — using maps to represent Sets since Go lacks a native Set.</description><pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>Go Set 数据结构的地道写法</title><link>https://www.webdong.dev/zh-cn/post/go-set/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/go-set/</guid><description>纪录近期从 JavaScript 迁移到 Go 的过程中实践 Set 资料结构的方式。先前代码使用 JavaScript Set 来实现不重复资料定义，但在 Go 语言当中并没有实践 Set 资料结构，但我们可以透过改造 map 来实践。</description><pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>Go Set 資料結構道地寫法</title><link>https://www.webdong.dev/zh-tw/post/go-set/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/go-set/</guid><description>紀錄近期從 JavaScript 遷移到 Go 的過程中實踐 Set 資料結構的方式。先前代碼使用 JavaScript Set 來實現不重複資料定義，但在 Go 語言當中並沒有實踐 Set 資料結構，但我們可以透過改造 map 來實踐。</description><pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>Embed files at compile time with go:embed</title><link>https://www.webdong.dev/en/post/go-embed-std/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/go-embed-std/</guid><description>Using Go 1.16&apos;s embed to include files at compile time, avoiding path/environment issues. Not suitable if files must change at runtime.</description><pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>通过 go:embed 在编译时将文件嵌入</title><link>https://www.webdong.dev/zh-cn/post/go-embed-std/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/go-embed-std/</guid><description>纪录使用到其中一项 Go 1.16 的 embed 功能，可以把任何档案在编译时就包进去，进而不用烦恼路径与环境问题。如果资料需要在 runtime 被修改，那就不适合使用 embed，但如果它是「版本的一部分」，那 embed 是更安全的选择。</description><pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>透過 go:embed 在編譯時將檔案包入</title><link>https://www.webdong.dev/zh-tw/post/go-embed-std/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/go-embed-std/</guid><description>紀錄使用到其中一項 Go 1.16 的 embed 功能，可以把任何檔案在編譯時就包進去，進而不用煩惱路徑與環境問題。如果資料需要在 runtime 被修改，那就不適合使用 embed，但如果它是「版本的一部分」，那 embed 是更安全的選擇。</description><pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>P vs NP: Exploring the difficulty of solving problems</title><link>https://www.webdong.dev/en/post/p-vs-np-problem/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/p-vs-np-problem/</guid><description>P and NP classify problems by whether they can be solved in polynomial time or nondeterministic polynomial time.</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>P vs NP 问题探讨问题解法的难度</title><link>https://www.webdong.dev/zh-cn/post/p-vs-np-problem/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/p-vs-np-problem/</guid><description>P 与 NP 用来描述解决问题的难度所需的时间为：polynomial time 或 non-deterministic polynomial time。将问题分类为 P 或 NP，有助于理解一个问题是否有可能在合理的时间内被解决——即执行时间不会随着输入规模的增长而爆炸性膨胀。</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>P vs NP 問題探討問題解方的難度</title><link>https://www.webdong.dev/zh-tw/post/p-vs-np-problem/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/p-vs-np-problem/</guid><description>P 與 NP 用來描述解決問題的難度所需的時間為：polynomial time 或 non-deterministic polynomial time。將問題分類為 P 或 NP，有助於理解一個問題是否有可能在合理的時間內被解決——即執行時間不會隨著輸入規模的增長而爆炸性膨脹。</description><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>4 Types of Feature Flags and When to Use Them</title><link>https://www.webdong.dev/en/post/4-types-of-feature-flag/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/4-types-of-feature-flag/</guid><description>After covering what Feature Flags are, this post explains four types of Feature Flags and their differing lifecycles, dynamism, and management strategies.</description><pubDate>Tue, 10 Feb 2026 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>4 种 Feature Flag 与使用时机</title><link>https://www.webdong.dev/zh-cn/post/4-types-of-feature-flag/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/4-types-of-feature-flag/</guid><description>先前探讨到：什么是 Feature Flag 以及它解决什么问题？了解 Feature Flag 存在的价值后，今天了解更多关于 4 种类型的 Feature Flag 以及实战上的用途。不同目的的 Flag，在设计方式、生命周期、动态程度与管理策略上都有明显差异。</description><pubDate>Tue, 10 Feb 2026 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>4 種類的 Feature Flag 與使用時機</title><link>https://www.webdong.dev/zh-tw/post/4-types-of-feature-flag/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/4-types-of-feature-flag/</guid><description>先前探討到：什麼是 Feature Flag 以及它解決什麼問題？了解 Feature Flag 存在的價值後，今天了解更多關於 4 種類型的 Feature Flag 以及實戰上的用途。不同目的的 Flag，在設計方式、生命週期、動態程度與管理策略上都有明顯差異。</description><pubDate>Tue, 10 Feb 2026 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>Stable Product Feature Releases through OpenFeature</title><link>https://www.webdong.dev/en/post/openfeature/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/openfeature/</guid><description>I thought keeping things simple—changing code or env vars—was enough. But when incidents occur you don&apos;t have time to debug.</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>通过 OpenFeature 实践稳定产品功能发布</title><link>https://www.webdong.dev/zh-cn/post/openfeature/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/openfeature/</guid><description>我一直觉得事情可以保持简单就好，有问题改程式码或环境变数切换就好，何必导入更复杂的套件管理与第三方服务呢？但真实情境当问题发生时不会有空闲慢慢部署与除错，就有必要透过更完善的 Feature Flag 规划来降低推送功能的风险，也能减少心脏病发作的机率。</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>透過 OpenFeature 實踐穩定產品功能發布</title><link>https://www.webdong.dev/zh-tw/post/openfeature/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/openfeature/</guid><description>我一直覺得事情可以保持簡單就好，有問題改程式碼或環境變數切換就好，何必導入更複雜的套件管理與第三方服務呢？但真實情境當問題發生時不會有空閒慢慢部署與除錯，就有必要透過更完善的 Feature Flag 規劃來降低推送功能的風險，也能減少心臟病發作的機率。</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>Dependency Injection - Make Swappable &amp; Testable module!</title><link>https://www.webdong.dev/en/post/dependency-injection/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/dependency-injection/</guid><description>To better replace modules via &quot;dependency injection&quot; for cleaner testing. I uploaded the demo example demonstrating testing architecture through DI.</description><pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>通过依赖注入达成依赖反转，使替换程序模块测试更省事！</title><link>https://www.webdong.dev/zh-cn/post/dependency-injection/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/dependency-injection/</guid><description>通常有些规模的专案会透过架构分层的方式来管理，而近期在研究如何更好的透过「依赖注入」替换模块并实现更干净的测试。架构分层的概念可以参考之前写过的：Express.js 入门建构 MVC 范例。我上传了 go-gin-testing-todos 范例透过 DI 实践测试架构。</description><pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>透過依賴注入達成依賴反轉，使替換程式模組測試更省事！</title><link>https://www.webdong.dev/zh-tw/post/dependency-injection/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/dependency-injection/</guid><description>通常有些規模的專案會透過架構分層的方式來管理，而近期在研究如何更好的透過「依賴注入」替換模塊並實現更乾淨的測試。架構分層的概念可以參考之前寫過的：Express.js 入門建構 MVC 範例。我上傳了 go-gin-testing-todos 範例透過 DI 實踐測試架構。</description><pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>Familiar with Go Modules and Packages</title><link>https://www.webdong.dev/en/post/go-module-and-package/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/go-module-and-package/</guid><description>From JS to Go, I wasn&apos;t familiar with Go&apos;s approach to modularity. Although similar in places, Go&apos;s simple and opinionated design is very evident.</description><pubDate>Mon, 26 Jan 2026 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>熟悉使用 Go Module 与 Package</title><link>https://www.webdong.dev/zh-cn/post/go-module-and-package/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/go-module-and-package/</guid><description>从 JavaScript 转写 Go 我其实还是不太熟悉 Go 如何模组化处理代码，虽然它们有大致相似的地方，但使用体验感觉非常简单甚至到简陋的程度，当然简单并不意味着「容易」或「没用」，Go 简单且固执己见的哲学在各方面都感受得到。</description><pubDate>Mon, 26 Jan 2026 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>熟悉使用 Go Module 與 Package</title><link>https://www.webdong.dev/zh-tw/post/go-module-and-package/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/go-module-and-package/</guid><description>從 JavaScript 轉寫 Go 我其實還是不太熟悉 Go 如何模組化處理代碼，雖然它們有大致相似的地方，但使用體驗感覺非常簡單甚至到簡陋的程度，當然簡單並不意味著「容易」或「沒用」，Go 簡單且固執己見的哲學在各方面都感受得到。</description><pubDate>Mon, 26 Jan 2026 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>Database query performance issue: N+1 problem</title><link>https://www.webdong.dev/en/post/db-n-plus-one-problem/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/db-n-plus-one-problem/</guid><description>N+1 database query problem, its causes, and solutions: denormalization, DB-level joins ($lookup/JOIN), batch queries with assembly, and ORM/ODM eager loading.</description><pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate><category>Database</category><category>unsorted</category></item><item><title>数据库查询性能问题：N+1 问题</title><link>https://www.webdong.dev/zh-cn/post/db-n-plus-one-problem/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/db-n-plus-one-problem/</guid><description>很早以前接触资料库就有听说过「N+1 问题」，不过一直没有写下笔记认真思考过一次，这次撰写问题成因与详细解方与图表。透过：资料结构设计（去正规化）、在 DB 层完成关联资料查询、批次查询并在应用层组装、ORM ODM Eager Loading 来解决。</description><pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate><category>Database</category><category>unsorted</category></item><item><title>資料庫查詢效能問題：N+1 問題</title><link>https://www.webdong.dev/zh-tw/post/db-n-plus-one-problem/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/db-n-plus-one-problem/</guid><description>很早以前接觸資料庫就有聽說過「N+1 問題」，不過一直沒有寫下筆記認真思考過一次，這次撰寫問題成因與詳細解方與圖表。透過：資料結構設計（去正規化）、在 DB 層完成關聯資料查詢、批次查詢並在應用層組裝、ORM ODM Eager Loading 來解決。</description><pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate><category>Database</category><category>unsorted</category></item><item><title>研究現有流程如何使用 Agent Skills 模組化管理上下文</title><link>https://www.webdong.dev/zh-tw/post/what-is-agent-skills/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/what-is-agent-skills/</guid><description>使用 Agentic AI 解決問題時上下文管理至關重要，而 Anthropic 推出的 Agent Skill 上下文管理模式近期也成為業界的一種主流標準，在 Claude Code、Codex、Opencode 等工具中都有支援，透過研究如何整合進入現有的流程來增加開發效率。</description><pubDate>Wed, 14 Jan 2026 00:00:00 GMT</pubDate><category>AI</category><category>unsorted</category></item><item><title>What is Marshal in Go?</title><link>https://www.webdong.dev/en/post/go-marshal/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/go-marshal/</guid><description>Revisiting serialization/deserialization in Go and the origin of &quot;Marshal&quot;, building on my earlier post about struct tags and reflect.</description><pubDate>Sun, 11 Jan 2026 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>Go 进行数据序列化与 Marshal 名称的起源</title><link>https://www.webdong.dev/zh-cn/post/go-marshal/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/go-marshal/</guid><description>处理传递资料时都快忘了有「序列化与反序列化资料」这个步骤，因为都被套件像是：Axios 抽象掉了，近期在写后端也重新温习相关知识，也延续先前文章：Go Struct Tag 是什么？如何透过 reflect 动态处理栏位？探讨 Go 如何处理序列化资料。</description><pubDate>Sun, 11 Jan 2026 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>Go 進行資料序列化與 Marshal 名稱的起源</title><link>https://www.webdong.dev/zh-tw/post/go-marshal/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/go-marshal/</guid><description>處理傳遞資料時都快忘了有「序列化與反序列化資料」這個步驟，因為都被套件像是：Axios 抽象掉了，近期在寫後端也重新溫習相關知識，也延續先前文章：Go Struct Tag 是什麼？如何透過 reflect 動態處理欄位？探討 Go 如何處理序列化資料。</description><pubDate>Sun, 11 Jan 2026 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>How Programs Remember: Stack and Heap</title><link>https://www.webdong.dev/en/post/stack-and-heap/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/stack-and-heap/</guid><description>High-level programming languages usually involves the concept that &quot;unused variables are automatically garbage collected&quot;. How do programs manage memory?</description><pubDate>Sun, 04 Jan 2026 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>程式如何记忆：Stack 与 Heap</title><link>https://www.webdong.dev/zh-cn/post/stack-and-heap/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/stack-and-heap/</guid><description>学习高阶程序语言通常都会接受一个观念是：「没用到的变量会自动被垃圾回收掉」。不过越接近底层或开始探讨性能问题，发现自己对于程序语言核心的记忆体概念 Heap 与 Stack 并没有那么清楚。程序语言究竟是如何分配与管理记忆体的？所谓的垃圾回收（Garbage Collection, GC）具体来说又做了哪些事情？</description><pubDate>Sun, 04 Jan 2026 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>程式如何記憶：Stack 與 Heap</title><link>https://www.webdong.dev/zh-tw/post/stack-and-heap/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/stack-and-heap/</guid><description>學習高階程式語言通常都會接受一個觀念是：「沒用到的變數會自動被垃圾回收掉」。不過越接近底層或開始探討效能問題，發現自己對於程式語言核心的記憶體概念 Heap 與 Stack 並沒有那麼清楚。程式語言究竟是如何分配與管理記憶體的？所謂的垃圾回收（Garbage Collection, GC）具體來說又做了哪些事情？</description><pubDate>Sun, 04 Jan 2026 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>Go context termination, timeouts, and passing values</title><link>https://www.webdong.dev/en/post/go-context/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/go-context/</guid><description>Context is added to Go standard library in 1.7. It&apos;s primarily used for  including deadlines, cancellation signals, and passing request-scoped values.</description><pubDate>Tue, 30 Dec 2025 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>使用 Go Context 处理 goroutine 终止、超时、传递请求相关的值</title><link>https://www.webdong.dev/zh-cn/post/go-context/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/go-context/</guid><description>Context 是 Go 1.7 添加于标准函式库的功能。常在存取资料库或其他服务时会遇到，初步看起来是用于「传递取消信号」用途的语法，用于处理 goroutine：背负期限（deadline）、取消信号（cancellation signal）、传递请求相关的值（request-scoped values）。</description><pubDate>Tue, 30 Dec 2025 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>使用 Go Context 處理 goroutine 終止、超時、傳遞請求相關的值</title><link>https://www.webdong.dev/zh-tw/post/go-context/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/go-context/</guid><description>Context 是 Go 1.7 添加於標準函式庫的功能。常在存取資料庫或其他服務時會遇到，初步看起來是用於「傳遞取消信號」用途的語法，用於處理 goroutine：背負期限（deadline）、取消信號（cancellation signal）、傳遞請求相關的值（request-scoped values）。</description><pubDate>Tue, 30 Dec 2025 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>How and Why Two Factor Authentication</title><link>https://www.webdong.dev/en/post/how-and-why-two-factor-authentication/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/how-and-why-two-factor-authentication/</guid><description>As more and more apps started promoting—or even requiring—two-factor authentication (2FA), I ended up installing Google Authenticator on my phone.</description><pubDate>Thu, 25 Dec 2025 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>为什么需要双重因子验证（2FA）？</title><link>https://www.webdong.dev/zh-cn/post/how-and-why-two-factor-authentication/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/how-and-why-two-factor-authentication/</guid><description>随着越来越多的软体推广与强制双重因子验证 2FA，我的手机也装上了 Google Authenticator，但老实说，很长一段时间我只知道「打开 App → 输入六位数字」，对于这组数字为什么会一直变、伺服器又是怎么验证的，其实没有真正了解过。直到最近在测试一些相关登入逻辑才回来补齐这块知识。</description><pubDate>Thu, 25 Dec 2025 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>為什麼需要雙重因子驗證（2FA）？</title><link>https://www.webdong.dev/zh-tw/post/how-and-why-two-factor-authentication/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/how-and-why-two-factor-authentication/</guid><description>隨著越來越多的軟體推廣與強制雙重因子驗證 2FA，我的手機也裝上了 Google Authenticator，但老實說，很長一段時間我只知道「打開 App → 輸入六位數字」，對於這組數字為什麼會一直變、伺服器又是怎麼驗證的，其實沒有真正了解過。直到最近在測試一些相關登入邏輯才回來補齊這塊知識。</description><pubDate>Thu, 25 Dec 2025 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>如何於 2026 年建構前端自動化測試</title><link>https://www.webdong.dev/zh-tw/post/2026-frontend-testing/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/2026-frontend-testing/</guid><description>前端測試一直存在龐大的需求，但具體討論如何實戰中建構合理測試體制的討論文章卻不多，隨著社群工具成熟與不同的嘗試下我摸索出一套實戰可採用的方式替團隊建構設施。這篇文章參雜主觀意見與特定的上下文，主要統整近期在工作中的經驗選擇某項解決方案之前必須知道自己選擇的原因以及未來的走向，有太多已經被淘汰的技術與陳舊代碼。</description><pubDate>Thu, 18 Dec 2025 00:00:00 GMT</pubDate><category>Software Testing</category><category>unsorted</category></item><item><title>How is Time Calculated and Stored in Programming?</title><link>https://www.webdong.dev/en/post/datetime-in-programming/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/datetime-in-programming/</guid><description>I always relying on convenient libraries like: dayjs for date conversion. This article aims to clarify the knowledge necessary for handling time in programming.</description><pubDate>Tue, 16 Dec 2025 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>程序中时间是如何计算与存储的？</title><link>https://www.webdong.dev/zh-cn/post/datetime-in-programming/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/datetime-in-programming/</guid><description>我一直对程式中日期存在个模糊不可靠的概念，通常依靠方便的库像是：dayjs 去处理日期转换，但底层的原理至今仍不是很清楚，只知道时间是相对的，且存储方式可能是某种标准格式，这篇文章将尽可能补全程式处理时间所需要的知识。关于时区的规则与电脑运算存储时间的概念。</description><pubDate>Tue, 16 Dec 2025 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>程式中時間是如何計算與存儲的？</title><link>https://www.webdong.dev/zh-tw/post/datetime-in-programming/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/datetime-in-programming/</guid><description>我一直對程式中日期存在個模糊不可靠的概念，通常依靠方便的庫像是：dayjs 去處理日期轉換，但底層的原理至今仍不是很清楚，只知道時間是相對的，且存儲方式可能是某種標準格式，這篇文章將盡可能補全程式處理時間所需要的知識。關於時區的規則與電腦運算存儲時間的概念。</description><pubDate>Tue, 16 Dec 2025 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>How are Passwords Stored?</title><link>https://www.webdong.dev/en/post/how-are-passwords-stored/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/how-are-passwords-stored/</guid><description>I found a simple explanatory video: You&apos;re Storing Passwords Wrong. Here&apos;s The Fix - LearnThatStack, so I will record knowledge related to password storage.</description><pubDate>Mon, 15 Dec 2025 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>unsorted</category></item><item><title>密码是如何被存储的？哪些机制预防密码泄漏？</title><link>https://www.webdong.dev/zh-cn/post/how-are-passwords-stored/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/how-are-passwords-stored/</guid><description>虽然之前制作过一个笔记网站有建构用户注册的部份：my-note，但没有笔记下来发现忘了很多概念，碰巧看到我看过最简单好懂的解说影片：You&apos;re Storing Passwords Wrong. Here&apos;s The Fix - LearnThatStack，把密码保存相关的知识都纪录一下。</description><pubDate>Mon, 15 Dec 2025 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>unsorted</category></item><item><title>密碼是如何被存儲的？哪些機制預防密碼洩漏？</title><link>https://www.webdong.dev/zh-tw/post/how-are-passwords-stored/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/how-are-passwords-stored/</guid><description>雖然之前製作過一個筆記網站有建構用戶註冊的部份：my-note，但沒有筆記下來發現忘了很多概念，碰巧看到我看過最簡單好懂的解說影片：You&apos;re Storing Passwords Wrong. Here&apos;s The Fix - LearnThatStack，把密碼保存相關的知識都紀錄一下。</description><pubDate>Mon, 15 Dec 2025 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>unsorted</category></item><item><title>ASCII, Unicode, UTF-8? How do computers process text?</title><link>https://www.webdong.dev/en/post/how-do-computers-process-text/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/how-do-computers-process-text/</guid><description>I realized that I don&apos;t fully understand how strings work in Go. Explored documentation to understand the history and evolution of text encoding.</description><pubDate>Mon, 08 Dec 2025 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>ASCII、Unicode、UTF-8、UTF-16？计算机是如何处理文本的？</title><link>https://www.webdong.dev/zh-cn/post/how-do-computers-process-text/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/how-do-computers-process-text/</guid><description>近期在 Go 处理字串时发现对于电脑处理文字的原理不是很透彻，所以翻了更多教学文件了解电脑是如何处理文字的。历史上电脑如何处理文字？以及后续 ASCII、Unicode、UTF-8、UTF-16 相关演进特点与背后取舍，了解为什么现代文字编码都使用 UTF-8。</description><pubDate>Mon, 08 Dec 2025 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>ASCII、Unicode、UTF-8、UTF-16？電腦是如何處理文字的？</title><link>https://www.webdong.dev/zh-tw/post/how-do-computers-process-text/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/how-do-computers-process-text/</guid><description>近期在 Go 處理字串時發現對於電腦處理文字的原理不是很透徹，所以翻了更多教學文件了解電腦是如何處理文字的。歷史上電腦如何處理文字？以及後續 ASCII、Unicode、UTF-8、UTF-16 相關演進特點與背後取捨，了解為什麼現代文字編碼都使用 UTF-8。</description><pubDate>Mon, 08 Dec 2025 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>String Handling in Go Using Rune</title><link>https://www.webdong.dev/en/post/go-rune-and-characters/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/go-rune-and-characters/</guid><description>When indexing position `n` in a Go string, why isn&apos;t the `n`th character returned? In Go, you get a &quot;Rune&quot;; direct indexing gets you a byte.</description><pubDate>Sat, 06 Dec 2025 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>Go 字符串处理使用 Rune</title><link>https://www.webdong.dev/zh-cn/post/go-rune-and-characters/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/go-rune-and-characters/</guid><description>当在 Go 字串中索引位置 `n` 时，为什么没有得到第 `n` 个字元？相较于其他程式语言一串文字在遍历时会预期拿到单一个字符，在 Go 会拿到「Rune」；如果直接透过索引取得 string 内容会拿到 byte。透过实际解 Codewars 题目了解处理字串要留意的东西</description><pubDate>Sat, 06 Dec 2025 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>Go 字串處理使用 Rune</title><link>https://www.webdong.dev/zh-tw/post/go-rune-and-characters/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/go-rune-and-characters/</guid><description>當在 Go 字串中索引位置 `n` 時，為什麼沒有得到第 `n` 個字元？相較於其他程式語言一串文字在遍歷時會預期拿到單一個字符，在 Go 會拿到「Rune」；如果直接透過索引取得 string 內容會拿到 byte。透過實際解 Codewars 題目了解處理字串要留意的東西</description><pubDate>Sat, 06 Dec 2025 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>Go Struct Tag and reflect</title><link>https://www.webdong.dev/en/post/go-struct-tag/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/go-struct-tag/</guid><description>When interacting with MongoDB, I encountered unfamiliar syntax in Struct fields. This article explores why Go Struct Tags exist and the problems they solve.</description><pubDate>Sun, 30 Nov 2025 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>Go Struct Tag 是什么？如何透过 reflect 动态处理栏位？</title><link>https://www.webdong.dev/zh-cn/post/go-struct-tag/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/go-struct-tag/</guid><description>最近在与 MongoDB 互动时发现 Struct 栏位结尾有一段语法不是很熟悉，这篇文章探讨 Struct Tag 存在的原因以及解决什么问题。与其命令式的操纵资料，透过宣告式的方式来描述资料格式是 Struct Tag 的主要用途。</description><pubDate>Sun, 30 Nov 2025 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>Go Struct Tag 是什麼？如何透過 reflect 動態處理欄位？</title><link>https://www.webdong.dev/zh-tw/post/go-struct-tag/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/go-struct-tag/</guid><description>最近在與 MongoDB 互動時發現 Struct 欄位結尾有一段語法不是很熟悉，這篇文章探討 Struct Tag 存在的原因以及解決什麼問題。與其命令式的操縱資料，透過宣告式的方式來描述資料格式是 Struct Tag 的主要用途。</description><pubDate>Sun, 30 Nov 2025 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>Go 非同步運算 (Goroutine)</title><link>https://www.webdong.dev/zh-tw/post/go-multi-tasks/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/go-multi-tasks/</guid><description>Goroutine 是由 Go 語言本身管理的輕量級執行緒（User-space Thread），而不是由作業系統管理的執行緒（OS Thread）。背後使用 M:N 排程模型。這意味著，M 個 Goroutine 會被分配到 N 個作業系統執行緒（OS Threads）上執行。</description><pubDate>Tue, 18 Nov 2025 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>Symmetric encryption and asymmetric encryption</title><link>https://www.webdong.dev/en/post/symmetric-encryption-and-asymmetric-encryption/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/symmetric-encryption-and-asymmetric-encryption/</guid><description>Symmetric encryption uses the same key for encryption and decryption by both parties, posing risks such as key sharing and interception</description><pubDate>Wed, 12 Nov 2025 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>unsorted</category></item><item><title>对称加密与非对称加密</title><link>https://www.webdong.dev/zh-cn/post/symmetric-encryption-and-asymmetric-encryption/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/symmetric-encryption-and-asymmetric-encryption/</guid><description>「对称加密」就是通讯双方进行加密与解密使用相同的金耀，但除了双方都要保守金钥外，怎么让双方都持有相同的金钥本身就是个问题，存在被劫持的风险（中间人攻击）。 「非对称加密」透过一对金钥（Key Pair），也就是公钥与私钥来解决对称加密会遇到的问题。</description><pubDate>Wed, 12 Nov 2025 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>unsorted</category></item><item><title>對稱加密與非對稱加密</title><link>https://www.webdong.dev/zh-tw/post/symmetric-encryption-and-asymmetric-encryption/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/symmetric-encryption-and-asymmetric-encryption/</guid><description>「對稱加密」就是通訊雙方進行加密與解密使用相同的金耀，但除了雙方都要保守金鑰外，怎麼讓雙方都持有相同的金鑰本身就是個問題，存在被劫持的風險（中間人攻擊）。「非對稱加密」透過一對金鑰（Key Pair），也就是公鑰與私鑰來解決對稱加密會遇到的問題。</description><pubDate>Wed, 12 Nov 2025 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>unsorted</category></item><item><title>Slicce vs Array in Go</title><link>https://www.webdong.dev/en/post/array-vs-slice-in-go/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/array-vs-slice-in-go/</guid><description>In Go, there are two common data structures for &quot;sequence data&quot;: Array and Slice. They are similar in syntax, but the differences in behavior.</description><pubDate>Sun, 09 Nov 2025 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>Go Slice vs Array 差異與底層原理</title><link>https://www.webdong.dev/zh-cn/post/array-vs-slice-in-go/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/array-vs-slice-in-go/</guid><description>在 Go 语言中，有两种常见的资料结构可用于表示「序列资料」：Array 与 Slice。这两者在语法上相似，但背后行为与使用情境差异非常关键。简单来说，Array 是固定长度（Static Array），而 Slice 是动态长度（Dynamic Array）。</description><pubDate>Sun, 09 Nov 2025 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>Go Slice vs Array 差異與底層原理</title><link>https://www.webdong.dev/zh-tw/post/array-vs-slice-in-go/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/array-vs-slice-in-go/</guid><description>在 Go 語言中，有兩種常見的資料結構可用於表示「序列資料」：Array 與 Slice。這兩者在語法上相似，但背後行為與使用情境差異非常關鍵。簡單來說，Array 是固定長度（Static Array），而 Slice 是動態長度（Dynamic Array）。</description><pubDate>Sun, 09 Nov 2025 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>GitLab Mirror: Easy Syncing of Git Repos in 3 Minutes</title><link>https://www.webdong.dev/en/post/gitlab-repo-mirror/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/gitlab-repo-mirror/</guid><description>My recent work involves migrating GitLab to GitHub, Fortunately, GitLab has had a feature called Mirroring for a long time.</description><pubDate>Sat, 01 Nov 2025 00:00:00 GMT</pubDate><category>Git</category><category>unsorted</category></item><item><title>GitLab Mirror 3 分钟轻松迁移与同步 Git Repo</title><link>https://www.webdong.dev/zh-cn/post/gitlab-repo-mirror/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/gitlab-repo-mirror/</guid><description>近期工作上计划将 GitLab 迁移到 GitHub，但光是腾出时间进行专案迁移就感觉很麻烦，也因此很多计画被耽搁着，像是建构 CI 自动化测试环境、导入 AI 代码审核。幸好 GitLab 很早就有一项功能叫做 Mirroring。</description><pubDate>Sat, 01 Nov 2025 00:00:00 GMT</pubDate><category>Git</category><category>unsorted</category></item><item><title>GitLab Mirror 3 分鐘輕鬆遷移與同步 Git Repo</title><link>https://www.webdong.dev/zh-tw/post/gitlab-repo-mirror/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/gitlab-repo-mirror/</guid><description>近期工作上計劃將 GitLab 遷移到 GitHub，但光是騰出時間進行專案遷移就感覺很麻煩，也因此很多計畫被耽擱著，像是建構 CI 自動化測試環境、導入 AI 代碼審核。幸好 GitLab 很早就有一項功能叫做 Mirroring。</description><pubDate>Sat, 01 Nov 2025 00:00:00 GMT</pubDate><category>Git</category><category>unsorted</category></item><item><title>Quickly Uderstand TypeScript Generics</title><link>https://www.webdong.dev/en/post/typescript-generic/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/typescript-generic/</guid><description>I&apos;ve always had a fear of TypeScript generics with all the &lt;T&gt;, &lt;U&gt;, extends. It seems daunting, but generics are essential for specific problems.</description><pubDate>Tue, 28 Oct 2025 00:00:00 GMT</pubDate><category>TypeScript</category><category>unsorted</category></item><item><title>速通了解 TypeScript 泛型</title><link>https://www.webdong.dev/zh-cn/post/typescript-generic/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/typescript-generic/</guid><description>对于 TypeScript 的泛型我一直有种恐惧，什么满满的 `&lt;T&gt;`、`&lt;U&gt;`、`extends`、多层嵌套，看起来就很可怕。毕竟在日常开发里，好像也不太需要……对吧？的确解决小问题如此，但在特定问题下泛型将会非常必要。</description><pubDate>Tue, 28 Oct 2025 00:00:00 GMT</pubDate><category>TypeScript</category><category>unsorted</category></item><item><title>速通了解 TypeScript 泛型</title><link>https://www.webdong.dev/zh-tw/post/typescript-generic/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/typescript-generic/</guid><description>對於 TypeScript 的泛型我一直有種恐懼，什麼滿滿的 `&lt;T&gt;`、`&lt;U&gt;`、`extends`、多層嵌套，看起來就很可怕。畢竟在日常開發裡，好像也不太需要……對吧？的確解決小問題如此，但在特定問題下泛型將會非常必要。</description><pubDate>Tue, 28 Oct 2025 00:00:00 GMT</pubDate><category>TypeScript</category><category>unsorted</category></item><item><title>CPU Core / Process / Thread / Fiber / Coroutine 差異與解釋</title><link>https://www.webdong.dev/zh-tw/post/core-process-thread/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/core-process-thread/</guid><description>程式是可被執行的代碼或指令，而作業系統透過統整不同概念達成有效率的執行程式，理解以下概念可以幫助更好理解多工程式的運作原理與運行效率最佳化：CPU Core（處理器核心）、Process（進程 / 程序）、Thread（線程 / 執行緒）。</description><pubDate>Sun, 26 Oct 2025 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>Pitfalls Encountered in Frontend Automation Testing</title><link>https://www.webdong.dev/en/post/testing-in-modern-frontend/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/testing-in-modern-frontend/</guid><description>The ever-changing complexity of frontend UI leads to various challenges in testing tools and methods. The difficulties along the way.</description><pubDate>Mon, 20 Oct 2025 00:00:00 GMT</pubDate><category>Software Testing</category><category>unsorted</category></item><item><title>前端自动化测试会遇上的坑</title><link>https://www.webdong.dev/zh-cn/post/testing-in-modern-frontend/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/testing-in-modern-frontend/</guid><description>前端 UI 一直是多变且复杂的题材，经历各种工具迭代与起伏，有很长一段时间其实并没有什么特别统一良好的方式进行测试。在经历过太多次的跌宕变化过后，纪录我认为现阶段怎么打造可被验证的前端与未来趋势与过程中实际遇到的各种困难。</description><pubDate>Mon, 20 Oct 2025 00:00:00 GMT</pubDate><category>Software Testing</category><category>unsorted</category></item><item><title>前端自動化測試會遇上的坑</title><link>https://www.webdong.dev/zh-tw/post/testing-in-modern-frontend/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/testing-in-modern-frontend/</guid><description>前端 UI 一直是多變且複雜的題材，經歷各種工具迭代與起伏，有很長一段時間其實並沒有什麼特別統一良好的方式進行測試。在經歷過太多次的跌宕變化過後，紀錄我認為現階段怎麼打造可被驗證的前端與未來趨勢與過程中實際遇到的各種困難。</description><pubDate>Mon, 20 Oct 2025 00:00:00 GMT</pubDate><category>Software Testing</category><category>unsorted</category></item><item><title>JavaScript Array Lazy Evaluation Through Iterator Helper</title><link>https://www.webdong.dev/en/post/array-iterator-helper/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/array-iterator-helper/</guid><description>Understand the Iterator Protocol and Generator, and arrays benefit from the new iterator helper for lazy evaluation.</description><pubDate>Wed, 15 Oct 2025 00:00:00 GMT</pubDate><category>JavaScript</category><category>unsorted</category></item><item><title>JavaScript 数组惰性求值通过 iterator helper</title><link>https://www.webdong.dev/zh-cn/post/array-iterator-helper/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/array-iterator-helper/</guid><description>之前提到 JavaScript 的 Iterator Protocol：什么让 JavaScript 数据结构能够被迭代？ 了解 Iterator Protocol 与 Generator，数组自然受惠于最近推出的 iterator helper 进行惰性求值。</description><pubDate>Wed, 15 Oct 2025 00:00:00 GMT</pubDate><category>JavaScript</category><category>unsorted</category></item><item><title>JavaScript 陣列惰性求值透過 iterator helper</title><link>https://www.webdong.dev/zh-tw/post/array-iterator-helper/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/array-iterator-helper/</guid><description>先前提到 JavaScript 的 Iterator Protocol：什麼讓 JavaScript 資料結構能夠被迭代？ 了解 Iterator Protocol 與 Generator，而陣列正是基於 iterator 實做，自然受惠於近期推出的 iterator helper 來進行惰性求值。</description><pubDate>Wed, 15 Oct 2025 00:00:00 GMT</pubDate><category>JavaScript</category><category>unsorted</category></item><item><title>What makes JavaScript Iterables Iterable?</title><link>https://www.webdong.dev/en/post/javascript-iterator/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/javascript-iterator/</guid><description>Have you wondered why arrays can be iterated (for...of) but objects cannot? Iterables rely on the Iterator Protocol to implement iterable data structures.</description><pubDate>Tue, 14 Oct 2025 00:00:00 GMT</pubDate><category>JavaScript</category><category>unsorted</category></item><item><title>什么让 JavaScript 数据结构能够被迭代？ 了解 Iterator Protocol 与 Generator</title><link>https://www.webdong.dev/zh-cn/post/javascript-iterator/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/javascript-iterator/</guid><description>你有想过为什么阵列可以被迭代处理（for...of）但物件不行吗？ Iterables 背后仰赖 Iterator Protocol 来实践可被迭代的资料结构。基于 Iterator Protocol 的概念更是伸展到 Generator Function 相关的知识点，可以创造更多特殊的资料结构。</description><pubDate>Tue, 14 Oct 2025 00:00:00 GMT</pubDate><category>JavaScript</category><category>unsorted</category></item><item><title>什麼讓 JavaScript 資料結構能夠被迭代？ 了解 Iterator Protocol 與 Generator</title><link>https://www.webdong.dev/zh-tw/post/javascript-iterator/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/javascript-iterator/</guid><description>你有想過為什麼陣列可以被迭代處理（for...of）但物件不行嗎？Iterables 背後仰賴 Iterator Protocol 來實踐可被迭代的資料結構。基於 Iterator Protocol 的概念更是伸展到 Generator Function 相關的知識點，可以創造更多特殊的資料結構。</description><pubDate>Tue, 14 Oct 2025 00:00:00 GMT</pubDate><category>JavaScript</category><category>unsorted</category></item><item><title>A Simple Explanation of Monad</title><link>https://www.webdong.dev/en/post/monad/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/monad/</guid><description>The benefit of Functor is: it allows us to operate on different &quot;container types&quot; in the same way, preserving the structure while we compute values inside.</description><pubDate>Tue, 07 Oct 2025 00:00:00 GMT</pubDate><category>Functional Programming</category><category>unsorted</category></item><item><title>实际简单的 Monad 解释</title><link>https://www.webdong.dev/zh-cn/post/monad/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/monad/</guid><description>Functor 的好处是：它让我们能用同样的方式操作不同的「容器型别」，想像成一个「装值的盒子」，它允许我们对盒子里的值进行运算，但同时又保留了盒子的结构。 Functor 「提供了方式在容器里操作值」，遵循同一性（Identity）与合成性（Composition）。</description><pubDate>Tue, 07 Oct 2025 00:00:00 GMT</pubDate><category>Functional Programming</category><category>unsorted</category></item><item><title>實際簡白的 Monad 解釋</title><link>https://www.webdong.dev/zh-tw/post/monad/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/monad/</guid><description>Functor 的好處是：它讓我們能用同樣的方式操作不同的「容器型別」，想像成一個「裝值的盒子」，它允許我們對盒子裡的值進行運算，但同時又保留了盒子的結構。Functor 「提供了方式在容器裡操作值」，遵循同一性（Identity）與合成性（Composition）。</description><pubDate>Tue, 07 Oct 2025 00:00:00 GMT</pubDate><category>Functional Programming</category><category>unsorted</category></item><item><title>Simple Explanation of Applicative Functor</title><link>https://www.webdong.dev/en/post/applicative/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/applicative/</guid><description>The `map` of Functor can only operate on values, not &quot;values within a container,&quot; necessitating the Applicative Functor.</description><pubDate>Sun, 05 Oct 2025 00:00:00 GMT</pubDate><category>Functional Programming</category><category>unsorted</category></item><item><title>实际简洁的 Applicative Functor 解释</title><link>https://www.webdong.dev/zh-cn/post/applicative/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/applicative/</guid><description>从先前 Functor 的概念出发，Functor 的 `map` 只能作用在数值上，而不能是「存在于容器中的数值」上，所以才需要 Applicative Functor，一种比 Functor 更多功能的结构，除了满足 Functor 的功能外还能「让盒子里的函数作用（apply）到另一盒子的值」。</description><pubDate>Sun, 05 Oct 2025 00:00:00 GMT</pubDate><category>Functional Programming</category><category>unsorted</category></item><item><title>實際簡白的 Applicative Functor 解釋</title><link>https://www.webdong.dev/zh-tw/post/applicative/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/applicative/</guid><description>從先前 Functor 的概念出發，Functor 的 `map` 只能作用在數值上，而不能是「存在於容器中的數值」上，所以才需要 Applicative Functor，一種比 Functor 更多功能的結構，除了滿足 Functor 的功能外還能「讓盒子裡的函數作用（apply）到另一盒子的值」。</description><pubDate>Sun, 05 Oct 2025 00:00:00 GMT</pubDate><category>Functional Programming</category><category>unsorted</category></item><item><title>Function Composition and Pointfree Coding Style</title><link>https://www.webdong.dev/en/post/pointfree/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/pointfree/</guid><description>A coding style that emphasizes composing functions rather than handling specific data, defining functions without explicit parameters.</description><pubDate>Sat, 04 Oct 2025 00:00:00 GMT</pubDate><category>Functional Programming</category><category>unsorted</category></item><item><title>Pointfree 代码风格通过函数组合提升代码质量</title><link>https://www.webdong.dev/zh-cn/post/pointfree/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/pointfree/</guid><description>一种代码风格，着重于函式的组合关系而非具体资料，定义函式时不显式提其参数（points），而是透过函式组合与高阶函式来表达资料流动。可以减少不必要的命名保持代码简洁与达成更好的通用组合性，但是额外的抽象须被理解与熟悉。透过两个实际案例熟悉 Pointfree 开发风格。</description><pubDate>Sat, 04 Oct 2025 00:00:00 GMT</pubDate><category>Functional Programming</category><category>unsorted</category></item><item><title>Pointfree 代碼風格透過函式組合提昇代碼品質</title><link>https://www.webdong.dev/zh-tw/post/pointfree/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/pointfree/</guid><description>一種代碼風格，著重於函式的組合關係而非具體資料，定義函式時不顯式提其參數（points），而是透過函式組合與高階函式來表達資料流動。可以減少不必要的命名保持代碼簡潔與達成更好的通用組合性，但是額外的抽象須被理解與熟悉。透過兩個實際案例熟悉 Pointfree 開發風格。</description><pubDate>Sat, 04 Oct 2025 00:00:00 GMT</pubDate><category>Functional Programming</category><category>unsorted</category></item><item><title>A Simple and Clear Explanation of Functor</title><link>https://www.webdong.dev/en/post/functor/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/functor/</guid><description>I&apos;m not a mathematician and I&apos;m not very interested in category theory, but it profoundly relates to advanced concepts of Functional Programming.</description><pubDate>Thu, 02 Oct 2025 00:00:00 GMT</pubDate><category>Functional Programming</category><category>unsorted</category></item><item><title>实际简单的 Functor 解释</title><link>https://www.webdong.dev/zh-cn/post/functor/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/functor/</guid><description>我不是数学家也对于范畴论没有太大兴趣，但它深刻的与 Functional Programming 进阶理念挂勾，透过实战了解开发层面这些理论可以如何撰写更好维护的程式。 Functor 是一种具有 map 方法的结构，允许对其中的值进行转换同时保持结构不变、让函数可以基于容器进行组合，意味着可以被用于封装副作用或情境。</description><pubDate>Thu, 02 Oct 2025 00:00:00 GMT</pubDate><category>Functional Programming</category><category>unsorted</category></item><item><title>實際簡白的 Functor 解釋</title><link>https://www.webdong.dev/zh-tw/post/functor/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/functor/</guid><description>我不是數學家也對於範疇論沒有太大興趣，但它深刻的與 Functional Programming 進階理念掛勾，透過實戰了解開發層面這些理論可以如何撰寫更好維護的程式。Functor 是一種具有 map 方法的結構，允許對其中的值進行轉換同時保持結構不變、讓函數可以基於容器進行組合，意味著可以被用於封裝副作用或情境。</description><pubDate>Thu, 02 Oct 2025 00:00:00 GMT</pubDate><category>Functional Programming</category><category>unsorted</category></item><item><title>Optimal Loading Times Contribute to a Better UX</title><link>https://www.webdong.dev/en/post/optimal-loading-times-contribute-to-a-better-ux/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/optimal-loading-times-contribute-to-a-better-ux/</guid><description>Pursuing shorter wait times and faster feedback is crucial. However, rushing to present information may not be optimal.</description><pubDate>Tue, 30 Sep 2025 00:00:00 GMT</pubDate><category>UX</category><category>unsorted</category></item><item><title>探讨适当的加载时长如何打造更好的加载体验</title><link>https://www.webdong.dev/zh-cn/post/optimal-loading-times-contribute-to-a-better-ux/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/optimal-loading-times-contribute-to-a-better-ux/</guid><description>最好的用户体验是即时的，因此追求更短的等待时间和更快的反馈非常重要，然而匆忙的将任何信息显示给用户未必是最佳体验，举例来说：1.进入网页 2.反馈“加载数据中……”3.显示加载完成的数据，以上流程简洁实在，会有什么问题呢？问题出在时机和时间。</description><pubDate>Tue, 30 Sep 2025 00:00:00 GMT</pubDate><category>UX</category><category>unsorted</category></item><item><title>探討適當的載入時長如何打造更好的載入體驗</title><link>https://www.webdong.dev/zh-tw/post/optimal-loading-times-contribute-to-a-better-ux/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/optimal-loading-times-contribute-to-a-better-ux/</guid><description>最美好的使用體驗是即刻的，因此追求更短暫的等待時間越快越早的回饋很重要，然而倉促的將任何當下的資訊拋給用戶未必是最佳體驗，舉例來說：1.進入網頁 2.反饋「載入資料中……」3.顯示載入完成的資料，以上流程簡潔實在，會有什麼問題呢？問題出在時機和時間。</description><pubDate>Tue, 30 Sep 2025 00:00:00 GMT</pubDate><category>UX</category><category>unsorted</category></item><item><title>打造開發者友善的錯誤處理方式（feat. Java, Go, Rust, TS）</title><link>https://www.webdong.dev/zh-tw/post/developer-friendly-error-handling/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/developer-friendly-error-handling/</guid><description>錯誤處理是所有程式都會遇到的問題，特別是在複雜的網頁開發中更是如此。本文將研究不同方法模式與語言探討如何「打造開發者友善的錯誤處理方式」。推薦演講：Unexpected Monad. Is Safe Error Handling Possible in JS/TS?</description><pubDate>Mon, 22 Sep 2025 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>無痛導入的 Vue 無頭表單驗證：VeeValidate</title><link>https://www.webdong.dev/zh-tw/post/veevalidate/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/veevalidate/</guid><description>近期在遷移舊的 Element Plus 專案是必要找到另一款客戶端表單驗證方案，而在使用 Shadcn Vue 過程中發現 VeeValidate 是一款針對 Vue 製作的無頭表單驗證工具，你可以攜帶自己的 UI 整合，使用原生表單元件也不是問題。</description><pubDate>Thu, 11 Sep 2025 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>Learning Go Interface for Polymorphism</title><link>https://www.webdong.dev/en/post/go-interface/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/go-interface/</guid><description>Understanding &quot;Polymorphism&quot; is like &quot;doing something, but the way it is done varies&quot; For example, various &quot;shapes&quot; can &quot;calculate area,&quot;</description><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>学习 Go interface 实践多型</title><link>https://www.webdong.dev/zh-cn/post/go-interface/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/go-interface/</guid><description>对于「多型 Polymorphism」的概念理解像是「要做一件事，但这件事对不同对象来说实践的方式不同」。具体来说像是各种「形状」都可以「算面积」，但背后实践的方法却不同，而在 Go 当中 interface 就是方法的集合。</description><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>學習 Go interface 實踐多型</title><link>https://www.webdong.dev/zh-tw/post/go-interface/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/go-interface/</guid><description>對於「多型 Polymorphism」的概念理解像是「要做一件事，但這件事對不同對象來說實踐的方式不同」。具體來說像是各種「形狀」都可以「算面積」，但背後實踐的方法卻不同，而在 Go 當中 interface 就是方法的集合。</description><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>Go Receiver Function like Class Method</title><link>https://www.webdong.dev/en/post/go-receiver-function/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/go-receiver-function/</guid><description>The first time you see a Go Receiver function, you might wonder what this strange syntax is, with parameters accepted before the function name?</description><pubDate>Tue, 09 Sep 2025 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>像 Class Method 的奇特 Go Receiver Function</title><link>https://www.webdong.dev/zh-cn/post/go-receiver-function/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/go-receiver-function/</guid><description>第一次看到 Go 的 Receiver 函数会觉得这是啥怪语法，函数名前面还能接收参数？Go 语言提倡「Composition over inheritance」，并极力追求代码的简洁性，以此规避 class-based OOP 所带来的复杂性。</description><pubDate>Tue, 09 Sep 2025 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>像 Class Method 的奇特 Go Receiver Function</title><link>https://www.webdong.dev/zh-tw/post/go-receiver-function/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/go-receiver-function/</guid><description>第一次看到 Go 的 Receiver 函式會覺得這是啥怪語法，函式名前面還能接收參數？Go 語言提倡「Composition over inheritance」（組合優於繼承），並極力追求程式碼的簡潔性，以此迴避 class-based OOP 所帶來的複雜性。</description><pubDate>Tue, 09 Sep 2025 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>Learn Go Pointer and Difference with Passing by Reference</title><link>https://www.webdong.dev/en/post/go-pointer/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/go-pointer/</guid><description>Go&apos;s design has all values passed by value; to achieve passing by reference effect, Pointer must be used explicitly.</description><pubDate>Sun, 07 Sep 2025 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>学习 Go Pointer 与 Passing by reference 的差异</title><link>https://www.webdong.dev/zh-cn/post/go-pointer/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/go-pointer/</guid><description>Go 设计上一切数值都是直白的「Passing by value」，会有「Passing by value」的效果原因是因为 Reference Types 带有指标，复制时是复制指标值。要让 Value Types 有 Passing by Reference 的效果要显式的使用 Pointer。</description><pubDate>Sun, 07 Sep 2025 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>學習 Go Pointer 與 Passing by reference 的差異</title><link>https://www.webdong.dev/zh-tw/post/go-pointer/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/go-pointer/</guid><description>Go 設計上一切數值都是直白的「Passing by value」，會有「Passing by value」的效果原因是因為 Reference Types 帶有指標，複製時是複製指標值。要讓 Value Types 有 Passing by Reference 的效果要顯式的使用 Pointer。</description><pubDate>Sun, 07 Sep 2025 00:00:00 GMT</pubDate><category>Go</category><category>unsorted</category></item><item><title>Solve Any Data Table Problem using TanStack Table</title><link>https://www.webdong.dev/en/post/tanstack-table/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/tanstack-table/</guid><description>TanStack Table is a awesome library that at first glance may seem overly complex but actually saves countless hours of time.</description><pubDate>Tue, 02 Sep 2025 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>TanStack Table 拯救前端复杂的数据表格呈现问题</title><link>https://www.webdong.dev/zh-cn/post/tanstack-table/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/tanstack-table/</guid><description>前端生涯中遇到无数攸关资料呈现的需求需要解决，而 TanStack Table 是一款第一眼看起来很多余复杂但实际上能省下无数时间的一个优质套件，如果有任何「大量表单、中大型表单应用」我会强烈推荐。在实际工作中我透过导入 TanStack Table 在几天时间内就能把现有表单大多复杂功能重现。</description><pubDate>Tue, 02 Sep 2025 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>TanStack Table 拯救前端複雜的資料表格呈現問題</title><link>https://www.webdong.dev/zh-tw/post/tanstack-table/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/tanstack-table/</guid><description>前端生涯中遇到無數攸關資料呈現的需求需要解決，而 TanStack Table 是一款第一眼看起來很多餘複雜但實際上能省下無數時間的一個優質套件，如果有任何「大量表單、中大型表單應用」我會強烈推薦。在實際工作中我透過導入 TanStack Table 在幾天時間內就能把現有表單大多複雜功能重現。</description><pubDate>Tue, 02 Sep 2025 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>Create API Contracts (GraphQL, tRPC, oRPC) and Workarounds</title><link>https://www.webdong.dev/en/post/frontend-and-backend-api-sync/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/frontend-and-backend-api-sync/</guid><description>Using TypeScript to ensure type safety in large frontend projects is common, but API communication can introduce vulnerabilities that compromise type safety.</description><pubDate>Tue, 26 Aug 2025 00:00:00 GMT</pubDate><category>Infrastructure</category><category>unsorted</category></item><item><title>打造前后端 API 数据合约（GraphQL、tRPC、oRPC）与相关变通方案</title><link>https://www.webdong.dev/zh-cn/post/frontend-and-backend-api-sync/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/frontend-and-backend-api-sync/</guid><description>使用 TypeScript 确保程式型别安全以维持大型前端专案的品质和维护性已经是很成熟且常见的做法，但有一项最常见的破口会让程式变得脆弱且混乱：「程式间 API 沟通」。 TypeScript 本身虽然能静态检查程式内部的型别正确性，但只能在程式执行阶段验证资料格式才能真正确保型别安全。</description><pubDate>Tue, 26 Aug 2025 00:00:00 GMT</pubDate><category>Infrastructure</category><category>unsorted</category></item><item><title>打造前後端 API 資料合約（GraphQL、tRPC、oRPC）與相關變通方案</title><link>https://www.webdong.dev/zh-tw/post/frontend-and-backend-api-sync/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/frontend-and-backend-api-sync/</guid><description>使用 TypeScript 確保程式型別安全以維持大型前端專案的品質和維護性已經是很成熟且常見的做法，但有一項最常見的破口會讓程式變得脆弱且混亂：「程式間 API 溝通」。TypeScript 本身雖然能靜態檢查程式內部的型別正確性，但只能在程式執行階段驗證資料格式才能真正確保型別安全。</description><pubDate>Tue, 26 Aug 2025 00:00:00 GMT</pubDate><category>Infrastructure</category><category>unsorted</category></item><item><title>Why Does Shadcn use cn() Helper Functions?</title><link>https://www.webdong.dev/en/post/tailwind-merge-and-clsx-in-shadcn/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/tailwind-merge-and-clsx-in-shadcn/</guid><description>If you browse through Shadcn&apos;s component set, you&apos;ll find extensive use of a helper function cn, which uses twMerge(clsx(inputs)).</description><pubDate>Wed, 20 Aug 2025 00:00:00 GMT</pubDate><category>CSS</category><category>Tailwind</category></item><item><title>twMerge() + clsx() = cn() ？Shadcn 为什么要用这些辅助函数？</title><link>https://www.webdong.dev/zh-cn/post/tailwind-merge-and-clsx-in-shadcn/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/tailwind-merge-and-clsx-in-shadcn/</guid><description>如果翻阅 Shadcn 组件集的组件会发现大量使用到一个辅助函数 cn，背后是使用 twMerge(clsx(inputs))，它实质是两个库的组合，方便构建 Tailwind 样式。为什么需要额外的库和方法来构建组件样式呢？</description><pubDate>Wed, 20 Aug 2025 00:00:00 GMT</pubDate><category>CSS</category><category>Tailwind</category></item><item><title>twMerge() + clsx() = cn() ？為啥 Shadcn 要用這些輔助函式？</title><link>https://www.webdong.dev/zh-tw/post/tailwind-merge-and-clsx-in-shadcn/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/tailwind-merge-and-clsx-in-shadcn/</guid><description>如果翻閱 Shadcn 元件集的元件會發現大量使用到一個輔助函式 cn，背後使用 twMerge(clsx(inputs))，它其實是兩套函式庫的組成，用於更方便建構元件當中 Tailwind 的樣式。為什麼會需要額外的庫和方法來建構元件樣式呢？</description><pubDate>Wed, 20 Aug 2025 00:00:00 GMT</pubDate><category>CSS</category><category>Tailwind</category></item><item><title>什麼是單一登入（SSO）？它解決什麼問題？</title><link>https://www.webdong.dev/zh-tw/post/what-is-sso/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/what-is-sso/</guid><description>不少網站登入時都有關於「Single Sign-On」的選項，像是只要登入 Google 帳號，就可以橫跨不同服務如 YouTube、Gmail，從痛點了解 SSO 如何解決多個服務間登入造成的潛在問題與相關流程，打造更方便與安全的登入體驗。</description><pubDate>Tue, 19 Aug 2025 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>unsorted</category></item><item><title>Integrate Figma MCP and Shadcn MCP to build UI</title><link>https://www.webdong.dev/en/post/integrate-figmamcp-and-shadcnmcp/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/integrate-figmamcp-and-shadcnmcp/</guid><description>By integrating Figma MCP and Shadcn MCP Server, maybe we can precisely build frontend interfaces through chat with AI.</description><pubDate>Mon, 18 Aug 2025 00:00:00 GMT</pubDate><category>AI</category><category>unsorted</category></item><item><title>通过 Figma MCP 与 Shadcn MCP 通过与 AI 聊天打造前端界面</title><link>https://www.webdong.dev/zh-cn/post/integrate-figmamcp-and-shadcnmcp/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/integrate-figmamcp-and-shadcnmcp/</guid><description>UI 通常仰赖设计者与前端耗费大量时间精力进行组织与维护，近期工作上进行前端翻新也遇到大量陈旧代码需要翻皮的作业，问题是谁有时间一个一个重新替换？尝试串上 Figma MCP 与 Shadcn MCP Server 让我们透过与 AI 聊天就能精准打造前端介面。</description><pubDate>Mon, 18 Aug 2025 00:00:00 GMT</pubDate><category>AI</category><category>unsorted</category></item><item><title>透過 Figma MCP 與 Shadcn MCP 透過與 AI 聊天打造前端介面</title><link>https://www.webdong.dev/zh-tw/post/integrate-figmamcp-and-shadcnmcp/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/integrate-figmamcp-and-shadcnmcp/</guid><description>UI 通常仰賴設計者與前端耗費大量時間精力進行組織與維護，近期工作上進行前端翻新也遇到大量陳舊代碼需要翻皮的作業，問題是誰有時間一個一個重新替換？嘗試串上 Figma MCP 與 Shadcn MCP Server 讓我們透過與 AI 聊天就能精準打造前端介面。</description><pubDate>Mon, 18 Aug 2025 00:00:00 GMT</pubDate><category>AI</category><category>unsorted</category></item><item><title>Webpage lagging during rendering? Try List Virtualization</title><link>https://www.webdong.dev/en/post/list-virtualization-pattern/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/list-virtualization-pattern/</guid><description>Rendering is performance bottleneck in web, especially in dashboard or large data lists. It skips the performance burden by &quot;only rendering visible items.&quot;</description><pubDate>Sat, 09 Aug 2025 00:00:00 GMT</pubDate><category>Web Performance</category><category>unsorted</category></item><item><title>网页渲染太多东西开始卡顿？让列表虚拟化来解决</title><link>https://www.webdong.dev/zh-cn/post/list-virtualization-pattern/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/list-virtualization-pattern/</guid><description>渲染永远是网页运算中极度耗费效能的一块瓶颈之一，而在像是仪表板应用或是大量资料清单如社群媒体版面很容易会遇到前端渲染效率上的问题，透过「只渲染看得到的东西」来减少效能负担。这种模式通常称作 List Virtualization（虚拟化看不到的东西）或 Windowing（只渲染视窗内的东西）。</description><pubDate>Sat, 09 Aug 2025 00:00:00 GMT</pubDate><category>Web Performance</category><category>unsorted</category></item><item><title>網頁渲染太多東西開始卡頓？讓 List Virtualization 來解決</title><link>https://www.webdong.dev/zh-tw/post/list-virtualization-pattern/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/list-virtualization-pattern/</guid><description>渲染永遠是網頁運算中極度耗費效能的一塊瓶頸之一，而在像是儀表板應用或是大量資料清單如社群媒體版面很容易會遇到前端渲染效率上的問題，透過「只渲染看得到的東西」來減少效能負擔。這種模式通常稱作 List Virtualization（虛擬化看不到的東西）或 Windowing（只渲染視窗內的東西）。</description><pubDate>Sat, 09 Aug 2025 00:00:00 GMT</pubDate><category>Web Performance</category><category>unsorted</category></item><item><title>What is the Model Context Protocol?</title><link>https://www.webdong.dev/en/post/what-is-mcp/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/what-is-mcp/</guid><description>AI solves clear contextual problems like LeetCode with remarkable efficiency and accuracy. But in real situations, AI struggles. MCP would help.</description><pubDate>Fri, 08 Aug 2025 00:00:00 GMT</pubDate><category>AI</category><category>unsorted</category></item><item><title>模型上下文协议（Model Context Protocol）是什么？对现代开发者有什么影响？</title><link>https://www.webdong.dev/zh-cn/post/what-is-mcp/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/what-is-mcp/</guid><description>AI 解决一些上下文清晰的小题目如 LeetCode 会发现它通常有惊人的效率与准确率，然而在真实情境下 AI 通常没有这么厉害，因为环境上下文和需求是模糊的，如何更好的让 AI 看清与外部世界互动能够达成更有效率的产出，而 MCP 是一种大型语言模型的统一协定帮助达成该目标。</description><pubDate>Fri, 08 Aug 2025 00:00:00 GMT</pubDate><category>AI</category><category>unsorted</category></item><item><title>模型上下文協定（Model Context Protocol）是啥？對現代開發者有什麼影響？</title><link>https://www.webdong.dev/zh-tw/post/what-is-mcp/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/what-is-mcp/</guid><description>AI 解決一些上下文清晰的小題目如 LeetCode 會發現它通常有驚人的效率與準確率，然而在真實情境下 AI 通常沒有這麼厲害，因為環境上下文和需求是模糊的，如何更好的讓 AI 看清與外部世界互動能夠達成更有效率的產出，而 MCP 是一種大型語言模型的統一協定幫助達成該目標。</description><pubDate>Fri, 08 Aug 2025 00:00:00 GMT</pubDate><category>AI</category><category>unsorted</category></item><item><title>Better Server State Management through TanStack Query!</title><link>https://www.webdong.dev/en/post/why-use-vue-query/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/why-use-vue-query/</guid><description>We discussed issues and solutions related to fetching external data. Explore building a better frontend data fetching experience through TanStack Query.</description><pubDate>Wed, 06 Aug 2025 00:00:00 GMT</pubDate><category>Vue</category><category>unsorted</category></item><item><title>如何通过 TanStack Query 构建更好的前端数据获取体验</title><link>https://www.webdong.dev/zh-cn/post/why-use-vue-query/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/why-use-vue-query/</guid><description>先前文章提到：如何优雅的于 Vue 正确的处理资料载入点出了一些获取外部资料延伸带来的问题与实际解方，这次我想透过 TanStack Query 的视角挖掘怎么建构更好的前端资料获取体验。本篇教学继续延续使用 Vue 框架，不过概念对主流框架基本相通。</description><pubDate>Wed, 06 Aug 2025 00:00:00 GMT</pubDate><category>Vue</category><category>unsorted</category></item><item><title>如何透過 TanStack Query 建構更好的前端資料獲取體驗</title><link>https://www.webdong.dev/zh-tw/post/why-use-vue-query/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/why-use-vue-query/</guid><description>先前文章提到：如何優雅的於 Vue 正確的處理資料載入點出了一些獲取外部資料延伸帶來的問題與實際解方，這次我想透過 TanStack Query 的視角挖掘怎麼建構更好的前端資料獲取體驗。本篇教學繼續延續使用 Vue 框架，不過概念對主流框架基本相通。</description><pubDate>Wed, 06 Aug 2025 00:00:00 GMT</pubDate><category>Vue</category><category>unsorted</category></item><item><title>How to Organize Your TypeScript Types</title><link>https://www.webdong.dev/en/post/how-to-organize-your-typescript-types/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/how-to-organize-your-typescript-types/</guid><description>TypeScript type definition files are often created as a global type.ts file, but this can cause confusion as projects grow.</description><pubDate>Mon, 04 Aug 2025 00:00:00 GMT</pubDate><category>TypeScript</category><category>unsorted</category></item><item><title>如何管理 TypeScript 类型文件？</title><link>https://www.webdong.dev/zh-cn/post/how-to-organize-your-typescript-types/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/how-to-organize-your-typescript-types/</guid><description>TypeScript 型别定义档案通常就是在全局创个 type.ts 档案并把所有型别丢里头，随处都能引用很方便，但很多专案初期沿用的习惯到了一定规模就会开始混乱，近期也遇到相关的问题因此研究一下一般有哪些方式管理型别档案。</description><pubDate>Mon, 04 Aug 2025 00:00:00 GMT</pubDate><category>TypeScript</category><category>unsorted</category></item><item><title>如何管理 TypeScript 型別檔案？</title><link>https://www.webdong.dev/zh-tw/post/how-to-organize-your-typescript-types/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/how-to-organize-your-typescript-types/</guid><description>TypeScript 型別定義檔案通常就是在全局創個 type.ts 檔案並把所有型別丟裡頭，隨處都能引用很方便，但很多專案初期沿用的習慣到了一定規模就會開始混亂，近期也遇到相關的問題因此研究一下一般有哪些方式管理型別檔案。</description><pubDate>Mon, 04 Aug 2025 00:00:00 GMT</pubDate><category>TypeScript</category><category>unsorted</category></item><item><title>What Is Feature Flag and What Problem Does It Solve?</title><link>https://www.webdong.dev/en/post/what-is-feature-flag/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/what-is-feature-flag/</guid><description>&quot;Writing code is like building a church; once it&apos;s done, we start praying.&quot; and feature flags are a great technique to manage the risks.</description><pubDate>Sun, 03 Aug 2025 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>什么是 Feature Flag 以及它解决什么问题？</title><link>https://www.webdong.dev/zh-cn/post/what-is-feature-flag/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/what-is-feature-flag/</guid><description>还记得之前参与某个专案使用 Git Flow 的方式管理产品发布，但随着时间过去它与持续进行中的主支线差距越来越大，也是在那次问题之后我更认可 Trunk Based Development 流程的概念，其中提到 Feature Flag 是一种很好的技巧用来降低推送功能的风险与控制程度。</description><pubDate>Sun, 03 Aug 2025 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>什麼是 Feature Flag 以及它解決什麼問題？</title><link>https://www.webdong.dev/zh-tw/post/what-is-feature-flag/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/what-is-feature-flag/</guid><description>還記得之前參與某個專案使用 Git Flow 的方式管理產品發布，但隨著時間過去它與持續進行中的主支線差距越來越大，也是在那次問題之後我更認可 Trunk Based Development 流程的概念，其中提到 Feature Flag 是一種很好的技巧用來降低推送功能的風險與控制程度。</description><pubDate>Sun, 03 Aug 2025 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>How Stacked PRs Improve Code Review Quality?</title><link>https://www.webdong.dev/en/post/stacked-pr/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/stacked-pr/</guid><description>When there&apos;s a change of only 10 lines, one can carefully check the comments; with 1000 lines, everything is LGTM (Looks Good to Me)!</description><pubDate>Wed, 30 Jul 2025 00:00:00 GMT</pubDate><category>Git</category><category>unsorted</category></item><item><title>Stacked PR 如何改善代码审核质量？</title><link>https://www.webdong.dev/zh-cn/post/stacked-pr/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/stacked-pr/</guid><description>当只有 10 行代码改动还可能会细心检查留言，当有 1000 行改动一切都 LGTM（Looks Good to Me）！要让人好好集中精神盯着几千行的代码改动本身就是很难得的事，身为提交的一方，有没有可以改善审核效率的方式？或许能试试看 Stacked PR。</description><pubDate>Wed, 30 Jul 2025 00:00:00 GMT</pubDate><category>Git</category><category>unsorted</category></item><item><title>Stacked PR 如何提昇代碼審查品質</title><link>https://www.webdong.dev/zh-tw/post/stacked-pr/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/stacked-pr/</guid><description>當只有 10 行代碼改動還可能會細心檢查留言，當有 1000 行改動一切都 LGTM（Looks Good to Me）！要讓人好好集中精神盯著幾千行的代碼改動本身就是很難得的事，身為提交的一方，有沒有可以改善審核效率的方式？或許能試試看 Stacked PR。</description><pubDate>Wed, 30 Jul 2025 00:00:00 GMT</pubDate><category>Git</category><category>unsorted</category></item><item><title>Why Choose Shadcn in 2025?</title><link>https://www.webdong.dev/en/post/why-shadcn-in-2025/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/why-shadcn-in-2025/</guid><description>If you are considering building a Tailwind-based component library, this article is worth a read. It examines the current frontend environment and challenges.</description><pubDate>Tue, 29 Jul 2025 00:00:00 GMT</pubDate><category>CSS</category><category>unsorted</category></item><item><title>Shadcn 解决什么问题？为什么它是 2025 最好用的前端 UI 方案？</title><link>https://www.webdong.dev/zh-cn/post/why-shadcn-in-2025/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/why-shadcn-in-2025/</guid><description>如果你在考虑建立基于 Tailwind 的元件库这篇文章值得一看，探讨当下前端环境背景与 UI 扩充难题与问题是如何保持元件弹性点出 Shadcn 如何成为 2025 最热门的 Tailwind 元件解决方案，正巧最近又在导入 Vue Shadcn 就来更齐全的回顾这项工具。</description><pubDate>Tue, 29 Jul 2025 00:00:00 GMT</pubDate><category>CSS</category><category>unsorted</category></item><item><title>Shadcn 解決什麼問題？為什麼它是 2025 最好用的前端 UI 方案？</title><link>https://www.webdong.dev/zh-tw/post/why-shadcn-in-2025/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/why-shadcn-in-2025/</guid><description>如果你在考慮建立基於 Tailwind 的元件庫這篇文章值得一看，探討當下前端環境背景與 UI 擴充難題與問題是如何保持元件彈性點出 Shadcn 如何成為 2025 最熱門的 Tailwind 元件解決方案，正巧最近又在導入 Vue Shadcn 就來更齊全的回顧這項工具。</description><pubDate>Tue, 29 Jul 2025 00:00:00 GMT</pubDate><category>CSS</category><category>unsorted</category></item><item><title>How to Choose Between Cypress and Playwright?</title><link>https://www.webdong.dev/en/post/cypress-vs-playwright/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/cypress-vs-playwright/</guid><description>E2E testing often mentions two options: Cypress and Playwright, both of which I&apos;ve tried. While I prefer Playwright overall, there are more factors to consider.</description><pubDate>Fri, 25 Jul 2025 00:00:00 GMT</pubDate><category>Software Testing</category><category>unsorted</category></item><item><title>Cypress 与 Playwright 如何选择？</title><link>https://www.webdong.dev/zh-cn/post/cypress-vs-playwright/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/cypress-vs-playwright/</guid><description>在网页提到 E2E 测试通常有 Cypress 与 Playwright 两种选项，而两种测试工具我都尝试过。单论整体开发体验来说我更喜欢 Playwright，不过还有更多可以考虑的要素在选择合适的测试工具，纪录我会在意的细节与选择原因。</description><pubDate>Fri, 25 Jul 2025 00:00:00 GMT</pubDate><category>Software Testing</category><category>unsorted</category></item><item><title>Cypress 與 Playwright 如何選擇？</title><link>https://www.webdong.dev/zh-tw/post/cypress-vs-playwright/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/cypress-vs-playwright/</guid><description>在網頁提到 E2E 測試通常有 Cypress 與 Playwright 兩種選項，而兩種測試工具我都嘗試過。單論整體開發體驗來說我更喜歡 Playwright，不過還有更多可以考慮的要素在選擇合適的測試工具，紀錄我會在意的細節與選擇原因。</description><pubDate>Fri, 25 Jul 2025 00:00:00 GMT</pubDate><category>Software Testing</category><category>unsorted</category></item><item><title>What is the Testing Pyramid? Does it Work?</title><link>https://www.webdong.dev/en/post/testing-pyramid/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/testing-pyramid/</guid><description>Recently reviewing some testing concepts, I encountered the testing pyramid from Mike Cohn’s book “Succeeding with Agile: Software Development Using Scrum.”</description><pubDate>Thu, 24 Jul 2025 00:00:00 GMT</pubDate><category>Software Testing</category><category>unsorted</category></item><item><title>什么是测试金字塔？它真的有用吗？</title><link>https://www.webdong.dev/zh-cn/post/testing-pyramid/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/testing-pyramid/</guid><description>近期在回顾一些测试的概念，其中有个测试金字塔的概念来自于 Mike Cohn 的书 《Succeeding with Agile: Software Development Using Scrum》。还没有看过这本书，但这个词汇只要有研究过测试多少都会接触到，这次来重新了解一下并输出自己对这个议题的理解。</description><pubDate>Thu, 24 Jul 2025 00:00:00 GMT</pubDate><category>Software Testing</category><category>unsorted</category></item><item><title>什麼是測試金字塔？它真的有用嗎？</title><link>https://www.webdong.dev/zh-tw/post/testing-pyramid/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/testing-pyramid/</guid><description>近期在回顧一些測試的概念，其中有個測試金字塔的概念來自於 Mike Cohn 的書 《Succeeding with Agile: Software Development Using Scrum》。還沒有看過這本書，但這個詞彙只要有研究過測試多少都會接觸到，這次來重新了解一下並輸出自己對這個議題的理解。</description><pubDate>Thu, 24 Jul 2025 00:00:00 GMT</pubDate><category>Software Testing</category><category>unsorted</category></item><item><title>Use Git Worktree to Reduce Burden of Context Switching</title><link>https://www.webdong.dev/en/post/git-worktree/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/git-worktree/</guid><description>Recently, whether using AI Vibe Coding or switching functions at work, using git stash feels inconvenient. Let&apos;s learn how to use Git Worktree effectively.</description><pubDate>Tue, 22 Jul 2025 00:00:00 GMT</pubDate><category>Git</category><category>unsorted</category></item><item><title>使用 Git Worktree 快速切换复杂的项目情境</title><link>https://www.webdong.dev/zh-cn/post/git-worktree/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/git-worktree/</guid><description>近期不管是用 AI Vibe Coding 还是工作上切换不同功能感觉使用 git stash 不是很方便，虽然大致知道有 git worktree 但都还懒得学直接先跳过。这次有空来学如何使用 Git Worktree 快速切换复杂的专案情境。</description><pubDate>Tue, 22 Jul 2025 00:00:00 GMT</pubDate><category>Git</category><category>unsorted</category></item><item><title>使用 Git Worktree 快速切換複雜的專案情境</title><link>https://www.webdong.dev/zh-tw/post/git-worktree/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/git-worktree/</guid><description>近期不管是用 AI Vibe Coding 還是工作上切換不同功能感覺使用 git stash 不是很方便，雖然大致知道有 git worktree 但都還懶得學直接先跳過。這次有空來學如何使用 Git Worktree 快速切換複雜的專案情境。</description><pubDate>Tue, 22 Jul 2025 00:00:00 GMT</pubDate><category>Git</category><category>unsorted</category></item><item><title>What is Vue defineExpose?</title><link>https://www.webdong.dev/en/post/vue-define-expose/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/vue-define-expose/</guid><description>You may know that Vue components communicate through props down and events up or Scoped Slots to pass info. Another approach is defineExpose.</description><pubDate>Tue, 15 Jul 2025 00:00:00 GMT</pubDate><category>Vue</category><category>unsorted</category></item><item><title>Vue defineExpose 是啥？子组件如何沟通？</title><link>https://www.webdong.dev/zh-cn/post/vue-define-expose/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/vue-define-expose/</guid><description>近期要重写很多的 Vue 发现多得是我需要多补充的知识。你可能了解 Vue 组件间通过 props down 与 event up 或是使用 Scoped Slots 来传递信息。还有一种做法是「显式地暴露某些变量或函数给父组件使用」。</description><pubDate>Tue, 15 Jul 2025 00:00:00 GMT</pubDate><category>Vue</category><category>unsorted</category></item><item><title>Vue defineExpose 是啥？子元件如何溝通？</title><link>https://www.webdong.dev/zh-tw/post/vue-define-expose/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/vue-define-expose/</guid><description>近期要重寫很多的 Vue 發現多得是我需要多補充的知識。你可能了解 Vue 元件間透過 props down 與 event up 或是使用 Scoped Slots 來傳遞資訊。還有一種做法是「顯式地暴露某些變數或函式給父組件使用」。</description><pubDate>Tue, 15 Jul 2025 00:00:00 GMT</pubDate><category>Vue</category><category>unsorted</category></item><item><title>What is JWT and What Problem Does It Solve?</title><link>https://www.webdong.dev/en/post/what-and-why-jwt/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/what-and-why-jwt/</guid><description>JWT stands for JSON Web Token, a standard based on RFC 751 that is used to transmit JSON objects between two entities.</description><pubDate>Sun, 06 Jul 2025 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>unsorted</category></item><item><title>什么是 JWT 以及它解决了什么问题？</title><link>https://www.webdong.dev/zh-cn/post/what-and-why-jwt/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/what-and-why-jwt/</guid><description>JWT 也就是 JSON Web Token，一个基于 RFC 751 的标准，可用于在两个实体（如前端和后端）间进行 JSON 物件的传输。由 header、payload、signature 三种资料所构成，透过 . 来区隔并使用 Base64 编码以便传输。</description><pubDate>Sun, 06 Jul 2025 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>unsorted</category></item><item><title>什麼是 JWT 以及它解決了什麼問題？</title><link>https://www.webdong.dev/zh-tw/post/what-and-why-jwt/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/what-and-why-jwt/</guid><description>JWT 也就是 JSON Web Token，一個基於 RFC 751 的標準，可用於在兩個實體（如前端和後端）間進行 JSON 物件的傳輸。由 header、payload、signature 三種資料所構成，透過 . 來區隔並使用 Base64 編碼以便傳輸。</description><pubDate>Sun, 06 Jul 2025 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>unsorted</category></item><item><title>Difference Between &quot;Authentication&quot; and &quot;Authorization&quot;</title><link>https://www.webdong.dev/en/post/authentication-and-authorization/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/authentication-and-authorization/</guid><description>Authentication and Authorization are two concepts in access control, representing the questions: Who are you? What are you allowed to do?</description><pubDate>Sat, 05 Jul 2025 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>unsorted</category></item><item><title>了解「验证」和「授权」的差别</title><link>https://www.webdong.dev/zh-cn/post/authentication-and-authorization/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/authentication-and-authorization/</guid><description>验证（Authentication）与授权（Authorization）是存取控制中两个常被混淆的概念，背后分别代表两种问题：你是谁？你被允许做哪些事？同时也将介绍几种常见的授权模式，例如 RBAC 与 ABAC 管理授权。</description><pubDate>Sat, 05 Jul 2025 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>unsorted</category></item><item><title>瞭解「驗證」和「授權」的差別</title><link>https://www.webdong.dev/zh-tw/post/authentication-and-authorization/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/authentication-and-authorization/</guid><description>驗證（Authentication）與授權（Authorization）是存取控制中兩個常被混淆的概念，背後分別代表兩種問題：你是誰？你被允許做哪些事？同時也將介紹幾種常見的授權模式，例如 RBAC 與 ABAC 管理授權。</description><pubDate>Sat, 05 Jul 2025 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>unsorted</category></item><item><title>How Jamstack Solves the Problems</title><link>https://www.webdong.dev/en/post/jamstack/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/jamstack/</guid><description>To understand what problems the Jamstack architecture solves, we need to review the history of web evolution, emphasizing pre-generated static pages.</description><pubDate>Tue, 17 Jun 2025 00:00:00 GMT</pubDate><category>Pattern</category><category>unsorted</category></item><item><title>从网页演进看 Jamstack 如何解决传统架构的痛点</title><link>https://www.webdong.dev/zh-cn/post/jamstack/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/jamstack/</guid><description>要了解 Jamstack 架构解决什么问题，需要先回顾网页演变的历史，从静态档案到动态伺服器渲染再到客户端渲染，Jamstack 的核心概念是强调预先生成静态页面并解耦商业逻辑与内容，以提高网站效能、弹性与安全性。适合大多数动态资料不多的网站。</description><pubDate>Tue, 17 Jun 2025 00:00:00 GMT</pubDate><category>Pattern</category><category>unsorted</category></item><item><title>從網頁演進看 Jamstack 如何解決傳統架構的痛點</title><link>https://www.webdong.dev/zh-tw/post/jamstack/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/jamstack/</guid><description>要了解 Jamstack 架構解決什麼問題，需要先回顧網頁演變的歷史，從靜態檔案到動態伺服器渲染再到客戶端渲染，Jamstack 的核心概念是強調預先生成靜態頁面並解耦商業邏輯與內容，以提高網站效能、彈性與安全性。適合大多數動態資料不多的網站。</description><pubDate>Tue, 17 Jun 2025 00:00:00 GMT</pubDate><category>Pattern</category><category>unsorted</category></item><item><title>Fade in and out Content through CSS Pseudo Element</title><link>https://www.webdong.dev/en/post/fade-in-and-out-content-through-css-pseudo-element/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/fade-in-and-out-content-through-css-pseudo-element/</guid><description>I found the my online resume a bit off, resulting in a lack of indication to scroll down. To achieve a fade-in style using CSS pseudo elements.</description><pubDate>Mon, 16 Jun 2025 00:00:00 GMT</pubDate><category>CSS</category><category>unsorted</category></item><item><title>通过渐变伪元素淡入淡出可滚动内容</title><link>https://www.webdong.dev/zh-cn/post/fade-in-and-out-content-through-css-pseudo-element/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/fade-in-and-out-content-through-css-pseudo-element/</guid><description>近期预览我的线上履历时发现阅读体验有点生硬，甚至最糟的情况下会裁到文字行间，导致没有任何提示指明可以继续往下滑动，这篇文章描述如何透过 CSS 伪元素达成卷动元素淡入的样式。这个样式我应用于自己的线上履历或 CodePen 范例可以参考看看。</description><pubDate>Mon, 16 Jun 2025 00:00:00 GMT</pubDate><category>CSS</category><category>unsorted</category></item><item><title>透過漸層偽元素淡入淡出可捲動內容</title><link>https://www.webdong.dev/zh-tw/post/fade-in-and-out-content-through-css-pseudo-element/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/fade-in-and-out-content-through-css-pseudo-element/</guid><description>近期預覽我的線上履歷時發現閱讀體驗有點生硬，甚至最糟的情況下會裁到文字行間，導致沒有任何提示指明可以繼續往下滑動，這篇文章描述如何透過 CSS 偽元素達成捲動元素淡入的樣式。這個樣式我應用於自己的線上履歷或 CodePen 範例可以參考看看。</description><pubDate>Mon, 16 Jun 2025 00:00:00 GMT</pubDate><category>CSS</category><category>unsorted</category></item><item><title>Draggable Element to Make Website More Interactive and Fun</title><link>https://www.webdong.dev/en/post/implement-draggable-dom-element-to-make-website-more-interactive-and-fun/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/implement-draggable-dom-element-to-make-website-more-interactive-and-fun/</guid><description>Initially inspired by the Glitch website&apos;s draggable features, I created a DOM API-based solution instead of using additional packages.</description><pubDate>Thu, 05 Jun 2025 00:00:00 GMT</pubDate><category>Implementation</category><category>unsorted</category></item><item><title>实作可拖动 DOM 元素增添网站互动与趣味性</title><link>https://www.webdong.dev/zh-cn/post/implement-draggable-dom-element-to-make-website-more-interactive-and-fun/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/implement-draggable-dom-element-to-make-website-more-interactive-and-fun/</guid><description>最初是看到 Glitch 网站 图示像冰箱磁铁可以随意挪动的功能觉得充满趣味，背后是使用 react-draggable 套件制作。不过考虑到速度与维护性，部落格不打算因为一页特效就引入额外套件，所以从头用 DOM API 手刻了相关功能。</description><pubDate>Thu, 05 Jun 2025 00:00:00 GMT</pubDate><category>Implementation</category><category>unsorted</category></item><item><title>實作可拖動 DOM 元素增添網站互動與趣味性</title><link>https://www.webdong.dev/zh-tw/post/implement-draggable-dom-element-to-make-website-more-interactive-and-fun/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/implement-draggable-dom-element-to-make-website-more-interactive-and-fun/</guid><description>最初是看到 Glitch 網站 圖示像冰箱磁鐵可以隨意挪動的功能覺得充滿趣味，背後是使用 react-draggable 套件製作。不過考慮到速度與維護性，部落格不打算因為一頁特效就引入額外套件，所以從頭用 DOM API 手刻了相關功能。</description><pubDate>Thu, 05 Jun 2025 00:00:00 GMT</pubDate><category>Implementation</category><category>unsorted</category></item><item><title>Connect Postgres with Drizzle ORM</title><link>https://www.webdong.dev/en/post/connect-postgres-with-drizzle-orm/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/connect-postgres-with-drizzle-orm/</guid><description>Communicate with databases via SQL can lead to development efficiency and security issues. Usually we choose a suitable ORM for better development experience.</description><pubDate>Fri, 30 May 2025 00:00:00 GMT</pubDate><category>Database</category><category>unsorted</category></item><item><title>设置 Drizzle ORM 连接 Postgres 为例</title><link>https://www.webdong.dev/zh-cn/post/connect-postgres-with-drizzle-orm/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/connect-postgres-with-drizzle-orm/</guid><description>单纯透过 SQL 与关联式资料库直接沟通，可能会带来开发效率与安全性的问题，因此挑选一款合适的 ORM 多一层抽象是常见的选择，而 Drizzle ORM 是我最常使用也是接触 ORM 的起点。它在 TypeScript 生态中有出色支援，虽然相对新颖，但社群活跃，值得一试。</description><pubDate>Fri, 30 May 2025 00:00:00 GMT</pubDate><category>Database</category><category>unsorted</category></item><item><title>設置 Drizzle ORM 連接 Postgres 為範例</title><link>https://www.webdong.dev/zh-tw/post/connect-postgres-with-drizzle-orm/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/connect-postgres-with-drizzle-orm/</guid><description>單純透過 SQL 與關聯式資料庫直接溝通，可能會帶來開發效率與安全性的問題，因此挑選一款合適的 ORM 多一層抽象是常見的選擇，而 Drizzle ORM 是我最常使用也是接觸 ORM 的起點。它在 TypeScript 生態中有出色支援，雖然相對新穎，但社群活躍，值得一試。</description><pubDate>Fri, 30 May 2025 00:00:00 GMT</pubDate><category>Database</category><category>unsorted</category></item><item><title>Getting Started with Docker and Building Postgres</title><link>https://www.webdong.dev/en/post/getting-started-with-docker-and-building-postgres/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/getting-started-with-docker-and-building-postgres/</guid><description>When I first in backend development, I struggled to effectively reproduce services for other developers until I found Docker.</description><pubDate>Mon, 26 May 2025 00:00:00 GMT</pubDate><category>Infrastructure</category><category>unsorted</category></item><item><title>初学 Docker 并轻松构建 Postgres</title><link>https://www.webdong.dev/zh-cn/post/getting-started-with-docker-and-building-postgres/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/getting-started-with-docker-and-building-postgres/</guid><description>刚接触后端时我还不清楚如何有效重现服务供其他开发者使用，直到遇见 Docker 才大幅简化各种设施的维护与重现的工作，是一项非常高回报的实用技能，本篇从实做角度透过 Docker 建构 Postgres 服务，了解它的便捷快速。</description><pubDate>Mon, 26 May 2025 00:00:00 GMT</pubDate><category>Infrastructure</category><category>unsorted</category></item><item><title>初學 Docker 並輕鬆建構 Postgres</title><link>https://www.webdong.dev/zh-tw/post/getting-started-with-docker-and-building-postgres/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/getting-started-with-docker-and-building-postgres/</guid><description>剛接觸後端時我還不清楚如何有效重現服務供其他開發者使用，直到遇見 Docker 才大幅簡化各種設施的維護與重現的工作，是一項非常高回報的實用技能，本篇從實做角度透過 Docker 建構 Postgres 服務，了解它的便捷快速。</description><pubDate>Mon, 26 May 2025 00:00:00 GMT</pubDate><category>Infrastructure</category><category>unsorted</category></item><item><title>SQL vs SQL Builder vs ORM</title><link>https://www.webdong.dev/en/post/sql-sql-builder-orm/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/sql-sql-builder-orm/</guid><description>Interacting with RDB through SQL, SQL Builder, and ORM. Understanding their differences helps us make better choices for project needs.</description><pubDate>Sat, 24 May 2025 00:00:00 GMT</pubDate><category>Database</category><category>unsorted</category></item><item><title>与关系数据库对话：SQL vs SQL Builder vs ORM</title><link>https://www.webdong.dev/zh-cn/post/sql-sql-builder-orm/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/sql-sql-builder-orm/</guid><description>开发网站无可避免的会和关联式资料库打交道，而互动的方式有三种：SQL、SQL Builder、ORM。这三者有着不同的使用方式、优缺点与适用场景，了解它们的差异能帮助我们做出更适合专案需求的技术选择。分享我在 Node.js 的学习经历。</description><pubDate>Sat, 24 May 2025 00:00:00 GMT</pubDate><category>Database</category><category>unsorted</category></item><item><title>與關聯式資料庫對話：SQL vs SQL Builder vs ORM</title><link>https://www.webdong.dev/zh-tw/post/sql-sql-builder-orm/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/sql-sql-builder-orm/</guid><description>開發網站無可避免的會和關聯式資料庫打交道，而互動的方式有三種：SQL、SQL Builder、ORM。這三者有著不同的使用方式、優缺點與適用場景，了解它們的差異能幫助我們做出更適合專案需求的技術選擇。分享我在 Node.js 的學習經歷。</description><pubDate>Sat, 24 May 2025 00:00:00 GMT</pubDate><category>Database</category><category>unsorted</category></item><item><title>Improve 104 HR Service Website Menu Loading Experience</title><link>https://www.webdong.dev/en/post/improve-104-hr-service-website-menu-loading-experience/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/improve-104-hr-service-website-menu-loading-experience/</guid><description>Recently, I frequently use Taiwan&apos;s most famous job platform: 104 Job Bank, where the personal data menu experience has potential issues worth exploring. </description><pubDate>Wed, 21 May 2025 00:00:00 GMT</pubDate><category>Challenge</category><category>unsorted</category></item><item><title>挑战改善 104 人力银行网站清单载入体验</title><link>https://www.webdong.dev/zh-cn/post/improve-104-hr-service-website-menu-loading-experience/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/improve-104-hr-service-website-menu-loading-experience/</guid><description>近期很频繁使用到台湾最知名的求职平台：104 人力银行，其中个人资料选单的体验有潜在的问题值得挖掘。就目前 104 的体验对我来说没什么好抱怨的，就是最少这个 `0` 如果能改成 `-` 或 `载入中` 代表无资料都清楚得多阿！就和 `0` 与 `null` 一样，它们相近的意义是不同的。</description><pubDate>Wed, 21 May 2025 00:00:00 GMT</pubDate><category>Challenge</category><category>unsorted</category></item><item><title>挑戰改善 104 人力銀行網站清單載入體驗</title><link>https://www.webdong.dev/zh-tw/post/improve-104-hr-service-website-menu-loading-experience/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/improve-104-hr-service-website-menu-loading-experience/</guid><description>近期很頻繁使用到臺灣最知名的求職平台：104 人力銀行，其中個人資料選單的體驗有潛在的問題值得挖掘。就目前 104 的體驗對我來說沒什麼好抱怨的，就是最少這個 `0` 如果能改成 `-` 或 `載入中` 代表無資料都清楚得多阿！就和 `0` 與 `null` 一樣，它們相近的意義是不同的。</description><pubDate>Wed, 21 May 2025 00:00:00 GMT</pubDate><category>Challenge</category><category>unsorted</category></item><item><title>How to deal with conflict effectively: Disagree and commit</title><link>https://www.webdong.dev/en/post/disagree-and-commit/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/disagree-and-commit/</guid><description>Here&apos;s a guide on &quot;Disagree and Commit&quot;. Encourage discussion, Set decision deadlines, Avoid criticism after decisions are made.</description><pubDate>Sun, 18 May 2025 00:00:00 GMT</pubDate><category>Team</category><category>unsorted</category></item><item><title>有效面對冲突的方式：不同意但致力</title><link>https://www.webdong.dev/zh-cn/post/disagree-and-commit/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/disagree-and-commit/</guid><description>在团队中冲突是不可避免的，发现遇到太多次需要解释对于团队冲突的看法：「不同意但致力（Disagree and Commit）」，所以特别重复习一次并写成文章推广。 1. 鼓励讨论 2. 设立决策停损点 3. 不要事成定局后，方才提出意见或办法。</description><pubDate>Sun, 18 May 2025 00:00:00 GMT</pubDate><category>Team</category><category>unsorted</category></item><item><title>有效面對衝突的方式：不同意但致力</title><link>https://www.webdong.dev/zh-tw/post/disagree-and-commit/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/disagree-and-commit/</guid><description>在團隊中衝突是不可避免的，發現遇到太多次需要解釋對於團隊衝突的看法：「不同意但致力（Disagree and Commit）」，所以特別重複習一次並寫成文章推廣。1. 鼓勵討論 2. 設立決策停損點 3. 不要事成定局後，方才提出意見或辦法。</description><pubDate>Sun, 18 May 2025 00:00:00 GMT</pubDate><category>Team</category><category>unsorted</category></item><item><title>Finite and Infinite Games and Gaming Impotence</title><link>https://www.webdong.dev/en/post/finite-and-infinite-games-and-gaming-impotence/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/finite-and-infinite-games-and-gaming-impotence/</guid><description>To clarify my feelings of Gaming impotence, I recalled a book recommendation, &quot;Finite and Infinite Games,&quot; which discusses two game concepts.</description><pubDate>Tue, 13 May 2025 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>unsorted</category></item><item><title>有限与无限游戏看待电子阳痿</title><link>https://www.webdong.dev/zh-cn/post/finite-and-infinite-games-and-gaming-impotence/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/finite-and-infinite-games-and-gaming-impotence/</guid><description>为了厘清自己电子阳痿或对事情提不起兴趣的念头，一直回忆起某天偶然读到一本书的推荐《有限与无限的游戏》，里面提到世上有两种游戏的概念发现对于梳理看待「游戏观」是有帮助的。不幸的是，时间确实在流逝。时间飞快地流逝。过去在增加，未来在减少。可能性在减少，遗憾在增加。</description><pubDate>Tue, 13 May 2025 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>unsorted</category></item><item><title>有限與無限遊戲看待電子陽痿</title><link>https://www.webdong.dev/zh-tw/post/finite-and-infinite-games-and-gaming-impotence/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/finite-and-infinite-games-and-gaming-impotence/</guid><description>為了釐清自己電子陽痿或對事情提不起興趣的念頭，一直回憶起某天偶然讀到一本書的推薦《有限與無限的遊戲》，裡面提到世上有兩種遊戲的概念發現對於梳理看待「遊戲觀」是有幫助的。不幸的是，時間確實在流逝。時間飛快地流逝。過去在增加，未來在減少。可能性在減少，遺憾在增加。</description><pubDate>Tue, 13 May 2025 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>unsorted</category></item><item><title>What is hreflang meta in i18n Website?</title><link>https://www.webdong.dev/en/post/what-is-meta-hreflang-in-i18n-website/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/what-is-meta-hreflang-in-i18n-website/</guid><description>When creating multilingual websites, many focus on translation accuracy or switching locale experience, often overlooking the crucial SEO setting: `hreflang`. </description><pubDate>Mon, 12 May 2025 00:00:00 GMT</pubDate><category>SEO</category><category>unsorted</category></item><item><title>多语言网站当中的 hreflang 是什么？</title><link>https://www.webdong.dev/zh-cn/post/what-is-meta-hreflang-in-i18n-website/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/what-is-meta-hreflang-in-i18n-website/</guid><description>在打造多语系网站时，许多人会关注翻译的准确度或切换体验，但往往忽略了一个对 SEO 非常关键的设定：`hreflang`。正好最近把部落格和个人网站模板的多语系都调整完成，它们都是需要重视 SEO 的静态内容网站类型，其中的经验我纪录于这篇文章当中。</description><pubDate>Mon, 12 May 2025 00:00:00 GMT</pubDate><category>SEO</category><category>unsorted</category></item><item><title>多語系網站當中的 hreflang 是什麼？</title><link>https://www.webdong.dev/zh-tw/post/what-is-meta-hreflang-in-i18n-website/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/what-is-meta-hreflang-in-i18n-website/</guid><description>在打造多語系網站時，許多人會關注翻譯的準確度或切換體驗，但往往忽略了一個對 SEO 非常關鍵的設定：`hreflang`。正好最近把部落格和個人網站模板的多語系都調整完成，它們都是需要重視 SEO 的靜態內容網站類型，其中的經驗我紀錄於這篇文章當中。</description><pubDate>Mon, 12 May 2025 00:00:00 GMT</pubDate><category>SEO</category><category>unsorted</category></item><item><title>Build a Minecraft Server on AWS EC2 Using Docker</title><link>https://www.webdong.dev/en/post/setup-a-minecraft-server-on-aws-ec2-with-docker/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/setup-a-minecraft-server-on-aws-ec2-with-docker/</guid><description>Minecraft is one of the world&apos;s most famous sandbox games. This article explores the use of different technologies (AWS EC2, Docker) to set up a MC server.</description><pubDate>Thu, 01 May 2025 00:00:00 GMT</pubDate><category>Infrastructure</category><category>AWS EC2</category></item><item><title>使用 Docker 在 AWS EC2 上建构 Minecraft 服务器</title><link>https://www.webdong.dev/zh-cn/post/setup-a-minecraft-server-on-aws-ec2-with-docker/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/setup-a-minecraft-server-on-aws-ec2-with-docker/</guid><description>Minecraft 是一款全世界最有名的沙盒游戏，早些年和朋友一起游玩这款游戏时连线的方式还是于个人电脑区域网路（LAN）连线，使用 Hamachi 模拟区域网路达成连线，但很明显有各式各样的局限性。这篇文章探讨藉由不同的技术（AWS EC2、Docker）实现快速自建 MC 伺服器的目的。</description><pubDate>Thu, 01 May 2025 00:00:00 GMT</pubDate><category>Infrastructure</category><category>AWS EC2</category></item><item><title>使用 Docker 在 AWS EC2 上建構 Minecraft 伺服器</title><link>https://www.webdong.dev/zh-tw/post/setup-a-minecraft-server-on-aws-ec2-with-docker/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/setup-a-minecraft-server-on-aws-ec2-with-docker/</guid><description>Minecraft 是一款全世界最有名的沙盒遊戲，早些年和朋友一起遊玩這款遊戲時連線的方式還是於個人電腦區域網路（LAN）連線，使用 Hamachi 模擬區域網路達成連線，但很明顯有各式各樣的侷限性。這篇文章探討藉由不同的技術（AWS EC2、Docker）實現快速自建 MC 伺服器的目的。</description><pubDate>Thu, 01 May 2025 00:00:00 GMT</pubDate><category>Infrastructure</category><category>AWS EC2</category></item><item><title>Monitor Website Performance by Self-Host Lighthouse Server</title><link>https://www.webdong.dev/en/post/build-a-personal-lighthouse-server/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/build-a-personal-lighthouse-server/</guid><description>Self-hosting Lighthouse allows for long-term tracking of best practices. As it enhances the team&apos;s awareness regarding code quality over time.</description><pubDate>Mon, 28 Apr 2025 00:00:00 GMT</pubDate><category>CI-CD</category><category>unsorted</category></item><item><title>Setting Up Uptime Kuma to Monitor Service Uptime</title><link>https://www.webdong.dev/en/post/uptime-kuma/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/uptime-kuma/</guid><description>Maintenance becomes challenging. How to ensure your servers are working properly? Uptime Kuma is a free monitoring tool that can help.</description><pubDate>Mon, 28 Apr 2025 00:00:00 GMT</pubDate><category>Share</category><category>unsorted</category></item><item><title>自建 Lighthouse 服务器实现持续监控网站最佳实践</title><link>https://www.webdong.dev/zh-cn/post/build-a-personal-lighthouse-server/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/build-a-personal-lighthouse-server/</guid><description>在先前的文章提到如何使用 Lighthouse 这款工具监控前端大大小小的最佳实践，例如：效能、SEO、适用性……等能被客观测量比较的数值，虽然很方便但你可能会希望自架 Lighthouse 服务，以便实现：搜集与管理自己的隐私资料、持续性监控同个网站的检测资料、减少依赖第三方伺服器服务。</description><pubDate>Mon, 28 Apr 2025 00:00:00 GMT</pubDate><category>CI-CD</category><category>unsorted</category></item><item><title>设置 Uptime Kuma 监控服务在线状态</title><link>https://www.webdong.dev/zh-cn/post/uptime-kuma/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/uptime-kuma/</guid><description>随着服务增多也出现了维护上的困难，要如何知道自己与第三方的伺服器有好好在运作？可以额外再开设一个伺服器再去专门监控其他伺服器的状态，而 Uptime Kuma 就是一款开源免费的监控工具。我用它来监控所有对外的服务确保在第一时间出问题或服务时好时坏时能得知并着手修理，算是一个简单但实用的好工具，展开监测服务的第一步。</description><pubDate>Mon, 28 Apr 2025 00:00:00 GMT</pubDate><category>Share</category><category>unsorted</category></item><item><title>自架 Lighthouse 伺服器實現持續監控網站最佳實踐</title><link>https://www.webdong.dev/zh-tw/post/build-a-personal-lighthouse-server/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/build-a-personal-lighthouse-server/</guid><description>在先前的文章提到如何使用 Lighthouse 這款工具監控前端大大小小的最佳實踐，例如：效能、SEO、適用性……等能被客觀測量比較的數值，雖然很方便但你可能會希望自架 Lighthouse 服務，以便實現：蒐集與管理自己的隱私資料、持續性監控同個網站的檢測資料、減少依賴第三方伺服器服務。</description><pubDate>Mon, 28 Apr 2025 00:00:00 GMT</pubDate><category>CI-CD</category><category>unsorted</category></item><item><title>設置 Uptime Kuma 監控服務在線狀態</title><link>https://www.webdong.dev/zh-tw/post/uptime-kuma/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/uptime-kuma/</guid><description>隨著服務增多也出現了維護上的困難，要如何知道自己與第三方的伺服器有好好在運作？可以額外再開設一個伺服器再去專門監控其他伺服器的狀態，而 Uptime Kuma 就是一款開源免費的監控工具。我用它來監控所有對外的服務確保在第一時間出問題或服務時好時壞時能得知並著手修理，算是一個簡單但實用的好工具，展開監測服務的第一步。</description><pubDate>Mon, 28 Apr 2025 00:00:00 GMT</pubDate><category>Share</category><category>unsorted</category></item><item><title>Frontend Storage - Cookie vs LocalStorage vs SessionStorage</title><link>https://www.webdong.dev/en/post/frontend-storage-cookie-localstorage-sessionstorage/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/frontend-storage-cookie-localstorage-sessionstorage/</guid><description>There are several browser storage solutions you must know, with key differences in capacity, expiration settings, interaction with the server, and more.</description><pubDate>Sun, 20 Apr 2025 00:00:00 GMT</pubDate><category>Browser</category><category>unsorted</category></item><item><title>前端必知的存储方案：Cookie vs LocalStorage vs SessionStorage</title><link>https://www.webdong.dev/zh-cn/post/frontend-storage-cookie-localstorage-sessionstorage/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/frontend-storage-cookie-localstorage-sessionstorage/</guid><description>身在前端有几个必须知道的浏览器存储方案，重点差异在于： 容量上限、有效期限设置、是否与服务器互动，各自有不同的特性适合运用在不同场景。之外也有许多延伸的问题如： Cookie 与法规、资安漏洞防范相关设置、除存字符串以外的数据结构。</description><pubDate>Sun, 20 Apr 2025 00:00:00 GMT</pubDate><category>Browser</category><category>unsorted</category></item><item><title>前端必知的存儲方案：Cookie vs LocalStorage vs SessionStorage</title><link>https://www.webdong.dev/zh-tw/post/frontend-storage-cookie-localstorage-sessionstorage/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/frontend-storage-cookie-localstorage-sessionstorage/</guid><description>身在前端有幾個必須知道的瀏覽器存儲方案，重點差異在於： 容量上限、有效期限設置、是否與伺服器互動 ，各自有不同的特性適合運用於不同場景。之外也有許多延伸的問題如： Cookie 與法規、資安漏洞防範相關設定、除存字串以外的資料結構。</description><pubDate>Sun, 20 Apr 2025 00:00:00 GMT</pubDate><category>Browser</category><category>unsorted</category></item><item><title>Should I Guess Answer on the Test?</title><link>https://www.webdong.dev/en/post/should-i-guess-answer-on-the-test/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/should-i-guess-answer-on-the-test/</guid><description>While discussing test questions in interviews with friends, I encountered the view that it’s better to leave blanks than to guess.</description><pubDate>Fri, 18 Apr 2025 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>unsorted</category></item><item><title>面试时不懂应该猜答案吗？为什么？</title><link>https://www.webdong.dev/zh-cn/post/should-i-guess-answer-on-the-test/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/should-i-guess-answer-on-the-test/</guid><description>近期在面试考一些常见逻辑测验题目而在与朋友对谈到这件事的过程中，发现一种观点是「时间到也宁愿留白也不要乱填」，以免被发现了仰赖运气不懂装懂又要解释。我很讶异自己当过多年的学生，却是第一次反思这项行为背后的动机与取舍。人的偏见不是那么轻松就能够改变的，但透过思考能更明白自己是否知行合一。</description><pubDate>Fri, 18 Apr 2025 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>unsorted</category></item><item><title>面試時不懂應該猜答案嗎？為什麼？</title><link>https://www.webdong.dev/zh-tw/post/should-i-guess-answer-on-the-test/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/should-i-guess-answer-on-the-test/</guid><description>近期在面試考一些常見邏輯測驗題目而在與朋友對談到這件事的過程中，發現一種觀點是「時間到也寧願留白也不要亂填」，以免被發現了仰賴運氣不懂裝懂又要解釋。我很訝異自己當過多年的學生，卻是第一次反思這項行為背後的動機與取捨。人的偏見不是那麼輕鬆就能夠改變的，但透過思考能更明白自己是否知行合一。</description><pubDate>Fri, 18 Apr 2025 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>unsorted</category></item><item><title>Utilize OG Edge Functions Reduced 90% OG Build Time</title><link>https://www.webdong.dev/en/post/cloudflare-functions-og-image-generation/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/cloudflare-functions-og-image-generation/</guid><description>As the number of blog posts increases, the pressure on static generation rises, specifically about 10 minutes spent generating images for previews.</description><pubDate>Wed, 16 Apr 2025 00:00:00 GMT</pubDate><category>Web Performance</category><category>unsorted</category></item><item><title>使用 Edge Function 生成 OG 图，构建时间缩短 90%</title><link>https://www.webdong.dev/zh-cn/post/cloudflare-functions-og-image-generation/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/cloudflare-functions-og-image-generation/</guid><description>随着博客文章逐渐增多，静态生成压力也随之上升，例来说在日常开发会需要近 10 分钟的时间，大多是生成图片占据大多时间，建构预览图的数量是：`(语言 x 文章数量)`。延续最大程度的静态渲染是合理的选择，而针对 OG 图片渲染可以包成 Serverless Function 在需要时呼叫。</description><pubDate>Wed, 16 Apr 2025 00:00:00 GMT</pubDate><category>Web Performance</category><category>unsorted</category></item><item><title>使用 Edge Function 生成 OG 圖，建構時間縮短 90%</title><link>https://www.webdong.dev/zh-tw/post/cloudflare-functions-og-image-generation/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/cloudflare-functions-og-image-generation/</guid><description>隨著部落格文章逐漸增多，靜態生成壓力也隨之上升，舉例來說在日常開發會需要花費近 10 分鐘的時間，大多是生成圖片佔據大多時間，建構預覽圖的數量是：`(語言 x 文章數量)`。延續最大程度的靜態渲染是合理的選擇，而針對 OG 圖片渲染可以包成 Serverless Function 在需要時呼叫。</description><pubDate>Wed, 16 Apr 2025 00:00:00 GMT</pubDate><category>Web Performance</category><category>unsorted</category></item><item><title>SEO Knowledge Related to HTML Anchor Tag &lt;a&gt;</title><link>https://www.webdong.dev/en/post/anchor-tag-seo/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/anchor-tag-seo/</guid><description>Search engines rely on the `&lt;a&gt;` tags in HTML documents to understand the relationships between pages and to score them accordingly.</description><pubDate>Mon, 07 Apr 2025 00:00:00 GMT</pubDate><category>SEO</category><category>Syntax</category></item><item><title>关于 HTML 锚点标签 &lt;a&gt; 相关的 SEO 知识</title><link>https://www.webdong.dev/zh-cn/post/anchor-tag-seo/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/anchor-tag-seo/</guid><description>了解 `&lt;a&gt;` 是网页资源相互连接、搜索引擎排序判断的关键，甚至与资安也有一定的关联，对于 SEO 与前端来说是必须了解的知识点之一。搜索引擎依赖 HTML 文件中的 `&lt;a&gt;` 标签了解页面之间的关联并进而评分，理解 `&lt;a&gt;` 能够更好地处理与标识页面与页面之间的关系。</description><pubDate>Mon, 07 Apr 2025 00:00:00 GMT</pubDate><category>SEO</category><category>Syntax</category></item><item><title>關於 HTML 錨點標籤 &lt;a&gt; 相關的 SEO 知識</title><link>https://www.webdong.dev/zh-tw/post/anchor-tag-seo/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/anchor-tag-seo/</guid><description>了解 `&lt;a&gt;` 是網頁資源相互連結、搜尋引擎排序判斷的關鍵，甚至與資安也有一定的關聯，對於 SEO 與前端來說是必須了解的知識點之一。搜尋引擎仰賴 HTML 文件中的 `&lt;a&gt;` 標籤了解頁面之間的關聯並進而評分，理解 `&lt;a&gt;` 能夠更好的處理與標示頁面與頁面之間的關係。</description><pubDate>Mon, 07 Apr 2025 00:00:00 GMT</pubDate><category>SEO</category><category>Syntax</category></item><item><title>Important Concepts for Beginners in n8n</title><link>https://www.webdong.dev/en/post/n8n-important-concepts/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/n8n-important-concepts/</guid><description>Recently, while trying out n8n, I encountered quite a few troubles. However, after resolving the issues, I felt that they were small problems.</description><pubDate>Thu, 03 Apr 2025 00:00:00 GMT</pubDate><category>n8n</category><category>unsorted</category></item><item><title>n8n 几个初学最重要的概念</title><link>https://www.webdong.dev/zh-cn/post/n8n-important-concepts/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/n8n-important-concepts/</guid><description>近期在尝试 n8n 时碰上了不少麻烦，但在问题解决后觉得其实也不是什么太大的问题但就是莫名的卡住流失了许多时间，我踩过的坑或许也是你踩过的坑。这篇文章适合像我一样没特别看文件直接跳进去玩的开发者，后续细读文件反省把问题都列出来。</description><pubDate>Thu, 03 Apr 2025 00:00:00 GMT</pubDate><category>n8n</category><category>unsorted</category></item><item><title>n8n 幾個初學最重要的概念</title><link>https://www.webdong.dev/zh-tw/post/n8n-important-concepts/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/n8n-important-concepts/</guid><description>近期在嘗試 n8n 時碰上了不少麻煩，但在問題解決後覺得其實也不是什麼太大的問題但就是莫名的卡住流失了許多時間，我踩過的坑或許也是你踩過的坑。這篇文章適合像我一樣沒特別看文件直接跳進去玩的開發者，後續細讀文件反省把問題都列出來。</description><pubDate>Thu, 03 Apr 2025 00:00:00 GMT</pubDate><category>n8n</category><category>unsorted</category></item><item><title>Integrate Different Git Repositories (Symink, Submodule)</title><link>https://www.webdong.dev/en/post/merge-different-git-repo/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/merge-different-git-repo/</guid><description>The website&apos;s content are recorded in Git. This decision has its pros and cons, As the project matures, I&apos;ve decided to separate the two.</description><pubDate>Wed, 02 Apr 2025 00:00:00 GMT</pubDate><category>CI-CD</category><category>unsorted</category></item><item><title>整合不同 Git 仓库在一起（符号链接、Git 子模块）</title><link>https://www.webdong.dev/zh-cn/post/merge-different-git-repo/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/merge-different-git-repo/</guid><description>网页东东至今仍完全以本地为主，所有代码、字体、图片影片与文章内容都记录于 Git 当中，并通过 Git LFS 来管理大文件。这样的决定有好有坏，其中一个问题便是内容与代码的耦合高，任何一个想维护的人要把我撰写的几百篇文章连带抓下来 😅，随着项目成熟我决定要将两者分离。</description><pubDate>Wed, 02 Apr 2025 00:00:00 GMT</pubDate><category>CI-CD</category><category>unsorted</category></item><item><title>整合不同 Git 倉庫在一起（Symbolic Link、Git Submodule）</title><link>https://www.webdong.dev/zh-tw/post/merge-different-git-repo/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/merge-different-git-repo/</guid><description>網頁東東至今仍完全以本地為主，所有代碼、字體、圖片影片與文章內容都紀錄於 Git 當中，並透過 Git LFS 來管理大檔案。這樣的決定有好有壞，其中一個問題便是內容與代碼的耦合高，任何一個想維護的人要把我撰寫的幾百篇文章連帶抓下來 😅，隨著專案成熟我決定要將兩者分離。</description><pubDate>Wed, 02 Apr 2025 00:00:00 GMT</pubDate><category>CI-CD</category><category>unsorted</category></item><item><title>Feedback Loop for AI with n8n Human in the Loop</title><link>https://www.webdong.dev/en/post/n8n-human-in-the-loop/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/n8n-human-in-the-loop/</guid><description>Restarting the entire AI process can be very time-consuming and costly. We can add human feedback, modifying prompts repeatedly until we are satisfied.</description><pubDate>Mon, 31 Mar 2025 00:00:00 GMT</pubDate><category>n8n</category><category>unsorted</category></item><item><title>n8n Human in the Loop 替 AI 流程建構反饋</title><link>https://www.webdong.dev/zh-cn/post/n8n-human-in-the-loop/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/n8n-human-in-the-loop/</guid><description>近期在琢磨刚玩上手的 n8n 的各式功能，其中在制作 AI 流程时发现如果其中一个环节不如预期整个流程重来十分的耗费时间与金钱，这时候我们就可以添加上人类的反馈，重复的修改提示词直到满意为止。在制作文章研究生成 AI 时我也运用了相关功能来达成与 AI 沟通动态调整需求的目的。</description><pubDate>Mon, 31 Mar 2025 00:00:00 GMT</pubDate><category>n8n</category><category>unsorted</category></item><item><title>n8n Human in the Loop 替 AI 流程建構反饋</title><link>https://www.webdong.dev/zh-tw/post/n8n-human-in-the-loop/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/n8n-human-in-the-loop/</guid><description>近期在琢磨剛玩上手的 n8n 的各式功能，其中在製作 AI 流程時發現如果其中一個環節不如預期整個流程重來十分的耗費時間與金錢，這時候我們就可以添加上人類的反饋，重複的修改提示詞直到滿意為止。在製作文章研究生成 AI 時我也運用了相關功能來達成與 AI 溝通動態調整需求的目的。</description><pubDate>Mon, 31 Mar 2025 00:00:00 GMT</pubDate><category>n8n</category><category>unsorted</category></item><item><title>Start Build a n8n Feedback Form</title><link>https://www.webdong.dev/en/post/build-n8n-feedback-form/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/build-n8n-feedback-form/</guid><description>n8n is a low-code / no-code solution that helps anyone quickly implement automation. This tutorial demonstrates through a simple integration.</description><pubDate>Thu, 20 Mar 2025 00:00:00 GMT</pubDate><category>n8n</category><category>unsorted</category></item><item><title>简单自架 n8n 回馈表单小试水深</title><link>https://www.webdong.dev/zh-cn/post/build-n8n-feedback-form/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/build-n8n-feedback-form/</guid><description>近期在熟悉 n8n 流程自动化的工具，发现值得推荐给任何人（特别是软件工程师）n8n 算是一种 low-code / no-code 解决方案可以帮助任何人通过现有的整合来快速实践流程自动化的目的。这次教学通过简单的串接 Google 服务来展现它的灵活性和强大功能。</description><pubDate>Thu, 20 Mar 2025 00:00:00 GMT</pubDate><category>n8n</category><category>unsorted</category></item><item><title>簡單自架 n8n 回饋表單小試水深</title><link>https://www.webdong.dev/zh-tw/post/build-n8n-feedback-form/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/build-n8n-feedback-form/</guid><description>近期在熟悉 n8n 流程自動化的工具，發現值得推薦給任何人（特別是軟體工程師）n8n 算是一種 low-code / no-code 解決方案可以幫助任何人透過現有的整合來快速實踐流程自動化的目的。這次教學透過簡單的串接 Google 服務來展現它的靈活性和強大功能。</description><pubDate>Thu, 20 Mar 2025 00:00:00 GMT</pubDate><category>n8n</category><category>unsorted</category></item><item><title>Quickly Generate Diagrams with Mermaid</title><link>https://www.webdong.dev/en/post/generate-diagram-using-mermaid/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/generate-diagram-using-mermaid/</guid><description>I explored using Mermaid to generate diagrams. It&apos;s a tool that supports various types of diagrams, allowing us to focus on content rather than chart creation.</description><pubDate>Wed, 05 Mar 2025 00:00:00 GMT</pubDate><category>Share</category><category>unsorted</category></item><item><title>使用 Mermaid 通过文字快速生成图表</title><link>https://www.webdong.dev/zh-cn/post/generate-diagram-using-mermaid/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/generate-diagram-using-mermaid/</guid><description>近期工作顺代研究到使用 Mermaid 来快速生成图表，这是一个很方便的工具，可以快速生成各种图表，例如流程图、心智图、圆饼图……等，你能想到的图表基本都有支援。大致纪录一下选择这项技术的原因以及使用上的心得。 Mermaid 与 AI 结合完美的免去了复杂度，让我们能够更专注在内容上，而不是花太多时间在制作图表上。</description><pubDate>Wed, 05 Mar 2025 00:00:00 GMT</pubDate><category>Share</category><category>unsorted</category></item><item><title>使用 Mermaid 透過文字快速生成圖表</title><link>https://www.webdong.dev/zh-tw/post/generate-diagram-using-mermaid/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/generate-diagram-using-mermaid/</guid><description>近期工作順代研究到使用 Mermaid 來快速生成圖表，這是一個很方便的工具，可以快速生成各種圖表，例如流程圖、心智圖、圓餅圖……等，你能想到的圖表基本都有支援。大致紀錄一下選擇這項技術的原因以及使用上的心得。Mermaid 與 AI 結合完美的免去了複雜度，讓我們能夠更專注在內容上，而不是花太多時間在製作圖表上。</description><pubDate>Wed, 05 Mar 2025 00:00:00 GMT</pubDate><category>Share</category><category>unsorted</category></item><item><title>Slidev: A Web-Based Presentation Creation Solution</title><link>https://www.webdong.dev/en/post/slidev-build-presentation-with-markdown/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/slidev-build-presentation-with-markdown/</guid><description>Recently, I researched using Slidev for presentations, a web-based tool integrating various packages to create presentations easily, built on Vite + Vue3.</description><pubDate>Mon, 24 Feb 2025 00:00:00 GMT</pubDate><category>Share</category><category>unsorted</category></item><item><title>Slidev：基于网页的简报创作方案</title><link>https://www.webdong.dev/zh-cn/post/slidev-build-presentation-with-markdown/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/slidev-build-presentation-with-markdown/</guid><description>近期工作研究到使用 Slidev 来呈现简报，一个基于 Vite + Vue3 的简报工具整合了大大小小的套件方便用网页创作简报，主要以 Markdown 来撰写内容，这样的方式让我们可以专注在内容上，而不用花太多时间在花俏的简报软体操作。</description><pubDate>Mon, 24 Feb 2025 00:00:00 GMT</pubDate><category>Share</category><category>unsorted</category></item><item><title>Slidev：基於網頁的簡報創作方案</title><link>https://www.webdong.dev/zh-tw/post/slidev-build-presentation-with-markdown/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/slidev-build-presentation-with-markdown/</guid><description>近期工作研究到使用 Slidev 來呈現簡報，一個基於 Vite + Vue3 的簡報工具整合了大大小小的套件方便用網頁創作簡報，主要以 Markdown 來撰寫內容，這樣的方式讓我們可以專注在內容上，而不用花太多時間在花俏的簡報軟體操作。</description><pubDate>Mon, 24 Feb 2025 00:00:00 GMT</pubDate><category>Share</category><category>unsorted</category></item><item><title>Create Accordion with Details and Summary (with Animation!)</title><link>https://www.webdong.dev/en/post/build-a-native-accordion-using-html-details-and-summary/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/build-a-native-accordion-using-html-details-and-summary/</guid><description>The HTML `&lt;details&gt;` and `&lt;summary&gt;` syntax helps achieve accordion quickly, along with interpolate-size and transition-behavior for smooth animations.</description><pubDate>Tue, 18 Feb 2025 00:00:00 GMT</pubDate><category>HTML</category><category>unsorted</category></item><item><title>使用 Details 与 Summary 制作原生手风琴 (含收合动画！)</title><link>https://www.webdong.dev/zh-cn/post/build-a-native-accordion-using-html-details-and-summary/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/build-a-native-accordion-using-html-details-and-summary/</guid><description>手风琴是一种常见的网页 UI 模式，通常是一系列垂直堆叠的标题可以用于展开收合显示不同资讯，在 HTML 当中有项新颖的语法 &lt;details&gt; 和 &lt;summary&gt; 可帮助快速实现类似的功能，并且配合上最新的 interpolate-size 和 transition-behavior 制作滑顺的展开闭合动画。</description><pubDate>Tue, 18 Feb 2025 00:00:00 GMT</pubDate><category>HTML</category><category>unsorted</category></item><item><title>使用 Details 與 Summary 製作原生手風琴 (含收合動畫！)</title><link>https://www.webdong.dev/zh-tw/post/build-a-native-accordion-using-html-details-and-summary/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/build-a-native-accordion-using-html-details-and-summary/</guid><description>手風琴是一種常見的網頁 UI 模式，通常是一系列垂直堆疊的標題可以用於展開收合顯示不同資訊，在 HTML 當中有項新穎的語法 &lt;details&gt; 和 &lt;summary&gt; 可幫助快速實現類似的功能，並且配合上最新的 interpolate-size 和 transition-behavior 製作滑順的展開閉合動畫。</description><pubDate>Tue, 18 Feb 2025 00:00:00 GMT</pubDate><category>HTML</category><category>unsorted</category></item><item><title>Optimizing Assets (preload/fetch/dns-prefetch/preconnect)</title><link>https://www.webdong.dev/en/post/optimizing-assets-loading-in-advance/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/optimizing-assets-loading-in-advance/</guid><description>I was asked about a SPA I created and its poor image loading experience. I shared all my thoughts, but lacked confidence in my answers.</description><pubDate>Sat, 15 Feb 2025 00:00:00 GMT</pubDate><category>Web Performance</category><category>Image</category></item><item><title>使用 preload、prefetch、dns-prefetch、preconnect 最佳化资源加载顺序！</title><link>https://www.webdong.dev/zh-cn/post/optimizing-assets-loading-in-advance/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/optimizing-assets-loading-in-advance/</guid><description>先前面试时面试官询问到我早期制作的一个 SPA 网站在换页后图片载入体验不太好的问题，当时我把脑袋能想的所有答案都提出来了😅，最终有答到一点边缘知识，但太少用所以回答的不是很确定，因此这次来补齐这方面浏览器提供的机制，主要介绍浏览器如何处理安排资源的加载。</description><pubDate>Sat, 15 Feb 2025 00:00:00 GMT</pubDate><category>Web Performance</category><category>Image</category></item><item><title>使用 preload、prefetch、dns-prefetch、preconnect 最佳化資源載入順序！</title><link>https://www.webdong.dev/zh-tw/post/optimizing-assets-loading-in-advance/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/optimizing-assets-loading-in-advance/</guid><description>先前面試時面試官詢問到我早期製作的一個 SPA 網站在換頁後圖片載入體驗不太好的問題，當時我把腦袋能想的所有答案都提出來了😅，最終有答到一點邊緣知識，但太少用所以回答的不是很確定，因此這次來補齊這方面瀏覽器提供的機制，主要介紹瀏覽器如何處理安排資源的加載。</description><pubDate>Sat, 15 Feb 2025 00:00:00 GMT</pubDate><category>Web Performance</category><category>Image</category></item><item><title>後端入門可以了解的資料庫概念</title><link>https://www.webdong.dev/zh-tw/post/database-concepts-for-backend-beginners/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/database-concepts-for-backend-beginners/</guid><description>資料庫就是一個儲存資料的軟體，根據儲存資料性質不同，合適的資料庫種類也會不同。了解 Transaction、ACID、Normalization……等核心概念非常重要。還有更多可以深掘的細節，先單純把學到的知識紀錄一下，未來個別用更多文章詳細描述 :)</description><pubDate>Fri, 17 Jan 2025 00:00:00 GMT</pubDate><category>Database</category><category>unsorted</category></item><item><title>Build a Membership System with Express.js Session</title><link>https://www.webdong.dev/en/post/express-session/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/express-session/</guid><description>Due to HTTP being stateless, users need to re-validate on each login action. A solution is for the server to create a session upon request.</description><pubDate>Fri, 27 Dec 2024 00:00:00 GMT</pubDate><category>Express.js</category><category>Auth</category></item><item><title>使用 Express.js Session 实作会员系统</title><link>https://www.webdong.dev/zh-cn/post/express-session/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/express-session/</guid><description>依照先前的教学我们已经可以创建基本的CRUD 程式，但基于HTTP 是无状态的协议，如果单纯实作会员系统用户将会需要在每次操作登入会员相关的行为时重复验证，明显是糟糕的使用体验。一种解决方案是在请求时伺服器将会建立 Session。</description><pubDate>Fri, 27 Dec 2024 00:00:00 GMT</pubDate><category>Express.js</category><category>Auth</category></item><item><title>使用 Express.js Session 實作會員系統</title><link>https://www.webdong.dev/zh-tw/post/express-session/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/express-session/</guid><description>依照先前的教學我們已經可以創建基本的 CRUD 程式，但基於 HTTP 是無狀態的協議，如果單純實作會員系統用戶將會需要在每次操作登入會員相關的行為時重複驗證，明顯是糟糕的使用體驗。一種解決方案是在請求時伺服器將會建立 Session。</description><pubDate>Fri, 27 Dec 2024 00:00:00 GMT</pubDate><category>Express.js</category><category>Auth</category></item><item><title>How to Build a Awesome Frontend Project in 2025</title><link>https://www.webdong.dev/en/post/how-to-build-a-awesome-frontend-project-in-2025/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/how-to-build-a-awesome-frontend-project-in-2025/</guid><description>Few tutorials cover how to build a complete project. This is how I would build a Vue project from scratch in 2025!</description><pubDate>Mon, 23 Dec 2024 00:00:00 GMT</pubDate><category>Vue</category><category>unsorted</category></item><item><title>如何架构一个超赞的前端专案于 2025 年 (feat. Vue)</title><link>https://www.webdong.dev/zh-cn/post/how-to-build-a-awesome-frontend-project-in-2025/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/how-to-build-a-awesome-frontend-project-in-2025/</guid><description>随着前端演进，我们时常需要依靠现成的框架轮子协助，而其中Vue 又是继React 外第二热门且成熟的选项，但很少有教学提到一个完整的专案该如何建构，以及有哪些模式可以遵循。这次来介绍一下如果从头开始我会怎么建构一个 Vue 专案，在 2025 年！</description><pubDate>Mon, 23 Dec 2024 00:00:00 GMT</pubDate><category>Vue</category><category>unsorted</category></item><item><title>如何架構一個超讚的前端專案於 2025 年 (feat. Vue)</title><link>https://www.webdong.dev/zh-tw/post/how-to-build-a-awesome-frontend-project-in-2025/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/how-to-build-a-awesome-frontend-project-in-2025/</guid><description>隨著前端演進，我們時常需要依靠現成的框架輪子協助，而其中 Vue 又是繼 React 外第二熱門且成熟的選項，但很少有教學提到一個完整的專案該如何建構，以及有哪些模式可以遵循。這次來介紹一下如果從頭開始我會怎麼建構一個 Vue 專案，在 2025 年！</description><pubDate>Mon, 23 Dec 2024 00:00:00 GMT</pubDate><category>Vue</category><category>unsorted</category></item><item><title>Express.js Connects to MySQL to Implement Book App</title><link>https://www.webdong.dev/en/post/express-mysql-book-app/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/express-mysql-book-app/</guid><description>The previous series discussed creating a simple CRUD App with Express.js using MVC. This time, connect the backend to a local MySQL.</description><pubDate>Sat, 14 Dec 2024 00:00:00 GMT</pubDate><category>Express.js</category><category>CRUD</category></item><item><title>Express.js 串接 MySQL 实作书本管理 App</title><link>https://www.webdong.dev/zh-cn/post/express-mysql-book-app/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/express-mysql-book-app/</guid><description>先前系列提到使用 Express.js 简单的创造一个 CRUD App 并用 MVC 分层，这次流程差不多，目标是把后端接上本地的 MySQL 服务器并使用 MySQL2，一个专为 Node.js 应用设计的 MySQL 数据库连接工具。</description><pubDate>Sat, 14 Dec 2024 00:00:00 GMT</pubDate><category>Express.js</category><category>CRUD</category></item><item><title>Express.js 串接 MySQL 實作書本管理 App</title><link>https://www.webdong.dev/zh-tw/post/express-mysql-book-app/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/express-mysql-book-app/</guid><description>先前系列提到使用 Express.js 簡單的創造一個 CRUD App 並用 MVC 分層，這次流程差不多，目標是把後端接上本地的 MySQL 伺服器並使用 MySQL2，一個專為 Node.js 應用設計的 MySQL 資料庫連接工具。</description><pubDate>Sat, 14 Dec 2024 00:00:00 GMT</pubDate><category>Express.js</category><category>CRUD</category></item><item><title>Auto Publish TypeScript Package with Semver to NPM</title><link>https://www.webdong.dev/en/post/auto-publish-typescript-package-with-semver-to-npm/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/auto-publish-typescript-package-with-semver-to-npm/</guid><description>When using packages, one often wonders about the general process of managing package development. So I write the process of publish a TS package</description><pubDate>Wed, 11 Dec 2024 00:00:00 GMT</pubDate><category>CI-CD</category><category>NPM</category></item><item><title>撰写自动化发布语义化版本 TypeScript NPM 套件</title><link>https://www.webdong.dev/zh-cn/post/auto-publish-typescript-package-with-semver-to-npm/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/auto-publish-typescript-package-with-semver-to-npm/</guid><description>使用套件时总是会好奇一般管理套件开发的流程是如何？我通过 Matt Pocock 的 Blazing Fast Tips: Publishing to NPM 教学视频顺手实作了一次，并且把自己之前遇过的需求写成一个独立的 TS 套件公开发布：edit-element。</description><pubDate>Wed, 11 Dec 2024 00:00:00 GMT</pubDate><category>CI-CD</category><category>NPM</category></item><item><title>撰寫自動化發布語意化版本 TypeScript NPM 套件</title><link>https://www.webdong.dev/zh-tw/post/auto-publish-typescript-package-with-semver-to-npm/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/auto-publish-typescript-package-with-semver-to-npm/</guid><description>使用套件時總是會好奇一般管理套件開發的流程是如何？我透過 Matt Pocock 的 Blazing Fast Tips: Publishing to NPM 教學影片順手實作了一次，並且把自己之前遇過的需求寫成一個獨立的 TS 套件公開發布：edit-element。</description><pubDate>Wed, 11 Dec 2024 00:00:00 GMT</pubDate><category>CI-CD</category><category>NPM</category></item><item><title>Building Express.js project by Utilizing MVC Pattern</title><link>https://www.webdong.dev/en/post/express-mvc/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/express-mvc/</guid><description>Express provides elegant APIs for handling requests, but having all code in one app.js is not ideal. Utilizing MVC architecture for better maintainability.</description><pubDate>Fri, 29 Nov 2024 00:00:00 GMT</pubDate><category>Express.js</category><category>MVC</category></item><item><title>Express.js 入门构建 MVC 示例</title><link>https://www.webdong.dev/zh-cn/post/express-mvc/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/express-mvc/</guid><description>Express 提供便捷优雅的API 让我们接收请求经过处理后回应，但会发现随着规模庞大起来路径、商业逻辑、资料……等代码都塞在一个 app.js 实在不是一个好做法，于是这篇文章介绍使用MVC 架构替代码进行用途上的切割，以方便维护。</description><pubDate>Fri, 29 Nov 2024 00:00:00 GMT</pubDate><category>Express.js</category><category>MVC</category></item><item><title>Express.js 入門建構 MVC 範例</title><link>https://www.webdong.dev/zh-tw/post/express-mvc/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/express-mvc/</guid><description>Express 提供便捷優雅的 API 讓我們接收請求經過處理後回應，但會發現隨著規模龐大起來路徑、商業邏輯、資料……等代碼都塞在一個 app.js 實在不是一個好做法，於是這篇文章介紹使用 MVC 架構替代碼進行用途上的切割，以方便維護。</description><pubDate>Fri, 29 Nov 2024 00:00:00 GMT</pubDate><category>Express.js</category><category>MVC</category></item><item><title>Creating a Simple CRUD Todo List with Express.js</title><link>https://www.webdong.dev/en/post/expressjs-basic-crud-todolist/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/expressjs-basic-crud-todolist/</guid><description>Express.js is the closest framework to frontend, ideal for full-stack engineers to quickly engage with both fields. Let&apos;s build a simple in-memory todo backend</description><pubDate>Mon, 25 Nov 2024 00:00:00 GMT</pubDate><category>Express.js</category><category>CRUD</category><category>Beginner</category></item><item><title>Express.js 入门造个简单的增删查改待办事项</title><link>https://www.webdong.dev/zh-cn/post/expressjs-basic-crud-todolist/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/expressjs-basic-crud-todolist/</guid><description>近期正在学习后端相关领域，与前端最贴近的框架绝对就是 Express.js 了，很适合目标为全端的工程师。这次实作并不会牵扯到数据库相关的部分，侷限在使用 Express.js 打造一个简单的 in-memory 待办事项后端服务器。</description><pubDate>Mon, 25 Nov 2024 00:00:00 GMT</pubDate><category>Express.js</category><category>CRUD</category><category>Beginner</category></item><item><title>Express.js 入門造個簡單的增刪查改待辦事項</title><link>https://www.webdong.dev/zh-tw/post/expressjs-basic-crud-todolist/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/expressjs-basic-crud-todolist/</guid><description>近期正在學習後端相關領域，與前端最貼近的框架絕對就是 Express.js 了，很適合目標為全端的工程師，因為可以使用單一語言最快接觸到兩種領域。這次實作並不會牽扯到資料庫相關的部分，侷限在使用 Express.js 打造一個簡單的 in-memory 代辦事項後端伺服器，熟悉一下開設增刪查改相關 API。</description><pubDate>Mon, 25 Nov 2024 00:00:00 GMT</pubDate><category>Express.js</category><category>CRUD</category><category>Beginner</category></item><item><title>前端需要知道的無障礙網頁</title><link>https://www.webdong.dev/zh-tw/post/accessibility-and-webpage/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/accessibility-and-webpage/</guid><description>近期看到 Web Dev Simplified 推出的教學促使我趕緊打開這篇文章記錄其中提到的網頁無障礙需要留意的地方，並且補充上一些我自己實驗有幫助的資訊。無障礙一直是我想重視但實際開發時優先順序總是排在最後的要求，差勁的無障礙對某些使用者來說會嚴重影響到網頁互動的體驗，身為前端讓網頁保持良好的無障礙是基本責任。</description><pubDate>Tue, 12 Nov 2024 00:00:00 GMT</pubDate><category>Accessibility</category><category>ARIA</category></item><item><title>Why Object.keys returns string[] in TypeScript</title><link>https://www.webdong.dev/en/post/why-object-keys-returns-array-of-strings-in-typescript/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/why-object-keys-returns-array-of-strings-in-typescript/</guid><description>TypeScript `Object.keys` returning `string[]` for object. Let&apos;s explores the reasons and provides solutions for different scenarios.</description><pubDate>Tue, 05 Nov 2024 00:00:00 GMT</pubDate><category>TypeScript</category><category>unsorted</category></item><item><title>为什么 TypeScript 中 Object.keys 返回 string[] 型别？</title><link>https://www.webdong.dev/zh-cn/post/why-object-keys-returns-array-of-strings-in-typescript/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/why-object-keys-returns-array-of-strings-in-typescript/</guid><description>TypeScript 存在一些不太直觉但背后却有合理因素的问题要留意，像是无论传入任何对象进 `Object.keys` 都仍会返回 `string[]` 型别是其中之一，本文探讨背后因素与提供不同方向的解套方法供不同情境使用。</description><pubDate>Tue, 05 Nov 2024 00:00:00 GMT</pubDate><category>TypeScript</category><category>unsorted</category></item><item><title>為什麼 TypeScript 中 Object.keys 返回 string[] 型別？</title><link>https://www.webdong.dev/zh-tw/post/why-object-keys-returns-array-of-strings-in-typescript/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/why-object-keys-returns-array-of-strings-in-typescript/</guid><description>TypeScript 存在一些不太直覺但背後卻有合理因素的問題要留意，像是無論傳入任何物件進 `Object.keys` 都仍會回傳 `string[]` 型別是其中之一，本文探討背後因素與提供不同方向的解套方法供不同情境使用。</description><pubDate>Tue, 05 Nov 2024 00:00:00 GMT</pubDate><category>TypeScript</category><category>unsorted</category></item><item><title>How I write GitHub profile</title><link>https://www.webdong.dev/en/post/how-i-write-github-profile/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/how-i-write-github-profile/</guid><description>&quot;How to write a GitHub profile&quot; is like &quot;How developers create their business cards.&quot; Profile is the first impression.</description><pubDate>Wed, 25 Sep 2024 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>GitHub</category></item><item><title>如何编写 GitHub 个人档案</title><link>https://www.webdong.dev/zh-cn/post/how-i-write-github-profile/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/how-i-write-github-profile/</guid><description>「如何编写 GitHub 个人档案」这个问题其实就像是「开发者怎么制作自己的名片」，毕竟对你感兴趣的人来说 GitHub 个人档案就是第一印象，所以可以斟酌放些「你热爱参与的专案或展示专业」基本不会错。像我有热情持续经营展现技术博客那就放上最大篇幅去介绍，把作品、博客或履历放上。</description><pubDate>Wed, 25 Sep 2024 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>GitHub</category></item><item><title>如何編寫 GitHub 個人檔案</title><link>https://www.webdong.dev/zh-tw/post/how-i-write-github-profile/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/how-i-write-github-profile/</guid><description>「如何編寫 GitHub 個人檔案」這個問題其實就像是「開發者怎麼製作自己的名片」，畢竟對你感興趣的人來說 GitHub 個人檔案就是第一印象，所以可以斟酌放些「你熱愛參與的專案或展示專業」基本不會錯。像我有熱情持續經營展現技術部落格那就放上最大篇幅去介紹，把作品、部落格或履歷放上。</description><pubDate>Wed, 25 Sep 2024 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>GitHub</category></item><item><title>Build a Cinema Seats Layout by using CSS Grid and Form</title><link>https://www.webdong.dev/en/post/cinema-seats-layout/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/cinema-seats-layout/</guid><description>Let&apos;s build a cinema seats layout! It&apos;s an interesting Frontend problem that required a comprehensive understanding to solve.</description><pubDate>Thu, 19 Sep 2024 00:00:00 GMT</pubDate><category>CSS</category><category>Form</category><category>Grid</category></item><item><title>CSS Grid 与表单实现电影院座位选位系统</title><link>https://www.webdong.dev/zh-cn/post/cinema-seats-layout/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/cinema-seats-layout/</guid><description>之前碰到一道有趣的前端 UI 题，发现需要对于前端有较为全面的认知才有办法解出来，并且也可以针对感兴趣的领域延伸提出更更多问题，于是特地纪录一下我的思考解题过程。身为一名前端工程师，你会怎么实作上图的电影院座位选位系统？</description><pubDate>Thu, 19 Sep 2024 00:00:00 GMT</pubDate><category>CSS</category><category>Form</category><category>Grid</category></item><item><title>CSS Grid 與表單實作電影院座位選位系統</title><link>https://www.webdong.dev/zh-tw/post/cinema-seats-layout/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/cinema-seats-layout/</guid><description>之前碰到一道有趣的前端 UI 題，發現需要對於前端有較為全面的認知才有辦法解出來，並且也可以針對感興趣的領域延伸提出更更多問題，於是特地紀錄一下我的思考解題過程。身為一名前端工程師，你會怎麼實作上圖的電影院座位選位系統？</description><pubDate>Thu, 19 Sep 2024 00:00:00 GMT</pubDate><category>CSS</category><category>Form</category><category>Grid</category></item><item><title>Intersection Observer 真實案例：自動更新目錄</title><link>https://www.webdong.dev/zh-tw/post/real-use-case-of-intersection-observer-toc/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/real-use-case-of-intersection-observer-toc/</guid><description>近期製作到內容大綱（Table of Contents）相關的功能，發現是一個很適合使用 Intersection Observer 的案例，透過監聽特定元素來自動更新目錄的狀態。在早期可能會需要透過 getBoundingClientRect 之類的方法來計算元素有沒有離開視窗，現在這樣的需求就變得更加容易實現。</description><pubDate>Mon, 16 Sep 2024 00:00:00 GMT</pubDate><category>Implementation</category><category>toc</category><category>Intersection Observer</category><category>getBoundingClientRect</category></item><item><title>Real Use Case of CSS Grid: Extended Sidebar</title><link>https://www.webdong.dev/en/post/real-use-case-of-css-grid-extended-sidebar/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/real-use-case-of-css-grid-extended-sidebar/</guid><description>Real-world web pages rarely require CSS Grid for special visuals. This article helps deepen understanding of CSS Grid through real-world cases.</description><pubDate>Sun, 15 Sep 2024 00:00:00 GMT</pubDate><category>CSS</category><category>Grid</category></item><item><title>CSS Grid 真实案例：凸出的侧栏</title><link>https://www.webdong.dev/zh-cn/post/real-use-case-of-css-grid-extended-sidebar/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/real-use-case-of-css-grid-extended-sidebar/</guid><description>实际网页很少遇到特殊的视觉会需要动用到 CSS Grid 的情况，而我近期在制作一些比较特殊视觉的网页布局，事后感觉特别适合作为一个 CSS Grid 的启发教材，于是写下了本篇文章帮助透过真实世界案例更深刻了解 CSS Grid。</description><pubDate>Sun, 15 Sep 2024 00:00:00 GMT</pubDate><category>CSS</category><category>Grid</category></item><item><title>CSS Grid 真實案例：凸出的側欄</title><link>https://www.webdong.dev/zh-tw/post/real-use-case-of-css-grid-extended-sidebar/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/real-use-case-of-css-grid-extended-sidebar/</guid><description>實際網頁很少遇到特殊的視覺會需要動用到 CSS Grid 的情況，而我近期在製作一些比較特殊視覺的網頁布局，事後感覺特別適合作為一個 CSS Grid 的啟發教材，於是寫下了本篇文章幫助透過真實世界案例更深刻了解 CSS Grid。</description><pubDate>Sun, 15 Sep 2024 00:00:00 GMT</pubDate><category>CSS</category><category>Grid</category></item><item><title>CORS for Web Developer</title><link>https://www.webdong.dev/en/post/cors-for-web-developer/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/cors-for-web-developer/</guid><description>CORS (Cross-Origin Resource Sharing) is a mechanism that determines whether a web page can access resources from other origins.</description><pubDate>Mon, 02 Sep 2024 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>unsorted</category></item><item><title>写给网页开发者的 CORS 理解</title><link>https://www.webdong.dev/zh-cn/post/cors-for-web-developer/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/cors-for-web-developer/</guid><description>CORS (Cross-Origin Resource Sharing) 跨来源资源共享，是一个机制用来决定网页是否能够存取其他来源的资源，能有效防止不同来源之间的不正当资源存取。透过 CORS，可以在保护用户资料的同时，允许合法的跨来源请求。</description><pubDate>Mon, 02 Sep 2024 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>unsorted</category></item><item><title>寫給網頁開發者的 CORS 理解</title><link>https://www.webdong.dev/zh-tw/post/cors-for-web-developer/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/cors-for-web-developer/</guid><description>CORS (Cross-Origin Resource Sharing) 跨來源資源共享，是一個機制用來決定網頁是否能夠存取其他來源的資源，能有效防止不同來源之間的不正當資源存取。透過 CORS，可以在保護用戶資料的同時，允許合法的跨來源請求。</description><pubDate>Mon, 02 Sep 2024 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>unsorted</category></item><item><title>Let&apos;s solve FizzBuzz! Detailed problem-solving process</title><link>https://www.webdong.dev/en/post/fizzbuzz/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/fizzbuzz/</guid><description>This time, I describe how to solve the problem by breaking down the FizzBuzz. It covers everything from basic solutions to advance you might need to aware.</description><pubDate>Sun, 01 Sep 2024 00:00:00 GMT</pubDate><category>Implementation</category><category>Beginner</category></item><item><title>解决 FizzBuzz 的详细思路</title><link>https://www.webdong.dev/zh-cn/post/fizzbuzz/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/fizzbuzz/</guid><description>这次我透过一步一步拆解解题路径来描述如何解题。从基本解到分离资料与逻辑、保持 immutable 以及边缘案例还有文件编写都有涵盖。打印出 1 到 100 的数字、假如数字是 3 的倍数，则打印 Fizz、假如数字是 5 的倍数，则打印 Buzz、假如数字是 3 和 5 的公倍数，则打印 FizzBuzz。</description><pubDate>Sun, 01 Sep 2024 00:00:00 GMT</pubDate><category>Implementation</category><category>Beginner</category></item><item><title>來解 FizzBuzz 吧！附詳細解題思路</title><link>https://www.webdong.dev/zh-tw/post/fizzbuzz/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/fizzbuzz/</guid><description>這次我透過一步一步拆解解題路徑來描述如何解題。從基本解到分離資料與邏輯、保持 immutable 以及邊緣案例還有文件編寫都有涵蓋。打印出 1 到 100 的數字、假如數字是 3 的倍數，則打印 Fizz、假如數字是 5 的倍數，則打印 Buzz、假如數字是 3 和 5 的公倍數，則打印 FizzBuzz。</description><pubDate>Sun, 01 Sep 2024 00:00:00 GMT</pubDate><category>Implementation</category><category>Beginner</category></item><item><title>CSRF for Web Developer</title><link>https://www.webdong.dev/en/post/csrf-for-web-developer/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/csrf-for-web-developer/</guid><description>Regardless, one should never easily trust user requests to prevent CSRF. I&apos;ve recently found my knowledge in this area lacking, so I&apos;m catching up.</description><pubDate>Sat, 31 Aug 2024 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>unsorted</category></item><item><title>写给网页开发者的 CSRF 理解与防范</title><link>https://www.webdong.dev/zh-cn/post/csrf-for-web-developer/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/csrf-for-web-developer/</guid><description>无论如何都不轻易相信用户请求即能最大程度防范 CSRF。最近在碰一些资安的东东，发现自己对于这一块知识都比较薄弱，身为前端工程师资安通常并不是首要关注的职责，但一但有漏洞保证后果不堪设想，于是近期来补足一下这方面的知识。</description><pubDate>Sat, 31 Aug 2024 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>unsorted</category></item><item><title>寫給網頁開發者的 CSRF 理解與防範</title><link>https://www.webdong.dev/zh-tw/post/csrf-for-web-developer/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/csrf-for-web-developer/</guid><description>無論如何都不輕易相信用戶請求即能最大程度防範 CSRF。最近在碰一些資安的東東，發現自己對於這一塊知識都比較薄弱，身為前端工程師資安通常並不是首要關注的職責，但一但有漏洞保證後果不堪設想，於是近期來補足一下這方面的知識。</description><pubDate>Sat, 31 Aug 2024 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>unsorted</category></item><item><title>XSS for Web Developer</title><link>https://www.webdong.dev/en/post/xss-for-web-developer/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/xss-for-web-developer/</guid><description>The summary is to never easily trust user input to prevent XSS to the greatest extent. Recently, I found my knowledge in this area lacking.</description><pubDate>Fri, 30 Aug 2024 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>unsorted</category></item><item><title>写给网页开发者的 XSS 理解与防范</title><link>https://www.webdong.dev/zh-cn/post/xss-for-web-developer/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/xss-for-web-developer/</guid><description>总结是无论如何都不轻易相信用户输入即能最大程度防范 XSS。最近在碰一些资安的东东，发现自己对这一块知识都比较薄弱，身为前端工程师资安通常并不是首要关注的职责，但一旦有漏洞保证后果不堪设想，于是近期来补足一下这方面的知识。现代齐全的工具与文件帮助下意外执行用户提供的恶意脚本的概率已经大幅降低。</description><pubDate>Fri, 30 Aug 2024 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>unsorted</category></item><item><title>寫給網頁開發者的 XSS 理解與防範</title><link>https://www.webdong.dev/zh-tw/post/xss-for-web-developer/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/xss-for-web-developer/</guid><description>總結是無論如何都不輕易相信用戶輸入即能最大程度防範 XSS。最近在碰一些資安的東東，發現自己對於這一塊知識都比較薄弱，身為前端工程師資安通常並不是首要關注的職責，但一但有漏洞保證後果不堪設想，於是近期來補足一下這方面的知識。現代齊全的工具與文件幫助下意外執行用戶提供的惡意腳本的機率已經大幅降低。</description><pubDate>Fri, 30 Aug 2024 00:00:00 GMT</pubDate><category>Cybersecurity</category><category>unsorted</category></item><item><title>How to Manage Utility Functions</title><link>https://www.webdong.dev/en/post/how-to-organize-utility-functions/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/how-to-organize-utility-functions/</guid><description>I found many common functions scattered throughout the project. So, I took the opportunity to organize a unified structural rule for the team to use.</description><pubDate>Wed, 14 Aug 2024 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>如何管理工具函数</title><link>https://www.webdong.dev/zh-cn/post/how-to-organize-utility-functions/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/how-to-organize-utility-functions/</guid><description>近期维护项目时发现有许多通用的函数散乱的分布在项目当中，于是趁有空时整理出一个统一的结构规则以便团队使用。很多时候我们对这些通用工具函数的印象只停留在要抽离到某个文件夹，至于要怎么管理或是维护这些函数就没有太多想法，导致许多乱象产生，像是：过度抽象、意义不明的命名、神级函数。</description><pubDate>Wed, 14 Aug 2024 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>如何管理工具函式</title><link>https://www.webdong.dev/zh-tw/post/how-to-organize-utility-functions/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/how-to-organize-utility-functions/</guid><description>近期維護專案時發現有許多通用的函式散亂的分布在專案當中，於是趁有空時整理出一個統一的結構規則以便團隊使用。很多時候我們對這些通用工具函式的印象只停留在要抽離到某個資料夾，至於要怎麼管理或是維護這些函式就沒有太多想法，導致許多亂象產生，像是：過度抽象、意義不明的命名、神級函式。</description><pubDate>Wed, 14 Aug 2024 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>What is Barrel File?</title><link>https://www.webdong.dev/en/post/what-is-barrel-file/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/what-is-barrel-file/</guid><description>Vite does not perform Tree Shake during development, leading to a lot of unused code being bundled, severely affecting the development experience.</description><pubDate>Tue, 30 Jul 2024 00:00:00 GMT</pubDate><category>Pattern</category><category>unsorted</category></item><item><title>什么是桶文件（Barrel File）模式？</title><link>https://www.webdong.dev/zh-cn/post/what-is-barrel-file/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/what-is-barrel-file/</guid><description>我之所以调查这个主题，是因为目前所在的团队大量使用这种模式，但 Vite 在开发中不进行 Tree Shake，导致每次开发环境都有大量无用代码被打包，严重影响开发体验。因此研究一下这种方法的理念与优缺点以架构更好的项目。</description><pubDate>Tue, 30 Jul 2024 00:00:00 GMT</pubDate><category>Pattern</category><category>unsorted</category></item><item><title>什麼是桶文件（Barrel File）模式？</title><link>https://www.webdong.dev/zh-tw/post/what-is-barrel-file/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/what-is-barrel-file/</guid><description>會想調查這個主題是因為目前所在的團隊大量地使用到這樣的模式，但 Vite 並不會在開發中進行 Tree Shake 就導致每一次開發環境都有大量的無用代碼被打包進去，嚴重影響到開發體驗。因此研究一下這種方法的理念與優缺點以架構更好的專案。</description><pubDate>Tue, 30 Jul 2024 00:00:00 GMT</pubDate><category>Pattern</category><category>unsorted</category></item><item><title>Map vs WeakMap in JavaScript</title><link>https://www.webdong.dev/en/post/map-vs-weakmap-in-javascript/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/map-vs-weakmap-in-javascript/</guid><description>I previously wrote an article about the built-in data structure in ES6 JavaScript: Map. This time, let&apos;s discuss WeakMap and how it differs from Map.</description><pubDate>Mon, 29 Jul 2024 00:00:00 GMT</pubDate><category>JavaScript</category><category>Data Structure</category></item><item><title>了解了 JavaScript Map，但 WeakMap 又是什么东西？</title><link>https://www.webdong.dev/zh-cn/post/map-vs-weakmap-in-javascript/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/map-vs-weakmap-in-javascript/</guid><description>前面写了一篇文章关于 ES6 JavaScript 当中的内建数据结构： Map，这次来谈谈 WeakMap，它又与 Map 有什么不同呢？会发现 WeakMap 相较 `Map` 少了非常多可用的方法，这是因为它们的根本处理数据的方式不同，Map 是强引用，而 WeakMap 是弱引用。</description><pubDate>Mon, 29 Jul 2024 00:00:00 GMT</pubDate><category>JavaScript</category><category>Data Structure</category></item><item><title>了解了 JavaScript Map，但 WeakMap 又是什麼東西？</title><link>https://www.webdong.dev/zh-tw/post/map-vs-weakmap-in-javascript/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/map-vs-weakmap-in-javascript/</guid><description>前面寫了一篇文章關於 ES6 JavaScript 當中的內建資料結構： Map，這次來談談 WeakMap，它又與 Map 有什麼不同呢？會發現 WeakMap 相較 `Map` 少了非常多可用的方法，這是因為它們的根本處理資料的方式不同，Map 是強引用，而 WeakMap 是弱引用。</description><pubDate>Mon, 29 Jul 2024 00:00:00 GMT</pubDate><category>JavaScript</category><category>Data Structure</category></item><item><title>Future of the Web - Native Web Components</title><link>https://www.webdong.dev/en/post/future-of-the-web-native-web-components/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/future-of-the-web-native-web-components/</guid><description>Browsers began to introduce Web Components related APIs and standards, but I never had the chance to use this technology in practice.</description><pubDate>Sat, 27 Jul 2024 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>Web API</category></item><item><title>了解网页组件化的未来：Web Components</title><link>https://www.webdong.dev/zh-cn/post/future-of-the-web-native-web-components/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/future-of-the-web-native-web-components/</guid><description>从很早以前就大致知道浏览器开始推出 Web Components 相关 API 与标准，但一直没有机会在实战中使用这项技术。想撰写这篇文章记录是因为随着时间推移发现 Web Components 的应用范围越来越广，因此趁着有空也来了解一下相关知识，并且分析它与现有的解决方案有什么不同。</description><pubDate>Sat, 27 Jul 2024 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>Web API</category></item><item><title>了解網頁元件化的未來：Web Components</title><link>https://www.webdong.dev/zh-tw/post/future-of-the-web-native-web-components/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/future-of-the-web-native-web-components/</guid><description>從很早以前就大致知道瀏覽器開始推出 Web Components 相關 API 與標準，但一直沒有機會在實戰中使用這項技術。想撰寫這篇文章記錄是因為隨著時間推移發現 Web Components 的應用範疇越來越廣，因此趁著有空也來了解一下相關知識，並且分析它與現有的解決方案有什麼不同。</description><pubDate>Sat, 27 Jul 2024 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>Web API</category></item><item><title>Why Should We Test Software?</title><link>https://www.webdong.dev/en/post/why-write-software-test/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/why-write-software-test/</guid><description>Recently, I&apos;ve set higher expectations for my programming, and testing has become a crucial area. But does a working program mean testing is unnecessary?</description><pubDate>Mon, 22 Jul 2024 00:00:00 GMT</pubDate><category>Software Testing</category><category>unsorted</category></item><item><title>为什么要替软件进行测试？</title><link>https://www.webdong.dev/zh-cn/post/why-write-software-test/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/why-write-software-test/</guid><description>近期我对自己看待撰写程式这件事有更高的期许，除了最基本的效能、阅读性、扩充性……之外还有一个非常重要的领域就是：测试。不过程式好端端的能动就代表测试没有必要了吗？在我刚工作时实际上做了一段时间的自动化 QA 工程一段时间，不过那时候的我其实也并不明白写测试的原因，就是有程式就拿来自动化测试，并没有想太多。</description><pubDate>Mon, 22 Jul 2024 00:00:00 GMT</pubDate><category>Software Testing</category><category>unsorted</category></item><item><title>為什麼要替軟體進行測試？</title><link>https://www.webdong.dev/zh-tw/post/why-write-software-test/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/why-write-software-test/</guid><description>近期我對自己看待撰寫程式這件事有更高的期許，除了最基本的效能、閱讀性、擴充性……之外還有一個非常重要的領域就是：測試。不過程式好端端的能動就代表測試沒有必要了嗎？在我剛工作時實際上做了一段時間的自動化 QA 工程一段時間，不過那時候的我其實也並不明白寫測試的原因，就是有程式就拿來自動化測試，並沒有想太多。</description><pubDate>Mon, 22 Jul 2024 00:00:00 GMT</pubDate><category>Software Testing</category><category>unsorted</category></item><item><title>Map in ES6 JavaScript</title><link>https://www.webdong.dev/en/post/javascript-maps/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/javascript-maps/</guid><description>There is a data structure in JavaScript ES6 similar to objects that I have never fully understood. — Map. Let&apos;s compare objects with Map.</description><pubDate>Wed, 17 Jul 2024 00:00:00 GMT</pubDate><category>JavaScript</category><category>Data Structure</category></item><item><title>了解 ES6 JavaScript 中的内建数据结构： Map</title><link>https://www.webdong.dev/zh-cn/post/javascript-maps/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/javascript-maps/</guid><description>JavaScript ES6 中有一个用法与对象近似的数据结构我一直不是很清楚用途。—— Map，这篇文章将比较常见的对象与 Map，以辨别 Map 的特性与使用时机。总的来说可以把 Map 当作是用来频繁读写的对象，它具备更好的性能、更明确的语法。</description><pubDate>Wed, 17 Jul 2024 00:00:00 GMT</pubDate><category>JavaScript</category><category>Data Structure</category></item><item><title>了解 ES6 JavaScript 當中的內建資料結構： Map</title><link>https://www.webdong.dev/zh-tw/post/javascript-maps/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/javascript-maps/</guid><description>JavaScript ES6 中有一個用法與物件近似的資料結構我一直不是很清楚用途。 —— Map，這篇文章會主要拿熟知常見的物件與 Map 來做比較以分辨出 Map 的特性與使用時機。總結來說可以把 Map 當作是用來頻繁讀寫的物件，它具備更好的性能、更明確的語法。</description><pubDate>Wed, 17 Jul 2024 00:00:00 GMT</pubDate><category>JavaScript</category><category>Data Structure</category></item><item><title>Why is Time Estimating Hard</title><link>https://www.webdong.dev/en/post/why-is-time-estimating-hard/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/why-is-time-estimating-hard/</guid><description>I often just see problems and try to solve them. But if a project is on fire and the manager sets an unrealistic timeline, how do you explain it?</description><pubDate>Sat, 13 Jul 2024 00:00:00 GMT</pubDate><category>Team</category><category>unsorted</category></item><item><title>为什么项目时间预估这么难？具体可以如何解决时程预判问题</title><link>https://www.webdong.dev/zh-cn/post/why-is-time-estimating-hard/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/why-is-time-estimating-hard/</guid><description>发现身为初阶打工人其实通常只是看见问题并拼命解决它，但换个角度思考：“如果现在手上项目烧起来，主管定个超乎预期的时程但你也没有自己一套说法，要如何交代？”，最贴近实作的人其实是最能开出真实预估的人。参考：The work is never just “the work” - Dave Stewart 文章。</description><pubDate>Sat, 13 Jul 2024 00:00:00 GMT</pubDate><category>Team</category><category>unsorted</category></item><item><title>為什麼專案時間預估這麼難？具體可以如何解決時程預判問題</title><link>https://www.webdong.dev/zh-tw/post/why-is-time-estimating-hard/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/why-is-time-estimating-hard/</guid><description>發現身為初階打工人其實通常只是看見問題並拼命解決它，但換個角度思考：「如果現在手上專案燒起來，主管定個超乎預期的時程但你也沒有自己一套說法，要如何交代？」，最貼近實作的人其實是最能開出真實預估的人。參考：The work is never just “the work” - Dave Stewart 文章。</description><pubDate>Sat, 13 Jul 2024 00:00:00 GMT</pubDate><category>Team</category><category>unsorted</category></item><item><title>How to Manage Digital Product Variables</title><link>https://www.webdong.dev/en/post/how-to-organize-your-digital-product/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/how-to-organize-your-digital-product/</guid><description>Recent projects have involved a complete visual design overhaul, leading to facing the challenge of how to synchronize the management of product visuals.</description><pubDate>Fri, 05 Jul 2024 00:00:00 GMT</pubDate><category>UI</category><category>unsorted</category></item><item><title>具体来说可以怎么建立与管理产品的设计令牌或变量</title><link>https://www.webdong.dev/zh-cn/post/how-to-organize-your-digital-product/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/how-to-organize-your-digital-product/</guid><description>近期执行的专案在进行翻新包含了整体的视觉设计，因此前端也面临要如何同步管理产品视觉的问题。先说痛点，先前专案并没有具体的规范应该如何定义 UI 当中的数值，导致魔法数字（没有规范与描述的值）流窜于整个产品当中，造成了非常大的的困扰。我会解释得尽量具体明白如果要重新设计一款数字产品会怎么管理其中的数值。</description><pubDate>Fri, 05 Jul 2024 00:00:00 GMT</pubDate><category>UI</category><category>unsorted</category></item><item><title>具體來說可以怎麼建立與管理產品的設計令牌或變數</title><link>https://www.webdong.dev/zh-tw/post/how-to-organize-your-digital-product/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/how-to-organize-your-digital-product/</guid><description>近期執行的專案在進行翻新包含了整體的視覺設計，因此前端也面臨要如何同步管理產品視覺的問題。先說痛點，先前專案並沒有具體的規範應該如何定義 UI 當中的數值，導致魔法數字（沒有規範與描述的值）流竄於整個產品當中，造成了非常大的的困擾。我會解釋得盡量具體明白如果要重新設計一款數位產品會怎麼管理其中的數值。</description><pubDate>Fri, 05 Jul 2024 00:00:00 GMT</pubDate><category>UI</category><category>unsorted</category></item><item><title>How to Let Elements Escape the Container with CSS Grid</title><link>https://www.webdong.dev/en/post/how-to-escape-container-by-using-css-grid/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/how-to-escape-container-by-using-css-grid/</guid><description>To keep page content within reasonable limits, a fixed-size container is often needed. Unique layouts have emerged using CSS Grid for more flexibility.</description><pubDate>Wed, 03 Jul 2024 00:00:00 GMT</pubDate><category>CSS</category><category>Grid</category></item><item><title>如何通过 CSS Grid 让元素跳脱容器</title><link>https://www.webdong.dev/zh-cn/post/how-to-escape-container-by-using-css-grid/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/how-to-escape-container-by-using-css-grid/</guid><description>为了确保页面内容保持在合理的范围内，很多时候会需要在外层使用固定的尺寸作为网页内容的容器。而近期在翻新的页面有一些独特的布局样式，透过 CSS Grid 来更灵活的让容器内容也能跳脱安排在各处，主要参考 Kevin Powell 的做法。</description><pubDate>Wed, 03 Jul 2024 00:00:00 GMT</pubDate><category>CSS</category><category>Grid</category></item><item><title>如何透過 CSS Grid 讓元素跳脫容器</title><link>https://www.webdong.dev/zh-tw/post/how-to-escape-container-by-using-css-grid/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/how-to-escape-container-by-using-css-grid/</guid><description>為了確保頁面內容保持在合理的範圍內，很多時候會需要在外層使用固定的尺寸作為網頁內容的容器。而近期在翻新的頁面有一些獨特的布局樣式，透過 CSS Grid 來更靈活的讓容器內容也能跳脫安排在各處，主要參考 Kevin Powell 的做法。</description><pubDate>Wed, 03 Jul 2024 00:00:00 GMT</pubDate><category>CSS</category><category>Grid</category></item><item><title>Build Dark Mode (or Any Website Style) the Right Way</title><link>https://www.webdong.dev/en/post/build-theme-the-right-way/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/build-theme-the-right-way/</guid><description>&quot;the cost of adding dark mode&quot; inevitably increases costs more than expected, but using the right approach from the start can avoid many issues.</description><pubDate>Tue, 25 Jun 2024 00:00:00 GMT</pubDate><category>UI</category><category>unsorted</category></item><item><title>用正确的方式制作深色模式（或任何网站风格）</title><link>https://www.webdong.dev/zh-cn/post/build-theme-the-right-way/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/build-theme-the-right-way/</guid><description>先前提到「添加深色模式要考虑的代价」无可避免的会增加比预想中还要多的成本，但如果能在一开始用正确的方式制作网页风格，那么可以有效的避免掉许多问题。如果你希望制作不同风格的数字产品都可以参考本篇文章，用更省力的方式定义风格。</description><pubDate>Tue, 25 Jun 2024 00:00:00 GMT</pubDate><category>UI</category><category>unsorted</category></item><item><title>用正確的方式製作深色模式（或任何網站風格）</title><link>https://www.webdong.dev/zh-tw/post/build-theme-the-right-way/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/build-theme-the-right-way/</guid><description>先前提到「添加深色模式要考慮的代價」無可避免的會增加比預想中還要多的成本，但如果能在一開始用正確的方式製作網頁風格，那麼可以有效的避免掉許多問題。如果你希望製作不同風格的數位產品都可以參考本篇文章，用更省力的方式定義風格。</description><pubDate>Tue, 25 Jun 2024 00:00:00 GMT</pubDate><category>UI</category><category>unsorted</category></item><item><title>Embrace Every Unproductive Day</title><link>https://www.webdong.dev/en/post/embrace-every-unproductive-day/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/embrace-every-unproductive-day/</guid><description>While managing this blog, I gradually developed the habit of &quot;pushing new progress no matter how busy I am,&quot; forcing myself to refine my thoughts.</description><pubDate>Tue, 11 Jun 2024 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>Productive</category></item><item><title>拥抱低效率的一天</title><link>https://www.webdong.dev/zh-cn/post/embrace-every-unproductive-day/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/embrace-every-unproductive-day/</guid><description>经营这个部落格时我逐渐养成了「不管再忙也要推新进度上来」的习惯，不管是写文章、小短文、找题材、修复BUG 推新功能……总之每天都要尽量以让部落格更好这个方向努力进而强制自己去精炼思考。这种生产力非线性与专注在目标大方向的概念帮助我建立了不少习惯。</description><pubDate>Tue, 11 Jun 2024 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>Productive</category></item><item><title>擁抱低效率的一天</title><link>https://www.webdong.dev/zh-tw/post/embrace-every-unproductive-day/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/embrace-every-unproductive-day/</guid><description>經營這個部落格時我逐漸養成了「不管再忙也要推新進度上來」的習慣，不管是寫文章、小短文、找題材、修復 BUG 推新功能……總之每天都要盡量以讓部落格更好這個方向努力進而強制自己去精煉思考。這種生產力非線性與專注在目標大方向的概念幫助我建立了不少習慣。</description><pubDate>Tue, 11 Jun 2024 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>Productive</category></item><item><title>How to Achieve a Smoother Code Review Process?</title><link>https://www.webdong.dev/en/post/how-to-achieve-a-smoother-code-review-process/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/how-to-achieve-a-smoother-code-review-process/</guid><description>How to effectively conduct code reviews? This article aims to explore how to perform code reviews and improve overall code quality.</description><pubDate>Sat, 08 Jun 2024 00:00:00 GMT</pubDate><category>Team</category><category>Communication</category></item><item><title>如何达成更为流畅的代码审核？</title><link>https://www.webdong.dev/zh-cn/post/how-to-achieve-a-smoother-code-review-process/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/how-to-achieve-a-smoother-code-review-process/</guid><description>开发到现在为止都没有特别去了解如何好好的进行代码审核，大家默认会写代码就代表你也有能力去审核别人的代码，但我想这是一门额外的学习问题，从而促使我写下这篇文章去了解如何进行代码审核。审核代码是最直接可以养护并改善问题的阶段，主持得当的代码审核能够补足团队成员间的知识盲区进一步提升整体代码水平。</description><pubDate>Sat, 08 Jun 2024 00:00:00 GMT</pubDate><category>Team</category><category>Communication</category></item><item><title>如何達成更為流暢的代碼審核？</title><link>https://www.webdong.dev/zh-tw/post/how-to-achieve-a-smoother-code-review-process/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/how-to-achieve-a-smoother-code-review-process/</guid><description>開發至今從來都沒有特別去了解如何好好的執行代碼審核，大家都默認會寫代碼就代表你也有能力去審核別人代碼，但我想這是一門額外的學問，因而促使我寫下這篇文章去了解如何進行代碼審核。審核代碼是最直接可以發掘並改善問題的環節，主持得當的代碼審核能夠補足團隊成員間的知識盲區進而提升整體代碼水平。</description><pubDate>Sat, 08 Jun 2024 00:00:00 GMT</pubDate><category>Team</category><category>Communication</category></item><item><title>Writing like gardening, concept of digital garden blog</title><link>https://www.webdong.dev/en/post/blog-like-gardening/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/blog-like-gardening/</guid><description>In the development field, much of the work involves structuring information, so I find it fitting to call myself a &quot;🌵 Software Gardener.&quot;</description><pubDate>Mon, 03 Jun 2024 00:00:00 GMT</pubDate><category>Pattern</category><category>Writing</category></item><item><title>写作就像是在经营花园，替博客导入数字花园的概念</title><link>https://www.webdong.dev/zh-cn/post/blog-like-gardening/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/blog-like-gardening/</guid><description>身处开发领域会发现很多时候都是在做架构信息的工作，所以我觉得称呼自己的日常工作像是「🌵 软件园丁」是十分贴切的。如果你也同意写作是为了思考更多，并期望透过输出写作来精炼自己的思考那么「数字花园」这个概念你应该也会有兴趣。</description><pubDate>Mon, 03 Jun 2024 00:00:00 GMT</pubDate><category>Pattern</category><category>Writing</category></item><item><title>寫作就像是在經營花園，替部落格導入數位花園的概念</title><link>https://www.webdong.dev/zh-tw/post/blog-like-gardening/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/blog-like-gardening/</guid><description>身處開發領域會發現很多時候都是在做架構資訊的工作，所以我會覺得稱呼自己的日常工作像是「🌵 軟體園丁」是十分貼切的，如果你也同意寫作是為了思考更多，並期望透過輸出寫作來精煉自己的思考，那麼「數位花園」這個概念你應該也會有興趣。</description><pubDate>Mon, 03 Jun 2024 00:00:00 GMT</pubDate><category>Pattern</category><category>Writing</category></item><item><title>Death of CSS vendor prefix</title><link>https://www.webdong.dev/en/post/death-of-css-vendor-prefix/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/death-of-css-vendor-prefix/</guid><description>Browser engine prefixes were used to allow developers to implement new CSS features before support. But the need for prefixes has decreased.</description><pubDate>Thu, 30 May 2024 00:00:00 GMT</pubDate><category>CSS</category><category>Concept</category></item><item><title>逐渐凋零的浏览器引擎前缀</title><link>https://www.webdong.dev/zh-cn/post/death-of-css-vendor-prefix/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/death-of-css-vendor-prefix/</guid><description>浏览器引擎前缀是为了让开发者在浏览器尚未正式支援的情况下先使用这些前缀来实现一些新的 CSS 特性，甚至当时还时常会使用 PostCSS 这类预处理器的 autoprefixer 插件来预处理 CSS 添加上这些前缀。近期发现需要前缀的属性越来越少，未来也大机率不会再有新的前缀被加入了。</description><pubDate>Thu, 30 May 2024 00:00:00 GMT</pubDate><category>CSS</category><category>Concept</category></item><item><title>逐漸凋零的瀏覽器引擎前綴</title><link>https://www.webdong.dev/zh-tw/post/death-of-css-vendor-prefix/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/death-of-css-vendor-prefix/</guid><description>瀏覽器引擎前綴是為了讓開發者在瀏覽器尚未正式支援的情況下先使用這些前綴來實現一些新的 CSS 特性，甚至當時還時常會使用 PostCSS 這類預處理器的 autoprefixer 插件來預處理 CSS 添加上這些前綴。近期發現需要前綴的屬性越來越少，未來也大機率不會再有新的前綴被加入了。</description><pubDate>Thu, 30 May 2024 00:00:00 GMT</pubDate><category>CSS</category><category>Concept</category></item><item><title>How I Use Git LFS to Manage Large Git Files?</title><link>https://www.webdong.dev/en/post/how-i-use-git-lfs-to-manage-large-git-files/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/how-i-use-git-lfs-to-manage-large-git-files/</guid><description>Git allows us to track changes to any file and easily revert to any version, but it struggles with large files. Git LFS is an extension to solve this issue.</description><pubDate>Wed, 29 May 2024 00:00:00 GMT</pubDate><category>Git</category><category>unsorted</category></item><item><title>我如何使用 Git LFS 来管理大型 Git 档案？</title><link>https://www.webdong.dev/zh-cn/post/how-i-use-git-lfs-to-manage-large-git-files/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/how-i-use-git-lfs-to-manage-large-git-files/</guid><description>Git 允许我们纪录任何档案的变更，并且可以轻松地回溯到任何一个版本，但是当需要储存大型档案时Git 就会显得力不从心，因为Git 并不是为了储存大型档案（图片、影片、音乐……等二进制档案）而设计的。而这次介绍的 Git Large File Storage 是 Git 的扩充，专门用于解决以上问题。</description><pubDate>Wed, 29 May 2024 00:00:00 GMT</pubDate><category>Git</category><category>unsorted</category></item><item><title>我如何使用 Git LFS 來託付大型 Git 檔案？</title><link>https://www.webdong.dev/zh-tw/post/how-i-use-git-lfs-to-manage-large-git-files/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/how-i-use-git-lfs-to-manage-large-git-files/</guid><description>Git 允許我們紀錄任何檔案的變更，並且可以輕鬆地回溯到任何一個版本，但是當需要儲存大型檔案時 Git 就會顯得力不從心，因為 Git 並不是為了儲存大型檔案（圖片、影片、音樂……等二進制檔案）而設計的。而這次介紹的 Git Large File Storage 是 Git 的擴充，專門用於解決以上問題。</description><pubDate>Wed, 29 May 2024 00:00:00 GMT</pubDate><category>Git</category><category>unsorted</category></item><item><title>How to Code Review Using GitHub</title><link>https://www.webdong.dev/en/post/how-to-code-review-using-github/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/how-to-code-review-using-github/</guid><description>Git and GitHub have become mainstream in the industry. This article explores built-in features on GitHub that can enhance code review efficiency.</description><pubDate>Mon, 27 May 2024 00:00:00 GMT</pubDate><category>Git</category><category>unsorted</category></item><item><title>3 招提高 GitHub 代码审查效率</title><link>https://www.webdong.dev/zh-cn/post/how-to-code-review-using-github/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/how-to-code-review-using-github/</guid><description>如今 Git 与 GitHub 已经成为业界主流，有很大机率你的专案也会使用到它们来进行版本控制，但由于 GitHub 是一款基于 Git 附加的服务，所以我们时常会轻视它的功能，其实 GitHub 有许多不错的功能却不是那么明显，因此主要分享一些我认为有用但日常使用没有查觉到的功能。</description><pubDate>Mon, 27 May 2024 00:00:00 GMT</pubDate><category>Git</category><category>unsorted</category></item><item><title>3 招提高 GitHub 代碼審查效率</title><link>https://www.webdong.dev/zh-tw/post/how-to-code-review-using-github/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/how-to-code-review-using-github/</guid><description>如今 Git 與 GitHub 已經成為業界主流，有很大機率你的專案也會使用到它們來進行版本控制，但由於 GitHub 是一款基於 Git 附加的服務，所以我們時常會輕視它的功能，其實 GitHub 有許多不錯的功能卻不是那麼明顯，因此主要分享一些我認為有用但日常使用沒有查覺到的功能。</description><pubDate>Mon, 27 May 2024 00:00:00 GMT</pubDate><category>Git</category><category>unsorted</category></item><item><title>Rethink RWD through CSS Container Queries</title><link>https://www.webdong.dev/en/post/container-queries/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/container-queries/</guid><description>I first heard the term CSS Container Queries a year or two ago. As web evolves, this technology will be a key piece for future RWD web development.</description><pubDate>Sun, 26 May 2024 00:00:00 GMT</pubDate><category>CSS</category><category>RWD</category></item><item><title>重新思考如何构建 RWD 网页，透过 CSS Container Queries</title><link>https://www.webdong.dev/zh-cn/post/container-queries/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/container-queries/</guid><description>一开始听到CSS Container Queries 这个名词还是在一两年前，随着时间演进建构网页的模式也变动了许多次，我也越来越确信这项技术会是未来建构 RWD 网页的一块重要拼图，文章将介绍现有的Media Queries 有哪些缺陷，新解方则具备哪些优势？</description><pubDate>Sun, 26 May 2024 00:00:00 GMT</pubDate><category>CSS</category><category>RWD</category></item><item><title>重新思考如何建構 RWD 網頁，透過 CSS Container Queries</title><link>https://www.webdong.dev/zh-tw/post/container-queries/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/container-queries/</guid><description>一開始聽到 CSS Container Queries 這個名詞還是在一兩年前，隨著時間演進建構網頁的模式也變動了許多次，我也越來越確信這項技術會是未來建構 RWD 網頁的一塊重要拼圖，文章將介紹現有的 Media Queries 有哪些缺陷，新解方則具備哪些優勢？</description><pubDate>Sun, 26 May 2024 00:00:00 GMT</pubDate><category>CSS</category><category>RWD</category></item><item><title>Nx Migrate to Solve Upgrade Problem</title><link>https://www.webdong.dev/en/post/nx-migrate-to-solve-upgrade-problem/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/nx-migrate-to-solve-upgrade-problem/</guid><description>Recently, I added an automatic package update feature to the new Nx Monorepo project via GitHub Action, hoping for a more automated way to update dependencies.</description><pubDate>Fri, 24 May 2024 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>来看看 Nx 如何解决套件框架更新的问题 - nx migrate</title><link>https://www.webdong.dev/zh-cn/post/nx-migrate-to-solve-upgrade-problem/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/nx-migrate-to-solve-upgrade-problem/</guid><description>近期将公司的新 Nx Monorepo 架构专案透过 GitHub Action 添加了自动更新套件的功能，会想实践该功能是因为旧专案疏于更新导致吃了非常多的苦头，希望在新架构下可以有更轻松且自动化的方式去执行更新。其中 Nx 有专属的 nx migrate 指令帮助我们达成这件事，并且背后有些非常有趣的机制与理念。</description><pubDate>Fri, 24 May 2024 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>來看看 Nx 如何解決套件框架更新的問題 - nx migrate</title><link>https://www.webdong.dev/zh-tw/post/nx-migrate-to-solve-upgrade-problem/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/nx-migrate-to-solve-upgrade-problem/</guid><description>近期將公司的新 Nx Monorepo 架構專案透過 GitHub Action 添加了自動更新套件的功能，會想實踐該功能是因為舊專案疏於更新導致吃了非常多的苦頭，希望在新架構下可以有更輕鬆且自動化的方式去執行更新。其中 Nx 有專屬的 nx migrate 指令幫助我們達成這件事，並且背後有些非常有趣的機制與理念。</description><pubDate>Fri, 24 May 2024 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>The Cost of Implementing Dark Mode</title><link>https://www.webdong.dev/en/post/cost-behind-adding-darkmode/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/cost-behind-adding-darkmode/</guid><description>Recently, a project I maintain planning to introduce Dark Mode, but I believe it&apos;s not a cost-effective choice. This article discusses why I think so.</description><pubDate>Mon, 20 May 2024 00:00:00 GMT</pubDate><category>UX</category><category>unsorted</category></item><item><title>添加深色模式需要考虑的代价</title><link>https://www.webdong.dev/zh-cn/post/cost-behind-adding-darkmode/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/cost-behind-adding-darkmode/</guid><description>近期维护的项目希望引入深色模式，但分析后我认为实现这个需求并不是一个划算的选择，本文将讨论原因。如今许多网站和应用程序默认提供深色模式，这是一种将背景色转为深色，前景色转为浅色的设计手段，具备各种功能性和情感上的特点，例如：节省设备电力、降低眼睛疲劳……</description><pubDate>Mon, 20 May 2024 00:00:00 GMT</pubDate><category>UX</category><category>unsorted</category></item><item><title>添加深色模式要考慮的代價</title><link>https://www.webdong.dev/zh-tw/post/cost-behind-adding-darkmode/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/cost-behind-adding-darkmode/</guid><description>近期維護的專案希望導入深色模式 （Darkmode），但分析下來我認為實踐這個需求並不是一項划算的選擇，這篇文章將會討論為什麼我會這樣認為。如今許多網站和應用程式預設都提供了深色模式，這是一種將背景色轉為深色，前景色轉為淺色的設計手段，具備各種功能性和情感上的特點，例如：節省裝置電力、降低眼睛疲勞……</description><pubDate>Mon, 20 May 2024 00:00:00 GMT</pubDate><category>UX</category><category>unsorted</category></item><item><title>Differences in Usage Between @ts-ignore and @ts-expect-error</title><link>https://www.webdong.dev/en/post/ts-ignore-vs-expect-error/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/ts-ignore-vs-expect-error/</guid><description>While refactoring a project, I encountered type issues that I initially ignored using `@ts-ignore` or `@ts-expect-error`.</description><pubDate>Sun, 19 May 2024 00:00:00 GMT</pubDate><category>TypeScript</category><category>unsorted</category></item><item><title>@ts-ignore 与 @ts-expect-error 的使用时机差异</title><link>https://www.webdong.dev/zh-cn/post/ts-ignore-vs-expect-error/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/ts-ignore-vs-expect-error/</guid><description>近期在替项目做大型重构，其中就有将技术转换为 TypeScript 与 Monorepo，途中一些还没有头绪如何解决的类型问题，就会使用 `@ts-ignore` 或 `@ts-expect-error` 来先行忽略，但这两者的使用时机有所不同，这篇文章就来谈谈这两者的差异。</description><pubDate>Sun, 19 May 2024 00:00:00 GMT</pubDate><category>TypeScript</category><category>unsorted</category></item><item><title>@ts-ignore 與 @ts-expect-error 的使用時機差異</title><link>https://www.webdong.dev/zh-tw/post/ts-ignore-vs-expect-error/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/ts-ignore-vs-expect-error/</guid><description>近期在替專案做大型重構，其中就有將技術轉換為 TypeScript 與 Monorepo，途中一些還沒有頭緒如何解決的型別問題，就會使用 `@ts-ignore` 或 `@ts-expect-error` 來先行忽略，但這兩者的使用時機有所不同，這篇文章就來談談這兩者的差異。</description><pubDate>Sun, 19 May 2024 00:00:00 GMT</pubDate><category>TypeScript</category><category>unsorted</category></item><item><title>Git Flow, GitHub Flow, GitLab Flow, Trunk Based Development</title><link>https://www.webdong.dev/en/post/trunk-based-development/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/trunk-based-development/</guid><description>In maintaining projects of varying scales, to Understand the pros and cons of different Git branching strategies to select suitable ones for development.</description><pubDate>Fri, 17 May 2024 00:00:00 GMT</pubDate><category>Git</category><category>unsorted</category></item><item><title>完整介绍 Git 分支策略 feat. Git Flow, GitHub Flow, GitLab Flow, TBD</title><link>https://www.webdong.dev/zh-cn/post/trunk-based-development/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/trunk-based-development/</guid><description>近期在维护不同规模的专案，想说可以了解一下不同 Git 分支策略的优缺点来替专案选择适合的开发策略。现阶段我最常接触的是 Gitflow 的方式来进行开发，但发现这样的策略在小型规模的专案（5 人以下）并没有这么灵活好用，恰巧可以在全新的专案上尝试其他策略。</description><pubDate>Fri, 17 May 2024 00:00:00 GMT</pubDate><category>Git</category><category>unsorted</category></item><item><title>完整介紹 Git 分支策略 feat. Git Flow, GitHub Flow, GitLab Flow, TBD</title><link>https://www.webdong.dev/zh-tw/post/trunk-based-development/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/trunk-based-development/</guid><description>近期在維護不同規模的專案，想說可以了解一下不同 Git 分支策略的優缺點來替專案選擇適合的開發策略。現階段我最常接觸的是 Gitflow 的方式來進行開發，但發現這樣的策略在小型規模的專案（5 人以下）並沒有這麼靈活好用，恰巧可以在全新的專案上嘗試其他策略。</description><pubDate>Fri, 17 May 2024 00:00:00 GMT</pubDate><category>Git</category><category>unsorted</category></item><item><title>5 Tailwind Anti-Patterns You Must Avoid</title><link>https://www.webdong.dev/en/post/tailwind-anti-patterns/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/tailwind-anti-patterns/</guid><description>I&apos;ve encountered very user-unfriendly Tailwind projects. Some anti-patterns can be easily avoided early on, but become huge issues as the project scales.</description><pubDate>Sun, 05 May 2024 00:00:00 GMT</pubDate><category>CSS</category><category>Tailwind</category></item><item><title>绝对要避免的 5 项 Tailwind 反模式</title><link>https://www.webdong.dev/zh-cn/post/tailwind-anti-patterns/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/tailwind-anti-patterns/</guid><description>撰写这篇文章是因为接手过非常反人类的 Tailwind 项目，一些不应该出现的反模式其实都可以在早期被轻松避免，随着项目规模变大，这些反模式就会变成一个巨大的问题难以修正。本文将介绍一些我在项目中看到的反模式，并提醒你千万不要这样做！</description><pubDate>Sun, 05 May 2024 00:00:00 GMT</pubDate><category>CSS</category><category>Tailwind</category></item><item><title>絕對要避免的 5 項 Tailwind 反模式</title><link>https://www.webdong.dev/zh-tw/post/tailwind-anti-patterns/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/tailwind-anti-patterns/</guid><description>撰寫這篇文章是因為接手過非常反人類的 Tailwind 專案，一些不應該出現的反模式其實都可以在早期被輕鬆避免，當專案規模變大時，這些反模式就會變成一個巨大的問題難以修正。這篇文章將會介紹一些我在專案中看到的反模式，並且提醒你千萬不要這麼做！</description><pubDate>Sun, 05 May 2024 00:00:00 GMT</pubDate><category>CSS</category><category>Tailwind</category></item><item><title>The Story of How I Choose My Keyboard</title><link>https://www.webdong.dev/en/post/how-i-choose-my-keyboard/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/how-i-choose-my-keyboard/</guid><description>I only replace items when they are worn out. It wasn&apos;t until my frequently used membrane keyboard broke that I started looking for a new keyboard.</description><pubDate>Sat, 27 Apr 2024 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>unsorted</category></item><item><title>我如何选择自己键盘的故事</title><link>https://www.webdong.dev/zh-cn/post/how-i-choose-my-keyboard/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/how-i-choose-my-keyboard/</guid><description>我是一个物欲非常低的人，日常东西就是用到坏才换新，直到某天常用的薄膜键盘坏了才开始寻找新的键盘。在挑选新键盘的过程中让我想到选择键盘的一些故事促使写下这篇文章。作为软件工程师不外乎每天接触到的硬件生产力工具大概就是：键盘、鼠标、电脑、屏幕、椅子、笔电、大水杯（喝水非常重要），其中键盘绝对是情感最深厚的一一个。</description><pubDate>Sat, 27 Apr 2024 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>unsorted</category></item><item><title>我如何選擇自己鍵盤的故事</title><link>https://www.webdong.dev/zh-tw/post/how-i-choose-my-keyboard/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/how-i-choose-my-keyboard/</guid><description>我是一個物慾非常低的人，日常東西就是用到壞才換新，直到某天常用的薄膜鍵盤壞了才開始尋找新的鍵盤。在挑選新鍵盤的過程中讓我想到選擇鍵盤的一些故事促使寫下這篇文章。作為軟體工程師不外乎每天接觸到的硬體生產力工具大概就是：鍵盤、滑鼠、電腦、螢幕、椅子、筆電、大水杯（喝水非常重要），其中鍵盤絕對是情感最深厚的一個。</description><pubDate>Sat, 27 Apr 2024 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>unsorted</category></item><item><title>enum, const enum, as const - Enumeration in TypeScript</title><link>https://www.webdong.dev/en/post/enum-const-enum-and-as-const/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/enum-const-enum-and-as-const/</guid><description>To avoid hard-coded values and ensure clarity, I document some findings. The conclusion is to use as const for data management.</description><pubDate>Fri, 26 Apr 2024 00:00:00 GMT</pubDate><category>TypeScript</category><category>unsorted</category></item><item><title>enum、const enum 和 as const，应该如何列举资料于 TypeScript 当中？</title><link>https://www.webdong.dev/zh-cn/post/enum-const-enum-and-as-const/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/enum-const-enum-and-as-const/</guid><description>近期重写的专案中有许多状态需要管理，会需要统一管理资料于专案中，为了避免写死代码（Hard Coded）并且让接手的人都能轻易地了解资料型态，这里记录一些过程中的发现。结论是应该使用 as const 来达成列举资料管理，因为它更加直觉没有什么认知负担，并且更加灵活。</description><pubDate>Fri, 26 Apr 2024 00:00:00 GMT</pubDate><category>TypeScript</category><category>unsorted</category></item><item><title>enum、const enum 和 as const，應該如何列舉資料於 TypeScript 當中？</title><link>https://www.webdong.dev/zh-tw/post/enum-const-enum-and-as-const/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/enum-const-enum-and-as-const/</guid><description>近期重寫的專案中有許多狀態需要管理，會需要統一管理資料於專案中，為了避免寫死代碼（Hard Coded）並且讓接手的人都能輕易地瞭解資料型態，這裡記錄一些過程中的發現。結論是應該使用 as const 來達成列舉資料管理，因為它更加直覺沒有什麼認知負擔，並且更加靈活。</description><pubDate>Fri, 26 Apr 2024 00:00:00 GMT</pubDate><category>TypeScript</category><category>unsorted</category></item><item><title>Boring UI is Good UX: Why Do Websites Look Similar Now?</title><link>https://www.webdong.dev/en/post/why-websites-looks-the-same-nowaday/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/why-websites-looks-the-same-nowaday/</guid><description>Why do most websites look similar today, even in experience? Guides readers through web development history to conclude that &quot;boring UI is good UX.&quot;</description><pubDate>Thu, 25 Apr 2024 00:00:00 GMT</pubDate><category>UX</category><category>unsorted</category></item><item><title>无聊的 UI 是好的 UX，为什么现在的网站都长得差不多？</title><link>https://www.webdong.dev/zh-cn/post/why-websites-looks-the-same-nowaday/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/why-websites-looks-the-same-nowaday/</guid><description>为什么如今网站大多数都长得差不多，就连体验也差不多？我们时常会联想设计网页是一门富含创意创新的工作，但对使用者来说创新并不全然是一件好事。本篇文章希望引导读者了解网页发展的经历并推导出为什么「无聊的使用者介面是好的使用者体验」这个结论。</description><pubDate>Thu, 25 Apr 2024 00:00:00 GMT</pubDate><category>UX</category><category>unsorted</category></item><item><title>無聊的 UI 是好的 UX，為什麼現在的網站都長得差不多？</title><link>https://www.webdong.dev/zh-tw/post/why-websites-looks-the-same-nowaday/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/why-websites-looks-the-same-nowaday/</guid><description>為什麼如今網站大多數都長得差不多，就連體驗也差不多？我們時常會聯想設計網頁是一門富含創意創新的工作，但對使用者來說創新並不全然是一件好事。本篇文章希望引導讀者了解網頁發展的經歷並推導出為什麼「無聊的使用者介面是好的使用者體驗」這個結論。</description><pubDate>Thu, 25 Apr 2024 00:00:00 GMT</pubDate><category>UX</category><category>unsorted</category></item><item><title>Building UI Without Burden</title><link>https://www.webdong.dev/en/post/building-ui-without-burden/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/building-ui-without-burden/</guid><description>As a front-end engineer, my recent work experience has shown me that many development issues still revolve around the appearance.</description><pubDate>Sun, 21 Apr 2024 00:00:00 GMT</pubDate><category>UI</category><category>unsorted</category></item><item><title>建构正确的网页 UI 不应该是个麻烦的问题</title><link>https://www.webdong.dev/zh-cn/post/building-ui-without-burden/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/building-ui-without-burden/</guid><description>身为前端工程近期工作的感悟是很多时候开发问题还是陷于界面的外观、行为或互动层面上，并不是说花时间制作这些层面的事情就很逊，它们实际需要依靠经验丰富的开发者通过多方面的研究与考量才能打造合理的架构，例如有许多要留意的事：性能、适用性、可维护性、可测试性、搜索引擎优化、跨平台兼容性、多语言……</description><pubDate>Sun, 21 Apr 2024 00:00:00 GMT</pubDate><category>UI</category><category>unsorted</category></item><item><title>建構正確的網頁 UI 不應該是個麻煩的問題</title><link>https://www.webdong.dev/zh-tw/post/building-ui-without-burden/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/building-ui-without-burden/</guid><description>身為前端工程近期工作的感悟是很多時候開發問題還是陷於介面的外觀、行為或互動層面上，並不是說花時間製作這些層面的事情就很遜，它們實際需要依靠經驗豐富的開發者透過多方面的研究與考量才能打造合理的架構，例如有許多要留意的事：效能、適用性、可維護性、可測試性、搜尋引擎最佳化、跨平台相容性、多語系……</description><pubDate>Sun, 21 Apr 2024 00:00:00 GMT</pubDate><category>UI</category><category>unsorted</category></item><item><title>Future-Proof Your Career in the Age of AI</title><link>https://www.webdong.dev/en/post/future-proof-your-career-in-the-age-of-ai/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/future-proof-your-career-in-the-age-of-ai/</guid><description>AI will not leave our lives; it will only become more common, impacting our lives. What can humans do that AI cannot? What will future jobs look like?</description><pubDate>Mon, 15 Apr 2024 00:00:00 GMT</pubDate><category>AI</category><category>unsorted</category></item><item><title>如何在 AI 时代保障未来</title><link>https://www.webdong.dev/zh-cn/post/future-proof-your-career-in-the-age-of-ai/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/future-proof-your-career-in-the-age-of-ai/</guid><description>AI 并不会离开我们的生活，并且只会越来越普及，这也意味着我们的生活将受到影响。什么事情是人类能 AI 不能的？未来的工作会是怎么样？人们能做什么来保证未来？什么事情是人类能 AI 不能的？未来的工作会是怎么样？人们能做什么来保证未来？思考以上问题。</description><pubDate>Mon, 15 Apr 2024 00:00:00 GMT</pubDate><category>AI</category><category>unsorted</category></item><item><title>在 AI 時代應該如何保障未來</title><link>https://www.webdong.dev/zh-tw/post/future-proof-your-career-in-the-age-of-ai/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/future-proof-your-career-in-the-age-of-ai/</guid><description>AI 並不會離開我們的生活，並且只會越來越普及，這也意味著我們的生活將受到影響。什麼事情是人類能 AI 不能的？未來的工作會是怎麼樣？人們能做什麼來保證未來？什麼事情是人類能 AI 不能的？未來的工作會是怎麼樣？人們能做什麼來保證未來？思考以上問題。</description><pubDate>Mon, 15 Apr 2024 00:00:00 GMT</pubDate><category>AI</category><category>unsorted</category></item><item><title>Chcek Website Performance with Lighthouse CI in 3 Steps</title><link>https://www.webdong.dev/en/post/check-website-performance-with-lighthouse-ci/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/check-website-performance-with-lighthouse-ci/</guid><description>Manual testing has issues like unstable results and is time-consuming. Let’s try using Lighthouse CI for automated performance checks!</description><pubDate>Sun, 14 Apr 2024 00:00:00 GMT</pubDate><category>Web Performance</category><category>Lighthouse</category></item><item><title>只要三步骤透过 Lighthouse CI 自动化检测网站效能</title><link>https://www.webdong.dev/zh-cn/post/check-website-performance-with-lighthouse-ci/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/check-website-performance-with-lighthouse-ci/</guid><description>Lighthouse 是一款开源的自动化网页性能检测工具，通常在遇到网页性能问题时才逐个打开网页测试，手动测试总是会有：单次的测试结果不稳定、耗时费力、不利于团队开发的问题，今天来尝试使用 Lighthouse CI 自动化在每次代码更动时检测网页的性能问题吧！</description><pubDate>Sun, 14 Apr 2024 00:00:00 GMT</pubDate><category>Web Performance</category><category>Lighthouse</category></item><item><title>只要三步驟透過 Lighthouse CI 自動化檢測網站效能</title><link>https://www.webdong.dev/zh-tw/post/check-website-performance-with-lighthouse-ci/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/check-website-performance-with-lighthouse-ci/</guid><description>Lighthouse 是一款開源的自動化網頁效能檢測工具，通常都是遇上網頁效能問題才一個一個開網頁開來測試效能，手動測試總是會有：單次的測驗結果不穩、耗時費力、不利於團隊開發的問題，今天來嘗試使用 Lighthouse CI 自動化的在每次代碼更動時檢測網頁的效能問題吧！</description><pubDate>Sun, 14 Apr 2024 00:00:00 GMT</pubDate><category>Web Performance</category><category>Lighthouse</category></item><item><title>How to Add Search to Any Kind of Static Site Using Pagefind</title><link>https://www.webdong.dev/en/post/how-to-add-search-to-any-kind-of-static-site-using-pagefind/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/how-to-add-search-to-any-kind-of-static-site-using-pagefind/</guid><description>Give your site a custom search powered by WebAssembly. With the release of Pagefind 1.0, I replaced my custom fuse.js search with Pagefind.</description><pubDate>Sat, 13 Apr 2024 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>使用 Pagefind 替任何静态网站添加搜寻功能</title><link>https://www.webdong.dev/zh-cn/post/how-to-add-search-to-any-kind-of-static-site-using-pagefind/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/how-to-add-search-to-any-kind-of-static-site-using-pagefind/</guid><description>不到 3 步骤让你的网站拥有以 WebAssembly 高效驱动的客制化搜寻功能。静态网站像是部落格、文件、个人网站、公司网站……等这类阅读体验为主的网站通常都有搜寻内容的需求，恰逢 Pagefind 1.0 的推出我把原先自制的fuse.js 搜寻功能换成Pagefind，分享如何在任何静态网站上加入搜寻功能。</description><pubDate>Sat, 13 Apr 2024 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>使用 Pagefind 替任何靜態網站添加搜尋功能</title><link>https://www.webdong.dev/zh-tw/post/how-to-add-search-to-any-kind-of-static-site-using-pagefind/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/how-to-add-search-to-any-kind-of-static-site-using-pagefind/</guid><description>不到 3 步驟讓你的網站擁有以 WebAssembly 高效驅動的客製化搜尋功能。靜態網站像是部落格、文件、個人網站、公司網站……等這類閱讀體驗為主的網站通常都有搜尋內容的需求，恰逢 Pagefind 1.0 的推出我把原先自製的 fuse.js 搜尋功能換成 Pagefind，分享如何在任何靜態網站上加入搜尋功能。</description><pubDate>Sat, 13 Apr 2024 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>What is Shadcn UI? Why is it so popular?</title><link>https://www.webdong.dev/en/post/why-shadcn-ui/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/why-shadcn-ui/</guid><description>Recently, I used Shadcn for Vue to build web UI. It&apos;s a customizable component library based on Tailwind, allowing quick creation of web interfaces.</description><pubDate>Mon, 01 Apr 2024 00:00:00 GMT</pubDate><category>UI</category><category>unsorted</category></item><item><title>什么是 Shadcn UI？为什么在前端圈这么火爆？</title><link>https://www.webdong.dev/zh-cn/post/why-shadcn-ui/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/why-shadcn-ui/</guid><description>近期工作接触使用 Shadcn for Vue 来打造网页 UI，这是一款基于 Tailwind 可弹性客制化的组件组合，让我们可以快速建立出符合需求的网页界面。本文将介绍现有样式库的问题及 Shadcn UI 的特色，以及为什么在前端圈这么火爆。</description><pubDate>Mon, 01 Apr 2024 00:00:00 GMT</pubDate><category>UI</category><category>unsorted</category></item><item><title>什麼是 Shadcn UI？為什麼在前端圈這麼火爆？</title><link>https://www.webdong.dev/zh-tw/post/why-shadcn-ui/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/why-shadcn-ui/</guid><description>近期工作接觸使用 Shadcn for Vue 來打造網頁 UI，這是一款基於 Tailwind 可彈性客製化的元件組合，讓我們可以快速建立出符合需求的網頁介面。這篇文章將會介紹現有樣式庫的問題以及 Shadcn UI 的特色，以及為什麼在前端圈這麼火爆。</description><pubDate>Mon, 01 Apr 2024 00:00:00 GMT</pubDate><category>UI</category><category>unsorted</category></item><item><title>Design Forms Correctly, Essential UX for User Input</title><link>https://www.webdong.dev/en/post/design-a-good-form/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/design-a-good-form/</guid><description>Forms are the most common website elements and the bridge to users. This post summarizes essential form UX and why design choices matter.</description><pubDate>Sun, 31 Mar 2024 00:00:00 GMT</pubDate><category>UX</category><category>unsorted</category></item><item><title>如何正确地设计表单？必须知道的用户输入 UX 基础</title><link>https://www.webdong.dev/zh-cn/post/design-a-good-form/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/design-a-good-form/</guid><description>表单是是网站中最常见的功能性元素也是与用户沟通的桥梁，像是购买商品、注册会员、问卷填写……等各项行动都离不开它，然而这么重要的体验却时常被忽略，于是我决定整理一个良好的表单应该具备的体验以及为什么应该这样设计，供所有人了解常见的表单设计问题。</description><pubDate>Sun, 31 Mar 2024 00:00:00 GMT</pubDate><category>UX</category><category>unsorted</category></item><item><title>如何正確的設計表單？必須知道的用戶輸入 UX 基礎</title><link>https://www.webdong.dev/zh-tw/post/design-a-good-form/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/design-a-good-form/</guid><description>表單是是網站中最常見的功能性元素也是與用戶溝通的橋樑，像是購買商品、註冊會員、問卷填寫……等各項行動都離不開它，然而這麼重要的體驗卻時常被忽略，於是我決定整理一個良好的表單應該具備的體驗以及為什麼應該這樣設計，供所有人了解常見的表單設計問題。</description><pubDate>Sun, 31 Mar 2024 00:00:00 GMT</pubDate><category>UX</category><category>unsorted</category></item><item><title>How to Handle TypeScript Error?</title><link>https://www.webdong.dev/en/post/How-to-handle-typescript-error/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/How-to-handle-typescript-error/</guid><description>JavaScript has try...catch syntax for capturing errors. How can we ensure the type of errors thrown in TypeScript?</description><pubDate>Sat, 30 Mar 2024 00:00:00 GMT</pubDate><category>TypeScript</category><category>unsorted</category></item><item><title>Type Safety at Runtime with Zod</title><link>https://www.webdong.dev/en/post/type-safety-at-runtime-with-zod/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/type-safety-at-runtime-with-zod/</guid><description>Zod is a schema declaration and validation library led by TypeScript. The purpose of Zod is to easily write runtime data validation.</description><pubDate>Sat, 30 Mar 2024 00:00:00 GMT</pubDate><category>TypeScript</category><category>Zod</category></item><item><title>如何处理 TypeScript 抛出的错误？</title><link>https://www.webdong.dev/zh-cn/post/How-to-handle-typescript-error/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/How-to-handle-typescript-error/</guid><description>JavaScript 有 try...catch 语法用于捕捉程序中的错误情境，在需要时使用 throw 语法来抛出「任何错误」，通常建议会抛出 JS 默认的错误对象，但在 TypeScript 要怎么做才能确保抛出的错误的类型？</description><pubDate>Sat, 30 Mar 2024 00:00:00 GMT</pubDate><category>TypeScript</category><category>unsorted</category></item><item><title>使用 Zod 于运行时检验类型</title><link>https://www.webdong.dev/zh-cn/post/type-safety-at-runtime-with-zod/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/type-safety-at-runtime-with-zod/</guid><description>Zod 是以 TypeScript 为首的 Schema 声明和验证库，为什么有了 TypeScript 还需要 Zod？轻易的撰写运行时数据验证就是 Zod 的目的，像是验证第三方 API 传递的数据、用户输入在 URL 中或表单中的数据使用 Zod 来验证都很方便。</description><pubDate>Sat, 30 Mar 2024 00:00:00 GMT</pubDate><category>TypeScript</category><category>Zod</category></item><item><title>如何處理 TypeScript 拋出的錯誤？</title><link>https://www.webdong.dev/zh-tw/post/How-to-handle-typescript-error/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/How-to-handle-typescript-error/</guid><description>JavaScript 有 try...catch 語法用於捕捉程式中的錯誤情境，在需要時使用 throw 語法來拋出「任何錯誤」，通常建議會丟出 JS 預設的錯誤物件，但在 TypeScript 要怎麼做才能確保拋出的錯誤的型別？</description><pubDate>Sat, 30 Mar 2024 00:00:00 GMT</pubDate><category>TypeScript</category><category>unsorted</category></item><item><title>使用 Zod 於 Runtime 檢驗型別</title><link>https://www.webdong.dev/zh-tw/post/type-safety-at-runtime-with-zod/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/type-safety-at-runtime-with-zod/</guid><description>Zod 是以 TypeScript 為首的 Schema 聲明和驗證庫，為什麼有了 TypeScript 還需要 Zod？輕易的撰寫 Runtime 資料驗證就是 Zod 的目的，像是驗證三方 API 傳遞的資料、用戶輸入在 URL 中或表單中的資料使用 Zod 來驗證都很方便。</description><pubDate>Sat, 30 Mar 2024 00:00:00 GMT</pubDate><category>TypeScript</category><category>Zod</category></item><item><title>Describing Consensus: Goals, Problems, Solutions</title><link>https://www.webdong.dev/en/post/background-problem-solution/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/background-problem-solution/</guid><description>Recently reading about Goals, Problem, Solutions in Stay SasSy made me realize this is how I break down problems at work!</description><pubDate>Thu, 28 Mar 2024 00:00:00 GMT</pubDate><category>Team</category><category>Communication</category></item><item><title>达成共识的描述方式：目标、问题、解方</title><link>https://www.webdong.dev/zh-cn/post/background-problem-solution/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/background-problem-solution/</guid><description>最近阅读 Stay SasSy 提到的 Goals, Problem, Solutions 猛然察觉这不是我日常工作拆分问题的方式吗！简直是不谋而合，正好也想写一篇文章来分享这个达成共识的方法，同时这也是一个很好向上沟通的方式，不管是对团队还是对上级沟通都有帮助。</description><pubDate>Thu, 28 Mar 2024 00:00:00 GMT</pubDate><category>Team</category><category>Communication</category></item><item><title>達成共識的描述方式：目標、問題、解方</title><link>https://www.webdong.dev/zh-tw/post/background-problem-solution/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/background-problem-solution/</guid><description>最近閱讀 Stay SasSy 提到的 Goals, Problem, Solutions 猛然察覺這不是我日常工作拆分問題的方式嗎！簡直是不謀而合，正好也想寫一篇文章來分享這個達成共識的方法，同時這也是一個很好向上溝通的方式，不管是對團隊還是對上級溝通都有幫助。</description><pubDate>Thu, 28 Mar 2024 00:00:00 GMT</pubDate><category>Team</category><category>Communication</category></item><item><title>Why you shouldn&apos;t disable input and how to do it correctly</title><link>https://www.webdong.dev/en/post/why-you-shouldnt-disable-input-and-how-to-do-it-correctly/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/why-you-shouldnt-disable-input-and-how-to-do-it-correctly/</guid><description>Using the `disabled` attribute blocks users and creates confusion—explain the reason instead of just preventing actions.</description><pubDate>Sun, 24 Mar 2024 00:00:00 GMT</pubDate><category>UX</category><category>Buttons</category></item><item><title>为什么禁用输入通常是个糟糕的决定，以及如何正确禁用用户输入</title><link>https://www.webdong.dev/zh-cn/post/why-you-shouldnt-disable-input-and-how-to-do-it-correctly/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/why-you-shouldnt-disable-input-and-how-to-do-it-correctly/</guid><description>网页原先是静态文件，但随着需求增加，动态的改动网页的状态已变得普遍，随意使用 `disabled` 属性就像是在用户路上堵上一颗巨石，这样的设计不仅无法帮助用户解决问题，还会让用户感到困惑。我们应该尽全力让用户知道问题原因，而不是只做到「阻止用户的错误行为」。</description><pubDate>Sun, 24 Mar 2024 00:00:00 GMT</pubDate><category>UX</category><category>unsorted</category></item><item><title>為什麼禁用輸入通常是個糟糕的決定，以及如何正確禁用用戶輸入</title><link>https://www.webdong.dev/zh-tw/post/why-you-shouldnt-disable-input-and-how-to-do-it-correctly/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/why-you-shouldnt-disable-input-and-how-to-do-it-correctly/</guid><description>網頁原先是靜態文件，但隨著需求增加，動態的改動網頁的狀態已變得普遍，隨意使用 `disabled` 屬性就像是在用戶路上堵上一顆巨石，這樣的設計不僅無法幫助用戶解決問題，還會讓用戶感到困惑。我們應該盡全力讓用戶知道問題原因，而不是只做到「阻止用戶的錯誤行為」。</description><pubDate>Sun, 24 Mar 2024 00:00:00 GMT</pubDate><category>UX</category><category>unsorted</category></item><item><title>Astro Custom Component in MDX</title><link>https://www.webdong.dev/en/post/astro-custom-component-in-mdx/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/astro-custom-component-in-mdx/</guid><description>MDX in Astro gives me flexibility, but I prefer writing in Markdown. Can custom components be mapped to Markdown syntax?</description><pubDate>Sat, 23 Mar 2024 00:00:00 GMT</pubDate><category>Astro</category><category>unsorted</category></item><item><title>在 Astro MDX 中使用自定义组件</title><link>https://www.webdong.dev/zh-cn/post/astro-custom-component-in-mdx/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/astro-custom-component-in-mdx/</guid><description>在 Astro 中使用 MDX 撰写文章给我非常多的弹性，但绝大多数文章我还是希望使用 Markdown 现有的语法来撰写，像是：图片、程式码区块、列表……等，有没有办法将自定义的元件对应于 Markdown 语法呢？这样就不用每次都要再 MDX 中特地引入元件并使用，单纯的撰写 Markdown 即可。</description><pubDate>Sat, 23 Mar 2024 00:00:00 GMT</pubDate><category>Astro</category><category>unsorted</category></item><item><title>使用客製化元件在 Astro MDX 當中</title><link>https://www.webdong.dev/zh-tw/post/astro-custom-component-in-mdx/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/astro-custom-component-in-mdx/</guid><description>在 Astro 中使用 MDX 撰寫文章給我非常多的彈性，但絕大多數文章我還是希望使用 Markdown 現有的語法來撰寫，像是：圖片、程式碼區塊、列表……等，有沒有辦法將自定義的元件對應於 Markdown 語法呢？這樣就不用每次都要再 MDX 中特地引入元件並使用，單純的撰寫 Markdown 即可。</description><pubDate>Sat, 23 Mar 2024 00:00:00 GMT</pubDate><category>Astro</category><category>unsorted</category></item><item><title>Problem Between UI and Development</title><link>https://www.webdong.dev/en/post/problem-between-ui-and-development/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/problem-between-ui-and-development/</guid><description>why are UI design and development so uncoordinated? Can teams consistently deliver products that truly meet user needs?</description><pubDate>Sun, 17 Mar 2024 00:00:00 GMT</pubDate><category>Team</category><category>unsorted</category></item><item><title>TDD is Awesome You Should Try It! (Tutorial With Example)</title><link>https://www.webdong.dev/en/post/tdd-is-awesome/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/tdd-is-awesome/</guid><description>TDD Test-Driven Development is a development methodology where tests are written before the implementation code.</description><pubDate>Sun, 17 Mar 2024 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>存在于 UI 设计与开发之间的大问题</title><link>https://www.webdong.dev/zh-cn/post/problem-between-ui-and-development/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/problem-between-ui-and-development/</guid><description>Continuous Delivery 在《The Biggest Problem With UI》影片中指出我多年对产品 UI 开发流程的疑惑：为什么 UI 设计与开发总是如此不顺畅？本文探讨如何让团队稳定高效地产出真正满足用户需求的产品。</description><pubDate>Sun, 17 Mar 2024 00:00:00 GMT</pubDate><category>Team</category><category>unsorted</category></item><item><title>TDD 测试驱动开发超赞可以试试看（附实际操作范例）</title><link>https://www.webdong.dev/zh-cn/post/tdd-is-awesome/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/tdd-is-awesome/</guid><description>TDD 测试驱动开发是一种开发方法论，先写测试再实践代码，应该如何撰写测试？或许听过 TDD 但不清楚与单纯写测试差别在哪？这篇文章详细描述 TDD 的优势与实际操作范例快速了解 TDD 为什么这么赞。TDD 目的便是打造一个工作流程能够验证代码的行为，让开发者能够更有信心的重构、更动代码。</description><pubDate>Sun, 17 Mar 2024 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>存在於 UI 設計與開發之間的大問題</title><link>https://www.webdong.dev/zh-tw/post/problem-between-ui-and-development/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/problem-between-ui-and-development/</guid><description>Continuous Delivery 在 The Biggest Problem With UI 影片中點出了我多年來對於產品 UI 開發流程最大的疑惑：為什麼 UI 設計與開發的流程總是如此不順暢不協調？「有沒有辦法讓團隊穩定高效的產出真實滿足用戶需求的產品？」是本篇文章探討的核心問題。</description><pubDate>Sun, 17 Mar 2024 00:00:00 GMT</pubDate><category>Team</category><category>unsorted</category></item><item><title>TDD 測試驅動開發超讚可以試試看（附實際操作範例）</title><link>https://www.webdong.dev/zh-tw/post/tdd-is-awesome/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/tdd-is-awesome/</guid><description>TDD 測試驅動開發是一種開發方法論，先寫測試再實踐代碼，應該如何撰寫測試？或許聽過 TDD 但不清楚與單純寫測試差別在哪？這篇文章詳細描述 TDD 的優勢與實際操作範例快速了解 TDD 為什麼這麼讚。TDD 目的便是打造一個工作流程能夠驗證程式碼的行為，讓開發者能夠更有信心的重構、更動程式碼。</description><pubDate>Sun, 17 Mar 2024 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>3 Virtues From a Good Software Engineer</title><link>https://www.webdong.dev/en/post/three-virtues-from-a-good-software-engineer/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/three-virtues-from-a-good-software-engineer/</guid><description>Patience, communication, and thinking outside the box are the virtues I believe a software engineer should have. Do you agree with this idea?</description><pubDate>Sat, 16 Mar 2024 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>unsorted</category></item><item><title>软件工程师可以具备的三种优良美德</title><link>https://www.webdong.dev/zh-cn/post/three-virtues-from-a-good-software-engineer/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/three-virtues-from-a-good-software-engineer/</guid><description>观察并厘清什么样的「品格」是一位软件工程师可以具备的，以及普遍工作环境和社群带给我的感受，总结出几点可以解决问题的模式，在日常也作为我自己参考与努力的依据。有耐心、能沟通、跳脱框架是我理想中软件工程师可以具备的美德，不知道你是不是也认同这样的想法？</description><pubDate>Sat, 16 Mar 2024 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>unsorted</category></item><item><title>軟體工程師可以具備的 3 種優良美德</title><link>https://www.webdong.dev/zh-tw/post/three-virtues-from-a-good-software-engineer/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/three-virtues-from-a-good-software-engineer/</guid><description>觀察並釐清什麼樣的「品格」是一位工程師可以具備的，以及普遍工作環境和社群帶給我的感受，總結出幾點可以解決問題的模式，在日常也作為我自己參考與努力的依據。有耐心、能溝通、跳脫框架是我理想中軟體工程師可以具備的美德，不知道你是不是也認同這樣的想法？</description><pubDate>Sat, 16 Mar 2024 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>unsorted</category></item><item><title>2 Ways to Verify if JSON-LD is Working</title><link>https://www.webdong.dev/en/post/how-to-verify-jsonld-is-working/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/how-to-verify-jsonld-is-working/</guid><description>JSON-LD is a way to embed additional data to describe web content. This article shares my experience and how to verify JSON-LD is interpreted correctly.</description><pubDate>Tue, 12 Mar 2024 00:00:00 GMT</pubDate><category>SEO</category><category>unsorted</category></item><item><title>2 种方法验证 JSON-LD 是否正确运作？</title><link>https://www.webdong.dev/zh-cn/post/how-to-verify-jsonld-is-working/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/how-to-verify-jsonld-is-working/</guid><description>JSON-LD 是一种夹带更多资料以描述网页内容的方式之一。通常不太留意它，直到真正实施后也不知道有无用处？该如何检验搜索引擎是否正确抓到这笔资料？这篇文章分享我的经验以及让你实际验证 JSON-LD 是否和规范且被正确解读。</description><pubDate>Tue, 12 Mar 2024 00:00:00 GMT</pubDate><category>SEO</category><category>unsorted</category></item><item><title>2 種方法驗證 JSON-LD 是否正確運作</title><link>https://www.webdong.dev/zh-tw/post/how-to-verify-jsonld-is-working/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/how-to-verify-jsonld-is-working/</guid><description>JSON-LD 是一種夾帶更多資料以描述網頁網頁內容的方式之一。通常不會多留意它，直到真正實作下來也不知道有沒有任何用處？該如何檢驗搜尋引擎有正確抓到這筆資料？這篇文章分享我的經驗以及讓你實際驗證 JSON-LD 是否和規且有被正確解讀。</description><pubDate>Tue, 12 Mar 2024 00:00:00 GMT</pubDate><category>SEO</category><category>unsorted</category></item><item><title>How to Rewrite a Legacy System: The Ship of Theseus</title><link>https://www.webdong.dev/en/post/how-to-rewrite-a-legacy-system/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/how-to-rewrite-a-legacy-system/</guid><description>Recently faced with many issues of maintaining legacy code, documenting the dilemmas and solutions in rewriting legacy systems.</description><pubDate>Mon, 12 Feb 2024 00:00:00 GMT</pubDate><category>Pattern</category><category>Refactoring</category></item><item><title>The Dailies: A Good Way to Eliminate Team Learning Debt</title><link>https://www.webdong.dev/en/post/the-dailies-a-good-way-to-eliminate-team-learning-debt/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/the-dailies-a-good-way-to-eliminate-team-learning-debt/</guid><description>Developers&apos; &quot;failures&quot; transferring knowledge are not due to laziness. Instead, [pressures] create a complex tension between performance and learning goals.</description><pubDate>Mon, 12 Feb 2024 00:00:00 GMT</pubDate><category>Team</category><category>Communication</category></item><item><title>如何重写陈旧系统：就像忒修斯之船</title><link>https://www.webdong.dev/zh-cn/post/how-to-rewrite-a-legacy-system/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/how-to-rewrite-a-legacy-system/</guid><description>近期面对许多陈旧代码维护的问题，碰巧我翻找到这个博客：Understand Legacy Code，记录一下「重写」陈旧系统可能会遇到的困境与解套方案。以我自己手上的项目为例，在进行项目升级评估时发现事情比原先想象还要复杂！</description><pubDate>Mon, 12 Feb 2024 00:00:00 GMT</pubDate><category>Pattern</category><category>Refactoring</category></item><item><title>消除团队学习债务：每日小会</title><link>https://www.webdong.dev/zh-cn/post/the-dailies-a-good-way-to-eliminate-team-learning-debt/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/the-dailies-a-good-way-to-eliminate-team-learning-debt/</guid><description>开发者在记录或转移知识方面的「失败」并不是因为懒惰或缺乏关心。 相反，[环境压力]促使他们在绩效和学习目标之间的复杂紧张关系中找到平衡。当让学习变得显见并不安全时，绩效文化就会获胜。透过每日小会的方式，每天花费短小的时间让学习在团队中被提倡鼓励。</description><pubDate>Mon, 12 Feb 2024 00:00:00 GMT</pubDate><category>Team</category><category>Communication</category></item><item><title>如何重寫陳舊系統：就像忒修斯之船</title><link>https://www.webdong.dev/zh-tw/post/how-to-rewrite-a-legacy-system/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/how-to-rewrite-a-legacy-system/</guid><description>近期面對許多陳舊代碼維護的問題，碰巧我翻找到這個部落格：Understand Legacy Code，紀錄一下「重寫」陳舊系統可能會遇到的困境與解套方案。以我自己手上的專案為例，在進行專案升級評估時發現事情比原先想像還要複雜！</description><pubDate>Mon, 12 Feb 2024 00:00:00 GMT</pubDate><category>Pattern</category><category>Refactoring</category></item><item><title>消除團隊學習債務：每日小會</title><link>https://www.webdong.dev/zh-tw/post/the-dailies-a-good-way-to-eliminate-team-learning-debt/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/the-dailies-a-good-way-to-eliminate-team-learning-debt/</guid><description>開發者在記錄或轉移知識方面的「失敗」並不是因為懶惰或缺乏關心。 相反，[環境壓力]促使他們在績效和學習目標之間的複雜緊張關係中找到平衡。當讓學習變得顯見並不安全時，績效文化就會獲勝。透過每日小會的方式，每天花費短小的時間讓學習在團隊中被提倡鼓勵。</description><pubDate>Mon, 12 Feb 2024 00:00:00 GMT</pubDate><category>Team</category><category>Communication</category></item><item><title>內容於設計之前：給設計者的寫作建議</title><link>https://www.webdong.dev/zh-tw/post/build-content-before-design/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/build-content-before-design/</guid><description>UI 介面當中文字佔據了絕大多數的內容，文字充斥在設計的每個角落，它們是最有威力的設計元素之一，以極為精簡的形式傳遞深刻的意涵。這篇文章想分享設計與內容可以是相輔相成的概念，並且討論設計者在沒有內容的情況下設計可能造成什麼樣的問題。</description><pubDate>Mon, 05 Feb 2024 00:00:00 GMT</pubDate><category>UI</category><category>UX Writing</category></item><item><title>What is Monorepo? A straightforward explanation</title><link>https://www.webdong.dev/en/post/explain-monorepo/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/explain-monorepo/</guid><description>As the complexity of development increases, the term Monorepo frequently appears, To clarify my understanding of Monorepo, I wrote this post.</description><pubDate>Thu, 01 Feb 2024 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>Concept</category></item><item><title>故事化直白的解释 Monorepo 是什么</title><link>https://www.webdong.dev/zh-cn/post/explain-monorepo/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/explain-monorepo/</guid><description>随着前端的复杂程度增加，Monorepo 这个词汇也时常出现，可惜的是相关介绍资源非常不足，趁着近期较为闲暇的时间来统整记录一下我对 Monorepo 的理解。受到不同好文章与影片的启发，我想写一篇最直白的 Monorepo 解释，希望能够帮助更多人理解 Monorepo 的概念。</description><pubDate>Thu, 01 Feb 2024 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>Concept</category></item><item><title>故事化直白的解釋 Monorepo 是什麼</title><link>https://www.webdong.dev/zh-tw/post/explain-monorepo/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/explain-monorepo/</guid><description>隨著前端的複雜程度增加，Monorepo 這個詞彙也時常出現在眼前，可惜的是相關介紹資源非常不足，趁著近期較為閒暇的時間來統整紀錄一下我對 Monorepo 的理解。受到不同好文章與影片的的啟發，我想寫一篇最直白的 Monorepo 解釋，希望能夠幫助更多人理解 Monorepo 的概念。</description><pubDate>Thu, 01 Feb 2024 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>Concept</category></item><item><title>Build Scalable User Interfaces through Componentization</title><link>https://www.webdong.dev/en/post/build-reusable-interface-by-componentization/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/build-reusable-interface-by-componentization/</guid><description>For those with no prior knowledge of web pages, introducing the concept of &quot;UI componentization.&quot; Is a piece of a puzzle, a building block, a gear...</description><pubDate>Wed, 31 Jan 2024 00:00:00 GMT</pubDate><category>UI</category><category>Component</category></item><item><title>通过元件化以构建可扩展的用户界面</title><link>https://www.webdong.dev/zh-cn/post/build-reusable-interface-by-componentization/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/build-reusable-interface-by-componentization/</guid><description>近期在大改造现有产品的设计系统，预期会与来自不同领域的人合作，因此这篇文章是写给对网页无任何前置知识的人的，主要介绍「界面组件化」这个概念。组件是一块拼图、一个积木、一个齿轮……，就是一个可以被重复使用并且可被组合成更大物件的概念。</description><pubDate>Wed, 31 Jan 2024 00:00:00 GMT</pubDate><category>UI</category><category>Component</category></item><item><title>透過元件化以建構可擴展的使用者介面</title><link>https://www.webdong.dev/zh-tw/post/build-reusable-interface-by-componentization/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/build-reusable-interface-by-componentization/</guid><description>近期在大改造現有產品的設計系統，預期會與來自不同領域的人合作，因此這篇文章是寫給對網頁無任何前置知識的人的，主要介紹「介面元件化」這個概念。元件是一塊拼圖、一個積木、一個齒輪……，就是一個可以被重複使用並且可被組合成更大物件的概念。</description><pubDate>Wed, 31 Jan 2024 00:00:00 GMT</pubDate><category>UI</category><category>Component</category></item><item><title>Build Product From Scratch - Tokens</title><link>https://www.webdong.dev/en/post/build-product-from-scratch-tokens/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/build-product-from-scratch-tokens/</guid><description>Design tokens are a way to manage design properties and values for building UI components. It is essential for anyone involved with design systems.</description><pubDate>Mon, 29 Jan 2024 00:00:00 GMT</pubDate><category>UI</category><category>unsorted</category></item><item><title>记录如何从头打造数字产品 - 设计令牌篇</title><link>https://www.webdong.dev/zh-cn/post/build-product-from-scratch-tokens/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/build-product-from-scratch-tokens/</guid><description>设计令牌（Design Tokens）或令牌是一种管理设计属性与数值的方式，用于建构 UI 最细小的元素，适当的使用设计令牌可以让设计系统更加弹性与可扩展，不论是任何职位，只要与设计系统相关的人士都应当了解设计令牌的概念。</description><pubDate>Mon, 29 Jan 2024 00:00:00 GMT</pubDate><category>UI</category><category>unsorted</category></item><item><title>紀錄如何從頭打造數位產品 - 設計令牌篇</title><link>https://www.webdong.dev/zh-tw/post/build-product-from-scratch-tokens/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/build-product-from-scratch-tokens/</guid><description>設計令牌（Design Tokens）或令牌是一種管理設計屬性與數值的方式，用於建構 UI 最細小的元素，適當的使用設計令牌可以讓設計系統更加彈性與可擴展，不論是任何職位，只要與設計系統相關的人士都應當了解設計令牌的概念。</description><pubDate>Mon, 29 Jan 2024 00:00:00 GMT</pubDate><category>UI</category><category>unsorted</category></item><item><title>How To Drive Meetings, Before, During and After a Meeting</title><link>https://www.webdong.dev/en/post/how-to-drive-meetings/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/how-to-drive-meetings/</guid><description>Meetings are an art and a vital soft skill for team. Poorly structured meetings can impact individual and team productivity, especially in remote work.</description><pubDate>Sun, 28 Jan 2024 00:00:00 GMT</pubDate><category>Team</category><category>Communication</category></item><item><title>如何开会？开会前、开会中、开会后应当注意的事项！</title><link>https://www.webdong.dev/zh-cn/post/how-to-drive-meetings/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/how-to-drive-meetings/</guid><description>开会是一门学问，也是身为团队领袖必备的软技能之一，架构差劲的会议会不只影响个人更甚至会整体团队的生产力，特别是在远端工作盛行的时代沟通技巧更尤为重要，架构差劲的会议会不只影响个人更甚至会整体团队的生产力，本篇文章探讨开会前中后有哪些细节是可以注意的。</description><pubDate>Sun, 28 Jan 2024 00:00:00 GMT</pubDate><category>Team</category><category>Communication</category></item><item><title>如何開會？開會前、開會中、開會後應當注意的事項！</title><link>https://www.webdong.dev/zh-tw/post/how-to-drive-meetings/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/how-to-drive-meetings/</guid><description>開會是一門學問，也是身為團隊領袖必備的軟技能之一，架構差勁的會議會不只影響個人更甚至會整體團隊的生產力，特別是在遠端工作盛行的時代溝通技巧更尤為重要，架構差勁的會議會不只影響個人更甚至會整體團隊的生產力，本篇文章探討開會前中後有哪些細節是可以注意的。</description><pubDate>Sun, 28 Jan 2024 00:00:00 GMT</pubDate><category>Team</category><category>Communication</category></item><item><title>How to Build Digital Products from Scratch - Color</title><link>https://www.webdong.dev/en/post/build-product-from-scratch-color/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/build-product-from-scratch-color/</guid><description>Recently, the company purchased design-related courses to improve collaboration efficiency through design research. I plan to document my notes and thoughts.</description><pubDate>Tue, 23 Jan 2024 00:00:00 GMT</pubDate><category>Design</category><category>unsorted</category></item><item><title>记录如何从头打造数字产品 - 颜色篇</title><link>https://www.webdong.dev/zh-cn/post/build-product-from-scratch-color/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/build-product-from-scratch-color/</guid><description>近期公司购买了设计相关的课程，期望透过研究改良目前的设计来提升与开发合作的效率，恰好我之前的工作领域也与设计相关，而且我很早就想跨领域多写与网页相关的文章！因此打算特地开一系列文章记录课程笔记以及我自己补充的想法与资源。</description><pubDate>Tue, 23 Jan 2024 00:00:00 GMT</pubDate><category>Design</category><category>unsorted</category></item><item><title>紀錄如何從頭打造數位產品 - 顏色篇</title><link>https://www.webdong.dev/zh-tw/post/build-product-from-scratch-color/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/build-product-from-scratch-color/</guid><description>近期公司購買了設計相關的課程，期望透過研究改良目前的設計來提升與開發合作的效率，恰好我之前的工作領域也與設計相關，而且我很早就想跨領域多寫與網頁相關的文章！因此打算特地開一系列文章記錄課程筆記以及我自己補充的想法與資源。</description><pubDate>Tue, 23 Jan 2024 00:00:00 GMT</pubDate><category>Design</category><category>unsorted</category></item><item><title>Insights on E2E Testing and BDD After 4 Months at New Job</title><link>https://www.webdong.dev/en/post/behaviour-driven-development-for-your-team/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/behaviour-driven-development-for-your-team/</guid><description>I wrote nearly a hundred E2E tests and aim to solidify my knowledge while helping my team quickly adapt to the E2E Cypress testing project.</description><pubDate>Sun, 21 Jan 2024 00:00:00 GMT</pubDate><category>Software Testing</category><category>E2E</category><category>BDD</category></item><item><title>新工作 4 个月以来接触 E2E 测试与 BDD 的心得</title><link>https://www.webdong.dev/zh-cn/post/behaviour-driven-development-for-your-team/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/behaviour-driven-development-for-your-team/</guid><description>在加入新工作的数个月内我撰写了接近百支大大小小功能的E2E 测试，打算透过边撰写这篇文章边阅读文件稳固自己的知识，同时也方便团队成员能够快速上手我从零开始建立的E2E Cypress 测试专案，并且最终期望能够尝试实验导入BDD 流程到团队开发流程当中。</description><pubDate>Sun, 21 Jan 2024 00:00:00 GMT</pubDate><category>Software Testing</category><category>E2E</category><category>BDD</category></item><item><title>新工作 4 個月以來接觸 E2E 測試與 BDD 的心得</title><link>https://www.webdong.dev/zh-tw/post/behaviour-driven-development-for-your-team/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/behaviour-driven-development-for-your-team/</guid><description>在加入新工作的數個月內我撰寫了接近百支大大小小功能的 E2E 測試，打算透過邊撰寫這篇文章邊閱讀文件穩固自己的知識，同時也方便團隊成員能夠快速上手我從零開始建立的 E2E Cypress 測試專案，並且最終期望能夠嘗試實驗導入 BDD 流程到團隊開發流程當中。</description><pubDate>Sun, 21 Jan 2024 00:00:00 GMT</pubDate><category>Software Testing</category><category>E2E</category><category>BDD</category></item><item><title>Why is CSS so Difficult and Weird to Learn?</title><link>https://www.webdong.dev/en/post/why-is-css-so-weird/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/why-is-css-so-weird/</guid><description>Developers have mixed opinions about CSS; some find it simple, others find it hard to master. This article summarizes why CSS is both loved and hated.</description><pubDate>Mon, 01 Jan 2024 00:00:00 GMT</pubDate><category>CSS</category><category>Concept</category></item><item><title>为什么 CSS 这么难学这么诡异？</title><link>https://www.webdong.dev/zh-cn/post/why-is-css-so-weird/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/why-is-css-so-weird/</guid><description>开发者们对 CSS 有不同的意见，有的人说它很简单、有的人说它难以驾驭，这些都是事实。我时常听到苦恼的后端或是与其打交道多年的自己脱口而出：「CSS 真的好诡异阿！」，这篇文章来总结为什么CSS 是一个让人又爱又恨的存在，它为什么这么难学这么诡异？</description><pubDate>Mon, 01 Jan 2024 00:00:00 GMT</pubDate><category>CSS</category><category>Concept</category></item><item><title>為什麼 CSS 這麼難學這麼詭異？</title><link>https://www.webdong.dev/zh-tw/post/why-is-css-so-weird/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/why-is-css-so-weird/</guid><description>開發者們對 CSS 有不同的意見，有的人說它很簡單、有的人說它難以駕馭，這些都是事實。我時常聽到苦惱的後端或是與其打交道多年的自己脫口而出：「CSS 真的好詭異阿！」，這篇文章來總結為什麼 CSS 是一個讓人又愛又恨的存在，它為什麼這麼難學這麼詭異？</description><pubDate>Mon, 01 Jan 2024 00:00:00 GMT</pubDate><category>CSS</category><category>Concept</category></item><item><title>Integrate AI into your coding workflow - GitHub Copilot</title><link>https://www.webdong.dev/en/post/integrate-ai-into-your-coding-workflow/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/integrate-ai-into-your-coding-workflow/</guid><description>The nature of developers&apos; work puts us on the front lines alongside AI, and GitHub Copilot has significantly boosted my productivity and learning efficiency.</description><pubDate>Tue, 26 Dec 2023 00:00:00 GMT</pubDate><category>AI</category><category>unsorted</category></item><item><title>将 AI 应用到你的 Coding 工作流当中 - GitHub Copilot</title><link>https://www.webdong.dev/zh-cn/post/integrate-ai-into-your-coding-workflow/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/integrate-ai-into-your-coding-workflow/</guid><description>开发者的工作性质造就我们注定要站在最前线与 AI 并肩作战，而 GitHub Copilot 这些年的陪伴显著的提升了我的开发生产力与更有效率的学习开发技巧，是少数我觉得真正值得付费的服务之一，不管你是新手还是老鸟 Copilot 都有对应的定位帮助你加速开发。</description><pubDate>Tue, 26 Dec 2023 00:00:00 GMT</pubDate><category>AI</category><category>unsorted</category></item><item><title>將 AI 應用到你的 Coding 工作流當中 - GitHub Copilot</title><link>https://www.webdong.dev/zh-tw/post/integrate-ai-into-your-coding-workflow/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/integrate-ai-into-your-coding-workflow/</guid><description>開發者的工作性質造就我們注定要站在最前線與 AI 並肩作戰，而 GitHub Copilot 這些年的陪伴顯著的提升了我的開發生產力與更有效率的學習開發技巧，是少數我覺得真正值得付費的服務之一，不管你是新手還是老鳥 Copilot 都有對應的定位幫助你加速開發。</description><pubDate>Tue, 26 Dec 2023 00:00:00 GMT</pubDate><category>AI</category><category>unsorted</category></item><item><title>三步驟了解並實踐無限滾動加載 feat.Vue / Intersection Observer API</title><link>https://www.webdong.dev/zh-tw/post/implement-infinte-scroll-feat-vue-intersection-observer-api/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/implement-infinte-scroll-feat-vue-intersection-observer-api/</guid><description>近期工作剛好接觸很多介面開發的部分，其中一個需求實作「無限滾動加載功能」，當使用者滾動到頁面底部時會自動加載更多的資料，不用點擊按鈕就能瀏覽更多的資料，就像是自動版的加載按鈕。近期工作剛好接觸很多相關的介面功能開發，讓我們用 Vue Composition API 來實作。</description><pubDate>Sat, 23 Dec 2023 00:00:00 GMT</pubDate><category>Vue</category><category>實作</category><category>Intersection Observer</category></item><item><title>What is the Concept of Optimistic UI?</title><link>https://www.webdong.dev/en/post/optimistic-ui/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/optimistic-ui/</guid><description>The longer the wait, the more likely users will drop off. Optimistic UI emphasizes immediate, optimistic feedback.</description><pubDate>Thu, 14 Dec 2023 00:00:00 GMT</pubDate><category>UX</category><category>Concept</category></item><item><title>乐观 UI (Optimistic User Interface) 是什么？有哪些实践细节是你应该注意的？</title><link>https://www.webdong.dev/zh-cn/post/optimistic-ui/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/optimistic-ui/</guid><description>不要让使用者等待！越多的等待时间，就越容易让使用者流失，因此让应用程式的回馈即时，是很基础重要的原则。 Optimistic UI 强调即时、乐观的使用者介面回馈。在用户触发操作后，系统即时假定成功，迅速更新介面，提升使用者体验。这种方法有效缩短用户等待时间，创造更流畅、令人满意的互动体验。</description><pubDate>Thu, 14 Dec 2023 00:00:00 GMT</pubDate><category>UX</category><category>Concept</category></item><item><title>樂觀 UI (Optimistic User Interface) 是什麼？有哪些實踐細節是你應該注意的？</title><link>https://www.webdong.dev/zh-tw/post/optimistic-ui/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/optimistic-ui/</guid><description>不要让使用者等待！越多的等待时间，就越容易让使用者流失，因此让应用程式的回馈即时，是很基础重要的原则。 Optimistic UI 强调即时、乐观的使用者介面回馈。在用户触发操作后，系统即时假定成功，迅速更新介面，提升使用者体验。这种方法有效缩短用户等待时间，创造更流畅、令人满意的互动体验。</description><pubDate>Thu, 14 Dec 2023 00:00:00 GMT</pubDate><category>UX</category><category>Concept</category></item><item><title>How many breakpoints should you use? The less, the better.</title><link>https://www.webdong.dev/en/post/how-many-breakpoint-should-you-use/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/how-many-breakpoint-should-you-use/</guid><description>How many sizes of web pages do I need to create?  Share why you should use fewer breakpoints to create a responsive web page.</description><pubDate>Sun, 10 Dec 2023 00:00:00 GMT</pubDate><category>CSS</category><category>RWD</category></item><item><title>制作响应式网页需要多少尺寸版本？三个论点说服你越少越好。</title><link>https://www.webdong.dev/zh-cn/post/how-many-breakpoint-should-you-use/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/how-many-breakpoint-should-you-use/</guid><description>我既设计网页也开发网页，并且在过去几年经验中总结发现设计与开发配合上容易遇到的问题像是：我需要绘制多少种尺寸的网页？我需要为网页设置多少个断点？这篇文章我分享自己作为设计者与开发者的经历以及你为何应该使用越少的断点来制作响应式网页越好。</description><pubDate>Sun, 10 Dec 2023 00:00:00 GMT</pubDate><category>CSS</category><category>RWD</category></item><item><title>製作響應式網頁需要多少尺寸版本？三個論點說服你越少越好。</title><link>https://www.webdong.dev/zh-tw/post/how-many-breakpoint-should-you-use/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/how-many-breakpoint-should-you-use/</guid><description>我既設計網頁也開發網頁，並且在過去幾年經驗中總結發現設計與開發配合上容易遇到的問題像是：我需要繪製多少種尺寸的網頁？我需要替網頁設置多少個斷點？這篇文章我分享自己身為設計者與開發者的經歷以及你為何應該使用越少的斷點來製作響應式網頁越好。</description><pubDate>Sun, 10 Dec 2023 00:00:00 GMT</pubDate><category>CSS</category><category>RWD</category></item><item><title>How to Manage Z-index</title><link>https://www.webdong.dev/en/post/how-to-manage-z-index/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/how-to-manage-z-index/</guid><description>By giving web elements relative relationships instead of absolute values. Using CSS Variables for relative `z-index` values, which is an elegant method!</description><pubDate>Wed, 29 Nov 2023 00:00:00 GMT</pubDate><category>CSS</category><category>Concept</category></item><item><title>一个简单聪明的方法让你永远不用烦恼管理 Z-index 的问题</title><link>https://www.webdong.dev/zh-cn/post/how-to-manage-z-index/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/how-to-manage-z-index/</guid><description>赋予网页元素相对的关系而非绝对的数值，让我们强烈联系元素之间的差异，而非取决于某个魔法数字可以避免很多折腾。最近看到一篇文章，作者提到用 CSS Variable 来赋予相对而非绝对数值的 `z-index` 值，真是优雅简洁的方法！完美的发挥了 CSS 变量的优势，促使我写下这篇文章。</description><pubDate>Wed, 29 Nov 2023 00:00:00 GMT</pubDate><category>CSS</category><category>Concept</category></item><item><title>一個簡單聰明的方法讓你永遠不用煩惱管理 Z-index 的問題</title><link>https://www.webdong.dev/zh-tw/post/how-to-manage-z-index/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/how-to-manage-z-index/</guid><description>賦予網頁元素相對的關係而非絕對的數值，讓我們強烈聯繫元素之間的差異，而非取決於某個魔法數字可以避免很多折騰。最近看到一篇文章，作者提到用 CSS Variable 來賦予相對而非絕對數值的 `z-index` 值，真是優雅簡潔的方法！完美的發揮了 CSS 變數的優勢，促使我寫下這篇文章。</description><pubDate>Wed, 29 Nov 2023 00:00:00 GMT</pubDate><category>CSS</category><category>Concept</category></item><item><title>How to Handle Data Loading Elegantly in Vue</title><link>https://www.webdong.dev/en/post/organize-fetch-state-in-vue/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/organize-fetch-state-in-vue/</guid><description>Fetching and displaying data is routine for front-end developers, but as more states arise, projects can become chaotic.</description><pubDate>Tue, 21 Nov 2023 00:00:00 GMT</pubDate><category>Vue</category><category>unsorted</category></item><item><title>如何优雅的于 Vue 正确的处理数据加载</title><link>https://www.webdong.dev/zh-cn/post/organize-fetch-state-in-vue/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/organize-fetch-state-in-vue/</guid><description>索取并显示资料对前端工程师来说是家常便饭的事，但随着背后延伸的状态越来越多，就会让整个专案极度混乱，因此想要藉由这篇文章点出现有问题并提出一些可行的方案，纪录寻找更高效解法的过程。在索取资料时连带的有许多状态需要被管理和调整，文章透过 Vue 来探讨如何更优雅的处理这些状态。</description><pubDate>Tue, 21 Nov 2023 00:00:00 GMT</pubDate><category>Vue</category><category>unsorted</category></item><item><title>如何優雅的於 Vue 正確的處理資料載入</title><link>https://www.webdong.dev/zh-tw/post/organize-fetch-state-in-vue/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/organize-fetch-state-in-vue/</guid><description>索取並顯示資料對前端工程師來說是家常便飯的事，但隨著背後延伸的狀態越來越多，就會讓整個專案極度混亂，因此想要藉由這篇文章點出現有問題並提出一些可行的方案，紀錄尋找更高效解法的過程。在索取資料時連帶的有許多狀態需要被管理和調整，文章透過 Vue 來探討如何更優雅的處理這些狀態。</description><pubDate>Tue, 21 Nov 2023 00:00:00 GMT</pubDate><category>Vue</category><category>unsorted</category></item><item><title>Integrate Client-Side Form Validation into Legacy Code</title><link>https://www.webdong.dev/en/post/how-to-integrate-client-side-form-validation-into-legacy-code/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/how-to-integrate-client-side-form-validation-into-legacy-code/</guid><description>This article describes recent experiences in maintaining legacy code, where various validation methods need to be unified, avoiding more legacy code.</description><pubDate>Tue, 14 Nov 2023 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>如何替陈旧代码导入 HTML 原生客户端验证的故事</title><link>https://www.webdong.dev/zh-cn/post/how-to-integrate-client-side-form-validation-into-legacy-code/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/how-to-integrate-client-side-form-validation-into-legacy-code/</guid><description>本文描述近期在维护既有代码时的故事，目前的专案中有各式各样前人尚未统一的验证方式，例如：有些是使用 HTML 原生客户端验证、伺服器端验证、第三方套件、自造的验证方法，如何统一规范验证方式是一大问题，同时也要思考：「要如何避免创造更多的陈旧代码？」</description><pubDate>Tue, 14 Nov 2023 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>如何替陳舊代碼導入 HTML 原生客戶端驗證的故事</title><link>https://www.webdong.dev/zh-tw/post/how-to-integrate-client-side-form-validation-into-legacy-code/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/how-to-integrate-client-side-form-validation-into-legacy-code/</guid><description>本文描述近期在維護既有代碼時的故事，目前的專案中有各式各樣前人尚未統一的驗證方式，例如：有些是使用 HTML 原生客戶端驗證、伺服器端驗證、第三方套件、自造的驗證方法，如何統一規範驗證方式是一大問題，同時也要思考：「要如何避免創造更多的陳舊代碼？」</description><pubDate>Tue, 14 Nov 2023 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>Astro 系列文第三十日：系列回顧與反省</title><link>https://www.webdong.dev/zh-tw/post/astro-the-end/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/astro-the-end/</guid><description>本系列 Astro 文章終於完結了，必須說連續 30 天到了後段有點寫不太出來任何東西，秉持著有寫任何東西無論如何都比沒寫強的精神完成了這次的挑戰！本系列文章是當完兵出來沒多久馬上開始寫的，因此是在最後一天開賽而且還只有不到 10 篇的屯稿的狀態下進行的，加上日後工作也忙碌起來，能夠完賽算是很幸運。</description><pubDate>Sun, 15 Oct 2023 00:00:00 GMT</pubDate><category>Astro</category><category>系列文</category></item><item><title>Astro 系列文第二十九日：製作作品集參考 </title><link>https://www.webdong.dev/zh-tw/post/astro-portfolio-reference/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/astro-portfolio-reference/</guid><description>終於到第 29 天了……前面寫太多沒有規劃好反而到後面也不知道要多寫什麼。其實在撰寫這 30 天文章之前我有先試寫紀錄一下我用 Astro 製作個人網站的過程，可以參考看看：製作個人前端作品集 - 準備篇以及實作篇，裡面有記錄從發想草稿到實作的過程，如果想要製作個小網站試試水溫可以參考看看。</description><pubDate>Sat, 14 Oct 2023 00:00:00 GMT</pubDate><category>Astro</category><category>系列文</category></item><item><title>Astro 系列文第二十八日：近期與資源雜談</title><link>https://www.webdong.dev/zh-tw/post/astro-random-chat/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/astro-random-chat/</guid><description>感覺 30 天真的要寫不下去了 😅，感覺要寫的前面都寫過了，今天這一篇來介紹 Astro 有那些資源可以入門以及近期的新聞。就在昨天 Astro 發布了 3.3 版本，來了嶄新的實驗性圖片組件 &lt;Picture /&gt;，改進了語法突出顯示的相容性，引入了套件的可信性證明，以及其他一些提升使用體驗的改進。</description><pubDate>Fri, 13 Oct 2023 00:00:00 GMT</pubDate><category>Astro</category><category>系列文</category></item><item><title>Astro 系列文第二十七日：視圖過度 </title><link>https://www.webdong.dev/zh-tw/post/astro-view-transition/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/astro-view-transition/</guid><description>本章節來談談 Astro 3.0 版本最吸睛的一項功能：View Transitions ，讓你的靜態網頁也能達成 App 應用一樣的絲滑感受。由於這項技術還在實驗階段，因此放在後面的章節補充。View Transitions API 是瀏覽器正推出的一項 API，提供簡易的方法對任何 DOM 狀態更換提供轉場特效。</description><pubDate>Wed, 11 Oct 2023 00:00:00 GMT</pubDate><category>Astro</category><category>系列文</category></item><item><title>Astro 系列文第二十六日：建構網頁概念篇 </title><link>https://www.webdong.dev/zh-tw/post/astro-why-am-i-writing/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/astro-why-am-i-writing/</guid><description>很多時候建構網站都太著重在技術層面該如何應對，但要怎麼經營自己的網站或產品好像卻沒什麼概念，因此這裡添加一下我建構網站的歷程與收穫。我從幾年前剛學習網頁到現在一直在為寫部落格做準備，期間嘗試用很多不同技術與挑戰，但一直以來都沒有特別滿意的成果，直到近期才比較有「寫部落格」這件事究竟是什麼的體會。</description><pubDate>Wed, 11 Oct 2023 00:00:00 GMT</pubDate><category>Astro</category><category>系列文</category></item><item><title>Astro 系列文第二十五日：基礎指令與設定</title><link>https://www.webdong.dev/zh-tw/post/astro-connect-cms/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/astro-connect-cms/</guid><description>在 Astro 中串接 CMS 是一件非常容易的事情。內容管理系統 （Content Management System）是一種用於編寫和管理網站內容的工具，可以讓幫助撰寫內容與管理網站資產，不同的 CMS 廠商有各式各樣的特色像是：排程發布、編輯器、合作編輯、資產管理……等特色。</description><pubDate>Tue, 10 Oct 2023 00:00:00 GMT</pubDate><category>Astro</category><category>系列文</category></item><item><title>Astro 系列文第二十四日：添加 ESLint 與 Prettier</title><link>https://www.webdong.dev/zh-tw/post/astro-add-eslint-and-prettier/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/astro-add-eslint-and-prettier/</guid><description>我喜歡使用自動化的工具來為專案的代碼提供錯誤檢查與整理，因此使用 ESLint 與 Prettier 讓撰寫的代碼更一致無錯，還有額外添加 TypeScript 的檢查與 VSCode 提示。本篇文章將帶你認識我如何替自己的 Astro 部落格添加 ESLint 與 Prettier。</description><pubDate>Mon, 09 Oct 2023 00:00:00 GMT</pubDate><category>Astro</category><category>系列文</category></item><item><title>Astro 系列文第二十三日：路徑別名</title><link>https://www.webdong.dev/zh-tw/post/astro-aliases/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/astro-aliases/</guid><description>當網站規模愈複雜，使用相對關係路徑就會需要花費很多心力去解讀與撰寫，在撰寫引入路徑時會發現撰寫相對位置的路徑既又繁瑣又難維護，可以透過額外設置路徑別名來解決這個問題。本篇文章介紹如何透過設定 Astro 中的 TS 設定檔來達成路徑別名。</description><pubDate>Sun, 08 Oct 2023 00:00:00 GMT</pubDate><category>Astro</category><category>系列文</category></item><item><title>Astro 系列文第二十二日：環境變數</title><link>https://www.webdong.dev/zh-tw/post/astro-enviroment-variable/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/astro-enviroment-variable/</guid><description>環境變數提供在不同開發階段切換伺服器地址的靈活性，避免硬編碼，同時安全存儲敏感信息，如 API 金鑰或數據庫密碼，使程式更具適應性和安全性。如果你熟悉 Vite 的話應該會非常熟悉，因為 Astro 即是使用 Vite 作為底層。</description><pubDate>Sat, 07 Oct 2023 00:00:00 GMT</pubDate><category>Astro</category><category>系列文</category></item><item><title>Astro 系列文第二十一日：部屬升空</title><link>https://www.webdong.dev/zh-tw/post/astro-deploy/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/astro-deploy/</guid><description>到這個章節介紹了絕大多數會使用到的 Astro 功能，後續的章節會著重在講解一些額外的環境設置。讓我們把製作好的網站放到伺服器上可以被其他人造訪吧。到目前為止教學都是以靜態生產的方式的使用 Astro，也就是預先渲染的網頁文件可以被靜態的放置在伺服器上被索取。</description><pubDate>Fri, 06 Oct 2023 00:00:00 GMT</pubDate><category>Astro</category><category>系列文</category></item><item><title>Astro 系列文第二十日：實作搜尋功能</title><link>https://www.webdong.dev/zh-tw/post/astro-search-functionality/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/astro-search-functionality/</guid><description>前面透過建立靜態端點實作了自己的 RSS Feed 算是一個簡單的練習起步，這次更進一步透過建立整個集合的資料來完成「集合文章搜尋功能」。隨著文章愈來愈多會需要一個查詢文章的功能，透過用戶輸入文章相關的訊息，比對文章資訊（標題、文章短描述）並顯示出最相關的文章。</description><pubDate>Thu, 05 Oct 2023 00:00:00 GMT</pubDate><category>Astro</category><category>系列文</category></item><item><title>Astro 系列文第十九日：RSS 端點</title><link>https://www.webdong.dev/zh-tw/post/astro-rss-endpoint/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/astro-rss-endpoint/</guid><description>前面章節我們學會了如何使用 Markdown 或 MDX 、在內容集合中定義資料格式與索取資料。本章節將解釋如何在 Astro 中創造端點提供不同種類的資料，並實作生成一個 RSS 檔案作為練習，RSS 是一種標準化的方式，一種特定格式的 XML 檔案，設計來推播最新資訊給網站用戶。</description><pubDate>Wed, 04 Oct 2023 00:00:00 GMT</pubDate><category>Astro</category><category>系列文</category></item><item><title>Astro 系列文第十八日：實作集合分類功能</title><link>https://www.webdong.dev/zh-tw/post/astro-content-collection-category/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/astro-content-collection-category/</guid><description>前面學習了內容集合與頁籤的製作，今天的主題練習透過整理集合抓取到的資料更進一步製作分類功能頁面。隨著內容集合發布的文章越來越多，裡面可能會有許多相同性質的文章你會想要集合起來並替他們分類，並且自動根據類別自動創建頁面方便查閱。</description><pubDate>Tue, 03 Oct 2023 00:00:00 GMT</pubDate><category>Astro</category><category>系列文</category></item><item><title>Astro 系列文第十七日：頁籤</title><link>https://www.webdong.dev/zh-tw/post/astro-pagination/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/astro-pagination/</guid><description>透過內容集合動態的生成 Route 是件方便美好的事情，但一旦數量一多就必須要想辦法分批次顯示這些資料，恰好 Astro 內建頁籤可以幫助我們打造這方面功能，會建議等到網站真的有這麼大量的內容再來考慮製作頁籤，嘗試添加分頁功能並創建分頁元件吧。</description><pubDate>Mon, 02 Oct 2023 00:00:00 GMT</pubDate><category>Astro</category><category>系列文</category></item><item><title>Astro 系列文第十六日：內容集合</title><link>https://www.webdong.dev/zh-tw/post/astro-content-collection/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/astro-content-collection/</guid><description>除了定義資料在元件中、在 `src` 中 `import` 進來或者是 `fetch` 遠端資料之外有其他撰寫內容的方式嗎？有的！內容集合於 2.0 版本推出，用於替網站的本地內容提供易於使用管理、自動化型別驗證的功能。如果你有大量文件需要注入網頁中便可以使用該項功能。</description><pubDate>Sun, 01 Oct 2023 00:00:00 GMT</pubDate><category>Astro</category><category>系列文</category></item><item><title>Astro 系列文第十五日：基礎布局</title><link>https://www.webdong.dev/zh-tw/post/astro-layout/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/astro-layout/</guid><description>先前了解了如何使用 Markdown 與 MDX 來撰寫網頁，接著這個章節將會學習到如何替這些檔案設置畫面布局 (Layout)。布局可以想像成是常見的頁面的模板用於管理頁面常見的模式，定義布局頁面可以解省重複並統一管理頁面。</description><pubDate>Sat, 30 Sep 2023 00:00:00 GMT</pubDate><category>Astro</category><category>系列文</category></item><item><title>Astro 系列文第十四日：圖片最佳化</title><link>https://www.webdong.dev/zh-tw/post/astro-image-optimization/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/astro-image-optimization/</guid><description>通常文件會伴隨著圖片，而圖片可以佔據一個頁面絕大多數的運算資源與流量！你會希望圖片能夠被好好處理避免它們壓垮整個網站的體驗，Astro 預設自帶相關的元件與方法幫助你處理這些事務。了解儲存圖片位址 src/ 和 public/ 的差異與如何最佳化圖片。</description><pubDate>Fri, 29 Sep 2023 00:00:00 GMT</pubDate><category>Astro</category><category>系列文</category></item><item><title>Astro 系列文第十三日：Markdown 與 MDX</title><link>https://www.webdong.dev/zh-tw/post/astro-markdown-and-mdx/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/astro-markdown-and-mdx/</guid><description>撰寫網站最終還是要回歸到易於維護，能不能不需要接觸程式，只需透過編寫文件就能更改頁面內容呢？也就是將內容與版面、邏輯做分離。本章節我們將會學習 Markdown 與 MDX 來達成這件事，它們主要用途是作為傳達與標記內容。</description><pubDate>Thu, 28 Sep 2023 00:00:00 GMT</pubDate><category>Astro</category><category>系列文</category></item><item><title>Astro 系列文第十二日：基礎路由</title><link>https://www.webdong.dev/zh-tw/post/astro-routes/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/astro-routes/</guid><description>在上一章節介紹了基礎元件的使用，並且你也大概猜到了，只要元件放置在 src/pages/ 之內就會自動的成為 Astro 的頁面，在本章節會更細緻的介紹關於 Astro 的路由設置。Astro 採用的路由策略被稱為「基於檔案的路由 File-based Routing」。</description><pubDate>Wed, 27 Sep 2023 00:00:00 GMT</pubDate><category>Astro</category><category>系列文</category></item><item><title>Astro 系列文第十一日：全域狀態管理</title><link>https://www.webdong.dev/zh-tw/post/astro-global-state-management/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/astro-global-state-management/</guid><description>前面章節了解到在 Astro 中引用不同框架的元件是極其容易的事情，但這些元件中的狀態要怎麼去管理呢？在一些 UI 框架中會提供創建 `context` 的方式來管理狀態，但由於 Astro 採用「局部 Hydration」的方式來渲染頁面，因此無法辦到，但我們可以額外使用 Nano Stores 來達成這點。</description><pubDate>Tue, 26 Sep 2023 00:00:00 GMT</pubDate><category>Astro</category><category>系列文</category></item><item><title>Astro 系列文第十日：整合 UI 框架</title><link>https://www.webdong.dev/zh-tw/post/astro-ui-framework-integration/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/astro-ui-framework-integration/</guid><description>前面提到如何在 `.astro` 格式中添加客戶端 JavaScript 使元件具備互動性。Astro 最吸引人的一項特點就是可以整合各大 UI 框架到元件之中，享受不同技術與其生態域帶來的便利與好處。在本章節將會從安裝整合到製作一個 React 元件。</description><pubDate>Mon, 25 Sep 2023 00:00:00 GMT</pubDate><category>Astro</category><category>系列文</category></item><item><title>Astro 系列文第九日：腳本</title><link>https://www.webdong.dev/zh-tw/post/astro-client-side-script/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/astro-client-side-script/</guid><description>當你希望 Astro 處理腳本時可以直接撰寫 &lt;script&gt; 標籤到元件模板之中，當需要直接插入行內腳本可以使用 is:inline 模板指令。通常操縱 DOM 的行為都會放在客戶端腳本中，像是事件監聽、動畫、Ajax……一切與瀏覽器貼近的行為都會放在這裡。</description><pubDate>Sat, 23 Sep 2023 00:00:00 GMT</pubDate><category>Astro</category><category>系列文</category></item><item><title>Astro 系列文第八日：實作整合 Tailwind</title><link>https://www.webdong.dev/zh-tw/post/astro-tailwind-integration/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/astro-tailwind-integration/</guid><description>這個章節更偏向我在 Astro 中使用 Tailwind 的歷程心得，如果你沒有打算導入 Tailwind 可以直接前往下一章節即可。透過兩個章節都在練習寫按鈕，現在推薦你嘗試撰寫各式各樣的元件熟悉使用 Astro，對你來說都不會是問題了。</description><pubDate>Sat, 23 Sep 2023 00:00:00 GMT</pubDate><category>Astro</category><category>系列文</category></item><item><title>Astro 系列文第七日：實作按鈕元件</title><link>https://www.webdong.dev/zh-tw/post/astro-build-a-button-component/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/astro-build-a-button-component/</guid><description>網站中要用到許多種類的按鈕，在本章節綜合了先前「基礎元件」與「樣式」兩章節的內容，打造出一個通用的網頁按鈕元件，一起來實作看看吧。按鈕是網頁極具代表性的元件之一，下一章節講解整合 Tailwind 也會以這個例子出發，敬請期待！</description><pubDate>Fri, 22 Sep 2023 00:00:00 GMT</pubDate><category>Astro</category><category>系列文</category></item><item><title>Astro 系列文第六日：樣式</title><link>https://www.webdong.dev/zh-tw/post/astro-style/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/astro-style/</guid><description>綜合來說 Astro 讓你用自己習慣的方式撰寫 CSS，不管是 import 還是 &lt;link&gt; 還是 Scoped CSS 或是各式各樣的預處理語言或框架皆有支援。stro 中撰寫樣式是一件非常容易的事，並且有多樣選項可供挑選。</description><pubDate>Thu, 21 Sep 2023 00:00:00 GMT</pubDate><category>Astro</category><category>系列文</category></item><item><title>Astro 系列文第五日：基礎元件</title><link>https://www.webdong.dev/zh-tw/post/astro-components/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/astro-components/</guid><description>藉由本系列文章將持續 30 日不間斷的更新帶領你上手它！今日介紹構成 Astro 最核心的概念 —— 元件。前面除了創建新專案之外也了解了 Astro CLI 與設定檔的大致樣貌，本章節會從創建基本 Astro 元件開始。</description><pubDate>Wed, 20 Sep 2023 00:00:00 GMT</pubDate><category>Astro</category><category>unsorted</category></item><item><title>Astro 系列文第四日：基礎指令與設定</title><link>https://www.webdong.dev/zh-tw/post/astro-command-and-config/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/astro-command-and-config/</guid><description>藉由本系列文章將持續 30 日不間斷的更新帶領你上手它！今日介紹 Astro 的 CLI 指令與設置 `astro.config` 檔案。你可以使用自己喜愛的套件管理器來執行 Astro ，不管是 npm、pnpm、yarn 甚至是 bun。</description><pubDate>Tue, 19 Sep 2023 00:00:00 GMT</pubDate><category>Astro</category><category>unsorted</category></item><item><title>Astro 系列文第三日：建構新專案</title><link>https://www.webdong.dev/zh-tw/post/astro-hello-astro-world/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/astro-hello-astro-world/</guid><description>藉由本系列文章將持續 30 日不間斷的更新帶領你上手它！今日介紹如何從頭建構一個專案並且了解資料夾結構。前面提到 Astro 是如何建構頁面的，像是將網頁拆分成「元件」以及透過 Astro Island 的方式來建構網頁，接著本章節就要來實際創建一個 Astro 專案囉！</description><pubDate>Mon, 18 Sep 2023 00:00:00 GMT</pubDate><category>Astro</category><category>unsorted</category></item><item><title>Astro Series Day 2: Existing Problems and Solutions</title><link>https://www.webdong.dev/en/post/astro-problem-solution/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/astro-problem-solution/</guid><description>This series will continuously update for 30 days, helping you get started with it! Today, we understand the difference between dynamic and static websites.</description><pubDate>Sun, 17 Sep 2023 00:00:00 GMT</pubDate><category>Astro</category><category>unsorted</category></item><item><title>Astro 系列文第二日：现有问题与解方</title><link>https://www.webdong.dev/zh-cn/post/astro-problem-solution/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/astro-problem-solution/</guid><description>藉由本系列文章将持续 30 日不间断的更新带领你上手它！今天理解到了动态网站与静态网站的区别，关系到了网页「渲染模式」的抉择，而 Astro 就及是一个瞄准生成静态页面为主的框架。要了解 Astro 的优势就需要了解现有的问题，需要进一步了解什么是所谓的「静态网站」什么是「动态网站」。</description><pubDate>Sun, 17 Sep 2023 00:00:00 GMT</pubDate><category>Astro</category><category>unsorted</category></item><item><title>Astro 系列文第二日：現有問題與解方</title><link>https://www.webdong.dev/zh-tw/post/astro-problem-solution/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/astro-problem-solution/</guid><description>藉由本系列文章將持續 30 日不間斷的更新帶領你上手它！今天理解到了動態網站與靜態網站的區別，關係到了網頁「渲染模式」的抉擇，而 Astro 就及是一個瞄準生成靜態頁面為主的框架。要了解 Astro 的優勢就需要了解現有的問題，需要進一步了解什麼是所謂的「靜態網站」什麼是「動態網站」。</description><pubDate>Sun, 17 Sep 2023 00:00:00 GMT</pubDate><category>Astro</category><category>unsorted</category></item><item><title>Day1 - Astro Series: Preflight Check List</title><link>https://www.webdong.dev/en/post/astro-preflight-check-list/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/astro-preflight-check-list/</guid><description>Through this series of articles, I will continuously update for 30 days to help you get started! Learning Astro will be a new trend in front-end development.</description><pubDate>Sat, 16 Sep 2023 00:00:00 GMT</pubDate><category>Astro</category><category>unsorted</category></item><item><title>Astro 系列文第一日：起飛前置準備</title><link>https://www.webdong.dev/zh-cn/post/astro-preflight-check-list/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/astro-preflight-check-list/</guid><description>藉由本系列文章将持续 30 日不间断的更新带领你上手它！学习 Astro 将会成为前端开发的一股新气象，事实上也被前端社群评价为：「最喜爱的」、「最期待的」新技术之一，凭借着它极为平缓的学习曲线、活耀的社群、踩到痛点的定位和极高的扩充性，它可以轻易上手成为前端的主力生产力工具之一。</description><pubDate>Sat, 16 Sep 2023 00:00:00 GMT</pubDate><category>Astro</category><category>unsorted</category></item><item><title>Astro 系列文第一日：起飛前置準備</title><link>https://www.webdong.dev/zh-tw/post/astro-preflight-check-list/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/astro-preflight-check-list/</guid><description>藉由本系列文章將持續 30 日不間斷的更新帶領你上手它！學習 Astro 將會成為前端開發的一股新氣象，事實上也被前端社群評價為：「最喜愛的」、「最期待的」新技術之一，憑藉著它極為平緩的學習曲線、活耀的社群、踩到痛點的定位和極高的擴充性，它可以輕易上手成為前端的主力生產力工具之一。</description><pubDate>Sat, 16 Sep 2023 00:00:00 GMT</pubDate><category>Astro</category><category>unsorted</category></item><item><title>Reflections on Two Months of Military Service</title><link>https://www.webdong.dev/en/post/two-months-reflections-on-military-service/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/two-months-reflections-on-military-service/</guid><description>Revisiting military life after two years may not bring about significant changes in life, it has allowed me to appreciate the value of freedom.</description><pubDate>Sat, 29 Jul 2023 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>Life</category></item><item><title>当兵二阶段两个月以来的心得</title><link>https://www.webdong.dev/zh-cn/post/two-months-reflections-on-military-service/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/two-months-reflections-on-military-service/</guid><description>近两个月来在军队中学到的三点重要能力，时隔两年重温的两个月军旅生活说不上会对人生有什么大改变，但让我重新体会到自由的可贵。距离上次当兵已是 2 年前的事，在大学毕业后提前申请入伍进入了桃园杨梅再服役两个月，这篇文章主要想在没文章产出期间分享一下这两个月来的感想与活动。</description><pubDate>Sat, 29 Jul 2023 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>Life</category></item><item><title>當兵二階段兩個月以來的心得</title><link>https://www.webdong.dev/zh-tw/post/two-months-reflections-on-military-service/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/two-months-reflections-on-military-service/</guid><description>近兩個月來在軍隊中學到的三點重要能力，時隔兩年重溫的兩個月軍旅生活說不上會對人生有什麼大改變，但讓我重新體會到自由的可貴。距離上次當兵已是 2 年前的事，在大學畢業後提早申請入伍進入了桃園楊梅再服役兩個月，這篇文章主要想在沒文章產出期間分享一下這兩個月來的感想與活動。</description><pubDate>Sat, 29 Jul 2023 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>Life</category></item><item><title>Everything You Need to Know About HTML Form</title><link>https://www.webdong.dev/en/post/html-form/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/html-form/</guid><description>HTML natively supports data submission via HTML forms. Let’s explore how to create accessible and semantic input forms.</description><pubDate>Sun, 23 Jul 2023 00:00:00 GMT</pubDate><category>HTML</category><category>unsorted</category></item><item><title>简单明确的了解 HTML 表单使用方式</title><link>https://www.webdong.dev/zh-cn/post/html-form/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/html-form/</guid><description>很多时候都会忽略掉 HTML 本身就有很好的支援输入控制与提交，输入选项的功能与介面都可以轻易的透过原生 HTML 标签来完成，只要想要在网页中提交资料，都是使用 HTML 表单的好时机，让我们来了解怎么使用 HTML 表单制作一个无障碍且语意化的输入表单。</description><pubDate>Sun, 23 Jul 2023 00:00:00 GMT</pubDate><category>HTML</category><category>unsorted</category></item><item><title>簡單明確的了解 HTML 表單使用方式</title><link>https://www.webdong.dev/zh-tw/post/html-form/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/html-form/</guid><description>很多時候都會忽略掉 HTML 本身就有很好的支援輸入控制與提交，輸入選項的功能與介面都可以輕易的透過原生 HTML 標籤來完成，只要想要在網頁中提交資料，都是使用 HTML 表單的好時機，讓我們來了解怎麼使用 HTML 表單製作一個無障礙且語意化的輸入表單。</description><pubDate>Sun, 23 Jul 2023 00:00:00 GMT</pubDate><category>HTML</category><category>unsorted</category></item><item><title>Using JavaScript try...catch to Control Errors in Code</title><link>https://www.webdong.dev/en/post/try-to-catch-errors/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/try-to-catch-errors/</guid><description>Errors in programs are inevitable, and JavaScript&apos;s try...catch syntax can handle error situations, making errors easier to understand and manage.</description><pubDate>Sat, 01 Jul 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Syntax</category></item><item><title>使用 JavaScript try...catch 来控制程序中的错误</title><link>https://www.webdong.dev/zh-cn/post/try-to-catch-errors/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/try-to-catch-errors/</guid><description>程序中出现错误是必不可少的，有千万个原因可能造成程序出现错误无法运行，这时候在 JavaScript 中就可以使用 try...catch 语法来处理错误情境，除了拦截错误也可以自行定义与抛出错误，让程序中的错误更容易被理解与管理。</description><pubDate>Sat, 01 Jul 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Syntax</category></item><item><title>使用 JavaScript try...catch 來控制程式中的錯誤</title><link>https://www.webdong.dev/zh-tw/post/try-to-catch-errors/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/try-to-catch-errors/</guid><description>程式中出現錯誤是必不可少的，有千萬個原因可能造成程式出現錯誤無法運行，這時候在 JavaScript 中就可以使用 try...catch 語法來處理錯誤情境，除了攔截錯誤也可以自行定義與拋出錯誤，讓程式中的錯誤更容易被理解與管理。</description><pubDate>Sat, 01 Jul 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Syntax</category></item><item><title>Explained Node Package Manager by Directing a Movie</title><link>https://www.webdong.dev/en/post/node-package-manager-explained-by-directing-a-movie/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/node-package-manager-explained-by-directing-a-movie/</guid><description>NPM is a package manager that is essential in JS development environment. NPM is like a platform where you can find many ready-made actors.</description><pubDate>Fri, 30 Jun 2023 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>Difference between null / undefined / not defined?</title><link>https://www.webdong.dev/en/post/null-vs-undefined/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/null-vs-undefined/</guid><description>JavaScript&apos;s null and undefined have similar meanings of &quot;nothing,&quot; but they fundamentally differ. This article clarifies their relationship.</description><pubDate>Fri, 30 Jun 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>unsorted</category></item><item><title>通过导演一部电影来解释 Node Package Manager</title><link>https://www.webdong.dev/zh-cn/post/node-package-manager-explained-by-directing-a-movie/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/node-package-manager-explained-by-directing-a-movie/</guid><description>NPM 是 JavaScript 开发环境中必不可少的软件包管理器。本文将以导演一部电影为比喻，解释 NPM 的运作方式。编程就像拍摄一部电影，可以亲自设计和管理演员，也可以雇佣他人设计好的演员。NPM 就像一个平台，可以在上面找到许多现成的演员，这些演员就是软件包（Package）。</description><pubDate>Fri, 30 Jun 2023 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>null vs undefined vs not defined 差在哪？</title><link>https://www.webdong.dev/zh-cn/post/null-vs-undefined/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/null-vs-undefined/</guid><description>avaScript null 与 undefined 两者的意涵非常相近，意思都是「没有东西」，但在根本上它们是截然不同的东西，虽然都代表「没东西」，但一个是「存在没东西」一个是「不存在没东西」，藉由这篇文章我来厘清解释他们两者之间的关系。</description><pubDate>Fri, 30 Jun 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>unsorted</category></item><item><title>藉由導演一部電影來解釋 Node Package Manager</title><link>https://www.webdong.dev/zh-tw/post/node-package-manager-explained-by-directing-a-movie/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/node-package-manager-explained-by-directing-a-movie/</guid><description>NPM 是 JavaScript 開發環境中一定會使用到的一款套件管理器，本篇文章將比喻導演一部電影來解釋 NPM 如何運作。寫程式就像在拍攝一部電影，可以親自上陣設計並打理演員，也可以聘請別人設計好的，NPM 就像一個平台可以在上面找到很多現成的演員，這些演員就是套件（Package）。</description><pubDate>Fri, 30 Jun 2023 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>null vs undefined vs not defined 差在哪？</title><link>https://www.webdong.dev/zh-tw/post/null-vs-undefined/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/null-vs-undefined/</guid><description>JavaScript null 與 undefined 兩者的意涵非常相近，意思都是「沒有東西」，但在根本上它們是截然不同的東西，雖然都代表「沒東西」，但一個是「存在沒東西」一個是「不存在沒東西」，藉由這篇文章我來釐清解釋他們兩者之間的關係。</description><pubDate>Fri, 30 Jun 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>unsorted</category></item><item><title>Can I Use Multiple h1 Inside A Page?</title><link>https://www.webdong.dev/en/post/can-i-use-multiple-heading-one-inside-a-page/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/can-i-use-multiple-heading-one-inside-a-page/</guid><description>It&apos;s often taught that using multiple h1 tags is wrong, but is that really the case? I delve into various perspectives and findings.</description><pubDate>Mon, 26 Jun 2023 00:00:00 GMT</pubDate><category>SEO</category><category>unsorted</category></item><item><title>Let&apos;s talk about why you need useEffect!</title><link>https://www.webdong.dev/en/post/why-you-need-useeffect/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/why-you-need-useeffect/</guid><description>useEffect is a fundamental Hook in React. To truly learn it, you need a basic understanding of how React works.</description><pubDate>Mon, 26 Jun 2023 00:00:00 GMT</pubDate><category>React</category><category>unsorted</category></item><item><title>我可以在一个页面里面拥有多个 h1 吗？</title><link>https://www.webdong.dev/zh-cn/post/can-i-use-multiple-heading-one-inside-a-page/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/can-i-use-multiple-heading-one-inside-a-page/</guid><description>通常写多个 h1 都会被教育这是错误的做法，但实际上真的是如此吗？我深入的研究各方面说法。整理 Google 与 MDN 文件的说法，一个页面有很多个「重磅级标题」的情况非常少见的，如果这么写在阅读结构上是合理的话，使用多个 &lt;h1&gt; 在单个页面之中是完全没问题的，此外有许多更值得探讨的细节。</description><pubDate>Mon, 26 Jun 2023 00:00:00 GMT</pubDate><category>SEO</category><category>unsorted</category></item><item><title>来聊聊为什么你需要 useEffect 吧！</title><link>https://www.webdong.dev/zh-cn/post/why-you-need-useeffect/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/why-you-need-useeffect/</guid><description>useEffect 是 react 中一个相当基础常见的 Hook，要真正学会它就必须要对 React 如何运作有基础的认识才行，它是 React 提供的一个 Hook 用于操作副作用，举例来说：送出请求、操纵 DOM、设定监听器……等都是副作用。</description><pubDate>Mon, 26 Jun 2023 00:00:00 GMT</pubDate><category>React</category><category>unsorted</category></item><item><title>我可以在一個頁面裡面擁有多個 h1 嗎？</title><link>https://www.webdong.dev/zh-tw/post/can-i-use-multiple-heading-one-inside-a-page/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/can-i-use-multiple-heading-one-inside-a-page/</guid><description>通常寫多個 h1 都會被教育這是錯誤的做法，但實際上真的是如此嗎？我深入的研究各方面說法。整理 Google 與 MDN 文件的說法，一個頁面有很多個「重磅級標題」的情況非常少見的，如果這麼寫在閱讀架構上是合理的話，使用多個 &lt;h1&gt; 在單個頁面之中是完全沒問題的，此外有許多更值得探討的細節。</description><pubDate>Mon, 26 Jun 2023 00:00:00 GMT</pubDate><category>SEO</category><category>unsorted</category></item><item><title>來聊聊為什麼你需要 useEffect 吧！</title><link>https://www.webdong.dev/zh-tw/post/why-you-need-useeffect/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/why-you-need-useeffect/</guid><description>useEffect 是 react 中一個相當基礎常見的 Hook，要真正學會它就必須要對 React 如何運作有基礎的認識才行，它是 React 提供的一個 Hook 用於操作副作用，舉例來說：送出請求、操縱 DOM、設定監聽器……等都是副作用。</description><pubDate>Mon, 26 Jun 2023 00:00:00 GMT</pubDate><category>React</category><category>unsorted</category></item><item><title>JavaScript Conditional(Ternary) Operator</title><link>https://www.webdong.dev/en/post/javascript-conditional-operator/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/javascript-conditional-operator/</guid><description>Control flow is one of the essential concepts in programming languages. Besides using if and else, JavaScript offers the conditional (ternary) operator.</description><pubDate>Sun, 25 Jun 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Syntax</category></item><item><title>如何使用 JavaScript 条件运算子？</title><link>https://www.webdong.dev/zh-cn/post/javascript-conditional-operator/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/javascript-conditional-operator/</guid><description>流程控制是程式语言中基础不可少的概念之一，除了使用if、else 之外，JavaScript 还提供一个简洁的写法，就是条件（三元）运算子，顾名思义，由三个片段所组成，分别是：「条件、成功流程与失败流程」。用更精简的语法来撰写流程控制，条件运算子是常见且必学的语法之一</description><pubDate>Sun, 25 Jun 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Syntax</category></item><item><title>可以怎麼使用 JavaScript 條件運算子？</title><link>https://www.webdong.dev/zh-tw/post/javascript-conditional-operator/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/javascript-conditional-operator/</guid><description>流程控制是程式語言中基礎不可少的概念之一，除了使用 if、else 之外，JavaScript 還提供一個簡潔的寫法，就是條件（三元）運算子，顧名思義，由三個片段所組成，分別是：「條件、成功流程與失敗流程」。用更精簡的語法來撰寫流程控制，條件運算子是常見且必學的語法之一</description><pubDate>Sun, 25 Jun 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Syntax</category></item><item><title>Why Do You Need JavaScript Default Parameters?</title><link>https://www.webdong.dev/en/post/why-you-need-default-parameters/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/why-you-need-default-parameters/</guid><description>In JavaScript, functions can use any number of parameters and arguments. If a parameter has no corresponding argument, it becomes undefined.</description><pubDate>Thu, 22 Jun 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Syntax</category></item><item><title>Why do you need JavaScript Enhanced Object Literals?</title><link>https://www.webdong.dev/en/post/why-you-need-enhanced-object-literals/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/why-you-need-enhanced-object-literals/</guid><description>Utilizing ES6&apos;s enhanced object literals in JavaScript can simplify code snippets and even dynamically compute properties within objects!</description><pubDate>Thu, 22 Jun 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Syntax</category></item><item><title>为什么你需要 JavaScript 预设参数？</title><link>https://www.webdong.dev/zh-cn/post/why-you-need-default-parameters/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/why-you-need-default-parameters/</guid><description>在 JavaScript 中函式可以使用任意数量的参数与引数，如果参数没有对应的引数将导致该变数成为未定义，参数（占位符）代表一个值你期望函式所接收；引数（实际值）则是函式呼叫时所传递的值，让我们用预设参数来解决这个问题吧！</description><pubDate>Thu, 22 Jun 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Syntax</category></item><item><title>为什么你需要 JavaScript 增强版对象字面量？</title><link>https://www.webdong.dev/zh-cn/post/why-you-need-enhanced-object-literals/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/why-you-need-enhanced-object-literals/</guid><description>在 JavaScript 中活用 ES6 带来的增强版对象字面量可以精简代码片段，甚至可以动态计算创建对象内的项目！字面量指的是代表它自己的数值，例如数字 `25` 或 `你好世界`，而增强对象字面量就是在对象中使用的值。</description><pubDate>Thu, 22 Jun 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Syntax</category></item><item><title>為什麼你需要 JavaScript 預設參數？</title><link>https://www.webdong.dev/zh-tw/post/why-you-need-default-parameters/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/why-you-need-default-parameters/</guid><description>在 JavaScript 中函式可以使用任意數量的參數與引數，如果參數沒有對應的引數將導致該變數成為未定義，參數（佔位符）代表一個值你期望函式所接收；引數（實際值）則是函式呼叫時所傳遞的值，讓我們用預設參數來解決這個問題吧！</description><pubDate>Thu, 22 Jun 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Syntax</category></item><item><title>為什麼你需要 JavaScript 加強版物件實字？</title><link>https://www.webdong.dev/zh-tw/post/why-you-need-enhanced-object-literals/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/why-you-need-enhanced-object-literals/</guid><description>在 JavaScript 中活用 ES6 帶來的加強版物件實字可以精簡程式片段，甚至還可以動態的計算創造物件內的項目！實字(Literal) 指的是代表它自己的數值，舉例來說數字 `25` 或 `你好世界` 而進階物件實字就是在物件中使用的值。</description><pubDate>Thu, 22 Jun 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Syntax</category></item><item><title>Setting Up ESLint and Prettier in Astro</title><link>https://www.webdong.dev/en/post/setting-up-eslint-and-prettier-in-astro/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/setting-up-eslint-and-prettier-in-astro/</guid><description>I enjoy using automation tools for error checking and formatting in projects. This article guides you on setting up ESLint and Prettier in Astro.</description><pubDate>Mon, 12 Jun 2023 00:00:00 GMT</pubDate><category>Astro</category><category>unsorted</category></item><item><title>为 Astro 设置 ESLint 与 Prettier</title><link>https://www.webdong.dev/zh-cn/post/setting-up-eslint-and-prettier-in-astro/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/setting-up-eslint-and-prettier-in-astro/</guid><description>我喜欢使用自动化的工具来为专案的代码提供错误检查与整理，因此使用 ESLint 与 Prettier 让撰写的代码更一致无错，还有额外添加 TypeScript 的检查与 VSCode 提示，本篇文章有详细的教学范例引导你在 Astro 中安装 ESLint 与 Prettier 套件。</description><pubDate>Mon, 12 Jun 2023 00:00:00 GMT</pubDate><category>Astro</category><category>unsorted</category></item><item><title>為 Astro 設置 ESLint 與 Prettier</title><link>https://www.webdong.dev/zh-tw/post/setting-up-eslint-and-prettier-in-astro/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/setting-up-eslint-and-prettier-in-astro/</guid><description>我喜歡使用自動化的工具來為專案的代碼提供錯誤檢查與整理，因此使用 ESLint 與 Prettier 讓撰寫的代碼更一致無錯，還有額外添加 TypeScript 的檢查與 VSCode 提示，本篇文章有詳細的教學範例引導你在 Astro 中安裝 ESLint 與 Prettier 套件。</description><pubDate>Mon, 12 Jun 2023 00:00:00 GMT</pubDate><category>Astro</category><category>unsorted</category></item><item><title>Let&apos;s Build a Personal Frontend Portfolio - Preparation</title><link>https://www.webdong.dev/en/post/lets-build-a-portfolio/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/lets-build-a-portfolio/</guid><description>Since I am a frontend developer, why not create a portfolio website myself? Creating my own portfolio is an essential experience and a very interesting journey.</description><pubDate>Fri, 09 Jun 2023 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>unsorted</category></item><item><title>Let&apos;s Building a Frontend Portfolio using Astro.js</title><link>https://www.webdong.dev/en/post/lets-build-a-portfolio-with-astro/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/lets-build-a-portfolio-with-astro/</guid><description>Astro, as a SSG, is very suitable for building static web pages. I will use my own portfolio as a case study to teach you to create a real website.</description><pubDate>Fri, 09 Jun 2023 00:00:00 GMT</pubDate><category>Astro</category><category>unsorted</category></item><item><title>制作个人前端作品集 - 准备篇</title><link>https://www.webdong.dev/zh-cn/post/lets-build-a-portfolio/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/lets-build-a-portfolio/</guid><description>记录一下我是如何制作自己的前端作品集的，随着从大学毕业，很快也要步入社会寻找正职工作，因此急需一个可以展示自己作品的平台，既然身为前端开发者，何不动手制作一个作品集网站呢？制作自己的作品集是必经历的体验，也是一趟很有趣的体验。</description><pubDate>Fri, 09 Jun 2023 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>unsorted</category></item><item><title>製作個人前端作品集 - 實作篇</title><link>https://www.webdong.dev/zh-cn/post/lets-build-a-portfolio-with-astro/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/lets-build-a-portfolio-with-astro/</guid><description>Astro 作为一个静态内容为主的生产器非常适合用于打造静态网页，这次我将用自己的作品集为案例教你打造一个实际的静态网站，通过以自己的作品集网站为范例，借助这个机会来展示这个框架好用与强大的地方。只需要有基础的 HTML 与 CSS 知识就能跟着这篇文章创造一个属于自己的作品集。</description><pubDate>Fri, 09 Jun 2023 00:00:00 GMT</pubDate><category>Astro</category><category>unsorted</category></item><item><title>製作個人前端作品集 - 準備篇</title><link>https://www.webdong.dev/zh-tw/post/lets-build-a-portfolio/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/lets-build-a-portfolio/</guid><description>記錄一下我是如何製作自己的前端作品集的，隨著從大學畢業，很快也要步入社會尋找正職工作，因此急需一個可以展示自己作品的平台，既然身為前端開發者，何不動手製作一個作品集網站呢？製作自己的作品集是必經歷的體驗，也是一趟很有趣的體驗。</description><pubDate>Fri, 09 Jun 2023 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>unsorted</category></item><item><title>製作個人前端作品集 - 實作篇</title><link>https://www.webdong.dev/zh-tw/post/lets-build-a-portfolio-with-astro/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/lets-build-a-portfolio-with-astro/</guid><description>Astro 作為一個靜態內容為主的生產器非常適合用於打造靜態網頁，這次我將用自己的作品集為案例教你打造一個實際的靜態網站，透過以自己的作品集網站為範例，借助這個機會來展示這個框架好用與強大的地方。只需要有基礎的 HTML 與 CSS 知識就能跟著這篇文章創造一個屬於自己的作品集。</description><pubDate>Fri, 09 Jun 2023 00:00:00 GMT</pubDate><category>Astro</category><category>unsorted</category></item><item><title>Can I Put Image Inside Heading?</title><link>https://www.webdong.dev/en/post/can-i-put-image-inside-heading/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/can-i-put-image-inside-heading/</guid><description>For decorative purposes, images are needed to display headings. I wondered if &quot;putting images inside headings&quot; is compliant with HTML.</description><pubDate>Thu, 08 Jun 2023 00:00:00 GMT</pubDate><category>SEO</category><category>Image</category></item><item><title>我可以把图片放在标题里面吗？</title><link>https://www.webdong.dev/zh-cn/post/can-i-put-image-inside-heading/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/can-i-put-image-inside-heading/</guid><description>有时候为了装饰用途会需要用图片来显示标题，于是我开始思考“把图片放在标题里面”是不是和规的 HTML？是不是一个好的作法？主要查阅了 Google Search Central 的回应以及 MDN 文件，结论是和规的，以及有更多可以留意的细节。</description><pubDate>Thu, 08 Jun 2023 00:00:00 GMT</pubDate><category>SEO</category><category>Image</category></item><item><title>我可以把圖片放在標題裡面嗎？</title><link>https://www.webdong.dev/zh-tw/post/can-i-put-image-inside-heading/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/can-i-put-image-inside-heading/</guid><description>有時候為了裝飾用途會需要用圖片來顯示標題，於是我開始思考「把圖片放在標題裡面」是不是和規的 HTML？是不是一個好的作法？主要查閱了 Google Search Central 的回應以及 MDN 文件，結論是和規的，以及有更多可以留意的細節。</description><pubDate>Thu, 08 Jun 2023 00:00:00 GMT</pubDate><category>SEO</category><category>Image</category></item><item><title>創建靜態為主的網站？一定要來試試 Astro.js！</title><link>https://www.webdong.dev/zh-tw/post/why-you-should-try-astro/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/why-you-should-try-astro/</guid><description>目前本部落格就是使用 Astro 所建構，在從正式版還沒推出之前就使用著它來創建網頁到目前算是小有心得，加上也有許多人詢問過，於是就寫這篇文章來分享一下。在這之前我使用過很多不同的框架，像是 Next、Gatsby、Jekyll、HUGO，它們都是很好的框架，但一直沒有戳中我的需求……</description><pubDate>Sat, 03 Jun 2023 02:17:58 GMT</pubDate><category>Astro</category><category>心得</category></item><item><title>了解網頁的三大渲染模式 Rendering Patterns feat. SSG, SSR, CSR</title><link>https://www.webdong.dev/zh-tw/post/rendering-pattern/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/rendering-pattern/</guid><description>當建構一個網頁的時候，最首要面對的問題就是「網頁內容要怎麼生成並提交給用戶？」，而為了解決這個問題所產生的解決方法就是「網頁渲染模式 （Rendering Pattern）」。建構網站有許多種方式，藉由了解它們之間的取捨可以更好的幫助你建構下一個網頁專案。</description><pubDate>Thu, 01 Jun 2023 00:00:00 GMT</pubDate><category>Pattern</category><category>渲染</category></item><item><title>Experience Summary as a Teaching Assistant at Hexschool</title><link>https://www.webdong.dev/en/post/my-experience-in-hexschool/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/my-experience-in-hexschool/</guid><description>A summary of three key insights gained from a year as an online teaching assistant at Hexschool, along with advice for students and teachers.</description><pubDate>Wed, 31 May 2023 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>unsorted</category></item><item><title>近一年来担任六角学院助教的过程与心得总结</title><link>https://www.webdong.dev/zh-cn/post/my-experience-in-hexschool/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/my-experience-in-hexschool/</guid><description>总结在六角学院担任线上助教一年来总结的三大心得以及给同学助教老师们的话。从去年七月至今已在六角学院担任近一整年远端助教，准备在下个月毕业、服兵役并开始下段旅程，打算藉由这篇文章谈谈这段时间的心路历程与未来的规划。期待六角学院未来的发展，培养更多新一代的工程师。</description><pubDate>Wed, 31 May 2023 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>unsorted</category></item><item><title>近一年來擔任六角學院助教的過程與心得總結</title><link>https://www.webdong.dev/zh-tw/post/my-experience-in-hexschool/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/my-experience-in-hexschool/</guid><description>總結在六角學院擔任線上助教一年來總結的三大心得以及給同學助教老師們的話。從去年七月至今已在六角學院擔任近一整年遠端助教，準備在下個月畢業、服兵役並開始下段旅程，打算藉由這篇文章談談這段時間的心路歷程與未來的規劃。期待六角學院未來的發展，培養更多新一代的工程師。</description><pubDate>Wed, 31 May 2023 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>unsorted</category></item><item><title>All You Need To Know About Optimal Images!</title><link>https://www.webdong.dev/en/post/all-you-need-to-know-about-optimal-images/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/all-you-need-to-know-about-optimal-images/</guid><description>Images are essential elements that enrich web content. Understanding how to improve them is the most cost-effective choice for website performance.</description><pubDate>Fri, 19 May 2023 00:00:00 GMT</pubDate><category>Web Performance</category><category>Image</category></item><item><title>所有优化网页图片的技巧都写在这了！</title><link>https://www.webdong.dev/zh-cn/post/all-you-need-to-know-about-optimal-images/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/all-you-need-to-know-about-optimal-images/</guid><description>图片是丰富网页内容避不可少的元素之一，大家都会在网页中添加图片，并且大多数网站中图片与影片是传输资料中最繁重的存在，了解如何改善它们是最划算的选择，如果网站效能或加载速度出现问题，第一步可以从图片或影片开始改善。让我们先从简单的例子一步一步找出潜在的问题以及如何解决，了解图片实际上有很多有趣的细节可以调整。</description><pubDate>Fri, 19 May 2023 00:00:00 GMT</pubDate><category>Web Performance</category><category>Image</category></item><item><title>所有最佳化網頁圖片的技巧都寫在這了！</title><link>https://www.webdong.dev/zh-tw/post/all-you-need-to-know-about-optimal-images/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/all-you-need-to-know-about-optimal-images/</guid><description>圖片是豐富網頁內容避不可少的元素之一，大家都會在網頁中添加圖片，並且大多數網站中圖片與影片是傳輸資料中最繁重的存在，了解如何改善它們是最划算的選擇，如果網站效能或加載速度出現問題，第一步可以從圖片或影片開始改善。讓我們先從簡單的例子一步一步找出潛在的問題以及如何解決，了解圖片實際上有很多有趣的細節可以調整。</description><pubDate>Fri, 19 May 2023 00:00:00 GMT</pubDate><category>Web Performance</category><category>Image</category></item><item><title>What is Ajax and Why Not Ajaj?</title><link>https://www.webdong.dev/en/post/why-you-need-ajax-and-why-not-call-it-ajaj/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/why-you-need-ajax-and-why-not-call-it-ajaj/</guid><description>&quot;What is Ajax and Why Not Ajaj?&quot; This question has in my mind for a long time. After some research, I wrote this article about the history of Ajax</description><pubDate>Sat, 13 May 2023 00:00:00 GMT</pubDate><category>Pattern</category><category>unsorted</category></item><item><title>什么是 Ajax 以及为什么不是 Ajaj？</title><link>https://www.webdong.dev/zh-cn/post/why-you-need-ajax-and-why-not-call-it-ajaj/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/why-you-need-ajax-and-why-not-call-it-ajaj/</guid><description>「什么是 Ajax 以及为什么不是 Ajaj？」，这个问题一直在脑海中停留许久，有人和我一样思考 Ajaj 之类的称呼的可能性吗？经过一些调查了解背后的原因并写成文章，关于 Ajax 的历史以及名称的由来可以参考看看我的发现。</description><pubDate>Sat, 13 May 2023 00:00:00 GMT</pubDate><category>Pattern</category><category>unsorted</category></item><item><title>什麼是 Ajax 以及為什麼不是 Ajaj？</title><link>https://www.webdong.dev/zh-tw/post/why-you-need-ajax-and-why-not-call-it-ajaj/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/why-you-need-ajax-and-why-not-call-it-ajaj/</guid><description>「什麼是 Ajax 以及為什麼不是 Ajaj？」，這個問題一直在腦海中停留許久，有人和我一樣思考 Ajaj 之類的稱呼的可能性嗎？經過一些調查了解背後的原因並寫成文章，關於 Ajax 的歷史以及名稱的由來可以參考看看我的發現。</description><pubDate>Sat, 13 May 2023 00:00:00 GMT</pubDate><category>Pattern</category><category>unsorted</category></item><item><title>How to Solve x-scroll Overflow Problem?</title><link>https://www.webdong.dev/en/post/how-to-solve-x-scroll-overflow-problem/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/how-to-solve-x-scroll-overflow-problem/</guid><description>Content in responsive web pages flows like water, adapting to the browser&apos;s size. The solution is to &quot;find the elements exceeding the browser width.</description><pubDate>Fri, 12 May 2023 00:00:00 GMT</pubDate><category>CSS</category><category>RWD</category></item><item><title>如何解决网页中莫名其妙出现 x 轴的问题</title><link>https://www.webdong.dev/zh-cn/post/how-to-solve-x-scroll-overflow-problem/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/how-to-solve-x-scroll-overflow-problem/</guid><description>响应式网页内的内容像水一样，顺应着浏览器的尺寸(容器)自动填装，只要内容挤破容器就会产生x 轴，因此解决方法无疑就是「找出网页中超出浏览器宽度的元素」。这是大多数人困惑的地方「知道问题点，但是不知道怎么下手 🥺」。实际上这个问题的解决方法很简单，本篇文章提供提供两种解决方案。</description><pubDate>Fri, 12 May 2023 00:00:00 GMT</pubDate><category>CSS</category><category>RWD</category></item><item><title>怎麼解決網頁中莫名其妙出現 x 軸的問題</title><link>https://www.webdong.dev/zh-tw/post/how-to-solve-x-scroll-overflow-problem/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/how-to-solve-x-scroll-overflow-problem/</guid><description>響應式網頁內的內容像水一樣，順應著瀏覽器的尺寸(容器)自動填裝，只要內容擠破容器就會產生 x 軸，因此解決方法無疑就是「找出網頁中超出瀏覽器寬度的元素」。這是大多數人困惑的地方「知道問題點，但是不知道怎麼下手 🥺」。實際上這個問題的解決方法很簡單，本篇文章提供提供兩種解決方案。</description><pubDate>Fri, 12 May 2023 00:00:00 GMT</pubDate><category>CSS</category><category>RWD</category></item><item><title>Web Performance Metrics! TTFB, FCP, LCP, FID, INP, CLS...</title><link>https://www.webdong.dev/en/post/all-the-performance-metrics-you-need-to-know/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/all-the-performance-metrics-you-need-to-know/</guid><description>Metrics are values designed to measure website experience. This article challenges to explain all Google’s web experience metrics</description><pubDate>Wed, 10 May 2023 00:00:00 GMT</pubDate><category>Web Performance</category><category>lighthouse</category></item><item><title>学习 Google 衡量网页效能指标！TTFB, FCP, LCP, FID, INP, CLS, TTI, TBT</title><link>https://www.webdong.dev/zh-cn/post/all-the-performance-metrics-you-need-to-know/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/all-the-performance-metrics-you-need-to-know/</guid><description>指标就是为了能够客观的测量网站体验而生的统计数值，本篇文章挑战用自己的方式去理解并解释所有Google 提出网页体验相关的指标，我发现没有必要一次性的记忆所有种类的指标，因此制作了一个懒人包与该文章，方便你我查询与学习。</description><pubDate>Wed, 10 May 2023 00:00:00 GMT</pubDate><category>Web Performance</category><category>lighthouse</category></item><item><title>學習 Google 衡量網頁效能指標！ TTFB, FCP, LCP, FID, INP, CLS, TTI, TBT</title><link>https://www.webdong.dev/zh-tw/post/all-the-performance-metrics-you-need-to-know/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/all-the-performance-metrics-you-need-to-know/</guid><description>指标就是为了能够客观的测量网站体验而生的统计数值，本篇文章挑战用自己的方式去理解并解释所有Google 提出网页体验相关的指标，我发现没有必要一次性的记忆所有种类的指标，因此制作了一个懒人包与该文章，方便你我查询与学习。</description><pubDate>Wed, 10 May 2023 00:00:00 GMT</pubDate><category>Web Performance</category><category>lighthouse</category></item><item><title>Web page is Just a Bunch of Boxes: CSS Box Model</title><link>https://www.webdong.dev/en/post/css-box-model/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/css-box-model/</guid><description>Understanding the box model is essential for learning more web layout techniques. This article breaks down the CSS box model</description><pubDate>Mon, 24 Apr 2023 00:00:00 GMT</pubDate><category>CSS</category><category>Concept</category></item><item><title>网页就是一堆箱子组成的概念：CSS 盒模型</title><link>https://www.webdong.dev/zh-cn/post/css-box-model/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/css-box-model/</guid><description>唯有了解盒模型才能开始学习更多网页切版布局的技巧，本文由内至外拆解盒模型，并且解说相关的特性与属性。如果你对于网页有这么多间距可以被调整所困惑，或是初入门 CSS 我都非常推荐要先理解 CSS 的盒模型概念，网页其实就是一堆箱子组成的概念。</description><pubDate>Mon, 24 Apr 2023 00:00:00 GMT</pubDate><category>CSS</category><category>Concept</category></item><item><title>網頁就是一堆箱子組成的概念：CSS 盒模型</title><link>https://www.webdong.dev/zh-tw/post/css-box-model/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/css-box-model/</guid><description>唯有了解盒模型才能開始學習更多網頁切版布局的技巧，本文由內至外拆解盒模型，並且解說相關的特性與屬性。如果你對於網頁有這麼多間距可以被調整所困惑，或是初入門 CSS 我都非常推薦要先理解 CSS 的盒模型概念，網頁其實就是一堆箱子組成的概念。</description><pubDate>Mon, 24 Apr 2023 00:00:00 GMT</pubDate><category>CSS</category><category>Concept</category></item><item><title>Learning to Manage a Website from My Mistakes</title><link>https://www.webdong.dev/en/post/why-am-i-writing/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/why-am-i-writing/</guid><description>Why do I want to manage a website? It&apos;s essential to think this through before creating one. Building and managing a website are entirely different skills.</description><pubDate>Mon, 17 Apr 2023 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>unsorted</category></item><item><title>从我的经历与错误中学会如何经营网站</title><link>https://www.webdong.dev/zh-cn/post/why-am-i-writing/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/why-am-i-writing/</guid><description>「为什么想经营网站？」在制作之前要好好想清楚这件事，制作网站与经营网站是完全不同的技能。举我自己的部落格「网页东东」为例，直到近期才比较有「写部落格」这件事究竟是什么的体会，透过探讨分析我自己经营网站内外动力，希望能帮助你重新思考自己经营网站的真正的目标与动机。</description><pubDate>Mon, 17 Apr 2023 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>unsorted</category></item><item><title>從我的經歷與錯誤中學會如何經營網站</title><link>https://www.webdong.dev/zh-tw/post/why-am-i-writing/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/why-am-i-writing/</guid><description>「為什麼想經營網站？」在製作之前要好好想清楚這件事，製作網站與經營網站是完全不同的技能。舉我自己的部落格「網頁東東」為例，直到近期才比較有「寫部落格」這件事究竟是什麼的體會，透過探討分析我自己經營網站內外動力，希望能幫助你重新思考自己經營網站的真正的目標與動機。</description><pubDate>Mon, 17 Apr 2023 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>unsorted</category></item><item><title>Learn to Use Hoppscotch for API Testing (with Images)</title><link>https://www.webdong.dev/en/post/learn-hoppscotch/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/learn-hoppscotch/</guid><description>Hoppscotch is an online tool that allows you to quickly test APIs. Familiarizing yourself with tools can help avoid common issues.</description><pubDate>Fri, 14 Apr 2023 00:00:00 GMT</pubDate><category>Software Testing</category><category>unsorted</category></item><item><title>React Hook vs Normal function?</title><link>https://www.webdong.dev/en/post/react-hook-vs-normal-function/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/react-hook-vs-normal-function/</guid><description>React Hook is a feature added in React 16.8 that allows you to use React features without writing a class. Explains the differences between Hooks and methods.</description><pubDate>Fri, 14 Apr 2023 00:00:00 GMT</pubDate><category>React</category><category>unsorted</category></item><item><title>学习使用 Hoppscotch 测试 API（附图）</title><link>https://www.webdong.dev/zh-cn/post/learn-hoppscotch/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/learn-hoppscotch/</guid><description>Hoppscotch 是一个线上工具，可以让你在浏览器上迅捷的测试后端提供的 API。很常遇到到后端的文件就直接上手写程式，导致在写程式的时候常常疏漏许多问题，像是请求方式错误、少夹带参数、网址错误、资料不存在……等，因此我都会建议先熟悉怎么用现成的工具来测试 API，使用图形化的介面可以更直观的管理API 们。</description><pubDate>Fri, 14 Apr 2023 00:00:00 GMT</pubDate><category>Software Testing</category><category>unsorted</category></item><item><title>什么是 React Hook？与普通函数有什么不同？</title><link>https://www.webdong.dev/zh-cn/post/react-hook-vs-normal-function/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/react-hook-vs-normal-function/</guid><description>React Hook 是 React 16.8 版本新增的功能，可以让你在不写 class 的情况下使用 React 的功能。 「要如何区分 Hook 与方法的差别？什么情况下在 React 里称为 Hook？什么时候才只能称为方法？」于是写这篇文章来解释清楚。</description><pubDate>Fri, 14 Apr 2023 00:00:00 GMT</pubDate><category>React</category><category>unsorted</category></item><item><title>學習使用 Hoppscotch 測試 API（附圖）</title><link>https://www.webdong.dev/zh-tw/post/learn-hoppscotch/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/learn-hoppscotch/</guid><description>Hoppscotch 是一個線上工具，可以讓你在瀏覽器上迅捷的測試後端提供的 API。很常遇到到後端的文件就直接上手寫程式，導致在寫程式的時候常常疏漏許多問題，像是請求方式錯誤、少夾帶參數、網址錯誤、資料不存在……等，因此我都會建議先熟悉怎麼用現成的工具來測試 API，使用圖形化的介面可以更直觀的管理 API 們。</description><pubDate>Fri, 14 Apr 2023 00:00:00 GMT</pubDate><category>Software Testing</category><category>unsorted</category></item><item><title>什麼是 React Hook？和一般的函式又差在哪？</title><link>https://www.webdong.dev/zh-tw/post/react-hook-vs-normal-function/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/react-hook-vs-normal-function/</guid><description>React Hook 是 React 16.8 版本新增的功能，可以讓你在不寫 class 的情況下使用 React 的功能。「要如何區分 Hook 與方法的差別？什麼情況下在 React 裡稱為 Hook？什麼時候才只能稱為方法？」於是寫這篇文章來解釋清楚。</description><pubDate>Fri, 14 Apr 2023 00:00:00 GMT</pubDate><category>React</category><category>unsorted</category></item><item><title>就算被 AI 取代也沒差</title><link>https://www.webdong.dev/zh-tw/post/we-all-gonna-be-replaced-but-it-doesnt-matter/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/we-all-gonna-be-replaced-but-it-doesnt-matter/</guid><description>來寫寫對 AI 的看法，以及我如何對面對恐懼的方法與心得，如何保持一致步調學習前進。寫這篇文章主要是想傳達如何面對生活態度，正好社會上最新的恐懼「AI 取代人類」這樣的聲音正在增長，這樣的想法不只在前端，也在許多領域都有類似的聲音，像是：「繪師要被淘汰了！」、「作家要被淘汰了！」、「某某行業要被淘汰了！」屬不勝數……</description><pubDate>Thu, 13 Apr 2023 00:00:00 GMT</pubDate><category>AI</category><category>unsorted</category></item><item><title>Why You need Currying Function?</title><link>https://www.webdong.dev/en/post/currying-function/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/currying-function/</guid><description>Currying transforms functions with multiple parameters into a series of functions that take a single parameter, enhancing reusability and debuggability.</description><pubDate>Mon, 10 Apr 2023 00:00:00 GMT</pubDate><category>Functional Programming</category><category>unsorted</category></item><item><title>为什么需要柯里化函数</title><link>https://www.webdong.dev/zh-cn/post/currying-function/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/currying-function/</guid><description>柯里化就是将使用多个参数的函式转换成一系列使用一个参数的函式，用不同的思考方式来撰写函式，藉由将一个大函式分解成很多仅使用一个参数的函式，打造可被重复利用与轻松除错的函式，透过实际制作三明治函式案例简白的说明柯里化的概念。</description><pubDate>Mon, 10 Apr 2023 00:00:00 GMT</pubDate><category>Functional Programming</category><category>unsorted</category></item><item><title>為什麼需要柯里化函式</title><link>https://www.webdong.dev/zh-tw/post/currying-function/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/currying-function/</guid><description>柯里化就是將使用多個參數的函式轉換成一系列使用一個參數的函式，用不同的思考方式來撰寫函式，藉由將一個大函式分解成很多僅使用一個參數的函式，打造可被重複利用與輕鬆除錯的函式，透過實際製作三明治函式案例簡白的說明柯里化的概念。</description><pubDate>Mon, 10 Apr 2023 00:00:00 GMT</pubDate><category>Functional Programming</category><category>unsorted</category></item><item><title>從頭了解為什麼你需要 JavaScript 閉包</title><link>https://www.webdong.dev/zh-tw/post/javascript-closure/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/javascript-closure/</guid><description>閉包是一個聽起來非常難懂而且枯燥的題材，實際上概念很簡單，在了解閉包之前你必須熟悉作用域與事件佇列的概念。簡單來說閉包可以讓你在函式內獲得函式外作用域的變數，透過實際案例來觀察閉包的存在並且了解在什麼場合下會需要閉包，以及相關的取捨。</description><pubDate>Sun, 09 Apr 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>unsorted</category></item><item><title>JavaScript Expressions vs Statements</title><link>https://www.webdong.dev/en/post/javascript-expressions-vs-statements/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/javascript-expressions-vs-statements/</guid><description>Explains the difference between &quot;expressions&quot; and &quot;statements&quot;. Expressions produce a value, while statements perform actions.</description><pubDate>Fri, 07 Apr 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Concept</category></item><item><title>了解 JavaScript 陈述式与表达式</title><link>https://www.webdong.dev/zh-cn/post/javascript-expressions-vs-statements/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/javascript-expressions-vs-statements/</guid><description>讲解中「表达式」与「陈述式」的区别。表达式会产生一个值，而陈述式则是执行动作。表达式必须存在于某个陈述式中才能被使用。我回过头来才发现表达式与陈述式的重要性，了解 JavaScript 底层的逻辑对我们使用像是 React 这类框架也有帮助。</description><pubDate>Fri, 07 Apr 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Concept</category></item><item><title>了解 JavaScript 陳述式與表達式</title><link>https://www.webdong.dev/zh-tw/post/javascript-expressions-vs-statements/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/javascript-expressions-vs-statements/</guid><description>講解中「表達式」與「陳述式」的區別。表達式會產生一個值，而陳述式則是執行動作。表達式必須存在於某個陳述式中才能被使用。我回過頭來才發現表達式與陳述式的重要性，了解 JavaScript 底層的邏輯對我們使用像是 React 這類框架也有幫助。</description><pubDate>Fri, 07 Apr 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Concept</category></item><item><title>Use Tailwind without learning it!</title><link>https://www.webdong.dev/en/post/use-tailwind-without-learning-it/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/use-tailwind-without-learning-it/</guid><description>If you&apos;re familiar with writing native CSS, learning Tailwind will be a breeze for you. Tailwind is the most popular and widely used CSS framework.</description><pubDate>Thu, 06 Apr 2023 00:00:00 GMT</pubDate><category>CSS</category><category>Tailwind</category></item><item><title>不需要学 Tailwind 也可以用 Tailwind</title><link>https://www.webdong.dev/zh-cn/post/use-tailwind-without-learning-it/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/use-tailwind-without-learning-it/</guid><description>意思是说「如果你熟悉编写原生 CSS 的话，那么学 Tailwind 对你来说是易如反掌」。在 2022 CSS 调查中 Tailwind 都是最受欢迎、最多人使用的 CSS 框架，它开创性的设计理念打破了传统语义化架构 CSS 的方式，值得尝试用不同的方式架构网站！</description><pubDate>Thu, 06 Apr 2023 00:00:00 GMT</pubDate><category>CSS</category><category>Tailwind</category></item><item><title>不需要學 Tailwind 也可以用 Tailwind</title><link>https://www.webdong.dev/zh-tw/post/use-tailwind-without-learning-it/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/use-tailwind-without-learning-it/</guid><description>意思是說「如果你熟悉撰寫原生 CSS 的話，那麼學 Tailwind 對你來說是易如反掌」。在 2022 CSS 調查中 Tailwind 都是最受歡迎、最多人使用的 CSS 框架，它開創性的設計理念打破了傳統語意化架構 CSS 的方式，值得嘗試看用不同的方式架構網站架構！</description><pubDate>Thu, 06 Apr 2023 00:00:00 GMT</pubDate><category>CSS</category><category>Tailwind</category></item><item><title>Learn JavaScript Destructuring Syntax Through Examples</title><link>https://www.webdong.dev/en/post/learn-destructuring-assignment/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/learn-destructuring-assignment/</guid><description>Destructuring allows quick access to array or object data, making it a common syntax sugar. It simplifies code and renames extracted data for clarity.</description><pubDate>Tue, 04 Apr 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Syntax</category></item><item><title>从动图与实例学会解构语法糖</title><link>https://www.webdong.dev/zh-cn/post/learn-destructuring-assignment/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/learn-destructuring-assignment/</guid><description>通过解构语法可以快速取出当前数组或对象的数据，是个常见且必学的语法糖。通过解构可以快速取出当前数组或对象的数据，并且可以将取出的数据重新命名，让代码更简洁，是个简单方便的语法，举几个实际例子就会发现它的用处很多且很好懂。</description><pubDate>Tue, 04 Apr 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Syntax</category></item><item><title>從動圖與實例學會解構語法糖</title><link>https://www.webdong.dev/zh-tw/post/learn-destructuring-assignment/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/learn-destructuring-assignment/</guid><description>藉由解構語法可以快速取出目前陣列或物件的資料，是個常見且必學的語法糖。透過解構可以快速取出目前陣列或物件的資料，並且可以將取出的資料重新命名，讓程式碼更簡潔，是個簡單方便的語法，舉幾個實際例子就會發現它的用處很多且很好懂。</description><pubDate>Tue, 04 Apr 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Syntax</category></item><item><title>Spread and Rest Operator, The three Dots in JavaScript</title><link>https://www.webdong.dev/en/post/spread-operator-rest-operator-the-three-dots-in-javascript/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/spread-operator-rest-operator-the-three-dots-in-javascript/</guid><description>By learning the Spread and Rest operators introduced, you can write the same code more elegantly. Let&apos;s explore their uses through animations and real examples.</description><pubDate>Mon, 27 Mar 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Syntax</category></item><item><title>展开与其余运算子，三个点是什么魔法？</title><link>https://www.webdong.dev/zh-cn/post/spread-operator-rest-operator-the-three-dots-in-javascript/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/spread-operator-rest-operator-the-three-dots-in-javascript/</guid><description>通过学习 ES6 推出的展开与其余运算子，在许多场合可以更直觉易读的编写相同的代码，通过动图与实际案例来了解它们的用途吧。语法一模一样都是三个点，但在不同的位置会有不同的效果，这篇文章也会介绍展开运算子 (Spread Operator) 与其余运算子 (Rest Operator) 之间的差异。</description><pubDate>Mon, 27 Mar 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Syntax</category></item><item><title>展開與其餘運算子，三個點是什麼魔法？</title><link>https://www.webdong.dev/zh-tw/post/spread-operator-rest-operator-the-three-dots-in-javascript/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/spread-operator-rest-operator-the-three-dots-in-javascript/</guid><description>藉由學習 ES6 推出的展開與其餘運算子，在許多場合可以更直覺易讀的撰寫相同的程式碼，藉由動圖與實際案例來了解它們的用途吧。語法一模一樣都是三個點，但在不同的位置會有不同的效果，這篇文章也會介紹展開運算子 (Spread Operator) 與其餘運算子 (Rest Operator)之間的差異。</description><pubDate>Mon, 27 Mar 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Syntax</category></item><item><title>Three Steps to Record Videos with OBS!</title><link>https://www.webdong.dev/en/post/lets-learn-obs/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/lets-learn-obs/</guid><description>OBS stands for Open Broadcaster Software, a popular open-source recording software. This guide helps you set up OBS quickly from installation to recording.</description><pubDate>Fri, 24 Mar 2023 00:00:00 GMT</pubDate><category>Share</category><category>unsorted</category></item><item><title>三步走，使用 OBS 录制视频！</title><link>https://www.webdong.dev/zh-cn/post/lets-learn-obs/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/lets-learn-obs/</guid><description>OBS 是Open Broadcaster Software 的缩写，是一个在开源社群非常热门的录影软体，由于时常有录制影片的需求，于决定把设定OBS 的过程记录下来，让有需要的人可以依照简单的图示快速上手，从安装到实际录影。</description><pubDate>Fri, 24 Mar 2023 00:00:00 GMT</pubDate><category>Share</category><category>unsorted</category></item><item><title>三步驟，使用 OBS 來錄製影片！</title><link>https://www.webdong.dev/zh-tw/post/lets-learn-obs/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/lets-learn-obs/</guid><description>OBS 是 Open Broadcaster Software 的縮寫，是一個在開源社群非常熱門的錄影軟體，由於時常有錄製影片的需求，於決定把設定 OBS 的過程記錄下來，讓有需要的人可以依照簡單的圖示快速上手，從安裝到實際錄影。</description><pubDate>Fri, 24 Mar 2023 00:00:00 GMT</pubDate><category>Share</category><category>unsorted</category></item><item><title>Ways to help you write better HTML</title><link>https://www.webdong.dev/en/post/things-you-need-to-know-before-using-html/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/things-you-need-to-know-before-using-html/</guid><description>A summary of common issues encountered while reviewing assignments and how to address them. This article gathers key points to help you write better HTML.</description><pubDate>Mon, 20 Mar 2023 00:00:00 GMT</pubDate><category>HTML</category><category>unsorted</category></item><item><title>助教统整 n 个方法帮助你写出更好的 HTML</title><link>https://www.webdong.dev/zh-cn/post/things-you-need-to-know-before-using-html/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/things-you-need-to-know-before-using-html/</guid><description>总结作为六角学院助教一直以来审核作业上最容易碰上的问题，以及可以怎么应对。本篇文章集合了各大 4 个要点与提醒帮助你写出更好的 HTML 结构。了解整篇文章将可以回避掉很多同学最常踩的坑！推荐身为网页开发新手的你看看这篇文章。</description><pubDate>Mon, 20 Mar 2023 00:00:00 GMT</pubDate><category>HTML</category><category>unsorted</category></item><item><title>統整 4 個建議幫助你寫更好的 HTML</title><link>https://www.webdong.dev/zh-tw/post/things-you-need-to-know-before-using-html/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/things-you-need-to-know-before-using-html/</guid><description>總結作為六角學院助教一直以來審核作業上最容易碰上的問題，以及可以怎麼應對。本篇文章集合了各大 4 個要點與提醒幫助你寫出更好的 HTML 結構。了解整篇文章將可以迴避掉很多同學最常踩的坑！推薦身為網頁開發新手的你看看這篇文章。</description><pubDate>Mon, 20 Mar 2023 00:00:00 GMT</pubDate><category>HTML</category><category>unsorted</category></item><item><title>Amazing Features of CodePen You Never Thought Of</title><link>https://www.webdong.dev/en/post/things-you-need-to-know-before-using-codepen/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/things-you-need-to-know-before-using-codepen/</guid><description>CodePen is an online platform where you can build web, see results instantly, and share easily. It&apos;s very beginner-friendly.</description><pubDate>Sun, 19 Mar 2023 00:00:00 GMT</pubDate><category>Share</category><category>unsorted</category></item><item><title>Ways to Write Better CSS</title><link>https://www.webdong.dev/en/post/ways-to-help-you-write-better-css/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/ways-to-help-you-write-better-css/</guid><description>This article summarizes the common issues faced when reviewing assignments and how to address them, helping you avoid common pitfalls!</description><pubDate>Sun, 19 Mar 2023 00:00:00 GMT</pubDate><category>CSS</category><category>unsorted</category></item><item><title>你没想过 CodePen 具备的超赞小功能</title><link>https://www.webdong.dev/zh-cn/post/things-you-need-to-know-before-using-codepen/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/things-you-need-to-know-before-using-codepen/</guid><description>CodePen 是一个线上的模拟开发环境，功能很简单，就是一个网页可以在上面写HTML、CSS、JavaScript，并且可以直接在网页上看到结果，而且还直接分享连结给别人看，对初学者来说介面友好基本没有上手难度，我是非常推荐的。</description><pubDate>Sun, 19 Mar 2023 00:00:00 GMT</pubDate><category>Share</category><category>unsorted</category></item><item><title>助教统整 n 个方法帮助你写出更好的 CSS</title><link>https://www.webdong.dev/zh-cn/post/ways-to-help-you-write-better-css/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/ways-to-help-you-write-better-css/</guid><description>总结作为六角学院助教一直以来审核作业上最容易碰上的问题，以及可以怎么应对。了解整篇文章将可以回避掉很多同学最常踩的坑！撰写程式并没有绝对的准则，留意文章可权衡的地方自行判断即可。本篇文章记录我撰写程式以来的经验与原则以及当六角学院助教审核同学时最常发现的问题。</description><pubDate>Sun, 19 Mar 2023 00:00:00 GMT</pubDate><category>CSS</category><category>unsorted</category></item><item><title>你沒想過 CodePen 具備的超讚小功能</title><link>https://www.webdong.dev/zh-tw/post/things-you-need-to-know-before-using-codepen/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/things-you-need-to-know-before-using-codepen/</guid><description>CodePen 是一個線上的模擬開發環境，功能很簡單，就是一個網頁可以在上面寫 HTML、CSS、JavaScript，並且可以直接在網頁上看到結果，而且還直接分享連結給別人看，對初學者來說介面友好基本沒有上手難度，我是非常推薦的。</description><pubDate>Sun, 19 Mar 2023 00:00:00 GMT</pubDate><category>Share</category><category>unsorted</category></item><item><title>助教統整 n 個方法幫助你寫出更好的 CSS</title><link>https://www.webdong.dev/zh-tw/post/ways-to-help-you-write-better-css/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/ways-to-help-you-write-better-css/</guid><description>總結作為六角學院助教一直以來審核作業上最容易碰上的問題，以及可以怎麼應對。了解整篇文章將可以迴避掉很多同學最常踩的坑！撰寫程式並沒有絕對的準則，留意文章可權衡的地方自行判斷即可。本篇文章記錄我撰寫程式以來的經驗與原則以及當六角學院助教審核同學時最常發現的問題。</description><pubDate>Sun, 19 Mar 2023 00:00:00 GMT</pubDate><category>CSS</category><category>unsorted</category></item><item><title>JavaScript Pass by Value and Reference, The Difference?</title><link>https://www.webdong.dev/en/post/value-vs-reference-which-one/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/value-vs-reference-which-one/</guid><description>The concepts of pass by value and pass by reference. This tutorial uses JavaScript with diagrams to help you understand their differences.</description><pubDate>Tue, 14 Mar 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Concept</category></item><item><title>Why Do You Need Pure Functions?</title><link>https://www.webdong.dev/en/post/why-pure-function/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/why-pure-function/</guid><description>functions that cause changes affecting the rest of the program, leading to unnecessary side effects that make the code unpredictable and hard to understand.</description><pubDate>Tue, 14 Mar 2023 00:00:00 GMT</pubDate><category>Functional Programming</category><category>unsorted</category></item><item><title>JavaScript 传值与传址，都几咧？</title><link>https://www.webdong.dev/zh-cn/post/value-vs-reference-which-one/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/value-vs-reference-which-one/</guid><description>在程式语言中最基本的问题就是问题就是如何纪录与操纵资料，牵扯到传值与传址的问题，这篇教学使用 JavaScript 搭配图表帮助你了解它们的差异。了解如何储存变数有助于更好的操控资料，避免出现改 A 却动到 B 的状况。</description><pubDate>Tue, 14 Mar 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Concept</category></item><item><title>为什么你需要纯粹函数 (Pure Function)？</title><link>https://www.webdong.dev/zh-cn/post/why-pure-function/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/why-pure-function/</guid><description>写程序久了会发现编写干净的可被维护的程序是一件相当困难的事情，其中​​一个造成维护困难的原因是因为「函数除外并返回结果除了过程中产生变化对其他的程序产生影响」，换句话说问题就是「不需要的结果，让程序变得捉摸不定理解难以」，应该纯粹了解函数的定义以及如何使用，以便更进一步编写干净的代码。</description><pubDate>Tue, 14 Mar 2023 00:00:00 GMT</pubDate><category>Functional Programming</category><category>unsorted</category></item><item><title>JavaScript 傳值與傳址，都幾咧？</title><link>https://www.webdong.dev/zh-tw/post/value-vs-reference-which-one/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/value-vs-reference-which-one/</guid><description>在程式語言中最基本的問題就是問題就是如何紀錄與操縱資料，牽扯到傳值與傳址的問題，這篇教學使用 JavaScript 搭配圖表幫助你了解它們的差異。了解如何儲存變數有助於更好的操控資料，避免出現改 A 卻動到 B 的狀況。</description><pubDate>Tue, 14 Mar 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Concept</category></item><item><title>為什麼你需要純粹函式 (Pure Function)？</title><link>https://www.webdong.dev/zh-tw/post/why-pure-function/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/why-pure-function/</guid><description>寫程式久了會發現撰寫乾淨可被維護的程式是一件相當困難的事情，其中一個造成難維護的原因是因為「函式除了運算並回傳結果之外過程中產生變化影響到其餘的程式」，換句話說問題就是「不必要的副作用，讓程式變得捉摸不定難以理解」，因此應該了解純粹函式的定義以及如何使用，為了更進一步撰寫撰寫乾淨的代碼。</description><pubDate>Tue, 14 Mar 2023 00:00:00 GMT</pubDate><category>Functional Programming</category><category>unsorted</category></item><item><title>透過簡單的故事了解 JavaScript 中的 this</title><link>https://www.webdong.dev/zh-tw/post/learn-this-in-javascript-through-simple-story/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/learn-this-in-javascript-through-simple-story/</guid><description>本篇文章將透過簡單易懂的辭彙介紹 JavaScript 中的 this，讓讀者能夠更深入理解 JavaScript 中 this 的使用方式與特性。`this` 會如此讓人混亂是因為它需要基於前後文來判斷，最簡單的原則就是：誰呼叫 `this`，`this` 就代表誰。</description><pubDate>Fri, 10 Mar 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>語法</category></item><item><title>watch 與 useWatch 在 react hook form 中的差異</title><link>https://www.webdong.dev/zh-tw/post/watch-vs-usewatch-in-react-hook-form/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/watch-vs-usewatch-in-react-hook-form/</guid><description>特別記錄下來，這是 React Hook Form 中非常相近的方法：watch 與 useWatch 的差異比較與說明，就連我在第一次理解他們的時候也被搞混了，這裡製作了一些可以互動的實際範例讓你馬上體會到它們之間的差異。</description><pubDate>Wed, 01 Mar 2023 00:00:00 GMT</pubDate><category>React</category><category>Hook</category><category>表單</category></item><item><title>Why You Need Arrow Function in JavaScript?</title><link>https://www.webdong.dev/en/post/why-you-need-arrow-function/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/why-you-need-arrow-function/</guid><description>JavaScript arrow functions are a new syntax introduced in ES6. In this article, we will learn how to use arrow functions.</description><pubDate>Mon, 27 Feb 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Syntax</category></item><item><title>为什么你需要箭头函数</title><link>https://www.webdong.dev/zh-cn/post/why-you-need-arrow-function/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/why-you-need-arrow-function/</guid><description>JavaScript 箭头函式是 ES6 版本中新增的语法，能够简洁明了地定义函式，并且已经被广泛的使用当中。于本篇文章中我们将会学习如何使用箭头函式来简化程式码，并且了解这个语法的特性以及要注意的地方，以及它可以被使用在那些场合当中。</description><pubDate>Mon, 27 Feb 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Syntax</category></item><item><title>為什麼你需要箭頭函式？</title><link>https://www.webdong.dev/zh-tw/post/why-you-need-arrow-function/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/why-you-need-arrow-function/</guid><description>JavaScript 箭頭函式是 ES6 版本中新增的語法，能夠簡潔明瞭地定義函式，並且已經被廣泛的使用當中。於本篇文章中我們將會學習如何使用箭頭函式來簡化程式碼，並且了解這個語法的特性以及要注意的地方，以及它可以被使用在那些場合當中。</description><pubDate>Mon, 27 Feb 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Syntax</category></item><item><title>Summarizes Ways to Write Better Code</title><link>https://www.webdong.dev/en/post/ways-to-help-you-write-better-code/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/ways-to-help-you-write-better-code/</guid><description>Records some potential issues I’ve noticed while reviewing code... There are no absolute rules, but there are common considerations to be aware of.</description><pubDate>Tue, 21 Feb 2023 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>助教统整 n 个方法帮助你写出更好的代码</title><link>https://www.webdong.dev/zh-cn/post/ways-to-help-you-write-better-code/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/ways-to-help-you-write-better-code/</guid><description>我相信撰写程式并没有绝对的准则，但绝对有些常见可以权衡留意的地方。这篇文章记录著作为助教在检阅不同人写的代码的时候，留意到的一些潜在的问题……本篇文章主要是经验的浓缩，如果要详细的撰写建议可以参考看看无瑕的程式码，会有更全面的说明与案例。</description><pubDate>Tue, 21 Feb 2023 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>從實例了解 useRef 的使用情境</title><link>https://www.webdong.dev/zh-tw/post/understanding-the-use-cases-of-useref/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/understanding-the-use-cases-of-useref/</guid><description>React useRef 與一般定義變數差在哪？我決定把他們詳細的比較寫在這篇文章中。簡單來說 useRef 是一個 React Hook 可以讓你參考一個值並不會受到 React 的重新渲染影響，透過實際代碼操作範例來理解它與類似的 useState 還有一般變數的差異。</description><pubDate>Tue, 21 Feb 2023 00:00:00 GMT</pubDate><category>React</category><category>Hook</category></item><item><title>助教統整 n 個方法幫助你寫出更好的代碼</title><link>https://www.webdong.dev/zh-tw/post/ways-to-help-you-write-better-code/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/ways-to-help-you-write-better-code/</guid><description>我相信撰寫程式並沒有絕對的準則，但絕對有些常見可以權衡留意的地方。這篇文章記錄著作為助教在檢閱不同人寫的代碼的時候，留意到的一些潛在的問題……本篇文章主要是經驗的濃縮，如果要詳細的撰寫建議可以參考看看無瑕的程式碼，會有更全面的說明與案例。</description><pubDate>Tue, 21 Feb 2023 00:00:00 GMT</pubDate><category>Technical Discussion</category><category>unsorted</category></item><item><title>Stop using Loose Equality in JavaScript</title><link>https://www.webdong.dev/en/post/stop-using-loose-equality-in-javascript/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/stop-using-loose-equality-in-javascript/</guid><description>Most of the time, you won’t want to use &quot;loose equality&quot;; try using &quot;strict equality&quot; to write your code more rigorously and accurately</description><pubDate>Wed, 15 Feb 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Syntax</category></item><item><title>不要再使用 == 了，改使用 === 吧！</title><link>https://www.webdong.dev/zh-cn/post/stop-using-loose-equality-in-javascript/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/stop-using-loose-equality-in-javascript/</guid><description>绝大多数时候你不会想要使用「松散比对」，尝试使用「严格的比对」将程序撰写得严谨精确一些。在绝大多数的情况下，你不会想要使用松散比对，但是在某些情况下，可能会使用它会更为便利，本篇文章将介绍相关取舍，以及你可以在什么时候使用不同的比较方式。</description><pubDate>Wed, 15 Feb 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Syntax</category></item><item><title>不要再使用 == 了，改使用 === 吧！</title><link>https://www.webdong.dev/zh-tw/post/stop-using-loose-equality-in-javascript/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/stop-using-loose-equality-in-javascript/</guid><description>絕大多數時候你不會想要使用「鬆散比對」，嘗試使用「嚴謹的比對」將程式撰寫得嚴謹精確一些。在絕大多數的情況下，你不會想要使用鬆散比對，但是在某些情況下，可能會使用它會更為便利，本篇文章將介紹相關取捨，以及你可以在什麼時候使用不同的比較方式。</description><pubDate>Wed, 15 Feb 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Syntax</category></item><item><title>Use Guard Clauses for Better Readability</title><link>https://www.webdong.dev/en/post/why-you-should-use-guard-clauses-to-improve-code-readability/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/why-you-should-use-guard-clauses-to-improve-code-readability/</guid><description>If you need more than 3 levels of nesting, you&apos;ve messed up and should consider refactoring your code. Learn how to use guard clauses for better readability.</description><pubDate>Sun, 12 Feb 2023 00:00:00 GMT</pubDate><category>Pattern</category><category>Refactor</category></item><item><title>使用 Guard Clauses 回避嵌套的流程判断来增进阅读性</title><link>https://www.webdong.dev/zh-cn/post/why-you-should-use-guard-clauses-to-improve-code-readability/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/why-you-should-use-guard-clauses-to-improve-code-readability/</guid><description>如果你需要大于 3 层的嵌套，代表你已经搞砸了，应当考虑重构程式码，应当透过反转与封装程式来重构逻辑。这篇文章将详细的介绍现有问题以及使用 Guard Clauses 技巧撰写更好阅读的代码，也就是透过反转逻辑的技巧来撰写更少嵌套逻辑的程式。</description><pubDate>Sun, 12 Feb 2023 00:00:00 GMT</pubDate><category>Pattern</category><category>Refactor</category></item><item><title>使用 Guard Clauses 迴避嵌套的流程判斷來增進閱讀性</title><link>https://www.webdong.dev/zh-tw/post/why-you-should-use-guard-clauses-to-improve-code-readability/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/why-you-should-use-guard-clauses-to-improve-code-readability/</guid><description>如果你需要大於 3 層的嵌套，代表你已經搞砸了，應當考慮重構程式碼，應當透過反轉與封裝程式來重構邏輯。這篇文章將詳細的介紹現有問題以及使用 Guard Clauses 技巧撰寫更好閱讀的代碼，也就是透過反轉邏輯的技巧來撰寫更少嵌套邏輯的程式。</description><pubDate>Sun, 12 Feb 2023 00:00:00 GMT</pubDate><category>Pattern</category><category>Refactor</category></item><item><title>Why You Need Script defer and async Attribute</title><link>https://www.webdong.dev/en/post/why-you-need-javascript-defer-and-async/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/why-you-need-javascript-defer-and-async/</guid><description>To optimize the loading order of scripts, Explains why to use the built-in HTML `defer` and `async` attributes.</description><pubDate>Fri, 10 Feb 2023 00:00:00 GMT</pubDate><category>HTML</category><category>Syntax</category></item><item><title>从动图了解如何有效使用 defer 和 async 属性加载网页中的外部脚本</title><link>https://www.webdong.dev/zh-cn/post/why-you-need-javascript-defer-and-async/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/why-you-need-javascript-defer-and-async/</guid><description>为了优化网页加载顺序，本文通过实际案例说明为什么应该使用 HTML 内建的 `defer` 和 `async` 属性，先从问题出发再到三种解决方案与对比，利用原生 HTML Script 标签属性及能规划脚本的加载顺序。</description><pubDate>Fri, 10 Feb 2023 00:00:00 GMT</pubDate><category>HTML</category><category>Syntax</category></item><item><title>從動圖了解如何有效的使用 defer 和 async 屬性加載網頁中的外部腳本</title><link>https://www.webdong.dev/zh-tw/post/why-you-need-javascript-defer-and-async/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/why-you-need-javascript-defer-and-async/</guid><description>為了達成最佳化網頁加載的順序，本篇文章以實際案例說明為什麼應該使用 HTML 內建的 `defer` 和 `async` 屬性，先從問題點出發再來到三種解決方案與比對，透過原生的 HTML Script 標籤屬性及能規劃腳本的加載順序。</description><pubDate>Fri, 10 Feb 2023 00:00:00 GMT</pubDate><category>HTML</category><category>Syntax</category></item><item><title>Build a Searchbar Using JavaScript in Five Steps</title><link>https://www.webdong.dev/en/post/build-a-searchbar-using-javascript/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/build-a-searchbar-using-javascript/</guid><description>Creating a search box from scratch, allowing input and matching existing data to display relevant content, practical exercise for JavaScript beginners.</description><pubDate>Mon, 06 Feb 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Beginner</category></item><item><title>JavaScript 五个步骤制作搜寻功能</title><link>https://www.webdong.dev/zh-cn/post/build-a-searchbar-using-javascript/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/build-a-searchbar-using-javascript/</guid><description>搜寻列是普遍输入资料于 HTML 中最常用的方式之一，让我们学会如何使用它。本篇文章将会练习从无到有包含介面制作一个搜寻框，可以输入结果并比对现有资料显示关联的内容，是一个非常适合 JavaScript 新手的一道实用练习题目。</description><pubDate>Mon, 06 Feb 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Beginner</category></item><item><title>JavaScript 五個步驟製作搜尋功能</title><link>https://www.webdong.dev/zh-tw/post/build-a-searchbar-using-javascript/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/build-a-searchbar-using-javascript/</guid><description>搜尋列是普遍輸入資料於 HTML 中最常用的方式之一，讓我們學會如何使用它。本篇文章將會練習從無到有包含介面製作一個搜尋框，可以輸入結果並比對現有資料顯示關聯的內容，是一個非常適合 JavaScript 新手的一道實用練習題目。</description><pubDate>Mon, 06 Feb 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Beginner</category></item><item><title>Create a Counter in JavaScript in Five Steps</title><link>https://www.webdong.dev/en/post/build-a-counter-using-javascript/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/build-a-counter-using-javascript/</guid><description>A counter is a basic exercise commonly seen in various frameworks, showcasing minimal functionality of any app. Let&apos;s recreate it using native JavaScript.</description><pubDate>Sat, 04 Feb 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Beginner</category></item><item><title>JavaScript 五个步骤制作计数器</title><link>https://www.webdong.dev/zh-cn/post/build-a-counter-using-javascript/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/build-a-counter-using-javascript/</guid><description>计数器是入门各大框架基本会见到的习题，可以说是任何 App 最低限度的功能展示。这次使用原生的 JavaScript 来重现该题目，并且一步一步的思考并改善结果，本篇文章将会练习制作一个具备加、减、重制功能的 JavaScript 计数器。</description><pubDate>Sat, 04 Feb 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Beginner</category></item><item><title>JavaScript 五個步驟製作計數器</title><link>https://www.webdong.dev/zh-tw/post/build-a-counter-using-javascript/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/build-a-counter-using-javascript/</guid><description>計數器是入門各大框架基本會見到的習題，可以說是任何 App 最低限度的功能展示。這次使用原生的 JavaScript 來重現該題目，並且一步一步的思考並改善結果，本篇文章將會練習製作一個具備加、減、重製功能的 JavaScript 計數器。</description><pubDate>Sat, 04 Feb 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>Beginner</category></item><item><title>從動圖輕鬆學會撰寫非同步 JavaScript（第二章）</title><link>https://www.webdong.dev/zh-tw/post/async-javascript-visualized-with-ease-episode-2/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/async-javascript-visualized-with-ease-episode-2/</guid><description>上一章節從動圖理解了非同步的概念，這一章節將會介紹如何撰寫非同步程式。從簡單的回呼函式到 Promise 再到使用 Async/Await 語法。目前知道非同步的程式實際上是透過執行環境(瀏覽器、Node.js) 所提供的 API 來達成同時間處理多件事情的。</description><pubDate>Wed, 01 Feb 2023 00:00:00 GMT</pubDate><category>JavaScript</category><category>非同步</category></item><item><title>Learn Debounce and Throttle Through Animation</title><link>https://www.webdong.dev/en/post/learn-debounce-and-throttle/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/learn-debounce-and-throttle/</guid><description>Debounce and throttle are essential patterns in frontend performance, helping to improve user experience and reduce resource wastage for developers.</description><pubDate>Tue, 22 Nov 2022 00:00:00 GMT</pubDate><category>Pattern</category><category>unsorted</category></item><item><title>从动图轻松解题：防抖与节流</title><link>https://www.webdong.dev/zh-cn/post/learn-debounce-and-throttle/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/learn-debounce-and-throttle/</guid><description>防抖与节流是前端效能主题中必定会出现的模式，对用户的输入进行适当的防抖与节流处理，除了有助于提升使用者体验之外，对开发者来说也节省掉许多潜在的资源浪费，透过实际案例还有动画图片一起来了解防抖与节流如何帮助我们提升程式效率。</description><pubDate>Tue, 22 Nov 2022 00:00:00 GMT</pubDate><category>Pattern</category><category>unsorted</category></item><item><title>從動圖輕鬆解題：防抖與節流</title><link>https://www.webdong.dev/zh-tw/post/learn-debounce-and-throttle/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/learn-debounce-and-throttle/</guid><description>防抖與節流是前端效能主題中必定會出現的模式，對用戶的輸入進行適當的防抖與節流處理，除了有助於提升使用者體驗之外，對開發者來說也節省掉許多潛在的資源浪費，透過實際案例還有動畫圖片一起來了解防抖與節流如何幫助我們提升程式效率。</description><pubDate>Tue, 22 Nov 2022 00:00:00 GMT</pubDate><category>Pattern</category><category>unsorted</category></item><item><title>Async JavaScript Visualized With Ease</title><link>https://www.webdong.dev/en/post/async-javascript-visualized-with-ease/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/async-javascript-visualized-with-ease/</guid><description>Understand how single-threaded JavaScript works behind the scenes, the nuances of concurrent event handling, and demystify complex terminology.</description><pubDate>Fri, 18 Nov 2022 00:00:00 GMT</pubDate><category>JavaScript</category><category>unsorted</category></item><item><title>从动图轻松入门非同步 JavaScript（第一章）</title><link>https://www.webdong.dev/zh-cn/post/async-javascript-visualized-with-ease/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/async-javascript-visualized-with-ease/</guid><description>了解单线程的 JavaScript 背后如何运作、并发处理事件背后的奥妙、拆解晦涩难懂的专有名词。浏览器执行环境中的 JavaScript 是单线程的，也就是一次只能执行一件事，如此一来其他事情就都会被搁置在后，让使用者等待。这是非常大的问题，但解决方法也非常的简单：「不要呆呆站在那里等！」。</description><pubDate>Fri, 18 Nov 2022 00:00:00 GMT</pubDate><category>JavaScript</category><category>unsorted</category></item><item><title>從動圖輕鬆入門非同步 JavaScript（第一章）</title><link>https://www.webdong.dev/zh-tw/post/async-javascript-visualized-with-ease/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/async-javascript-visualized-with-ease/</guid><description>了解單線程的 JavaScript 背後如何運作、併發處理事件背後的奧妙、拆解晦澀難懂的專有名詞。瀏覽器執行環境中的 JavaScript 是單線程的，也就是一次只能執行一件事，如此一來其他事情就都會被擱置在後，讓使用者等待。這是非常大的問題，但解決方法也非常的簡單：「不要呆呆站在那裏等！」。</description><pubDate>Fri, 18 Nov 2022 00:00:00 GMT</pubDate><category>JavaScript</category><category>unsorted</category></item><item><title>Create a Todo List in JavaScript in Five Steps</title><link>https://www.webdong.dev/en/post/javascript-todo-list-exercise/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/javascript-todo-list-exercise/</guid><description>Todo lists are common exercises that simulate various scenarios and problems encountered when manipulating data.</description><pubDate>Tue, 15 Nov 2022 00:00:00 GMT</pubDate><category>Implementation</category><category>Beginner</category></item><item><title>JavaScript 五个步骤制作待办事项</title><link>https://www.webdong.dev/zh-cn/post/javascript-todo-list-exercise/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/javascript-todo-list-exercise/</guid><description>待办事项是非常常见的习题，其中需求含括了增、删、读、改资料，充分的模拟到未来在操纵资料时会碰上的各种情境与问题。可以说各式各样的软体都是一种客制化的待办事项，透过制作待办事项足以熟悉编写应用的方方面面，跟着步骤写一次来练习基本的应用撰写。</description><pubDate>Tue, 15 Nov 2022 00:00:00 GMT</pubDate><category>Implementation</category><category>Beginner</category></item><item><title>JavaScript 五個步驟製作待辦事項</title><link>https://www.webdong.dev/zh-tw/post/javascript-todo-list-exercise/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/javascript-todo-list-exercise/</guid><description>待辦事項是非常常見的習題，其中需求含括了增、刪、讀、改資料，充分的模擬到未來在操縱資料時會碰上的各種情境與問題。可以說各式各樣的軟體都是一種客製化的待辦事項，透過製作待辦事項足以熟悉編寫應用的方方面面，跟著步驟寫一次來練習基本的應用撰寫。</description><pubDate>Tue, 15 Nov 2022 00:00:00 GMT</pubDate><category>Implementation</category><category>Beginner</category></item><item><title>setTimeout and setInterval in async JavaScript</title><link>https://www.webdong.dev/en/post/settimeout-and-setinterval-in-async-javascript/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/settimeout-and-setinterval-in-async-javascript/</guid><description>setTimeout or setInterval are often used to simulate asynchronous execution in practice. This article will detail their underlying principles and usage.</description><pubDate>Mon, 14 Nov 2022 00:00:00 GMT</pubDate><category>JavaScript</category><category>unsorted</category></item><item><title>非同步 JavaScript 时间操纵之术： setTimeout 与 setInterval</title><link>https://www.webdong.dev/zh-cn/post/settimeout-and-setinterval-in-async-javascript/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/settimeout-and-setinterval-in-async-javascript/</guid><description>在介绍到同步与非同步代码时，常常会以 setTimeout 或 setInterval 来模拟程式被非同步执行的状况，这两种「方法」都不算是 JavaScript 的一部分，不过大多主流执行环境都有提供 (浏览器、Node.js)，是很好练习非同步处理 JavaScript 的起点，本文将会详细讲解其背后的故事与原理。</description><pubDate>Mon, 14 Nov 2022 00:00:00 GMT</pubDate><category>JavaScript</category><category>unsorted</category></item><item><title>非同步 JavaScript 時間操縱之術： setTimeout 與 setInterval</title><link>https://www.webdong.dev/zh-tw/post/settimeout-and-setinterval-in-async-javascript/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/settimeout-and-setinterval-in-async-javascript/</guid><description>在介紹到同步與非同步代碼時，常常會以 setTimeout 或 setInterval 來模擬程式被非同步執行的狀況，這兩種「方法」都不算是 JavaScript 的一部分，不過大多主流執行環境都有提供 (瀏覽器、Node.js)，是很好練習非同步處理 JavaScript 的起點，本文將會詳細講解其背後的故事與原理。</description><pubDate>Mon, 14 Nov 2022 00:00:00 GMT</pubDate><category>JavaScript</category><category>unsorted</category></item><item><title>Why You Should Use Data Attributes data-*</title><link>https://www.webdong.dev/en/post/why-you-should-use-data-attributes/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/why-you-should-use-data-attributes/</guid><description>HTML elements can have their own attributes. Data attributes are a formal way to store data in HTML elements, allowing JavaScript and CSS to access the data.</description><pubDate>Mon, 07 Nov 2022 00:00:00 GMT</pubDate><category>HTML</category><category>Syntax</category></item><item><title>为什么你应该使用数据属性 data-*</title><link>https://www.webdong.dev/zh-cn/post/why-you-should-use-data-attributes/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/why-you-should-use-data-attributes/</guid><description>HTML 元素可以拥有自己的属性，用于表达各种类的资讯，像是从外观样式到无障碍资讯到各式各样的预设属性，而 data 属性是一个正式存储资料于 HTML 元素的属性，将资讯储存在 HTML 标签属性上，使 JavaScript 与 CSS 都能读取得到元素的资料。</description><pubDate>Mon, 07 Nov 2022 00:00:00 GMT</pubDate><category>HTML</category><category>Syntax</category></item><item><title>為什麼你應該要使用資料屬性 data-*</title><link>https://www.webdong.dev/zh-tw/post/why-you-should-use-data-attributes/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/why-you-should-use-data-attributes/</guid><description>HTML 元素可以擁有自己的屬性，用於表達各種類的資訊，像是從外觀樣式到無障礙資訊到各式各樣的預設屬性，而 data 屬性是一個正式存儲資料於 HTML 元素的屬性，將資訊儲存在 HTML 標籤屬性上，使 JavaScript 與 CSS 都能讀取得到元素的資料。</description><pubDate>Mon, 07 Nov 2022 00:00:00 GMT</pubDate><category>HTML</category><category>Syntax</category></item><item><title>DOM API in One Go!</title><link>https://www.webdong.dev/en/post/dom-api-in-one-go/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/dom-api-in-one-go/</guid><description>Manipulate web pages requires understanding the DOM. This article quickly teaches you how to programmatically modify, access, edit, and listen to the DOM.</description><pubDate>Sat, 29 Oct 2022 00:00:00 GMT</pubDate><category>JavaScript</category><category>unsorted</category></item><item><title>DOM API 一篇就会！</title><link>https://www.webdong.dev/zh-cn/post/dom-api-in-one-go/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/dom-api-in-one-go/</guid><description>作为前端必学如何操控网页就需要学习 DOM，用一篇文章快速教你如何程序化的更动网页，一起来学会如何存取、编辑与监听 DOM，还有综合懒人包！如果对 Javascript 对象有一定的了解，代表你已经差不多会操纵 DOM 了，如果还不熟悉，建议可以先了解后再学习 DOM API。</description><pubDate>Sat, 29 Oct 2022 00:00:00 GMT</pubDate><category>JavaScript</category><category>unsorted</category></item><item><title>DOM API 一篇就會！</title><link>https://www.webdong.dev/zh-tw/post/dom-api-in-one-go/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/dom-api-in-one-go/</guid><description>身為前端必學如何操控網頁就需要學習 DOM，用一篇文章快速教你如何程序化的更動網頁，一起來學會如何存取、編輯與監聽 DOM，還有綜合懶人包！如果對 Javascript 物件有一定的了解，代表你已經差不多會操縱 DOM 了，如果還不熟悉，建議可以先了解後再學習 DOM API。</description><pubDate>Sat, 29 Oct 2022 00:00:00 GMT</pubDate><category>JavaScript</category><category>unsorted</category></item><item><title>Javascript Optional Chaining Operator</title><link>https://www.webdong.dev/en/post/javascript-optional-chaining-operator/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/javascript-optional-chaining-operator/</guid><description>Learn the optional chaining syntax to safely access nested object properties without causing errors, even if those properties do not exist.</description><pubDate>Fri, 21 Oct 2022 00:00:00 GMT</pubDate><category>JavaScript</category><category>Synatx</category></item><item><title>使用可选链安全访问不确定的数据</title><link>https://www.webdong.dev/zh-cn/post/javascript-optional-chaining-operator/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/javascript-optional-chaining-operator/</guid><description>学习任选串联语法可以让我们安全的访问某个询问且的对象属性，即使其属性并不存在也不会导致错误。访问对象属性对开发者来说是一件非常直觉的事情。做的事，但当数据的来源不稳定时，如果使用第三方来源的数据或用户输入，应该如何避免因使用不存在的值而出现的错误呢？来试试看任选染色体语法。</description><pubDate>Fri, 21 Oct 2022 00:00:00 GMT</pubDate><category>JavaScript</category><category>Syntax</category></item><item><title>使用可選串聯存取不確定是否存在的資料</title><link>https://www.webdong.dev/zh-tw/post/javascript-optional-chaining-operator/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/javascript-optional-chaining-operator/</guid><description>學習可選串聯語法可以讓我們安全的存取某個嵌套的物件屬性，就算其屬性並不存在也不會導致錯誤。存取物件屬性對開發者來說是一件非常直覺且每天都在做的事，但當資料的來源不穩定，像是使用第三方來源的資料或用戶輸入，應該如何迴避因使用不存在的值而出現的錯誤呢？來試試看可選串聯語法。</description><pubDate>Fri, 21 Oct 2022 00:00:00 GMT</pubDate><category>JavaScript</category><category>Syntax</category></item><item><title>Responsive Web Design(RWD) Explanation for Everyone</title><link>https://www.webdong.dev/en/post/simple-rwd-for-everyone/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/simple-rwd-for-everyone/</guid><description>Mobile devices account for over half of modern internet traffic. The demand for websites that adapt to various devices has surged, leading to RWD.</description><pubDate>Sat, 01 Oct 2022 00:00:00 GMT</pubDate><category>CSS</category><category>RWD</category></item><item><title>The Magic Before CSS - Preprocessors</title><link>https://www.webdong.dev/en/post/the-magic-before-css-preprocessors/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/the-magic-before-css-preprocessors/</guid><description>In the field of front-end development, some commonly heard preprocessors, such as Sass, Less, and Stylus, what are they? Why do they exist?</description><pubDate>Sat, 01 Oct 2022 00:00:00 GMT</pubDate><category>CSS</category><category>unsorted</category></item><item><title>由浅入深了解什么是 RWD</title><link>https://www.webdong.dev/zh-cn/post/simple-rwd-for-everyone/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/simple-rwd-for-everyone/</guid><description>行动装置占了现代网际网路流量的一半以上，并且这样的趋势只会越来越高，随着行动装置的普及，像手表、手机、平板……等装置，连结上网页的装置只会越来越多元零碎，而每个装置又有不同的解析度与尺寸，因此市场对「能够适应各种装置」的网页需求是大大的增加，因此出现了 Responsive Web Design (RWD) 的做法。</description><pubDate>Sat, 01 Oct 2022 00:00:00 GMT</pubDate><category>CSS</category><category>RWD</category></item><item><title>那些发生在 CSS 之「前」的魔法 —— 预处理器</title><link>https://www.webdong.dev/zh-cn/post/the-magic-before-css-preprocessors/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/the-magic-before-css-preprocessors/</guid><description>CSS 预处理器已经深刻地改变了前端开发的方式，成为一项必备工具。但随着时间推移，新标准不断推出，我们还需要它们吗？在前端开发领域，经常会听到一些预处理器 (Pre-processor)，比如 Sass、Less、Stylus，这些工具是什么？为什么会存在？本文将主要探讨以下几个重点（附带示例）。</description><pubDate>Sat, 01 Oct 2022 00:00:00 GMT</pubDate><category>CSS</category><category>unsorted</category></item><item><title>由淺入深的了解什麼是 RWD</title><link>https://www.webdong.dev/zh-tw/post/simple-rwd-for-everyone/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/simple-rwd-for-everyone/</guid><description>行動裝置占了現代網際網路流量的一半以上，並且這樣的趨勢只會越來越高，隨著行動裝置的普及，像手錶、手機、平板……等裝置，連結上網頁的裝置只會越來越多元零碎，而每個裝置又有不同的解析度與尺寸，因此市場對「能夠適應各種裝置」的網頁需求是大大的增加，因此出現了 Responsive Web Design (RWD) 的做法。</description><pubDate>Sat, 01 Oct 2022 00:00:00 GMT</pubDate><category>CSS</category><category>RWD</category></item><item><title>那些發生在 CSS 之「前」的魔法 —— 預處理器</title><link>https://www.webdong.dev/zh-tw/post/the-magic-before-css-preprocessors/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/the-magic-before-css-preprocessors/</guid><description>CSS 預處理器已經深深地改變了前端開發的方式，成為一項必備的工具。但隨著時間的轉變，新的標準持續地推出，我們仍然還需要它們嗎？在前端開發領域，常常會聽見的一些預處理器 (Pre-processor)，像是 Sass、less、stylus，是什麼？為什麼存在？這篇文章主要會探討以下幾個重點 (附帶範例)。</description><pubDate>Sat, 01 Oct 2022 00:00:00 GMT</pubDate><category>CSS</category><category>unsorted</category></item><item><title>Write More Maintainable CSS with BEM</title><link>https://www.webdong.dev/en/post/write-cleaner-css-with-bem/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/write-cleaner-css-with-bem/</guid><description>BEM is a convention for CSS. BEM CSS is simple, effective, and has battletested, making it suitable as a beginner&apos;s first CSS management method.</description><pubDate>Wed, 31 Aug 2022 00:00:00 GMT</pubDate><category>CSS</category><category>unsorted</category></item><item><title>如何用 BEM 撰写更好维护的 CSS</title><link>https://www.webdong.dev/zh-cn/post/write-cleaner-css-with-bem/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/write-cleaner-css-with-bem/</guid><description>BEM 是一种管理 CSS 撰写方式的一种规范。撰写小型的网站时通常不需要特别考虑到未来样式的命名与权级的规划，但随着网站的复杂度增长就必须需要一套可预测与可扩充的方式，BEM CSS 由于概念简洁好懂，成效显著，并且有着相对长远的历史被测试与应用过，很适合作为初学者第一套管理 CSS 的办法。</description><pubDate>Wed, 31 Aug 2022 00:00:00 GMT</pubDate><category>CSS</category><category>unsorted</category></item><item><title>如何用 BEM 撰寫更好維護的 CSS</title><link>https://www.webdong.dev/zh-tw/post/write-cleaner-css-with-bem/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/write-cleaner-css-with-bem/</guid><description>BEM 是一種管理 CSS 撰寫方式的一種規範。撰寫小型的網站時通常不需要特別考慮到未來樣式的命名與權級的規劃，但隨著網站的複雜度增長就必須需要一套可預測與可擴充的方式，BEM CSS 由於概念簡潔好懂，成效顯著，並且有著相對長遠的歷史被測試與應用過，很適合作為初學者第一套管理 CSS 的辦法。</description><pubDate>Wed, 31 Aug 2022 00:00:00 GMT</pubDate><category>CSS</category><category>unsorted</category></item><item><title>Tools for Front-end Development Testing</title><link>https://www.webdong.dev/en/post/tools-for-test-your-website/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/tools-for-test-your-website/</guid><description>Here are some small tools and websites that front-end developers may not have thought of, gathered to enhance the website development experience!</description><pubDate>Fri, 01 Jul 2022 00:00:00 GMT</pubDate><category>Share</category><category>unsorted</category></item><item><title>给前端开发测试的方便小工具</title><link>https://www.webdong.dev/zh-cn/post/tools-for-test-your-website/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/tools-for-test-your-website/</guid><description>前端开发者在开发过程中一些没有想到过可能存在的小工具与网站，都打包好放在这里，强化网站开发体验！网页总是有太多需要留意的技术细节，需要一个更快速简便的方式来测试网站是某可靠？某项功能是否到位？可以参考底下的工具协助开发。</description><pubDate>Fri, 01 Jul 2022 00:00:00 GMT</pubDate><category>Share</category><category>unsorted</category></item><item><title>給前端開發測試的方便小工具</title><link>https://www.webdong.dev/zh-tw/post/tools-for-test-your-website/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/tools-for-test-your-website/</guid><description>前端開發者在開發過程中一些沒有想到過可能存在的小工具與網站，都打包好放在這裡，強化網站開發體驗！網頁總是有太多需要留意的技術細節，需要一個更快速簡便的方式來測試網站是某可靠？某項功能是否到位？可以參考底下的工具協助開發。</description><pubDate>Fri, 01 Jul 2022 00:00:00 GMT</pubDate><category>Share</category><category>unsorted</category></item><item><title>4 Types of Documentation Nobody Tells You About</title><link>https://www.webdong.dev/en/post/4-types-of-documentation-nobody-tells-you-about/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/4-types-of-documentation-nobody-tells-you-about/</guid><description>Good documentation is easy to write, maintain. Article covers four types of documentation and tips for organizing ideas, inspired by Daniele Procida&apos;s talk.</description><pubDate>Wed, 01 Jun 2022 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>Writing</category></item><item><title>Fix Your File Organization Nightmare</title><link>https://www.webdong.dev/en/post/fix-your-file-nightmare/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/fix-your-file-nightmare/</guid><description>We Creating a chaotic mess that needs organizing. This article shares how our team established a system for file management and backup.</description><pubDate>Wed, 01 Jun 2022 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>unsorted</category></item><item><title>Where to find awesome fonts?</title><link>https://www.webdong.dev/en/post/where-to-find-awesome-fonts/</link><guid isPermaLink="true">https://www.webdong.dev/en/post/where-to-find-awesome-fonts/</guid><description>Fonts are the soul of the layout; good fonts can better express the emotions and contexts between words! Collects practical and reliable font websites.</description><pubDate>Wed, 01 Jun 2022 00:00:00 GMT</pubDate><category>Share</category><category>unsorted</category></item><item><title>四种文档的种类，以及为什么需要了解它们</title><link>https://www.webdong.dev/zh-cn/post/4-types-of-documentation-nobody-tells-you-about/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/4-types-of-documentation-nobody-tells-you-about/</guid><description>好的文档应更容易的被撰写，更简单去维护，好的文档可以帮助人们更快、更有自信的去上手某一项技术。本篇统整帮助你理解文档可以被拆分为的 4 个种类，并且如何更好的整理、传递你的知识和想法，撷取自 Daniele Procida 发表的演说所总结的观点笔记。</description><pubDate>Wed, 01 Jun 2022 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>Writing</category></item><item><title>分类好头疼！如何摆脱档案整理恶梦？</title><link>https://www.webdong.dev/zh-cn/post/fix-your-file-nightmare/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/fix-your-file-nightmare/</guid><description>我们每天都会囤积大量的文件、笔记、素材、累积下来就像乱糟糟的房间一样需要整理，如果你也同样在困扰这样的问题，这篇文章是为你准备的。本次文章想分享我们团队是如何建立一个系统应对基本的档案分工与备份的流程。好的档案管理是可以被追溯、被规范的，这样才好合作，好在未来被回顾。</description><pubDate>Wed, 01 Jun 2022 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>unsorted</category></item><item><title>授权透明、实用的字体哪里找？</title><link>https://www.webdong.dev/zh-cn/post/where-to-find-awesome-fonts/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/post/where-to-find-awesome-fonts/</guid><description>字体是版面的灵魂，好的字体能够更好地表达文词间的情绪与情境！本篇文章收集了实用且来源可靠、授权清楚的字体网站并且是我平时设计时会考虑参考的网素材网站，像是：Google Fonts、FontShare……在使用时请务必注意授权范围限制。</description><pubDate>Wed, 01 Jun 2022 00:00:00 GMT</pubDate><category>Share</category><category>unsorted</category></item><item><title>四種文檔的種類，以及為什麼需要了解它們</title><link>https://www.webdong.dev/zh-tw/post/4-types-of-documentation-nobody-tells-you-about/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/4-types-of-documentation-nobody-tells-you-about/</guid><description>好的文檔應更容易的被撰寫，更簡單去維護，好的文檔可以幫助人們更快、更有自信的去上手某一項技術。本篇統整幫助你理解文檔可以被拆分為的 4 個種類，並且如何更好的整理、傳遞你的知識和想法，擷取自 Daniele Procida 發表的演說所總結的觀點筆記。</description><pubDate>Wed, 01 Jun 2022 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>Writing</category></item><item><title>分類好頭疼！如何擺脫檔案整理惡夢？</title><link>https://www.webdong.dev/zh-tw/post/fix-your-file-nightmare/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/fix-your-file-nightmare/</guid><description>我們每天都會囤積大量的文件、筆記、素材、累積下來就像亂糟糟的房間一樣需要整理，如果你也同樣在困擾這樣的問題，這篇文章是為你準備的。本次文章想分享我們團隊是如何建立一個系統應對基本的檔案分工與備份的流程。好的檔案管理是可以被追溯、被規範的，這樣才好合作，好在未來被回顧。</description><pubDate>Wed, 01 Jun 2022 00:00:00 GMT</pubDate><category>Non-Technical Discussion</category><category>unsorted</category></item><item><title>授權透明、實用的字體哪裡找？</title><link>https://www.webdong.dev/zh-tw/post/where-to-find-awesome-fonts/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/post/where-to-find-awesome-fonts/</guid><description>字體是版面的靈魂，好的字體能夠更好的表達文詞間的情緒與情境！本篇文章蒐集了實用且來源可靠、授權清楚的字體網站並且是我平時設計時會考慮參考的網素材網站，像是：Google Fonts、FontShare……在使用時請務必要注意授權範圍限制。</description><pubDate>Wed, 01 Jun 2022 00:00:00 GMT</pubDate><category>Share</category><category>unsorted</category></item><item><title>自媒體的盡頭是 Mike（賣課）</title><link>https://www.webdong.dev/zh-tw/shortpost/ai-course/#ai-course/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/ai-course/#ai-course/</guid><pubDate>Sun, 05 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;因為之前有教學平台工作經歷，因此雖然沒有花錢在買課上，但看到各式各樣的課程廣告（大多是軟體開發）都會特別點進去看一下老師的背景、教的東西、宣傳的手段、內容的深度、學習社群⋯⋯有趣的是這些行銷中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;上班族領死薪水&lt;/li&gt;
&lt;li&gt;接案者收入不穩定&lt;/li&gt;
&lt;li&gt;老闆要減少人力依賴&lt;/li&gt;
&lt;li&gt;孩子需緊跟 AI 時代&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;財富自由、被動收入、個人品牌、一技之長⋯⋯&lt;/p&gt;
&lt;p&gt;宣傳方式來說可以準確帶動不同族群情緒作得很好，但如果學習是因為恐懼，把付錢買課當作是面對的話，只算是花錢買安慰劑用來緩解時代更迭的焦慮。&lt;/p&gt;
&lt;p&gt;真正的訣竅在於好奇心與內省：「想解決問題的衝動」、「我在乎的事情如何做得更好」。&lt;/p&gt;
&lt;p&gt;現實可能很糟糕，低薪高壓環境讓人絕望，但學習的重點還是不應該在於「能賺多少錢」或「搶得先機」，而是一個開放可能性的無限遊戲。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/zh-tw/post/finite-and-infinite-games-and-gaming-impotence/&quot;&gt;有限與無限遊戲看待電子陽痿 - WebDong&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>Why E2E automated tests still can&apos;t (completely) solve software testing problems</title><link>https://www.webdong.dev/en/shortpost/why-e2e-automation-test-wont-work/#why-e2e-automation-test-wont-work/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/why-e2e-automation-test-wont-work/#why-e2e-automation-test-wont-work/</guid><pubDate>Tue, 31 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Recently, we’ve been discussing how to introduce automated testing into products. A common thought comes up: AI is so powerful now! It can generate browser automation scripts quickly and accurately—shouldn’t it be able to replace manual testing right away and cover every scenario?&lt;/p&gt;
&lt;p&gt;Running E2E (End-to-End) tests has an undeniable appeal:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Black-box testing is easy to execute&lt;/li&gt;
&lt;li&gt;It provides the highest level of confidence&lt;/li&gt;
&lt;li&gt;It validates the entire codebase in one go&lt;/li&gt;
&lt;li&gt;AI-generated test scripts can be stable, consistent, and efficient&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;However, in real-world environments, the challenges are hard to ignore:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Unclear specifications: If the expected system behavior isn’t well-defined, what exactly are you testing?&lt;/li&gt;
&lt;li&gt;Side effects: Test actions can affect the test environment&lt;/li&gt;
&lt;li&gt;Test environments: Building a fully realistic environment is slow&lt;/li&gt;
&lt;li&gt;Instability: Code changes can easily break tests&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Take a simple “delete role” feature as an example: “Click the delete button and the role disappears.” What does this actually imply?&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Feature: Delete Role

  Scenario: Successful deletion
    Given an authenticated admin
    When deleting a role
    Then the role is successfully deleted

  Scenario: Missing parameters
    Given an authenticated admin
    When deleting a role (with missing required parameters)
    Then an invalid parameter error is shown

  Scenario: No admin privileges
    Given an authenticated non-admin user
    When deleting a role
    Then a permission denied error is shown

  Scenario: Deleting oneself
    Given an authenticated admin
    When deleting their own role
    Then an error is shown indicating self-deletion is not allowed

  Scenario: Deleting a non-existent role
    Given an authenticated admin
    When deleting a non-existent role
    Then a role not found error is shown

  Scenario: Deleting a super admin
    Given an authenticated admin
    When deleting a super admin role
    Then an error is shown indicating the super admin cannot be deleted
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;1.	Even a seemingly simple feature can involve multiple preconditions and failure. AI does not inherently understand how your business logic should behave, and most legacy systems lack clearly defined specifications.
2.	Six scenarios mean restarting the entire service six times for a single feature. If you don’t, test side effects will inevitably interfere with each other, leading to false confidence and false alarms.
3.	Every test is an asset that requires maintenance to remain effective—otherwise, it becomes a burden. E2E tests are the most fragile and hardest to maintain among all testing types.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;AI solves the problem of generating automated test scripts, but that’s only one bottleneck. Achieving effective testing requires much more:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A deep understanding of how the product works and the ability to clearly define specifications&lt;/li&gt;
&lt;li&gt;The ability to choose and apply the right testing strategies and tools (static testing, unit testing, component testing, integration testing, E2E testing, mock data, CI feedback loops, layered architecture, etc.)&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Testing</category></item><item><title>为什么 E2E 自动化测试还是没办法（完全）解决软件测试上的问题</title><link>https://www.webdong.dev/zh-cn/shortpost/why-e2e-automation-test-wont-work/#why-e2e-automation-test-wont-work/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/why-e2e-automation-test-wont-work/#why-e2e-automation-test-wont-work/</guid><pubDate>Tue, 31 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近讨论到如何替产品添加自动化测试的话题：现在 AI 很厉害！产生浏览器脚本精准又快速，应该马上就能替代手动测试，每个情境都测过一次吧？&lt;/p&gt;
&lt;p&gt;执行 E2E（End to End）测试有无法忽视的强大魅力：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;黑箱测试易于执行&lt;/li&gt;
&lt;li&gt;产生最高的信心度&lt;/li&gt;
&lt;li&gt;一次测验整体代码&lt;/li&gt;
&lt;li&gt;AI 产固定测试脚本成熟稳定又高效&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;但真实环境实际要面对的考验是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不清楚的规格：如果连系统的预期行为都不明朗，要如何测试？&lt;/li&gt;
&lt;li&gt;副作用：测试操作会影响测试环境&lt;/li&gt;
&lt;li&gt;测试环境：全面真实的环境构建缓慢&lt;/li&gt;
&lt;li&gt;不稳定：程序有更多理由改变而破坏测试&lt;/li&gt;
&lt;li&gt;⋯⋯&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;举例来说一个简单的删除角色功能：「点删除按钮，角色消失」，背后可能代表什么？&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;功能: 删除角色

场景: 正确删除
假如：已登入的管理员
当：删除角色
那么：角色正确删除

场景: 缺少参数
假如：已登入的管理员
当：删除角色（缺少必要参数）
那么：提示参数错误

场景: 没有管理员权限
假如：已登入的非管理员使用者
当：删除角色
那么：提示权限不足错误

场景: 删除自己
假如：已登入的管理员
当：删除自己的角色
那么：提示不可删除自己角色错误

场景: 删除不存在的角色
假如：已登入的管理员
当：删除不存在角色
那么：提示角色不存在错误

场景: 删除主管理员
假如：已登入的管理员
当：删除主管理员
那么：提示不可删除主管理员错误
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;看似简单的功能也能有多种前提、坏掉的方式、坏掉的地方，AI 不会理解你的商业逻辑应该如何运作，陈旧系统大多都没有具体规格。&lt;/li&gt;
&lt;li&gt;6 个场景意味着一个功能就需要全面重启整个服务 6 次，如果不想？那么测试副作用将会不可避免地交叉影响造成虚假的信心和假警报。&lt;/li&gt;
&lt;li&gt;每个测试都是需要维护才能生效的资产，否则就是累赘，E2E 测试是最容易被破坏，且难以维护的测试形式。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;AI 解决了「产自动化测试脚本」的问题，但那只是其中一个瓶颈，要达成有效的测试更多是需要：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;理解产品运作，且能够有序定义规格的能力&lt;/li&gt;
&lt;li&gt;能够善用测试种类，用合适的方式与工具导入测试的能力（静态测试、单元测试、组件测试、集成测试、E2E 测试、Mock Data、CI 反馈构建、架构分层⋯⋯）&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Testing</category></item><item><title>為什麼 E2E 自動化測試還是沒辦法（完全）解決軟體測試上的問題</title><link>https://www.webdong.dev/zh-tw/shortpost/why-e2e-automation-test-wont-work/#why-e2e-automation-test-wont-work/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/why-e2e-automation-test-wont-work/#why-e2e-automation-test-wont-work/</guid><pubDate>Tue, 31 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近討論到如何替產品添加自動化測試的話題：現在 AI 很厲害！產生瀏覽器腳本精準又快速，應該馬上就能替代手動測試，每個情境都測過一次吧？&lt;/p&gt;
&lt;p&gt;執行 E2E（End to End）測試有無法忽視的強大魅力：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;黑箱測試易於執行&lt;/li&gt;
&lt;li&gt;產生最高的信心度&lt;/li&gt;
&lt;li&gt;一次測驗整體代碼&lt;/li&gt;
&lt;li&gt;AI 產固定測試腳本成熟穩定又高效&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;但真實環境實際要面對的考驗是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不清楚的規格：如果連系統的預期行為都不明朗，要如何測試？&lt;/li&gt;
&lt;li&gt;副作用：測試操作會影響測試環境&lt;/li&gt;
&lt;li&gt;測試環境：全面真實的環境建構緩慢&lt;/li&gt;
&lt;li&gt;不穩定：程式有更多理由改變而破壞測試&lt;/li&gt;
&lt;li&gt;⋯⋯&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;舉例來說一個簡單的刪除角色功能：「點刪除按鈕，角色消失」，背後可能代表什麼？&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;功能: 刪除角色

  場景: 正確刪除
    假如：已登入的管理員
    當：刪除角色
    那麼：角色正確刪除

  場景: 缺少參數
    假如：已登入的管理員
    當：刪除角色（缺少必要參數）
    那麼：提示參數錯誤

  場景: 沒有管理員權限
    假如：已登入的非管理員使用者
    當：刪除角色
    那麼：提示權限不足錯誤

  場景: 刪除自己
    假如：已登入的管理員
    當：刪除自己的角色
    那麼：提示不可刪除自己角色錯誤

  場景: 刪除不存在的角色
    假如：已登入的管理員
    當：刪除不存在角色
    那麼：提示角色不存在錯誤

  場景: 刪除主管理員
    假如：已登入的管理員
    當：刪除主管理員
    那麼：提示不可刪除主管理員錯誤
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;看似簡單的功能也能有多種前提、壞掉的方式、壞掉的地方，AI 不會理解你的商業邏輯應該如何運作，陳舊系統大多都沒有具體規格。&lt;/li&gt;
&lt;li&gt;6 個場景意味著一個功能就需要全面重啟整個服務 6 次，如果不想？那麼測試副作用將會不可避免的交叉影響造成虛假的信心和假警報。&lt;/li&gt;
&lt;li&gt;每個測試都是需要維護才能生效的資產，否則就是累贅，E2E 測試是最容易被破壞，且難以維護的測試形式。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;AI 解決了「產自動化測試腳本」的問題，但那只是其中一個瓶頸，要達成有效的測試更多是需要：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;理解產品運作，且能夠有序定義規格的能力&lt;/li&gt;
&lt;li&gt;能夠善用測試種類，用合適的方式與工具導入測試的能力（靜態測試、單元測試、元件測試、整合測試、E2E 測試、Mock Data、CI 反饋建構、架構分層⋯⋯）&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Testing</category></item><item><title>Textbook Like Real Bug Case Caused by a Weak Type Language</title><link>https://www.webdong.dev/en/shortpost/weak-type-issue/#weak-type-issue/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/weak-type-issue/#weak-type-issue/</guid><pubDate>Fri, 20 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;At work I ran into a textbook like problem caused by a weakly-typed language. The issue happened in an authorization check; the following looks fine, right?&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if (isAdmin) {
  // Do Things 
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But &lt;code&gt;isAdmin&lt;/code&gt; actually calls out to another service to verify permissions, so it&apos;s an &lt;code&gt;async&lt;/code&gt; function — meaning it really returns a &lt;code&gt;Promise&amp;lt;boolean&amp;gt;&lt;/code&gt;. If you use it directly in a condition it will unconditionally pass.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const isAdmin = async () =&amp;gt; {
  return false
}

if (isAdmin()) {
  // PASS
}

if (isAdmin) {
  // PASS
}

if (await isAdmin) {
  // PASS
}

if (await isAdmin()) {
  // NOT PASS
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Compared to some odd string/number addition issues, this case is highly representative and dangerous, so I&apos;m documenting it. If you ask for a solution, switching to TypeScript is still the best option.&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>教科书级别的弱类型语言真实问题案例</title><link>https://www.webdong.dev/zh-cn/shortpost/weak-type-issue/#weak-type-issue/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/weak-type-issue/#weak-type-issue/</guid><pubDate>Fri, 20 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在工作上遇到一个教科书等级的弱型别程式语言造成的问题，问题发生在一个权限验证的机制，以下看起来没问题对吧？&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if (isAdmin) {
// Do Things
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但 &lt;code&gt;isAdmin&lt;/code&gt; 实际上会访问其他服务确认权限，所以是一个 &lt;code&gt;async&lt;/code&gt; 函式，意味着它实际返回的是 &lt;code&gt;Promise&amp;lt;boolean&amp;gt;&lt;/code&gt; 的结果，如果直接拿来比对会无条件的通过。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const isAdmin = async () =&amp;gt; {
return false
}

if (isAdmin()) {
// PASS
}

if (isAdmin) {
// PASS
}

if (await isAdmin) {
// PASS
}

if (await isAdmin()) {
// NOT PASS
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;比起一些奇怪的字串数字相加，这个案例极具代表与威胁性，所以记录下来。真要说有什么解决方案还是换成 TypeScript 最好。&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>教科書等級的弱型別語言真實問題案例</title><link>https://www.webdong.dev/zh-tw/shortpost/weak-type-issue/#weak-type-issue/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/weak-type-issue/#weak-type-issue/</guid><pubDate>Fri, 20 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在工作上遇到一個教科書等級的弱型別程式語言造成的問題，問題發生在一個權限驗證的機制，以下看起來沒問題對吧？&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if (isAdmin) {
  // Do Things 
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但 &lt;code&gt;isAdmin&lt;/code&gt; 實際上會訪問其他服務確認權限，所以是一個 &lt;code&gt;async&lt;/code&gt; 函式，意味著它實際返回的是 &lt;code&gt;Promise&amp;lt;boolean&amp;gt;&lt;/code&gt; 的結果，如果直接拿來比對會無條件的通過。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const isAdmin = async () =&amp;gt; {
  return false
}

if (isAdmin()) {
  // PASS
}

if (isAdmin) {
  // PASS
}

if (await isAdmin) {
  // PASS
}

if (await isAdmin()) {
  // NOT PASS
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;比起一些奇怪的字串數字相加，這個案例極具代表與威脅性，所以記錄下來。真要說有什麼解決方案還是換成 TypeScript 最好。&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>Running Go TUI Programs in the Browser via WASM</title><link>https://www.webdong.dev/en/shortpost/go-game-in-browser/#go-game-in-browser/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/go-game-in-browser/#go-game-in-browser/</guid><pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Maybe due to the AI ​​trend, TUI (Terminal User Interface) has become very popular, and I was thinking about what fun Go projects I could try. I happened to come across &lt;a href=&quot;https://github.com/charmbracelet/bubbletea&quot;&gt;Bubble Tea&lt;/a&gt;, and I made a simple little game and easily had the AI ​​adapt it to run in a browser using WASM.&lt;/p&gt;
&lt;p&gt;The biggest problem is that Go programs rely on the operating system&apos;s terminal syscalls (such as window scaling and native mode switching), which browser environments do not support.&lt;/p&gt;
&lt;h3&gt;Solution:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;xterm.js&lt;/strong&gt;: Use xterm.js to emulate a terminal interface in the browser.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Std I/O redirection&lt;/strong&gt;: In &lt;code&gt;cmd/wasm/main.go&lt;/code&gt;, I intercepted Bubble Tea&apos;s I/O and had xterm.js write to and read from it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WASM Build Patch CD&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Wrote a &lt;code&gt;build-wasm.sh&lt;/code&gt; script&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;go mod vendor&lt;/code&gt; before compiling to create a temporary copy of dependencies&lt;/li&gt;
&lt;li&gt;Inject a &lt;code&gt;tea_js.go&lt;/code&gt; patch into the vendored code to provide dummy implementations that skip unsupported syscalls&lt;/li&gt;
&lt;li&gt;Delete the &lt;code&gt;vendor&lt;/code&gt; folder immediately after compilation&lt;/li&gt;
&lt;li&gt;Publish to GitHub Pages&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The game is called &lt;a href=&quot;https://riceball-tw.github.io/push-pull/&quot;&gt;Push Pull&lt;/a&gt;, and the implementation is on &lt;a href=&quot;https://github.com/riceball-tw/push-pull&quot;&gt;GitHub&lt;/a&gt;. It even works on mobile! The only caveat is that audio may be blocked by the browser.&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>在网页运行 GO TUI 程序通过 WASM</title><link>https://www.webdong.dev/zh-cn/shortpost/go-game-in-browser/#go-game-in-browser/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/go-game-in-browser/#go-game-in-browser/</guid><pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;近期大概是因为 AI 的风潮 TUI（Terminal User Interface）很热门，而我在琢磨 Go 有什么好玩的专案可以尝试，正巧碰上了：&lt;a href=&quot;https://github.com/charmbracelet/bubbletea&quot;&gt;Bubble Tea&lt;/a&gt;，顺便做了一个简单小游 戏，并轻松地请 AI 调整成能在浏览器上执行的 WASM。&lt;/p&gt;
&lt;p&gt;最大的问题在于 Go 程式中预设依赖作业系统的终端机 syscalls（如视窗缩放、原始模式切换），而浏览器环境并不支援这些。&lt;/p&gt;
&lt;h3&gt;解決方案：&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;xterm.js&lt;/strong&gt;: 使用 xterm.js 在浏览器中模拟终端机介面。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;標準輸入輸出重定向&lt;/strong&gt;: 在 &lt;code&gt;cmd/wasm/main.go&lt;/code&gt; 中，拦截了 Bubble Tea 的 I/O，改由 xterm.js 写入和读取。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WASM 補丁 (Build Patch) CD&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;撰写了一个 &lt;code&gt;build-wasm.sh&lt;/code&gt; 脚本&lt;/li&gt;
&lt;li&gt;在编译前，先执行 &lt;code&gt;go mod vendor&lt;/code&gt; 建立临时依赖副本&lt;/li&gt;
&lt;li&gt;注入一个 &lt;code&gt;tea_js.go&lt;/code&gt; 补丁到 vendored 代码中，提供 dummy 实现来跳过不支持的 系统调用&lt;/li&gt;
&lt;li&gt;编译完成后立即删除 &lt;code&gt;vendor&lt;/code&gt; 文件夹&lt;/li&gt;
&lt;li&gt;发布到 GitHub Pages&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;游戏叫做 &lt;a href=&quot;https://riceball-tw.github.io/push-pull/&quot;&gt;Push Pull&lt;/a&gt;，实现都放在 &lt;a href=&quot;https://github.com/riceball-tw/push-pull&quot;&gt;GitHub&lt;/a&gt; 上。连手机都能操作！就是音效可能会被浏览器挡掉而已。&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>在網頁執行 GO TUI 遊戲程式透過 WASM</title><link>https://www.webdong.dev/zh-tw/shortpost/go-game-in-browser/#go-game-in-browser/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/go-game-in-browser/#go-game-in-browser/</guid><pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;近期大概是因為 AI 的風潮 TUI（Terminal User Interface）很熱門，而我在琢磨 Go 有什麼好玩的專案可以嘗試，正巧碰上了：&lt;a href=&quot;https://github.com/charmbracelet/bubbletea&quot;&gt;Bubble Tea&lt;/a&gt;，順便做了一個簡單小遊戲，並輕鬆的請 AI 調整成能在瀏覽器上執行的 WASM。&lt;/p&gt;
&lt;p&gt;最大的問題在於 Go 程式中預設依賴作業系統的終端機 syscalls（如視窗縮放、原始模式切換），而瀏覽器環境並不支援這些。&lt;/p&gt;
&lt;h3&gt;解決方案：&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;xterm.js&lt;/strong&gt;: 使用 xterm.js 在瀏覽器中模擬終端機介面。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;標準輸入輸出重定向&lt;/strong&gt;: 在 &lt;code&gt;cmd/wasm/main.go&lt;/code&gt; 中，攔截了 Bubble Tea 的 I/O，改由 xterm.js 寫入和讀取。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WASM 補丁 (Build Patch) CD&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;撰寫了一個 &lt;code&gt;build-wasm.sh&lt;/code&gt; 腳本&lt;/li&gt;
&lt;li&gt;在編譯前，先執行 &lt;code&gt;go mod vendor&lt;/code&gt; 建立臨時依賴副本&lt;/li&gt;
&lt;li&gt;注入一個 &lt;code&gt;tea_js.go&lt;/code&gt; 補丁到 vendored 代碼中，提供 dummy 實作來跳過不支援的 syscalls&lt;/li&gt;
&lt;li&gt;編譯完成後立即刪除 &lt;code&gt;vendor&lt;/code&gt; 資料夾&lt;/li&gt;
&lt;li&gt;發佈到 GitHub Pages&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;遊戲叫做 &lt;a href=&quot;https://riceball-tw.github.io/push-pull/&quot;&gt;Push Pull&lt;/a&gt;，實踐都放在 &lt;a href=&quot;https://github.com/riceball-tw/push-pull&quot;&gt;GitHub&lt;/a&gt; 上。連手機都能操作！就是音效可能會被瀏覽器擋掉而已。&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>AI Agent Tools I&apos;m Using in 2026</title><link>https://www.webdong.dev/en/shortpost/ai-tool/#ai-tool/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/ai-tool/#ai-tool/</guid><pubDate>Wed, 11 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The value of software engineers is shifting. Typing code line by line has always been slow and error-prone, and now that&apos;s changing rapidly —— in 2026, I almost no longer write code by hand; most of the time I use natural language to instruct AI to handle coding tasks.&lt;/p&gt;
&lt;p&gt;Pick a tool that works for you and start solving problems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ready for practical use
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://antigravity.google/&quot;&gt;Antigravity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://opencode.ai/&quot;&gt;Opencode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.warp.dev/&quot;&gt;Warp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/overview&quot;&gt;Claude CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chatgpt.com/codex&quot;&gt;Codex&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://geminicli.com/&quot;&gt;Gemini CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cursor.com/agents&quot;&gt;Cursor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kiro.dev/cli/&quot;&gt;Kiro CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://junie.jetbrains.com/&quot;&gt;Junie CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kiro.dev/&quot;&gt;Kiro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/features/copilot/cli&quot;&gt;Copilot CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.visualstudio.com/docs/copilot/overview&quot;&gt;VSCode GitHub Copilot&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Haven&apos;t tried yet
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://zed.dev/&quot;&gt;Zed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/mistralai/mistral-vibe&quot;&gt;Mistral Vibe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.augmentcode.com/product/CLI&quot;&gt;augment code CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cursor.com/cli&quot;&gt;Cursor CLI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>2026 年我在用的 AI Agent 工具</title><link>https://www.webdong.dev/zh-cn/shortpost/ai-tool/#ai-tool/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/ai-tool/#ai-tool/</guid><pubDate>Wed, 11 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;软件工程师的价值正在转移。逐行敲 code 本来就是一件缓慢且容易出错的事，而如今这件事已经在飞快地改变 —— 2026 年，我几乎不再手动撰写代码，大多数时候都在通过自然语言指挥 AI 来处理代码实践。&lt;/p&gt;
&lt;p&gt;挑一个顺手的工具开始解决问题吧：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;实战可用
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://antigravity.google/&quot;&gt;Antigravity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://opencode.ai/&quot;&gt;Opencode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.warp.dev/&quot;&gt;Warp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/overview&quot;&gt;Claude CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chatgpt.com/codex&quot;&gt;Codex&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://geminicli.com/&quot;&gt;Gemini CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cursor.com/agents&quot;&gt;Cursor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kiro.dev/cli/&quot;&gt;Kiro CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://junie.jetbrains.com/&quot;&gt;Junie CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kiro.dev/&quot;&gt;Kiro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/features/copilot/cli&quot;&gt;Copilot CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.visualstudio.com/docs/copilot/overview&quot;&gt;VSCode GitHub Copilot&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;观望
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://zed.dev/&quot;&gt;Zed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/mistralai/mistral-vibe&quot;&gt;Mistral Vibe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.augmentcode.com/product/CLI&quot;&gt;augment code CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cursor.com/cli&quot;&gt;Cursor CLI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>2026 我在用的 AI Agent 工具</title><link>https://www.webdong.dev/zh-tw/shortpost/ai-tool/#ai-tool/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/ai-tool/#ai-tool/</guid><pubDate>Wed, 11 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;軟體工程師的價值正在轉移。逐行敲 code 本來就是一件緩慢且容易出錯的事，而如今這件事已經在飛快地改變 —— 2026 年，我近乎不再手動撰寫代碼，大多數時候都在透過自然語言指揮 AI 來處理代碼實踐。&lt;/p&gt;
&lt;p&gt;挑一個順手的工具開始解決問題吧：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;實戰可用
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://antigravity.google/&quot;&gt;Antigravity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://opencode.ai/&quot;&gt;Opencode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.warp.dev/&quot;&gt;Warp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/en/overview&quot;&gt;Claude CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chatgpt.com/codex&quot;&gt;Codex&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://geminicli.com/&quot;&gt;Gemini CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cursor.com/agents&quot;&gt;Cursor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kiro.dev/cli/&quot;&gt;Kiro CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://junie.jetbrains.com/&quot;&gt;Junie CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kiro.dev/&quot;&gt;Kiro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/features/copilot/cli&quot;&gt;Copilot CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.visualstudio.com/docs/copilot/overview&quot;&gt;VSCode GitHub Copilot&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;觀望
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://zed.dev/&quot;&gt;Zed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/mistralai/mistral-vibe&quot;&gt;Mistral Vibe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.augmentcode.com/product/CLI&quot;&gt;augment code CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cursor.com/cli&quot;&gt;Cursor CLI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>i18n implementations must account for different word-order logic across languages</title><link>https://www.webdong.dev/en/shortpost/i18n-word-order/#i18n-word-order/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/i18n-word-order/#i18n-word-order/</guid><pubDate>Wed, 18 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I recently refreshed my self-made personal website template: &lt;a href=&quot;https://github.com/riceball-tw/letter&quot;&gt;Letter&lt;/a&gt;, and something that caught my attention was the following snippet:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{t(&apos;Hero-1&apos;, { name: t(&apos;Me-1&apos;) })}&amp;lt;br /&amp;gt;
{t(&apos;Hero-2&apos;, { number: &apos;100&apos; })} &amp;lt;a class=&quot;highlight&quot; href={`https://www.webdong.dev/${Astro.currentLocale}/post/`}&amp;gt;{t(&apos;Hero-3&apos;)}&amp;lt;/a&amp;gt; {t(&apos;Hero-4&apos;)} {t(&apos;Hero-5&apos;, {number: &apos;800&apos;})}
{t(&apos;Hero-6&apos;)} &amp;lt;a class=&quot;highlight&quot; href={getRelativeLocaleUrl(Astro.currentLocale || defaultLocale, &apos;/work&apos;)}&amp;gt;{t(&apos;Hero-7&apos;)}&amp;lt;/a
&amp;gt; {t(&apos;Hero-8&apos;)}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&quot;Hero-1&quot;: &quot;哈囉，我是{name}&quot;,
&quot;Hero-2&quot;: &quot;我撰寫超過 {number} 篇&quot;,
&quot;Hero-3&quot;: &quot;技術文章&quot;,
&quot;Hero-4&quot;: &quot;紀錄與傳達知識&quot;,
&quot;Hero-5&quot;: &quot;幫助 {number} 位以上開發者消除他們的疑惑。&quot;,
&quot;Hero-6&quot;: &quot;可以觀賞&quot;,
&quot;Hero-7&quot;: &quot;作品集&quot;,
&quot;Hero-8&quot;: &quot;了解我是如何解決真實世界問題的。&quot;,
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It&apos;s a bit ugly and just thinking about replacing it is a headache — especially for languages with significantly different word order where it simply won&apos;t work. So it&apos;s better to write it like this, splitting by &quot;concepts rather than word order or styling&quot;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;Fragment set:html={t(&apos;Hero-2&apos;, { 
      articles: &apos;100&apos;,
      articlesLink: `&amp;lt;a class=&quot;highlight&quot; href=&quot;https://www.webdong.dev/${Astro.currentLocale}/post/&quot;&amp;gt;${t(&apos;Hero-ArticlesLink&apos;)}&amp;lt;/a&amp;gt;`,
      developers: &apos;800&apos;
    })} /&amp;gt;
&amp;lt;Fragment set:html={t(&apos;Hero-3&apos;, {
  portfolioLink: `&amp;lt;a class=&quot;highlight&quot; href=&quot;${getRelativeLocaleUrl(Astro.currentLocale || defaultLocale, &apos;/work&apos;)}&quot;&amp;gt;${t(&apos;Hero-PortfolioLink&apos;)}&amp;lt;/a&amp;gt;`
})} /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&quot;Hero-2&quot;: &quot;我撰寫超過 {articles} 篇{articlesLink}紀錄與傳達知識，幫助 {developers} 位以上開發者消除他們的疑惑。&quot;,
&quot;Hero-3&quot;: &quot;可以觀賞{portfolioLink}了解我是如何解決真實世界問題的。&quot;,
&quot;Hero-ArticlesLink&quot;: &quot;技術文章&quot;,
&quot;Hero-PortfolioLink&quot;: &quot;作品集&quot;,
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;At the time I probably did this to keep the translation files pure, avoiding mixing in styles or markup structure, and to avoid potential &lt;a href=&quot;https://www.webdong.dev/zh-tw/post/xss-for-web-developer/&quot;&gt;XSS&lt;/a&gt; issues. However, most of the time writing the markup directly into the translations is easier... besides, I can compose it from the outside using parameters.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;t&lt;/code&gt; is a homemade i18n translation utility; most i18n libraries should have a similar placeholder mechanism for handling translations.&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>i18n 实作必须留意不同语言语序与逻辑的差异</title><link>https://www.webdong.dev/zh-cn/shortpost/i18n-word-order/#i18n-word-order/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/i18n-word-order/#i18n-word-order/</guid><pubDate>Wed, 18 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;近期翻新了一下我自制的个人网站模板：&lt;a href=&quot;https://github.com/riceball-tw/letter&quot;&gt;Letter&lt;/a&gt;，看到让我有点在意的地方是下面这段：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{t(&apos;Hero-1&apos;, { name: t(&apos;Me-1&apos;) })}&amp;lt;br /&amp;gt;
{t(&apos;Hero-2&apos;, { number: &apos;100&apos; })} &amp;lt;a class=&quot;highlight&quot; href={`https://www.webdong.dev/${Astro.currentLocale}/post/`}&amp;gt;{t(&apos;Hero-3&apos;)}&amp;lt;/a&amp;gt; {t(&apos;Hero-4&apos;)} {t(&apos;Hero-5&apos;, {number: &apos;800&apos;})}
{t(&apos;Hero-6&apos;)} &amp;lt;a class=&quot;highlight&quot; href={getRelativeLocaleUrl(Astro.currentLocale || defaultLocale, &apos;/work&apos;)}&amp;gt;{t(&apos;Hero-7&apos;)}&amp;lt;/a
&amp;gt; {t(&apos;Hero-8&apos;)}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&quot;Hero-1&quot;: &quot;哈啰，我是{name}&quot;,
&quot;Hero-2&quot;: &quot;我撰写超过 {number} 篇&quot;,
&quot;Hero-3&quot;: &quot;技术文章&quot;,
&quot;Hero-4&quot;: &quot;纪录与传达知识&quot;,
&quot;Hero-5&quot;: &quot;帮助 {number} 位以上开发者消除他们的疑惑。&quot;,
&quot;Hero-6&quot;: &quot;可以观赏&quot;,
&quot;Hero-7&quot;: &quot;作品集&quot;,
&quot;Hero-8&quot;: &quot;了解我是如何解决真实世界问题的。&quot;,
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;真的有点丑且光是想到要替换就很头痛，特别是换个语序差别大一点的语言根本没办法运作，所以最好这样写，根据「概念而非语序或样式去拆分」：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;Fragment set:html={t(&apos;Hero-2&apos;, {
articles: &apos;100&apos;,
articlesLink: `&amp;lt;a class=&quot;highlight&quot; href=&quot;https://www.webdong.dev/${Astro.currentLocale}/post/&quot;&amp;gt;${t(&apos;Hero-ArticlesLink&apos;)}&amp;lt;/a&amp;gt;`,
developers: &apos;800&apos;
})} /&amp;gt;
&amp;lt;Fragment set:html={t(&apos;Hero-3&apos;, {
portfolioLink: `&amp;lt;a class=&quot;highlight&quot; href=&quot;${getRelativeLocaleUrl(Astro.currentLocale || defaultLocale, &apos;/work&apos;)}&quot;&amp;gt;${t(&apos;Hero-PortfolioLink&apos;)}&amp;lt;/a&amp;gt;`
})} /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&quot;Hero-2&quot;: &quot;我撰写超过 {articles} 篇{articlesLink}纪录与传达知识，帮助 {developers} 位以上开发者消除他们的疑惑。&quot;,
&quot;Hero-3&quot;: &quot;可以观赏{portfolioLink}了解我是如何解决真实世界问题的。&quot;,
&quot;Hero-ArticlesLink&quot;: &quot;技术文章&quot;,
&quot;Hero-PortfolioLink&quot;: &quot;作品集&quot;,
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当时这么做应该是想要保持翻译文件单纯，不要又掺杂样式或 Markup 结构，还可能会有 &lt;a href=&quot;https://www.webdong.dev/zh-tw/post/xss-for-web-developer/&quot;&gt;XSS&lt;/a&gt; 的麻烦问题，不过事后权衡下来大多时候直接写进翻译内是更省事⋯⋯更何况我可以直接用参数的方式在外面组合进去。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;t&lt;/code&gt; 是自制的 i18n 翻译工具，应该大多 i18n 套件都有类似 placeholder 的方式去处理翻译。&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>i18n 實作必須要留意不同語言語序邏輯不同</title><link>https://www.webdong.dev/zh-tw/shortpost/i18n-word-order/#i18n-word-order/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/i18n-word-order/#i18n-word-order/</guid><pubDate>Wed, 18 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;近期翻新了一下我自製的個人網站模板：&lt;a href=&quot;https://github.com/riceball-tw/letter&quot;&gt;Letter&lt;/a&gt;，看到讓我有點在意的地方是下面這段：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{t(&apos;Hero-1&apos;, { name: t(&apos;Me-1&apos;) })}&amp;lt;br /&amp;gt;
{t(&apos;Hero-2&apos;, { number: &apos;100&apos; })} &amp;lt;a class=&quot;highlight&quot; href={`https://www.webdong.dev/${Astro.currentLocale}/post/`}&amp;gt;{t(&apos;Hero-3&apos;)}&amp;lt;/a&amp;gt; {t(&apos;Hero-4&apos;)} {t(&apos;Hero-5&apos;, {number: &apos;800&apos;})}
{t(&apos;Hero-6&apos;)} &amp;lt;a class=&quot;highlight&quot; href={getRelativeLocaleUrl(Astro.currentLocale || defaultLocale, &apos;/work&apos;)}&amp;gt;{t(&apos;Hero-7&apos;)}&amp;lt;/a
&amp;gt; {t(&apos;Hero-8&apos;)}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&quot;Hero-1&quot;: &quot;哈囉，我是{name}&quot;,
&quot;Hero-2&quot;: &quot;我撰寫超過 {number} 篇&quot;,
&quot;Hero-3&quot;: &quot;技術文章&quot;,
&quot;Hero-4&quot;: &quot;紀錄與傳達知識&quot;,
&quot;Hero-5&quot;: &quot;幫助 {number} 位以上開發者消除他們的疑惑。&quot;,
&quot;Hero-6&quot;: &quot;可以觀賞&quot;,
&quot;Hero-7&quot;: &quot;作品集&quot;,
&quot;Hero-8&quot;: &quot;了解我是如何解決真實世界問題的。&quot;,
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;真的有點醜且光是想到要替換就很頭痛，特別是換個語序差別大一點的語言根本沒辦法運作，所以最好這樣寫，根據「概念而非語序或樣式去拆分」：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;Fragment set:html={t(&apos;Hero-2&apos;, { 
      articles: &apos;100&apos;,
      articlesLink: `&amp;lt;a class=&quot;highlight&quot; href=&quot;https://www.webdong.dev/${Astro.currentLocale}/post/&quot;&amp;gt;${t(&apos;Hero-ArticlesLink&apos;)}&amp;lt;/a&amp;gt;`,
      developers: &apos;800&apos;
    })} /&amp;gt;
&amp;lt;Fragment set:html={t(&apos;Hero-3&apos;, {
  portfolioLink: `&amp;lt;a class=&quot;highlight&quot; href=&quot;${getRelativeLocaleUrl(Astro.currentLocale || defaultLocale, &apos;/work&apos;)}&quot;&amp;gt;${t(&apos;Hero-PortfolioLink&apos;)}&amp;lt;/a&amp;gt;`
})} /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&quot;Hero-2&quot;: &quot;我撰寫超過 {articles} 篇{articlesLink}紀錄與傳達知識，幫助 {developers} 位以上開發者消除他們的疑惑。&quot;,
&quot;Hero-3&quot;: &quot;可以觀賞{portfolioLink}了解我是如何解決真實世界問題的。&quot;,
&quot;Hero-ArticlesLink&quot;: &quot;技術文章&quot;,
&quot;Hero-PortfolioLink&quot;: &quot;作品集&quot;,
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;當時這麼做應該是想要保持翻譯文件單純，不要又摻雜樣式或 Markup 結構，還可能會有 &lt;a href=&quot;https://www.webdong.dev/zh-tw/post/xss-for-web-developer/&quot;&gt;XSS&lt;/a&gt; 的麻煩問題，不過事後權衡下來大多時候直接寫進翻譯內是更省事⋯⋯更何況我可以直接用參數的方式在外面組合進去。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;t&lt;/code&gt; 是自製的 i18n 翻譯工具，應該大多 i18n 套件都有類似 placeholder 的方式去處理翻譯。&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>Deploy Opencode Server to Serve Multiple Clients</title><link>https://www.webdong.dev/en/shortpost/opencode-server/#opencode-server/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/opencode-server/#opencode-server/</guid><pubDate>Tue, 10 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Previously I mentioned that &lt;a href=&quot;/zh-tw/shortpost/opencode&quot;&gt;Opencode&lt;/a&gt; can actually be separated into Server and Client components. That means the &lt;a href=&quot;https://opencode.ai/docs/server/&quot;&gt;Opencode Server&lt;/a&gt; can be deployed independently for other Opencode Clients to use. For example, a machine within a company can run local models or call APIs:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;opencode serve --hostname 0.0.0.0 --port 4096 --mdns --mdns-domain opencode.local

# Ollama 與 opencode 有深度整合，設置模型很方便
# https://docs.ollama.com/integrations/opencode
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Any client on the intranet can connect to &lt;code&gt;http://opencode.local:4096&lt;/code&gt; to operate, whether it&apos;s a browser, TUI, or an app: https://opencode.ai/zht/download&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# In another terminal, attach the TUI to the running backend
opencode attach http://opencode.local:4096
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Right now the server can host and serve its own models; per-client management isn&apos;t available yet. There is an existing service called &lt;a href=&quot;https://opencode.ai/docs/zen/&quot;&gt;Zen&lt;/a&gt; you can check out, or &lt;a href=&quot;https://github.com/BerriAI/litellm&quot;&gt;LiteLLM&lt;/a&gt;.&lt;/p&gt;
</content:encoded><category>Share</category></item><item><title>部署 Opencode Server 为多个客户端提供服务</title><link>https://www.webdong.dev/zh-cn/shortpost/opencode-server/#opencode-server/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/opencode-server/#opencode-server/</guid><pubDate>Tue, 10 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;先前提到 &lt;a href=&quot;/zh-tw/shortpost/opencode&quot;&gt;Opencode&lt;/a&gt; 其實可以被分為 Server 與 Client 兩個部分，也就是說 &lt;a href=&quot;https://opencode.ai/docs/server/&quot;&gt;Opencode Server&lt;/a&gt; 可以被單獨部署供其他 Opencode Client 使用，舉例公司內有一台機器用來跑本地模型或串 API：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;opencode serve --hostname 0.0.0.0 --port 4096 --mdns --mdns-domain opencode.local

# Ollama 與 opencode 有深度整合，設置模型很方便
# https://docs.ollama.com/integrations/opencode
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在內網任何 Client 就可以連上 &lt;code&gt;http://opencode.local:4096&lt;/code&gt; 進行操作，&lt;a href=&quot;https://opencode.ai/zht/download&quot;&gt;不管是瀏覽器、TUI還是 App&lt;/a&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# In another terminal, attach the TUI to the running backend
opencode attach http://opencode.local:4096
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;目前可以主持使用自己的模型，至於個別 Client 管理還沒這個功能，它們是有一個現成服務 &lt;a href=&quot;https://opencode.ai/docs/zen/&quot;&gt;Zen&lt;/a&gt; 可以參考看看，或是 &lt;a href=&quot;https://github.com/BerriAI/litellm&quot;&gt;LiteLLM&lt;/a&gt;。&lt;/p&gt;
</content:encoded><category>Share</category></item><item><title>部署 Opencode Server 服務多個 Client</title><link>https://www.webdong.dev/zh-tw/shortpost/opencode-server/#opencode-server/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/opencode-server/#opencode-server/</guid><pubDate>Tue, 10 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;先前提到 &lt;a href=&quot;/zh-tw/shortpost/opencode&quot;&gt;Opencode&lt;/a&gt; 其實可以被分為 Server 與 Client 兩個部分，也就是說 &lt;a href=&quot;https://opencode.ai/docs/server/&quot;&gt;Opencode Server&lt;/a&gt; 可以被單獨部署供其他 Opencode Client 使用，舉例公司內有一台機器用來跑本地模型或串 API：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;opencode serve --hostname 0.0.0.0 --port 4096 --mdns --mdns-domain opencode.local

# Ollama 與 opencode 有深度整合，設置模型很方便
# https://docs.ollama.com/integrations/opencode
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在內網任何 Client 就可以連上 &lt;code&gt;http://opencode.local:4096&lt;/code&gt; 進行操作，&lt;a href=&quot;https://opencode.ai/zht/download&quot;&gt;不管是瀏覽器、TUI還是 App&lt;/a&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# In another terminal, attach the TUI to the running backend
opencode attach http://opencode.local:4096
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;目前可以主持使用自己的模型，至於個別 Client 管理還沒這個功能，它們是有一個現成服務 &lt;a href=&quot;https://opencode.ai/docs/zen/&quot;&gt;Zen&lt;/a&gt; 可以參考看看，或是 &lt;a href=&quot;https://github.com/BerriAI/litellm&quot;&gt;LiteLLM&lt;/a&gt;。&lt;/p&gt;
</content:encoded><category>Share</category></item><item><title>Common _id ObjectId Issues You Will Encounter When Using MongoDB</title><link>https://www.webdong.dev/en/shortpost/mongodb-objectid/#mongodb-objectid/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/mongodb-objectid/#mongodb-objectid/</guid><pubDate>Sat, 24 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In &lt;a href=&quot;https://www.mongodb.com/&quot;&gt;MongoDB&lt;/a&gt;, every document has an &lt;code&gt;_id&lt;/code&gt; field that serves as the &lt;a href=&quot;https://www.mongodb.com/docs/manual/reference/glossary/#std-term-primary-key&quot;&gt;primary key&lt;/a&gt;. If it is not explicitly assigned, MongoDB will automatically generate one. In practice, I’ve run into several questions related to this design:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Does &lt;code&gt;_id&lt;/code&gt; expose sensitive information?&lt;/li&gt;
&lt;li&gt;Can we create our own custom IDs?&lt;/li&gt;
&lt;li&gt;Why is the &lt;code&gt;_id&lt;/code&gt; data type an &lt;a href=&quot;https://www.mongodb.com/docs/manual/reference/bson-types/#std-label-objectid&quot;&gt;ObjectId&lt;/a&gt; instead of a string or a number? What’s the reason for this special design?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;According to the official &lt;a href=&quot;https://www.mongodb.com/docs/manual/reference/bson-types/#std-label-objectid&quot;&gt;ObjectId&lt;/a&gt; documentation, an ObjectId is a 12-byte value composed of the following parts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A 4-byte timestamp, representing the ObjectId’s creation time, measured in seconds since the Unix epoch.&lt;/li&gt;
&lt;li&gt;A 5-byte random value, generated once per client process. This value is unique to the machine and process. It is regenerated if the process restarts or if the primary node changes.&lt;/li&gt;
&lt;li&gt;A 3-byte incrementing counter, initialized to a random value for each client process. The counter resets when the process restarts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The design goals of ObjectId are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Guaranteed uniqueness&lt;/strong&gt;: Ensures uniqueness across different services and machines.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Embedded timestamp&lt;/strong&gt;: Records the document’s creation time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Efficiency&lt;/strong&gt;: Designed for distributed systems, allowing IDs to be generated without coordinating with other services.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Back to the original questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Does it contain sensitive information?&lt;/strong&gt;
ObjectId does include the document’s creation time. In certain business scenarios, this may be considered sensitive, and it can also be sampled to roughly estimate data volume.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Can &lt;code&gt;_id&lt;/code&gt; be customized?&lt;/strong&gt;
Yes. However, a common practice is to let &lt;code&gt;_id&lt;/code&gt; handle technical uniqueness, while introducing a separate field for semantic meaning.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  _id: ObjectId(&quot;...&quot;),
  userId: &quot;u_123456&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;What are the advantages of ObjectId?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Globally unique and can be generated on the client side without requesting from the database, making it ideal for distributed environments.&lt;/li&gt;
&lt;li&gt;Enforced by MongoDB as the document’s primary key, with a unique index created automatically.&lt;/li&gt;
&lt;li&gt;Compact in size and sortable (due to the embedded timestamp), making it more friendly for indexing and storage efficiency.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Database</category></item><item><title>操作 MongoDB 一定会遇到的 _id ObjectId 问题</title><link>https://www.webdong.dev/zh-cn/shortpost/mongodb-objectid/#mongodb-objectid/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/mongodb-objectid/#mongodb-objectid/</guid><pubDate>Sat, 24 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在 &lt;a href=&quot;https://www.mongodb.com/&quot;&gt;MongoDB&lt;/a&gt; 任何文件都会有个 &lt;code&gt;_id&lt;/code&gt; 字段作为 &lt;a href=&quot;https://www.mongodb.com/docs/manual/reference/glossary/#std-term-primary-key&quot;&gt;primary key&lt;/a&gt;，如果未指派 Mongo 会自动产生。而工作上就遇过几个与其相关的问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;_id&lt;/code&gt; 查询会暴露敏感信息吗？&lt;/li&gt;
&lt;li&gt;能否自定义 id？&lt;/li&gt;
&lt;li&gt;&lt;code&gt;_id&lt;/code&gt; 的数据类型是 &lt;a href=&quot;https://www.mongodb.com/docs/manual/reference/bson-types/#std-label-objectid&quot;&gt;ObjectId&lt;/a&gt;而不是字符串或数字，为什么要特别设计这个东西？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;根据 &lt;a href=&quot;https://www.mongodb.com/docs/manual/reference/bson-types/#std-label-objectid&quot;&gt;ObjectId&lt;/a&gt; 官方文档描述，ObjectId 数值是 12 bytes 的数据，组成如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个 4 bytes 的时间戳，表示 ObjectId 的创建时间，以自 Unix 纪元以来的秒数计算。&lt;/li&gt;
&lt;li&gt;一个 5 bytes 的随机值，每个客户端进程产生一次。该随机值对于机器和进程都是唯一的。如果进程重启或进程的主节点发生变化，则该值会被重新生成。&lt;/li&gt;
&lt;li&gt;一个 3 bytes 的递增计数器，每个客户端进程初始值为一个随机值。当进程重新启动时，计数器会重置。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ObjectId 的目的为：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;保证唯一性&lt;/strong&gt;：确保不同服务或机器上唯一&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;包含时间戳&lt;/strong&gt;：记录文档创建时间&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;效率&lt;/strong&gt;：为分布式系统设计，生成时无需考虑其他服务&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;回到一开始的问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;是否包含敏感信息&lt;/strong&gt;：ObjectId 的确包含数据的创建时间，在某些商业情境下可能涉及隐私，且能抽样推估大致数据量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;是否可以自定义 &lt;code&gt;_id&lt;/code&gt;&lt;/strong&gt;：可以，但通常让 &lt;code&gt;_id&lt;/code&gt; 负责技术上的唯一性，而语义上额外创建字段。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;{
  _id: ObjectId(&quot;...&quot;),
  userId: &quot;u_123456&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ObjectId 有什么优势？&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;全局唯一且可由客户端自动生成，不需向数据库请求序号，适合分布式环境。&lt;/li&gt;
&lt;li&gt;MongoDB 强制作为文档的 primary key，并自动建立 unique index。&lt;/li&gt;
&lt;li&gt;体积小且可排序（包含时间信息），对 index 与存储空间更友好。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Database</category></item><item><title>操作 MongoDB 一定會遇到的 _id ObjectId 問題</title><link>https://www.webdong.dev/zh-tw/shortpost/mongodb-objectid/#mongodb-objectid/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/mongodb-objectid/#mongodb-objectid/</guid><pubDate>Sat, 24 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在 &lt;a href=&quot;https://www.mongodb.com/&quot;&gt;MongoDB&lt;/a&gt; 任何文件都會有個 &lt;code&gt;_id&lt;/code&gt; 欄位作為 &lt;a href=&quot;https://www.mongodb.com/docs/manual/reference/glossary/#std-term-primary-key&quot;&gt;primary key&lt;/a&gt;，如果未指派 Mongo 會自動產生。而工作上就遇過幾個問題與其相關：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;是不是使用 &lt;code&gt;_id&lt;/code&gt; 查詢會暴露敏感資訊？&lt;/li&gt;
&lt;li&gt;能不能自創 id？&lt;/li&gt;
&lt;li&gt;&lt;code&gt;_id&lt;/code&gt; 的資料型別是 &lt;a href=&quot;https://www.mongodb.com/docs/manual/reference/bson-types/#std-label-objectid&quot;&gt;ObjectId&lt;/a&gt;而非字串或數字，為啥要特別設計這個東西？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;根據 &lt;a href=&quot;https://www.mongodb.com/docs/manual/reference/bson-types/#std-label-objectid&quot;&gt;ObjectId&lt;/a&gt; 官方文件描述，ObjectId 數值是 12 bytes 的資料如下組成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一個 4 bytes 的時間戳，表示 ObjectId 的建立時間，以自 Unix 紀元以來的秒數計算。&lt;/li&gt;
&lt;li&gt;一個 5 bytes 的隨機值，每個客戶端進程產生一次。該隨機值對於機器和進程都是唯一的。如果進程重啟或進程的主節點發生變化，則該值會被重新產生。&lt;/li&gt;
&lt;li&gt;一個 3 bytes 的遞增計數器，每個客戶端進程初始值為一個隨機值。當進程重新啟動時，計數器會重置。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ObjectId 目的為：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;保證獨特性&lt;/strong&gt;：確保不同服務或機器上獨特&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;包含時間戳&lt;/strong&gt;：紀錄文件創建時間&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;效率&lt;/strong&gt;：為分散式系統設計，生成時無須考慮其他服務&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;回到一開始的問題：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;是否包含敏感資訊&lt;/strong&gt;：ObjectId 的確包含資料的創建時間，在某些商業情境下可能是隱私，且能抽樣推估大致資料量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;是否可以自訂 &lt;code&gt;_id&lt;/code&gt;&lt;/strong&gt;：可以，但通常讓 &lt;code&gt;_id&lt;/code&gt; 負責技術上的唯一，而語意上額外創建欄位。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;{
  _id: ObjectId(&quot;...&quot;),
  userId: &quot;u_123456&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ObjectId 有什麼優勢？&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;全域唯一且可由 Client 端自動生成，不需向資料庫請求序號，適合分散式環境。&lt;/li&gt;
&lt;li&gt;MongoDB 強制作為文件的 primary key，並自動建立 unique index。&lt;/li&gt;
&lt;li&gt;體積小且可排序（內含時間資訊），對 index 與儲存空間更友善。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Database</category></item><item><title>How to Clean a Macbook</title><link>https://www.webdong.dev/en/shortpost/clean-macbook/#clean-macbook/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/clean-macbook/#clean-macbook/</guid><pubDate>Sun, 11 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Previously, cleaning the computer was done with paper towels and a bit of water or alcohol. However, it is said that some coatings on the Macbook screen should not be cleaned so roughly. Since it is a tool for making money, it is better to handle it with caution.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Turn off the power&lt;/li&gt;
&lt;li&gt;Purchase specialized tools (you can buy LCD screen cleaning wet wipes for 49 TWD at Daiso, and it&apos;s best to get a blow dryer, similar to camera maintenance)&lt;/li&gt;
&lt;li&gt;Press Control + Command on the left and Shift on the right for 7 seconds, then press the power button for 7 seconds&lt;/li&gt;
&lt;li&gt;Cleanup&lt;/li&gt;
&lt;li&gt;Press the power button to turn on the device&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><category>Share</category></item><item><title>如何清洁 Macbook</title><link>https://www.webdong.dev/zh-cn/shortpost/clean-macbook/#clean-macbook/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/clean-macbook/#clean-macbook/</guid><pubDate>Sun, 11 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;先前清洁电脑都是纸巾加点水或酒精擦拭，不过 Macbook 屏幕听说有些镀膜最好不要这么粗暴的清洁，加上它是生财工具还是谨慎一点处理。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;关机断电&lt;/li&gt;
&lt;li&gt;购买专门器具（大创 49 元就能买到液晶屏幕擦拭专用湿纸巾，最好再买个吹气瓶，和相机保养差不多）&lt;/li&gt;
&lt;li&gt;左侧 Control + Command 与右侧 Shift 按下 7 秒，接着按电源 7 秒&lt;/li&gt;
&lt;li&gt;保养&lt;/li&gt;
&lt;li&gt;按下电源键开机&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><category>Share</category></item><item><title>如何清潔 Macbook</title><link>https://www.webdong.dev/zh-tw/shortpost/clean-macbook/#clean-macbook/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/clean-macbook/#clean-macbook/</guid><pubDate>Sun, 11 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;先前清潔電腦都是紙巾加點水或酒精擦拭，不過 Macbook 螢幕聽說有些鍍膜最好不要這麼粗暴的清潔，加上它是生財工具還是謹慎一點處理。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;關機斷電&lt;/li&gt;
&lt;li&gt;購買專門器具（大創 49 元就能買到液晶螢幕擦拭專用濕紙巾，最好再買個吹氣瓶，和相機保養差不多）&lt;/li&gt;
&lt;li&gt;左側 Control + Command 與右側 Shift 按下 7 秒，接著按電源 7 秒&lt;/li&gt;
&lt;li&gt;保養&lt;/li&gt;
&lt;li&gt;按下電源鍵開機&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><category>Share</category></item><item><title>Why I No Longer Update My Social Media</title><link>https://www.webdong.dev/en/shortpost/me-and-social-media/#me-and-social-media/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/me-and-social-media/#me-and-social-media/</guid><pubDate>Sun, 07 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I used to post my articles on Threads, but at some point, I suddenly lost all motivation to post anything. Looking back, I think there were a few reasons for that:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I’ve already found a stable job. (Some people do appreciate running a tech-sharing community, and I did use that as a selling point for myself back then. But now, I don’t really need to “market” myself anymore)&lt;/li&gt;
&lt;li&gt;I’m tired of playing the social media game. (Who gets to see your content and who interacts with you is decided by the platform, and the platform only cares about its own interests)&lt;/li&gt;
&lt;li&gt;There’s very little meaningful conversation. (Platforms love controversy and drama, so it’s hard to expect thoughtful or valuable discussions there)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For me, social media just isn’t a good place for thinking things through or having real discussions. The purpose of this blog is simply to keep me writing, so I can think more clearly. It also helps me spend less time worrying about things that don’t really matter—like “growing” a social media.&lt;/p&gt;
&lt;p&gt;What I really want is more meaningful exchanges of ideas, and social media just isn’t the right place for that.&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>为什么我不再更新社群</title><link>https://www.webdong.dev/zh-cn/shortpost/me-and-social-media/#me-and-social-media/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/me-and-social-media/#me-and-social-media/</guid><pubDate>Sun, 07 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;之前写的文章都会发到 Thread 上，不过突然于某天过后就没有任何发文动机了，现在回头思考自己为什么会有这样的决定：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;已经找到一份稳定的工作（不乏有人会欣赏经营技术分享社群这件事，当时也将这件事当作特点推销自己，总之现在我没有需要去包装自己）。&lt;/li&gt;
&lt;li&gt;懒得玩社群平台的游戏（谁能看见你、谁要与你互动取决于平台，而平台只为它的利益负责）。&lt;/li&gt;
&lt;li&gt;极少有意义的交流（平台喜欢见血的争议，在上面很难指望有价值的交流）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;对我来说社交媒体不适合作为思考讨论的媒介，而这个博客目前存在的意义就是让我保持写作输出来理清想法的地方，我可以少花点时间去烦恼本末倒置的问题，像是经营社群。&lt;/p&gt;
&lt;p&gt;我会期望更多有意义的想法交流，社群媒体不是合适的场合。&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>為什麼我不再更新社群</title><link>https://www.webdong.dev/zh-tw/shortpost/me-and-social-media/#me-and-social-media/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/me-and-social-media/#me-and-social-media/</guid><pubDate>Sun, 07 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;之前寫的文章都會發到 Thread 上，不過突然於某天過後就沒有任何發文動機了，現在回頭思考自己為什麼會有這樣的決定：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;已經找到一份穩定的工作（不乏有人會欣賞經營技術分享社群這件事，當時也將這件事當作特點推銷自己，總之現在我沒有需要去包裝自己）。&lt;/li&gt;
&lt;li&gt;懶得玩社群平台的遊戲（誰能看見你、誰要與你互動取決於平台，而平台只為它的利益負責）。&lt;/li&gt;
&lt;li&gt;極少有意義的交流（平台喜歡見血的爭議，在上面很難指望有價值的交流）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;對我來說社交媒體不適合作為思考討論的媒介，而這個部落格目前存在的意義就是讓我保持寫作輸出來釐清想法的地方，我可以少花點時間去煩惱本末倒置的問題，像是經營社群。&lt;/p&gt;
&lt;p&gt;我會期望更多有意義的想法交流，社群媒體不是合適的場合。&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>Opencode: A Command-Line Tool That Connects All AI</title><link>https://www.webdong.dev/en/shortpost/opencode/#opencode/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/opencode/#opencode/</guid><pubDate>Sun, 09 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Compared to &lt;a href=&quot;https://cursor.com/&quot;&gt;Cursor&lt;/a&gt; or &lt;a href=&quot;https://windsurf.com/&quot;&gt;Windsurf&lt;/a&gt;, the latest trend is the rise of lightweight command-line tools that let developers seamlessly integrate AI into their workflows—such as &lt;a href=&quot;https://www.claude.com/product/claude-code&quot;&gt;Claude Code&lt;/a&gt; 、&lt;a href=&quot;https://github.com/google-gemini/gemini-cli&quot;&gt;Gemini CLI&lt;/a&gt; and &lt;a href=&quot;https://openai.com/zh-Hant/codex/&quot;&gt;Codex&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The problem is that new and more powerful models keep emerging:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Each vendor is unlikely to support competitors or local models.&lt;/li&gt;
&lt;li&gt;Switching between models and adjusting configurations often feels fragmented.&lt;/li&gt;
&lt;li&gt;As models continue to evolve, their performance gaps will narrow and costs will drop—making vendor independence increasingly crucial.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;That’s where &lt;a href=&quot;https://opencode.ai/&quot;&gt;Opencode&lt;/a&gt; comes in as a great solution:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;100% open source under the MIT license&lt;/li&gt;
&lt;li&gt;Vendor-agnostic by design&lt;/li&gt;
&lt;li&gt;Built-in support for LSP (Language Server Protocol)&lt;/li&gt;
&lt;li&gt;Focused on the terminal user interface (TUI) — created by Neovim users and the creator of terminal.shop&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Before installing, you’ll need a modern &lt;a href=&quot;https://opencode.ai/docs#prerequisites&quot;&gt;Terminal Emulator&lt;/a&gt; for the best experience (I&apos;m using &lt;a href=&quot;https://www.warp.dev/&quot;&gt;Warp&lt;/a&gt;)。Then, set up your models using opencode auth login. There’s a &lt;a href=&quot;https://opencode.ai/docs/providers/#directory&quot;&gt;full doc page&lt;/a&gt; detailing how to configure each model provider.&lt;/p&gt;
&lt;p&gt;Among the available options, &lt;a href=&quot;https://opencode.ai/docs/zen/#background&quot;&gt;Opencode Zen&lt;/a&gt; is a curated set of models tested and optimized by the Opencode team in direct collaboration with the developers of those models. This list represents the most reliable and fine-tuned options. Some models, such as Grok Code Fast 1 and Code Supernova, are released for free as part of Opencode’s testing program.&lt;/p&gt;
&lt;p&gt;Opencode also includes features found in other CLIs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://opencode.ai/docs/agents/&quot;&gt;Agents Mode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://opencode.ai/docs/mcp-servers/&quot;&gt;MCP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://opencode.ai/docs/tui/#compact&quot;&gt;compact&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=e9j2iEwJru0&quot;&gt;Opencode Is Probably The Best Coding Agent I&apos;ve Ever Used - DevOps Toolbox&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Share</category></item><item><title>Opencode：串连各家 AI 的命令行工具</title><link>https://www.webdong.dev/zh-cn/shortpost/opencode/#opencode/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/opencode/#opencode/</guid><pubDate>Sun, 09 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;相较于 &lt;a href=&quot;https://cursor.com/&quot;&gt;Cursor&lt;/a&gt; 或 &lt;a href=&quot;https://windsurf.com/&quot;&gt;Windsurf&lt;/a&gt;，近期的热潮是各种轻量的命令行工具让开发者无痛的整合 AI 工作流程如 &lt;a href=&quot;https://www.claude.com/product/claude-code&quot;&gt;Claude Code&lt;/a&gt; 、&lt;a href=&quot;https://github.com/google-gemini/gemini-cli&quot;&gt;Gemini CLI&lt;/a&gt;、&lt;a href=&quot;https://openai.com/zh-Hant/codex/&quot;&gt;Codex&lt;/a&gt; ⋯⋯到自己的开发流程当中。&lt;/p&gt;
&lt;p&gt;问题是每过一段时间就有更新更强大的模型出现：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;各家供应商不可能支援对手或本地模型。&lt;/li&gt;
&lt;li&gt;切换各供应商模型与调整设定体验产生割裂。&lt;/li&gt;
&lt;li&gt;随着模型的不断发展，它们之间的差距将会缩小，价格也会下降，因此保持供应商无关性至关重要。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;因此 &lt;a href=&quot;https://opencode.ai/&quot;&gt;Opencode&lt;/a&gt; 是一个不错解决方案：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;100% MIT 开源&lt;/li&gt;
&lt;li&gt;不依赖任何供应商。&lt;/li&gt;
&lt;li&gt;开箱即用的 LSP 支持&lt;/li&gt;
&lt;li&gt;专注于终端使用者介面 (TUI)。 OpenCode 由 neovim 使用者和 terminal.shop 的创作者共同打造。&lt;/li&gt;
&lt;li&gt;OpenCode 采用客户端／伺服器架构，目前的 TUI（文字介面）只是其中一种可能的操作介面，未来还能扩展出其他形式的前端。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;安装前你会需要先安装现代的 &lt;a href=&quot;https://opencode.ai/docs#prerequisites&quot;&gt;Terminal Emulator&lt;/a&gt; 以获得最好的体验（我使用 &lt;a href=&quot;https://www.warp.dev/&quot;&gt;Warp&lt;/a&gt;）。再来设置模型：&lt;code&gt;opencode auth login&lt;/code&gt; 有&lt;a href=&quot;https://opencode.ai/docs/providers/#directory&quot;&gt;一整页文件详细说明各家模型如何配置&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;模型选项中 &lt;a href=&quot;https://opencode.ai/docs/zen/#background&quot;&gt;Opencode Zen&lt;/a&gt; 是 OpenCode 精选测试的模型，并直接与其开发团队沟通，找出运行它们的最佳方式且最有信心的清单模型。一些与 Opencode 合作的模型如：Grok Code Fast 1、Code Supernova 也会作为测试推出可免费使用。一些其他 CLI 有的功能 Opencode 皆有提供：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://opencode.ai/docs/agents/&quot;&gt;Agents 模式&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://opencode.ai/docs/mcp-servers/&quot;&gt;MCP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://opencode.ai/docs/tui/#compact&quot;&gt;compact&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;延伸阅读&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=e9j2iEwJru0&quot;&gt;Opencode Is Probably The Best Coding Agent I&apos;ve Ever Used - DevOps Toolbox&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Share</category></item><item><title>Opencode：串連各家 AI 的命令行工具</title><link>https://www.webdong.dev/zh-tw/shortpost/opencode/#opencode/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/opencode/#opencode/</guid><pubDate>Sun, 09 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;相較於 &lt;a href=&quot;https://cursor.com/&quot;&gt;Cursor&lt;/a&gt; 或 &lt;a href=&quot;https://windsurf.com/&quot;&gt;Windsurf&lt;/a&gt;，近期的熱潮是各種輕量的命令行工具讓開發者無痛的整合 AI 工作流程如 &lt;a href=&quot;https://www.claude.com/product/claude-code&quot;&gt;Claude Code&lt;/a&gt; 、&lt;a href=&quot;https://github.com/google-gemini/gemini-cli&quot;&gt;Gemini CLI&lt;/a&gt;、&lt;a href=&quot;https://openai.com/zh-Hant/codex/&quot;&gt;Codex&lt;/a&gt; ⋯⋯到自己的開發流程當中。&lt;/p&gt;
&lt;p&gt;問題是每過一段時間就有更新更強大的模型出現：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;各家供應商不可能支援對手或本地模型。&lt;/li&gt;
&lt;li&gt;切換各供應商模型與調整設定體驗產生割裂。&lt;/li&gt;
&lt;li&gt;隨著模型的不斷發展，它們之間的差距將會縮小，價格也會下降，因此保持供應商無關性至關重要。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;因此 &lt;a href=&quot;https://opencode.ai/&quot;&gt;Opencode&lt;/a&gt; 是一個不錯解決方案：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;100% MIT 開源&lt;/li&gt;
&lt;li&gt;不依賴任何供應商。&lt;/li&gt;
&lt;li&gt;開箱即用的 LSP 支持&lt;/li&gt;
&lt;li&gt;專注於終端使用者介面 (TUI)。 OpenCode 由 neovim 使用者和 terminal.shop 的創作者共同打造。&lt;/li&gt;
&lt;li&gt;OpenCode 採用客戶端／伺服器架構，目前的 TUI（文字介面）只是其中一種可能的操作介面，未來還能擴展出其他形式的前端。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;安裝前你會需要先安裝現代的 &lt;a href=&quot;https://opencode.ai/docs#prerequisites&quot;&gt;Terminal Emulator&lt;/a&gt; 以獲得最好的體驗（我使用 &lt;a href=&quot;https://www.warp.dev/&quot;&gt;Warp&lt;/a&gt;）。再來設置模型：&lt;code&gt;opencode auth login&lt;/code&gt; 有&lt;a href=&quot;https://opencode.ai/docs/providers/#directory&quot;&gt;一整頁文件詳細說明各家模型如何配置&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;模型選項中 &lt;a href=&quot;https://opencode.ai/docs/zen/#background&quot;&gt;Opencode Zen&lt;/a&gt; 是 OpenCode 精選測試的模型，並直接與其開發團隊溝通，找出運行它們的最佳方式且最有信心的清單模型。一些與 Opencode 合作的模型如：Grok Code Fast 1、Code Supernova 也會作為測試推出可免費使用。一些其他 CLI 有的功能 Opencode 皆有提供：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://opencode.ai/docs/agents/&quot;&gt;Agents 模式&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://opencode.ai/docs/mcp-servers/&quot;&gt;MCP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://opencode.ai/docs/tui/#compact&quot;&gt;compact&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;延伸閱讀&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=e9j2iEwJru0&quot;&gt;Opencode Is Probably The Best Coding Agent I&apos;ve Ever Used - DevOps Toolbox&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Share</category></item><item><title>Why Not Lazily Evaluate Everything?</title><link>https://www.webdong.dev/en/shortpost/why-not-lazy-evaluation-for-every-thing/#why-not-lazy-evaluation-for-every-thing/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/why-not-lazy-evaluation-for-every-thing/#why-not-lazy-evaluation-for-every-thing/</guid><pubDate>Wed, 05 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Lazy evaluation can delay the computations until result is actually needed, saving unnecessary calculations and providing more flexibility in control flow.&lt;/p&gt;
&lt;p&gt;So why not lazily evaluate all computations?&lt;/p&gt;
&lt;p&gt;While it can reduce immediate computation costs, it also postpones the occurrence of errors. In eager evaluation, errors are generally caught early in the execution; whereas in lazy mode, errors might only occur when data is actually accessed, leading to a debugging process that is more scattered and harder to trace. (Functional Programming avoids this issue by design to prevent side effects, and many FP languages have lazy evaluation as a default strategy.)&lt;/p&gt;
&lt;p&gt;Lazy evaluation requires an additional execution model to &quot;remember&quot; which values have not yet been computed, which typically means more wrapping and more memory overhead at the language execution level. (Side effects can be wrapped into explicit thunks/effects and called where you control them (or use Effect / IO Monad)&lt;/p&gt;
&lt;p&gt;Lazy evaluation is a strategy for deferring decisions, significantly improving efficiency when data streams are large and not all results are needed; however, when a predictable execution order or explicit side effects are required, eager mode is more reliable.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function* process(items) {
  for (const it of items) {
    yield doSideEffect(it);
  }
}

// The caller does not iterate =&amp;gt; no side effects occur
const gen = process([1,2,3]);

// The side effect is only triggered when this line is executed
for (const p of gen)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/8797980/why-do-most-programming-languages-use-eager-evaluation-for-arguments-passed-to-a&quot;&gt;Why do most programming languages use eager evaluation for arguments passed to a function? - stackoverflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://effect.website/docs/getting-started/using-generators/&quot;&gt;Using Generators - Effect&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>为什么不惰性求值（Lazy Evaluation）一切事物？</title><link>https://www.webdong.dev/zh-cn/shortpost/why-not-lazy-evaluation-for-every-thing/#why-not-lazy-evaluation-for-every-thing/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/why-not-lazy-evaluation-for-every-thing/#why-not-lazy-evaluation-for-every-thing/</guid><pubDate>Wed, 05 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;惰性求值（Lazy）可以延后计算的发生时机，直到真正需要结果时才执行，这不仅节省了不必要的运算，也让流程控制更具弹性。&lt;/p&gt;
&lt;p&gt;那为什么不干脆所有运算都惰性化？&lt;/p&gt;
&lt;p&gt;虽然能减少即時計算成本，但它同时也推迟了错误的发生时机。在 eager （即时求值）模式下错误通常能在执行流程早期就被捕捉；而在 lazy 模式中，错误可能延迟到资料被实际取用时才爆发，导致除错流程更分散且难以追踪。（Functional Programming 设计上避免副作用来避免该问题，且很多 FP 语言设计上 lazy 为默认策略）&lt;/p&gt;
&lt;p&gt;惰性求值需要一套额外的执行模型来「记得」哪些值尚未被计算，这在语言执行层面上通常意味着更多的包装与更多的内存负担。（可以把副作用包成明确的 thunk / effect，并在你控制的地方调用它（或用 Effect/IO Monad）&lt;/p&gt;
&lt;p&gt;惰性求值是一种延迟决策的策略，当数据流庞大、结果并非全都需要时，它能显著提升效率；然而在需要可预测执行顺序或明确副作用时，eager 模式反而更可靠。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function* process(items) {
  for (const it of items) {
    yield doSideEffect(it);
  }
}

// 调用者没有 iterate =&amp;gt; 不会发生副作用
const gen = process([1,2,3]);

// 只有在下面这行执行时，副作用才会被触发
for (const p of gen)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/8797980/why-do-most-programming-languages-use-eager-evaluation-for-arguments-passed-to-a&quot;&gt;Why do most programming languages use eager evaluation for arguments passed to a function? - stackoverflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://effect.website/docs/getting-started/using-generators/&quot;&gt;Using Generators - Effect&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>為什麼不惰性求值（Lazy Evaluation）一切事物？</title><link>https://www.webdong.dev/zh-tw/shortpost/why-not-lazy-evaluation-for-every-thing/#why-not-lazy-evaluation-for-every-thing/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/why-not-lazy-evaluation-for-every-thing/#why-not-lazy-evaluation-for-every-thing/</guid><pubDate>Wed, 05 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;惰性求值（Lazy）可以延後計算的發生時機，直到真正需要結果時才執行，這不僅節省了不必要的運算，也讓流程控制更具彈性。&lt;/p&gt;
&lt;p&gt;那為什麼不乾脆所有運算都惰性化？&lt;/p&gt;
&lt;p&gt;雖然能減少即時計算成本，但它同時也推遲了錯誤的發生時機。在 eager （即時求值）模式下錯誤通常能在執行流程早期就被捕捉；而在 lazy 模式中，錯誤可能延遲到資料被實際取用時才爆發，導致除錯流程更分散且難以追蹤。（Functional Programming 藉由設計上避免副作用來避免該問題，且很多 FP 語言設計上 lazy 為預設策略）&lt;/p&gt;
&lt;p&gt;惰性求值需要一套額外的執行模型來「記得」哪些值尚未被計算，這在語言執行層面上通常意味著更多的包裝與更多的記憶體負擔。（可以把副作用包成明確的 thunk / effect，並在你控制的地方呼叫它（或用 Effect/IO Monad）&lt;/p&gt;
&lt;p&gt;惰性求值是一種延後決策的策略，當資料流龐大、結果並非全都需要時，它能顯著提升效率；然而在需要可預測執行順序或明確副作用時，eager 模式反而更可靠。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function* process(items) {
  for (const it of items) {
    yield doSideEffect(it);
  }
}

// 呼叫者沒有 iterate =&amp;gt; 不會發生副作用
const gen = process([1,2,3]);

// 只有在下面這行執行時，副作用才會被觸發
for (const p of gen)
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/8797980/why-do-most-programming-languages-use-eager-evaluation-for-arguments-passed-to-a&quot;&gt;Why do most programming languages use eager evaluation for arguments passed to a function? - stackoverflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://effect.website/docs/getting-started/using-generators/&quot;&gt;Using Generators - Effect&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>Asking Strange Questions Helps Everyone</title><link>https://www.webdong.dev/en/shortpost/silly-questions/#silly-questions/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/silly-questions/#silly-questions/</guid><pubDate>Sun, 19 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;Do users really need this feature?&lt;/li&gt;
&lt;li&gt;Why use this framework or process?&lt;/li&gt;
&lt;li&gt;What does this code actually do?&lt;/li&gt;
&lt;li&gt;Can we automate this step?&lt;/li&gt;
&lt;li&gt;What would happen if we deleted it?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When the answer is &quot;it&apos;s always been this way&quot; or &quot;I don&apos;t know,&quot; it indicates an opportunity for improvement.&lt;/p&gt;
&lt;p&gt;Don&apos;t be afraid to ask questions, even if they seem silly, because the real danger lies in a culture that never questions the status quo. To continuously improve, we should boldly ask seemingly foolish questions. If the answers are obvious, they can be solved easily; if the questions need discussion and hit the key points, any question can be a good question.&lt;/p&gt;
&lt;p&gt;Not asking questions may stem from cultural and psychological pressure. A team culture that encourages admitting mistakes, asking questions, and learning helps everyone understand that &quot;it&apos;s okay not to know; continuous learning is what matters.&quot; There are no practices that are &quot;taken for granted&quot;; everything is worth questioning and exploring.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way&quot;&gt;The Wisdom of Asking Questions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ttulka.com/&quot;&gt;The Power of Silly Questions - Tomas Tulka&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>多问些诡异的问题对所有人都有帮助</title><link>https://www.webdong.dev/zh-cn/shortpost/silly-questions/#silly-questions/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/silly-questions/#silly-questions/</guid><pubDate>Sun, 19 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;用户真的需要这功能吗？&lt;/li&gt;
&lt;li&gt;为什么要用这个框架或流程？&lt;/li&gt;
&lt;li&gt;这段程序到底做什么？&lt;/li&gt;
&lt;li&gt;我们能自动化这步吗？&lt;/li&gt;
&lt;li&gt;如果删掉它会怎样？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当答案是「一直都是这样」或「我不知道」时，就代表发现了改善的契机。&lt;/p&gt;
&lt;p&gt;不要害怕提问，即使问题看似愚蠢，因为真正危险的是从不质疑现状的文化，要持续进步就应该勇于提出看似愚蠢的问题。如果问题答案太明显，简单就能被解决，如果问题需要被讨论说明问到要点上了，任何问题都会是个好问题。&lt;/p&gt;
&lt;p&gt;不问问题可能是文化与心理压力，团队文化的塑造上勇于承认错误、提问与学习，让团队知道「不知道没关系，持续学习才重要」。没有任何做法是「理所当然」的，一切都值得被质疑与探索。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way&quot;&gt;提问的智慧&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ttulka.com/&quot;&gt;The Power of Silly Questions - Tomas Tulka&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>多問些詭異的問題對所有人都有幫助</title><link>https://www.webdong.dev/zh-tw/shortpost/silly-questions/#silly-questions/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/silly-questions/#silly-questions/</guid><pubDate>Sun, 19 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;使用者真的需要這功能嗎？&lt;/li&gt;
&lt;li&gt;為什麼要用這個框架或流程？&lt;/li&gt;
&lt;li&gt;這段程式到底做什麼？&lt;/li&gt;
&lt;li&gt;我們能自動化這步嗎？&lt;/li&gt;
&lt;li&gt;如果刪掉它會怎樣？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;當答案是「一直都是這樣」或「我不知道」時，就代表發現了改善的契機。&lt;/p&gt;
&lt;p&gt;不要害怕提問，即使問題看似愚蠢，因為真正危險的是從不質疑現狀的文化，要持續進步就應該勇於提出看似愚蠢的問題。如果問題答案太明顯，簡單就能被解決，如果問題需要被討論說明問到要點上了，任何問題都會是個好問題。&lt;/p&gt;
&lt;p&gt;不問問題可能是文化與心理壓力，團隊文化的塑造上勇於承認錯誤、提問與學習，讓團隊知道「不知道沒關係，持續學習才重要」。沒有任何做法是「理所當然」的，一切都值得被質疑與探索。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way&quot;&gt;提問的智慧&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ttulka.com/&quot;&gt;The Power of Silly Questions - Tomas Tulka&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>Proper Naming is Creating Appropriate Abstraction</title><link>https://www.webdong.dev/en/shortpost/naming-in-coding/#naming-in-coding/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/naming-in-coding/#naming-in-coding/</guid><pubDate>Mon, 06 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=SEp0NrXWwoo&quot;&gt;Programming - Naming Things Is Easy - Nic Barker&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Software development is actually a process where developers communicate in two languages: natural language (usually English) and programming languages.&lt;/p&gt;
&lt;p&gt;The purpose of most software is not just execution but is written for long-term maintenance, which is why &quot;how to convey intentions correctly&quot; becomes particularly important. This is also why we are taught various naming conventions and learn how to describe problems and solutions through appropriate abstractions.&lt;/p&gt;
&lt;p&gt;However, the expressiveness of natural language itself is limited. When we try to convey technical concepts in words, we often face communication bottlenecks. To reduce complexity, we need to establish abstractions; however, excessive abstraction can create more confusion.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;A few points to consider:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Before adding an additional layer of abstraction, evaluate its cost and benefit to the team to avoid unnecessary abstraction.&lt;/li&gt;
&lt;li&gt;Sometimes, natural language itself is not precise enough as a medium for communication.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Regarding the topic of &quot;naming,&quot; I recently mentioned it in another article: &lt;a href=&quot;/en/post/pointfree/&quot;&gt;Function Composition and Pointfree Coding Style&lt;/a&gt; and was surprised by the different ways to solve problems from various dimensions.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>适当的命名是在创造适当的抽象</title><link>https://www.webdong.dev/zh-cn/shortpost/naming-in-coding/#naming-in-coding/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/naming-in-coding/#naming-in-coding/</guid><pubDate>Mon, 06 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=SEp0NrXWwoo&quot;&gt;Programming - Naming Things Is Easy - Nic Barker&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;程序开发其实是开发者之间以两种语言交流的过程：自然语言（通常是英文）与程序语言。&lt;/p&gt;
&lt;p&gt;大多数程序的目的并非仅仅是执行，而是为了长期维护而写成的，因此「如何正确传达意图」就变得格外重要，这也是为什么我们被教导各种命名惯例，并学习如何通过恰当的抽象来描述问题与解决方案。&lt;/p&gt;
&lt;p&gt;然而，自然语言本身的表达力是有限的。当我们试图以文字传达技术概念时，常会面临沟通的瓶颈。为了降低复杂度，我们需要建立抽象；但若抽象过度，反而会制造更多混乱。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;几个思考方向：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在新增一层抽象前，应衡量它对团队的成本与收益，避免不必要的抽象。&lt;/li&gt;
&lt;li&gt;有时候，自然语言本身就不是足够精准的沟通媒介。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;关于「命名」这个主题，我近期也在另一篇文章中提过：&lt;a href=&quot;/zh-cn/post/pointfree/&quot;&gt;Pointfree 代码风格：通过函数组合提升代码质量&lt;/a&gt; 惊讶从不同维度还有不同解决问题的方式。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>適當的命名是在創造適當的抽象</title><link>https://www.webdong.dev/zh-tw/shortpost/naming-in-coding/#naming-in-coding/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/naming-in-coding/#naming-in-coding/</guid><pubDate>Mon, 06 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=SEp0NrXWwoo&quot;&gt;Programming - Naming Things Is Easy - Nic Barker&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;程式開發其實是開發者之間以兩種語言交流的過程：自然語言（通常是英文）與程式語言。&lt;/p&gt;
&lt;p&gt;大多數程式的目的並非僅僅是執行，而是為了長期維護而寫成的，因此「如何正確傳達意圖」就變得格外重要，這也是為什麼我們被教導各種命名慣例，並學習如何透過恰當的抽象來描述問題與解決方案。&lt;/p&gt;
&lt;p&gt;然而，自然語言本身的表達力是有限的。當我們試圖以文字傳達技術概念時，常會面臨溝通的瓶頸。為了降低複雜度，我們需要建立抽象；但若抽象過度，反而會製造更多混亂。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;幾個思考方向：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在新增一層抽象前，應衡量它對團隊的成本與收益，避免不必要的抽象。&lt;/li&gt;
&lt;li&gt;有時候，自然語言本身就不是足夠精準的溝通媒介。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;關於「命名」這個主題，我近期也在另一篇文章中提過：&lt;a href=&quot;/zh-tw/post/pointfree/&quot;&gt;Pointfree 代碼風格：透過函式組合提升代碼品質&lt;/a&gt; 驚訝從不同維度還有不同解決問題的方式。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>Why Modern Websites Should Be Responsive?</title><link>https://www.webdong.dev/en/shortpost/why-website-should-be-responsive/#why-website-should-be-responsive/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/why-website-should-be-responsive/#why-website-should-be-responsive/</guid><pubDate>Wed, 17 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Having worked on different products, both consumer-facing (to C) and enterprise (to B), particularly in enterprise systems, there is a perspective that &quot;users use the product on a computer, so there&apos;s no need to consider the user experience on smaller screens.&quot;&lt;/p&gt;
&lt;p&gt;But is that really the case?&lt;/p&gt;
&lt;p&gt;Take today&apos;s common screen size &lt;code&gt;1920x1080&lt;/code&gt;, if a user splits the window in half: &lt;code&gt;1920 / 2 = 960&lt;/code&gt;, and adds a sidebar: &lt;code&gt;960 - 300 = 690&lt;/code&gt;, accounting for various whitespace and layout... the content size is not much different from that on mobile and tablet devices.&lt;/p&gt;
&lt;p&gt;It becomes clear that &lt;strong&gt;the actual displayed size of webpage content is uncontrollable variable&lt;/strong&gt;. Websites that aim to support only large sizes and half-heartedly implement responsiveness will result in:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;strange layouts.&lt;/li&gt;
&lt;li&gt;The impression that the product can only be used properly at specific sizes, giving a half-finished feel.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Is it faster for development to consider just one size? This could indeed be the case. However, this approach is increasingly becoming unworthy because:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Early habits&lt;/strong&gt;: In the past, during the era of Flash or traditional desktop applications, people presumed that &quot;users operate in full-screen on a computer.&quot; As a result, product designs did not consider cross-size factors, and a single layout could satisfy the need.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Front-end was not a professional field&lt;/strong&gt;: Front-end became a mature and standardized field only recently; interfaces are no longer just inputs and outputs but are now emphasized as an experience.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The rise of componentization&lt;/strong&gt;: Nowadays, with the development of front-end engineering, designing UIs that can adapt to different sizes is no longer a challenge. Through reusable components and responsive layouts, it becomes more efficient to maintain and expand.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The early web design, which required designers to create layouts using Table slicing, has completely transformed into a different world with powerful CSS and a rich ecosystem of JS.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.webdong.dev/en/post/how-many-breakpoint-should-you-use/&quot;&gt;How many breakpoints should you use? The less, the better.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>UX</category></item><item><title>为什么制作现代网站就应该是响应式？</title><link>https://www.webdong.dev/zh-cn/shortpost/why-website-should-be-responsive/#why-website-should-be-responsive/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/why-website-should-be-responsive/#why-website-should-be-responsive/</guid><pubDate>Wed, 17 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;制作过不同的产品，有面向消费者（to C）也有面向企业（to B）的，特别是面向企业的系统有个开发上的观点是「用户使用产品都是使用电脑，所以不用考虑小尺寸的使用体验」。&lt;/p&gt;
&lt;p&gt;然而真的是这样吗？&lt;/p&gt;
&lt;p&gt;举当今常见的屏幕尺寸 &lt;code&gt;1920x1080&lt;/code&gt;，用户切一半窗口操作： &lt;code&gt;1920 / 2 = 960&lt;/code&gt;，画面加个侧栏： &lt;code&gt;960 - 300 = 690&lt;/code&gt; 算上大大小小的留白与版面⋯⋯内容尺寸也和手机平板没两样。&lt;/p&gt;
&lt;p&gt;可以发现&lt;strong&gt;实际显示网页内容的尺寸是浮动且无法控制的&lt;/strong&gt;，网页希望只支持大尺寸且半吊子的套上响应式会造成：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;产品就是只能在特定尺寸下才能正常操作的印象，半成品的感觉。&lt;/li&gt;
&lt;li&gt;时时刻刻出现怪版面的问题。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;开发上会因为只考虑一种尺寸比较快吗？的确有可能。但这样的做法已经渐渐变得不值得，原因是因为：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;早期习惯&lt;/strong&gt; ：在过去像 Flash 或传统桌面应用的时代，人们预设「用户就是在电脑全屏幕操作」。因此产品设计没有太多跨尺寸的考量，单一版面就能满足需求。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;早期前端不是一个专业的领域&lt;/strong&gt;：前端直到近期才是成熟且规范的领域，界面不再是输入与输出而是一种被重视的体验。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;组件化盛行&lt;/strong&gt;：如今随着前端工程化发展，设计能适应不同尺寸的 UI 不再是难事。通过可重复使用的组件与响应式布局，才能更有效率地维护与扩展。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;早期网页还需要设计师画图用 Table 切片组成网页的思维和如今强大 CSS 与丰富生态的 JS 已经是不同世界。&lt;/p&gt;
&lt;h2&gt;延伸阅读&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.webdong.dev/zh-cn/post/how-many-breakpoint-should-you-use/&quot;&gt;制作响应式网页需要多少尺寸版本？三个论点说服你越少越好。&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>UX</category></item><item><title>為什麼製作現代網站就應該要是響應式？</title><link>https://www.webdong.dev/zh-tw/shortpost/why-website-should-be-responsive/#why-website-should-be-responsive/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/why-website-should-be-responsive/#why-website-should-be-responsive/</guid><pubDate>Wed, 17 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;製作過不同的產品，有面向消費者（to C）也有面向企業（to B）的，特別是面向企業的系統有個開發上的觀點是「用戶使用產品都是使用電腦，所以不用考慮小尺寸的使用體驗」。&lt;/p&gt;
&lt;p&gt;然而真的是這樣嗎？&lt;/p&gt;
&lt;p&gt;舉當今常見的螢幕尺寸 &lt;code&gt;1920x1080&lt;/code&gt;，用戶切一半視窗操作： &lt;code&gt;1920 / 2 = 960&lt;/code&gt;，畫面加個側欄： &lt;code&gt;960 - 300 = 690&lt;/code&gt; 算上大大小小的留白與版面⋯⋯內容尺寸也和手機平板沒兩樣。&lt;/p&gt;
&lt;p&gt;可以發現&lt;strong&gt;實際顯示網頁內容的尺寸是浮動且無法控制的&lt;/strong&gt;，網頁希望只支援大尺寸且半吊子的套上響應式會造成：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;產品就是只能在特定尺寸下才能正常操作的印象，半成品的感覺。&lt;/li&gt;
&lt;li&gt;時時刻刻出現怪版面的問題。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;開發上會因為只考慮一種尺寸比較快嗎？的確有可能。但這樣的做法已經漸漸變得不值得，原因是因為：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;早期習慣&lt;/strong&gt; ：在過去像 Flash 或傳統桌面應用的時代，人們預設「使用者就是在電腦全螢幕操作」。因此產品設計沒有太多跨尺寸的考量，單一版面就能滿足需求。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;早期前端不是一個專業的領域&lt;/strong&gt;：前端直到近期才是成熟且規範的領域，介面不再是輸入與輸出而是一種被重視的體驗。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;元件化盛行&lt;/strong&gt;：如今隨著前端工程化發展，設計能適應不同尺寸的 UI 不再是難事。透過可重複使用的元件與響應式布局，才能更有效率地維護與擴展。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;早期網頁還需要設計師畫圖用 Table 切片組成網頁的思維和如今強大 CSS 與豐富生態的 JS 已經是不同世界。&lt;/p&gt;
&lt;h2&gt;延伸閱讀&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.webdong.dev/zh-tw/post/how-many-breakpoint-should-you-use/&quot;&gt;製作響應式網頁需要多少尺寸版本？三個論點說服你越少越好。&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>UX</category></item><item><title>Me and Aphantasia</title><link>https://www.webdong.dev/en/shortpost/me-and-aphantasia/#me-and-aphantasia/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/me-and-aphantasia/#me-and-aphantasia/</guid><pubDate>Mon, 01 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I realized that most people can form visual imagery when they close their eyes, and it&apos;s hard for me to believe this when talking to friends and family. Does &quot;don&apos;t think of a blue elephant&quot; really make most people see a blue elephant? Do peoples immerse themselves in poetry or novels?&lt;/p&gt;
&lt;p&gt;This trait makes me focus only on the present, lack of imagination about the past or future.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I can&apos;t understand the feelings surrounded by memories&lt;/li&gt;
&lt;li&gt;No desire to travel and create memories&lt;/li&gt;
&lt;li&gt;Emotional fluctuations are minimal&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Is it that people lack a calibrated scale for the world? Just like your red may not be my red, it ultimately returns to subjective feelings?&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>我和心盲症</title><link>https://www.webdong.dev/zh-cn/shortpost/me-and-aphantasia/#me-and-aphantasia/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/me-and-aphantasia/#me-and-aphantasia/</guid><pubDate>Mon, 01 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;不知道从什么时候才知道大多数人闭上眼睛时能凭空形成视觉想像，和有丰富内心图像的亲友谈到这件事情时我还是难以置信，原来「不要想蓝色大象」，对多数人来说真的会见到蓝色的大象？阅读诗句或小说会身临其境？&lt;/p&gt;
&lt;p&gt;这样的特质让我只在意当下，对过往或未来的事情没有太多想像。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;没办法理解被回忆围绕的感受&lt;/li&gt;
&lt;li&gt;没有对旅游和创造回忆的向望&lt;/li&gt;
&lt;li&gt;情绪起伏较少&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;还是人们对于世界没有校准的尺度？就像你的红色不一定是我的红色一样的问题，最终还是回归到主观感受上？&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>我和心盲症</title><link>https://www.webdong.dev/zh-tw/shortpost/me-and-aphantasia/#me-and-aphantasia/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/me-and-aphantasia/#me-and-aphantasia/</guid><pubDate>Mon, 01 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;不知道從什麼時候才知道大多數人閉上眼睛時能憑空形成視覺想像，和有豐富內心圖像的親友談到這件事情時我還是難以置信，原來「不要想藍色大象」，對多數人來說真的會見到藍色的大象？閱讀詩句或小說會身臨其境？&lt;/p&gt;
&lt;p&gt;這樣的特質讓我只在意當下，對過往或未來的事情沒有太多想像。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;沒辦法理解被回憶圍繞的感受&lt;/li&gt;
&lt;li&gt;沒有對旅遊和創造回憶的嚮往&lt;/li&gt;
&lt;li&gt;情緒起伏較少&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;還是人們對於世界沒有校準的尺度？就像你的紅色不一定是我的紅色一樣的問題，最終還是回歸到主觀感受上？&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>Is No UI the Best UX? What Will UI Look Like in the New Era?</title><link>https://www.webdong.dev/en/shortpost/ai-and-ui/#ai-and-ui/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/ai-and-ui/#ai-and-ui/</guid><pubDate>Thu, 28 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;There is a scenario where older family members ask questions like, &quot;How do I enlarge the text?&quot; or &quot;How do I use this software?&quot; Experienced digital users may find these questions ridiculous, thinking, &quot;Can&apos;t you just Google it?&quot;&lt;/p&gt;
&lt;p&gt;Similarly, I feel the same way when using closed 2B or internal systems; there is too much prerequisite knowledge that raises the usage threshold.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;From a product perspective, the complexity of solving problems makes it hard to simplify processes.&lt;/li&gt;
&lt;li&gt;From a user perspective, no matter how powerful a feature is, it feels like a product manual—no one cares.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;An outstanding interface, complete functionalities, and a smooth experience are just means to an end. It doesn&apos;t constitute a beautiful experience; users still need to forcibly learn how to operate the interface and understand the practical details of the product to transform &quot;problems&quot; into &quot;actions&quot;.&lt;/p&gt;
&lt;p&gt;In the new era, we can expect AI in products to &lt;strong&gt;understand problems and select the right tools to execute&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The conclusion is that the UI interfaces of the old era will become like as keyboards and phones, and browsing a webpage will feel like visiting a bookstore. The next trend will be figuring out how to effectively integrate services with AI.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/en/post/what-is-mcp/&quot;&gt;What is the Model Context Protocol? - WebDong&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=gDSIxIGYk-o&quot;&gt;The Future of User Interaction with Kent C. Dodds - Microsoft Developer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=tGo0Ul3eC4c&quot;&gt;Are AI-Agents &amp;amp; MCP The End For Developers (mcp-ui)? Frontend Is Changing Forever&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mcpui.dev/&quot;&gt;MCP-UI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>UX</category></item><item><title>没有 UI 才是最好的 UX？新时代的 UI 会是什么模样？</title><link>https://www.webdong.dev/zh-cn/shortpost/ai-and-ui/#ai-and-ui/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/ai-and-ui/#ai-and-ui/</guid><pubDate>Thu, 28 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;有一种情境是家里的长辈会询问一些他们不熟悉的问题像是：「要怎么放大文字？」、「要怎么操作某软件？」，熟练的数字用户会觉得这些问题很扯，不是 Google 一下就能找到吗？&lt;/p&gt;
&lt;p&gt;同样的道理，思考我在使用一些较为封闭的 2B 或内部系统也有相同的感受，在操作之前就有太多前置知识拉高使用门槛甚至还很封闭。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;产品角度来说，要解决问题复杂度就摆在那儿很难简化流程。&lt;/li&gt;
&lt;li&gt;用户角度来说，再强大厉害的功能都像是产品手册，没人在乎。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;界面出色、功能齐全、体验合理流畅是一种手段，就算达成了也说不上是一种漂亮的体验，用户还是要强迫学会操作界面和了解产品实践细节才能将「问题叙述」转化成「命令式」的操作来达成。&lt;/p&gt;
&lt;p&gt;新时代中可以预期 AI 在产品中可以 &lt;strong&gt;负责理解问题并挑选正确命令执行&lt;/strong&gt;，就像是阿嬤问孙女科技问题一样，阿嬤没有必要也不在乎怎么操作手机，孙女就是会帮你理清问题并采用恰当的工具。&lt;/p&gt;
&lt;p&gt;结论是旧时代的 UI 界面会成为键盘手机一样的存在，浏览网页会成为逛书店一样的体验，怎么更有效率的把服务接上 AI 是下个风口。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/zh-cn/post/what-is-mcp/&quot;&gt;模型上下文协议（Model Context Protocol）是什么？对现代开发者有什么影响？ - WebDong&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=gDSIxIGYk-o&quot;&gt;The Future of User Interaction with Kent C. Dodds - Microsoft Developer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=tGo0Ul3eC4c&quot;&gt;Are AI-Agents &amp;amp; MCP The End For Developers (mcp-ui)? Frontend Is Changing Forever&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mcpui.dev/&quot;&gt;MCP-UI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>UX</category></item><item><title>沒有 UI 才是最好的 UX？新時代的 UI 會是什麼模樣？</title><link>https://www.webdong.dev/zh-tw/shortpost/ai-and-ui/#ai-and-ui/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/ai-and-ui/#ai-and-ui/</guid><pubDate>Thu, 28 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;有一種情境是家裡長輩會詢問一些他們不熟悉的問題像是：「要怎麼放大文字？」、「要怎麼操作某軟體？」，熟練的數位用戶會覺得這些問題很扯，不是 Google 一下就能找到嗎？&lt;/p&gt;
&lt;p&gt;同樣的道理，思考我在使用一些較為封閉的 2B 或內部系統也有相同的感受，在操作之前就有太多前置知識拉高使用門檻甚至還很封閉。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;產品角度來說，要解決問題複雜度就擺在那裡很難簡化流程。&lt;/li&gt;
&lt;li&gt;用戶角度來說，再強大厲害的功能都像是產品手冊，沒人在乎。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;介面出色、功能齊全、體驗合理流暢是一種手段，就算達成了也說不上是一種漂亮的體驗，用戶還是要強迫學會操作介面和了解產品實踐細節才能將「問題敘述」轉化成「命令式」的操作來達成。&lt;/p&gt;
&lt;p&gt;新時代中可以預期 AI 在產品中可以 &lt;strong&gt;負責理解問題並挑選正確命令執行&lt;/strong&gt;，就像是阿嬤問孫女科技問題一樣，阿嬤沒有必要也不在乎怎麼操作手機，孫女就是會幫你釐清問題並採用恰當的工具。&lt;/p&gt;
&lt;p&gt;結論是舊時代的 UI 介面會成為鍵盤手機一樣的存在，瀏覽網頁會成為逛書店一樣的體驗，怎麼更有效率的把服務接上 AI 是下個風口。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/zh-tw/post/what-is-mcp/&quot;&gt;模型上下文協定（Model Context Protocol）是啥？對現代開發者有什麼影響？ - WebDong&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=gDSIxIGYk-o&quot;&gt;The Future of User Interaction with Kent C. Dodds - Microsoft Developer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=tGo0Ul3eC4c&quot;&gt;Are AI-Agents &amp;amp; MCP The End For Developers (mcp-ui)? Frontend Is Changing Forever&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mcpui.dev/&quot;&gt;MCP-UI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>UX</category></item><item><title>Think About Learning</title><link>https://www.webdong.dev/en/shortpost/think-about-learning/#think-about-learning/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/think-about-learning/#think-about-learning/</guid><pubDate>Thu, 14 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Previously, while playing table tennis with friends, we talked about how you shouldn’t put half-baked knowledge and thoughts out there in the open. Senior or experienced people might think no depth in it, and it could even mislead others.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;What does others&apos; evaluation of you mean to you, and why does it matter?&lt;/li&gt;
&lt;li&gt;Whose responsibility is it to interpret information? How can we do better?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;During the job search period, it makes sense to fear that expressing incorrect viewpoints or knowledge might leave a bad impression, but in the long run, this is not the direction I’m pursuing. Therefore, I will continue to output my thoughts, as writing them down is thinking, and thinking leads to progress.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/en/post/blog-like-gardening/&quot;&gt;Writing like gardening, concept of digital garden blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>关于输出学习</title><link>https://www.webdong.dev/zh-cn/shortpost/think-about-learning/#think-about-learning/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/think-about-learning/#think-about-learning/</guid><pubDate>Thu, 14 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;之前和朋友打桌球聊到不应该把半成品的知识和思考放上台面，让资深的人看到只会觉得没料，甚至还会误导他人。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;别人对你的评价对你而言是什么，为什么在意？&lt;/li&gt;
&lt;li&gt;识读资讯是谁的责任？怎么做得更好？&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;找工作那段时间可能会害怕表达错观点或知识带来的不好的印象有它的道理，但长远来看这不是我在追求的方向，所以还是保持持续输出想法，因为写下来就是思考，思考就是进步。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/zh-cn/post/blog-like-gardening/&quot;&gt;写作就像是在经营花园，替博客导入数字花园的概念&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>關於輸出學習</title><link>https://www.webdong.dev/zh-tw/shortpost/think-about-learning/#think-about-learning/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/think-about-learning/#think-about-learning/</guid><pubDate>Thu, 14 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;之前和朋友打桌球聊到不應該把半成品的知識和思考放上檯面，讓資深的人看到只會覺得沒料，甚至還會誤導他人。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;別人對你的評價對你而言是什麼，為什麼在意？&lt;/li&gt;
&lt;li&gt;識讀資訊是誰的責任？怎麼做得更好？&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;找工作那段時間可能會害怕表達錯觀點或知識帶來不好的印象有它的道理，但長遠來看這不是我在追求的方向，所以還是保持持續輸出想法，因為寫下來就是思考，思考就是進步。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/zh-tw/post/blog-like-gardening/&quot;&gt;寫作就像是在經營花園，替部落格導入數位花園的概念&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>Is it a bad thing to inform that you have other offers and need time to consider?</title><link>https://www.webdong.dev/en/shortpost/is-it-bad-to-inform-there-are-other-offers-need-time-to-consider/#is-it-bad-to-inform-there-are-other-offers-need-time-to-consider/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/is-it-bad-to-inform-there-are-other-offers-need-time-to-consider/#is-it-bad-to-inform-there-are-other-offers-need-time-to-consider/</guid><pubDate>Thu, 17 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Recording a recent story about finding a job earlier. During the job search, I received an offer but still had other interviews ongoing, encountering different perspectives:&lt;/p&gt;
&lt;p&gt;Perspective A: Since the company has already made an offer, saying that you need to wait until finishing the processes with other companies before making a decision means a lack of desire to join, which is inappropriate.&lt;/p&gt;
&lt;p&gt;Perspective B: There’s nothing wrong with being sincere and telling the other company that you need more time to evaluate different jobs before making a decision.&lt;/p&gt;
&lt;p&gt;I lean towards Perspective B, as being responsible for my life also shows consideration for the other party.&lt;/p&gt;
&lt;p&gt;Then there’s Perspective C: There’s no need to inform about other interview is  ongoing; just say you need more time to consider.&lt;/p&gt;
&lt;p&gt;The reason I prefer Perspective B is that I hope the company I join values reasoning rather than just superficial aspects.&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>主动告知还有其他 Offer 需要时间考虑是坏事吗？</title><link>https://www.webdong.dev/zh-cn/shortpost/is-it-bad-to-inform-there-are-other-offers-need-time-to-consider/#is-it-bad-to-inform-there-are-other-offers-need-time-to-consider/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/is-it-bad-to-inform-there-are-other-offers-need-time-to-consider/#is-it-bad-to-inform-there-are-other-offers-need-time-to-consider/</guid><pubDate>Thu, 17 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;记录最近找到工作早些时间的故事，在求职时因为先拿到 Offer 但还有其他面试在跑，遇见不同观点：&lt;/p&gt;
&lt;p&gt;A 观点：公司既然已经发 Offer，如果说要等跑完其他还在面的公司流程再作出决定，表达没有很想来，是不好的举动。&lt;/p&gt;
&lt;p&gt;B 观点：没有什么不好的地方，态度诚恳告诉对方需要更多时间评估不同工作再决定。&lt;/p&gt;
&lt;p&gt;我会偏向 B 观点，对自己的人生负责也是替对方着想。&lt;/p&gt;
&lt;p&gt;还有 C 观点：不用告知还有在跑其他 Offer，只说需要更多时间考虑就好。&lt;/p&gt;
&lt;p&gt;认为 B 观点更好的原因是因为希望加入的公司是不只看重表面而是讲道理的方式面对事情。&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>主動告知還有其他 Offer 需要時間考慮是壞事嗎？</title><link>https://www.webdong.dev/zh-tw/shortpost/is-it-bad-to-inform-there-are-other-offers-need-time-to-consider/#is-it-bad-to-inform-there-are-other-offers-need-time-to-consider/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/is-it-bad-to-inform-there-are-other-offers-need-time-to-consider/#is-it-bad-to-inform-there-are-other-offers-need-time-to-consider/</guid><pubDate>Thu, 17 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;紀錄最近找到工作早些時間的故事，在求職時因為先拿到 Offer 但還有其他面試在跑，遇見不同觀點：&lt;/p&gt;
&lt;p&gt;A 觀點：公司既然已經發 Offer，如果說要等跑完其他還在面的公司流程再作出決定，表達沒有很想來，是不好的舉動。&lt;/p&gt;
&lt;p&gt;B 觀點：沒有什麼不好的地方，態度誠懇告訴對方需要更多時間評估不同工作再決定。&lt;/p&gt;
&lt;p&gt;我會偏向 B 觀點，對自己的人生負責也是替對方著想。&lt;/p&gt;
&lt;p&gt;還有 C 觀點：不用告知還有在跑其他 Offer，只說需要更多時間考慮就好。&lt;/p&gt;
&lt;p&gt;認為 B 觀點更好的原因是因為希望加入的公司是不只看重表面而是講道理的方式面對事情。&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>Not Comparing Yourself with Others</title><link>https://www.webdong.dev/en/shortpost/finite-and-infinite-games/#finite-and-infinite-games/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/finite-and-infinite-games/#finite-and-infinite-games/</guid><pubDate>Mon, 07 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&quot;It&apos;s not about winning or losing&quot; and &quot;don&apos;t compare yourself to others&quot; used to feel like comforting words, but I gradually realized these phrases reveal a different perspective on competition.&lt;/p&gt;
&lt;p&gt;For example, &quot;I&apos;m better than others because I have good grades&quot; is based on the idea that power is granted by rules (good grades), where those with good grades only care about holding a high position and not being pushed down. However, if the starting point is &quot;studying enriches knowledge,&quot; the focus is not on who has the most knowledge but on exploring the possibilities.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/en/post/finite-and-infinite-games-and-gaming-impotence/&quot;&gt;Finite and Infinite Games and Gaming Impotence&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>请写下一件您认为很重要也很想告诉别人：别和他人比较背后的观点</title><link>https://www.webdong.dev/zh-cn/shortpost/finite-and-infinite-games/#finite-and-infinite-games/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/finite-and-infinite-games/#finite-and-infinite-games/</guid><pubDate>Mon, 07 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;「运动家精神不用在乎输赢」、「别与其他人比较」之前会觉得是安慰人的话，但逐渐发现这些话透漏对竞争抱持不同观点。&lt;/p&gt;
&lt;p&gt;例如「因为读书成绩好所以我比别人优异」，建立在规则（好成绩）赋予权力，成绩好的人只在乎占据高位不要被斗下来，但出发点如果是「因为读书可以丰富学识」，重点不在谁有最多学识，而是探索延续丰富学识的可能性。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/zh-cn/post/finite-and-infinite-games-and-gaming-impotence/&quot;&gt;有限与无限游戏看待电子阳痿&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>請寫下一件您認為很重要也很想告訴別人：別和他人比較背後的觀點</title><link>https://www.webdong.dev/zh-tw/shortpost/finite-and-infinite-games/#finite-and-infinite-games/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/finite-and-infinite-games/#finite-and-infinite-games/</guid><pubDate>Mon, 07 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;「運動家精神不用在乎輸贏」、「別與其他人比較」之前會覺得是安慰人的話，但逐漸發現這些話透漏對競爭抱持不同觀點。&lt;/p&gt;
&lt;p&gt;例如「因為讀書成績好所以我比別人優異」，建立在規則（好成績）賦予權力，成績好的人只在乎佔據高位不要被鬥下來，但出發點如果是「因為讀書可以豐富學識」，重點不在誰有最多學識，而是探索延續豐富學識的可能性。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/zh-tw/post/finite-and-infinite-games-and-gaming-impotence/&quot;&gt;有限與無限遊戲看待電子陽痿&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>Thoughts on Career Choice Factors</title><link>https://www.webdong.dev/en/shortpost/thoughts-on-career-choice-factors/#thoughts-on-career-choice-factors/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/thoughts-on-career-choice-factors/#thoughts-on-career-choice-factors/</guid><pubDate>Sun, 08 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;When chatting with friends about views on career choices, I often base our discussion on three simplified factors: &quot;money, potential, and mood.&quot; A deeper reflection reminds me of the concept of &quot;the meaning of life&quot; (&lt;a href=&quot;https://ja.wikipedia.org/wiki/%E7%94%9F%E3%81%8D%E7%94%B2%E6%96%90&quot;&gt;生き甲斐 IKIGAI&lt;/a&gt;) that I heard in college classes; I&apos;ve forgotten the details, but this chart left quite an impression.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>对于职涯选择因素想法</title><link>https://www.webdong.dev/zh-cn/shortpost/thoughts-on-career-choice-factors/#thoughts-on-career-choice-factors/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/thoughts-on-career-choice-factors/#thoughts-on-career-choice-factors/</guid><pubDate>Sun, 08 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;和朋友聊到对于职涯选择的看法，都依照自己简化的三个因素为出发点讨论：「钱、发展性、心情」。更深层思考想到大学课堂上听到「生活的意义」（&lt;a href=&quot;https://ja.wikipedia.org/wiki/%E7%94%9F%E3%81%8D%E7%94%B2%E6%96%90&quot;&gt;生き甲斐 IKIGAI&lt;/a&gt;）的概念，细节已经忘光了，不过这个图表倒是挺印象深刻。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>對於職涯選擇因素想法</title><link>https://www.webdong.dev/zh-tw/shortpost/thoughts-on-career-choice-factors/#thoughts-on-career-choice-factors/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/thoughts-on-career-choice-factors/#thoughts-on-career-choice-factors/</guid><pubDate>Sun, 08 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;和朋友聊到對於職涯選擇的看法，都會依照自己簡化的三個因素為出發點討論：「錢、發展性、心情」。更深層思考想到大學課堂上聽到「生活的意義」（&lt;a href=&quot;https://ja.wikipedia.org/wiki/%E7%94%9F%E3%81%8D%E7%94%B2%E6%96%90&quot;&gt;生き甲斐 IKIGAI&lt;/a&gt;）的概念，細節已經忘光了，不過這個圖表倒是挺印象深刻。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>Thoughts on Presenting Resume Statistics</title><link>https://www.webdong.dev/en/shortpost/opinions-on-displaying-achievement-statistics/#opinions-on-displaying-achievement-statistics/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/opinions-on-displaying-achievement-statistics/#opinions-on-displaying-achievement-statistics/</guid><pubDate>Wed, 14 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Usually, when writing about work achievements, if there are data, we present the data; if there are no data, we point out the contributions so that the other understands the value you can bring, for example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Changing process A reduced CI time by 30%&lt;/li&gt;
&lt;li&gt;Implementing B reduced communication costs by 30%&lt;/li&gt;
&lt;li&gt;Optimizing website loading speed by 2 seconds, Reduced Lighthouse FCP by 30%, LCP by 45%&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sometimes, it can be quite troublesome to quantify achievements as it is an art in itself because many statistics lack meaning:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The context cannot be clearly communicated. (Keeping resumes concise inevitably omits details)&lt;/li&gt;
&lt;li&gt;Can the other party understand the value brought by the numbers? (Perhaps it would be clearer to state how much money is saved or earned, but that involves too many unrelated variables)&lt;/li&gt;
&lt;li&gt;There’s no need or time to collect statistics (precise statistics also incur costs, and can be difficult to quantify)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Achievements with clear rules can be stated, like TOEIC scores, but more often, the real world involves various trade-offs and premises. One-sided facts can be quantified, but they serve merely as conversational hooks and are not the main point. It is best to have a reasonable explanation behind the achievements.&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>对于展示履历成果统计的看法</title><link>https://www.webdong.dev/zh-cn/shortpost/opinions-on-displaying-achievement-statistics/#opinions-on-displaying-achievement-statistics/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/opinions-on-displaying-achievement-statistics/#opinions-on-displaying-achievement-statistics/</guid><pubDate>Wed, 14 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;通常撰写工作上的成果有数据就写数据，没有数据就点出贡献，对方才知道你能带来的价值，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;改变 A 流程减少 30% CI 时间&lt;/li&gt;
&lt;li&gt;导入 B 减少 30% 沟通成本&lt;/li&gt;
&lt;li&gt;最佳化网站载入速度 2 秒、Lighthouse FCP 降低 30%、LCP 降低 45%。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;有时候会很困扰量化成果也是一门学问，因为很多数值片面的量化其实没有太大的意义：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;上下文无法交待清楚。（履历保持精简，势必舍弃细节）&lt;/li&gt;
&lt;li&gt;对方能否明白数值带来的价值？（或许直接写开源节流多少钱会更直白，但又牵扯到太多无关变因）&lt;/li&gt;
&lt;li&gt;没必要没时间统计（精确统计也花费成本，甚至难以量化）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;规则明确的成就统计可以写，像是多益分数，但更多时候现实世界总是包含各种取舍与前提。片面的事实可以被量化，但它们只是个话题钩子并不是重点，声明的成果背后最好要有说得通的解释。&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>對於展示履歷成果統計的看法</title><link>https://www.webdong.dev/zh-tw/shortpost/opinions-on-displaying-achievement-statistics/#opinions-on-displaying-achievement-statistics/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/opinions-on-displaying-achievement-statistics/#opinions-on-displaying-achievement-statistics/</guid><pubDate>Wed, 14 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;通常撰寫工作上的成果有數據就寫數據，沒數據就點出貢獻，對方才知道你能帶來的價值，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;改變 A 流程減少 30% CI 時間&lt;/li&gt;
&lt;li&gt;導入 B 減少 30% 溝通成本&lt;/li&gt;
&lt;li&gt;最佳化網站載入速度 2 秒、Lighthouse FCP 降低 30%、LCP 降低 45%。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;有時候會很困擾量化成果也是一門學問，因為很多數值片面的量化其實沒有太大的意義：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;上下文無法交待清楚。（履歷保持精簡，勢必捨棄細節）&lt;/li&gt;
&lt;li&gt;對方能否明白數值帶來的價值？（或許直接寫開源節流多少錢會更直白，但又牽扯到太多無關變因）&lt;/li&gt;
&lt;li&gt;沒必要沒時間統計（精確統計也花費成本，甚至難以量化）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;規則明確的成就統計可以寫，像是多益分數，但更多時候現實世界總是包含各種取捨與前提。片面的事實可以被量化，但它們只是個話題鉤子並不是重點，聲明的成果背後最好要有說得通的解釋。&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>Discussion on Equal Partnership from &quot;Salary Adjustment After Probation Period&quot;</title><link>https://www.webdong.dev/en/shortpost/equal-partnership/#equal-partnership/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/equal-partnership/#equal-partnership/</guid><pubDate>Tue, 13 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;When you&apos;re job hunting, you’ll often hear something like: “The salary will be adjusted after the probation period.” On the surface, it sounds like a raise is coming later, but flip it around, and it could also mean you&apos;re getting underpaid during the probation.&lt;/p&gt;
&lt;p&gt;The thing is, job hunting is a two-way street. The company is choosing you, but you’re also choosing the company. Ideally, it should be a fair exchange. Sometimes companies believe that the risk of hiring someone new should fall on the candidate, but honestly, you don’t have to accept that without question. Both sides should come to the table as equals.&lt;/p&gt;
&lt;p&gt;In many cases, this whole “salary adjustment after probation” feels more like a negotiation tactic than anything else. Sure, it seems like a logical way to manage risk — but should we just accept it blindly? It’s definitely something worth thinking twice about.&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>从「试用期后调薪」讨论对等的合作关系</title><link>https://www.webdong.dev/zh-cn/shortpost/equal-partnership/#equal-partnership/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/equal-partnership/#equal-partnership/</guid><pubDate>Tue, 13 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;找工作期间谈薪资几乎都会遇到一种说法是：「在试用期后会调薪」，美化来说是考核后加薪，负面解读则是试用期减薪。&lt;/p&gt;
&lt;p&gt;要了解公司选择你而你也选择公司，求职理想的状态是双向合理的利益交换，公司主张新入职的风险应该由求职者承担，求职者可以也应该主张回去，双方都应该以对等为原则展开合作关系。&lt;/p&gt;
&lt;p&gt;更多时候试用期后调薪更像是一种资方的谈判话术，看似合理的转移风险，但盲目接受是正确的吗？可以重新思考。&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>從「試用期後調薪」討論對等的合作關係</title><link>https://www.webdong.dev/zh-tw/shortpost/equal-partnership/#equal-partnership/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/equal-partnership/#equal-partnership/</guid><pubDate>Tue, 13 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;找工作期間談薪資幾乎都會遇到一種說法是：「在試用期後會調薪」，美化來說是考核後加薪，負面解讀則是試用期減薪。&lt;/p&gt;
&lt;p&gt;要了解公司選擇你而你也選擇公司，求職理想的狀態是雙向合理的利益交換，公司主張新入職的風險應該由求職者承擔，求職者可以也應該主張回去，雙方都應該以對等為原則展開合作關係。&lt;/p&gt;
&lt;p&gt;更多時候試用期後調薪更像是一種資方的談判話術，看似合理的轉移風險，但盲目接受是正確的嗎？可以重新思考。&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>The Most Unique Interview Experience</title><link>https://www.webdong.dev/en/shortpost/interesting-interview/#interesting-interview/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/interesting-interview/#interesting-interview/</guid><pubDate>Thu, 08 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Recently, I encountered a unique experience during an interview where the whole company&apos;s front-end and back-end team played a Switch game together. The other person got so into it that they accidentally knocked the console off the table. It was a startup with a very lively and open team atmosphere.&lt;/p&gt;
&lt;p&gt;The purpose was said to be to understand how one handles pressure and communicates within a team. I must admit that once I got into the game, I really couldn&apos;t think too much about it. It wasn&apos;t until after playing that I realized I was still in an interview.&lt;/p&gt;
&lt;p&gt;My reflection afterward was that since it was a live interview, I should not focus on the outcome but rather on the process. One shouldn&apos;t apply previous best strategies directly just because they have played before; each team has its own suitable approach.&lt;/p&gt;
&lt;p&gt;Of course, you don’t have to overthink everything. Every individual is unique, and as long as the game and collaboration are fun, there is no only answer.&lt;/p&gt;
&lt;p&gt;A great team collaboration game! &lt;a href=&quot;https://store.steampowered.com/app/1016920/Unrailed&quot;&gt;Unrailed!&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>最奇特的面试经验</title><link>https://www.webdong.dev/zh-cn/shortpost/interesting-interview/#interesting-interview/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/interesting-interview/#interesting-interview/</guid><pubDate>Thu, 08 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;近期面试遇到和整家公司前后端配合打 Switch 游戏的奇特经验，对方玩的太激动还不小心撞到机台滚下桌，是个团队气氛很活泼开放的新创。&lt;/p&gt;
&lt;p&gt;目的说是为了了解面对压力与团队的相处沟通模式。必须说我进入游戏状态还真的没办法想太多，玩完后才想到还在面试。&lt;/p&gt;
&lt;p&gt;结束后给自己的反思是既然是现场面试就不要在乎结果而是过程，不要因为玩过就直接套用先前的最佳打法，每个团队有合适的策略。&lt;/p&gt;
&lt;p&gt;当然也可以不用事事都想太多，每个人个性都是独特的，游戏和合作好玩就好，不存在唯一的答案。&lt;/p&gt;
&lt;p&gt;很好的团队合作游戏！ &lt;a href=&quot;https://store.steampowered.com/app/1016920/Unrailed&quot;&gt;Unrailed!&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>最奇特的面試經驗</title><link>https://www.webdong.dev/zh-tw/shortpost/interesting-interview/#interesting-interview/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/interesting-interview/#interesting-interview/</guid><pubDate>Thu, 08 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;近期面試遇到和整公司前後端配合打 Switch 遊戲的奇特經驗，對方玩的太激動還不小心撞到機台滾下桌，是個團隊氣氛很活潑開放的新創。&lt;/p&gt;
&lt;p&gt;目的說是為了了解面對壓力與團隊的相處溝通模式。必須說我進入遊戲狀態還真的沒辦法想太多，玩完後才想到還在面試。&lt;/p&gt;
&lt;p&gt;結束後給自己的反思是既然是現場面試就不要在乎結果而是過程，不要因為玩過就直接套用先前的最佳打法，每個團隊有合適的策略。&lt;/p&gt;
&lt;p&gt;當然也可以不用事事都想太多，每個人個性都是獨特的，遊戲和合作好玩就好，不存在唯一的答案。&lt;/p&gt;
&lt;p&gt;很好的團隊合作遊戲！ &lt;a href=&quot;https://store.steampowered.com/app/1016920/Unrailed&quot;&gt;Unrailed!&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>Linux Snap (VSCode) Cannot Input Chinese Characters</title><link>https://www.webdong.dev/en/shortpost/linux-snap-unable-to-input-chinese-character/#linux-snap-unable-to-input-chinese-character/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/linux-snap-unable-to-input-chinese-character/#linux-snap-unable-to-input-chinese-character/</guid><pubDate>Wed, 19 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Recently, I fixed up my computer and installed Ubuntu for daily use, and used the App Center (&lt;a href=&quot;https://ivonblog.com/posts/linux-snap-pros-and-cons/&quot;&gt;Snap&lt;/a&gt;) to install commonly used apps like VSCode. Later, I found out that I couldn&apos;t input Chinese characters correctly...&lt;/p&gt;
&lt;p&gt;The unique sandbox mechanism causes its apps not to properly access system settings. It seems that a complete rebuild is necessary to resolve this issue, which might explain why the &lt;a href=&quot;https://github.com/microsoft/vscode/issues/96041&quot;&gt;related issue&lt;/a&gt; discussion for VSCode has been ongoing since 2020 and is still not resolved. Firefox and Discord do not have this problem.&lt;/p&gt;
&lt;p&gt;Additionally, trying out the &lt;a href=&quot;https://zed.dev/&quot;&gt;Zed editor&lt;/a&gt; also has the issue of not being able to input Chinese characters, yet another question to be solve...&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://leimao.github.io/blog/Multilingual-Issues-Snap-Applications-Linux/&quot;&gt;Multilingual Issues with Snap Applications on Linux&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>Linux Snap (VSCode) 无法输入中文字</title><link>https://www.webdong.dev/zh-cn/shortpost/linux-snap-unable-to-input-chinese-character/#linux-snap-unable-to-input-chinese-character/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/linux-snap-unable-to-input-chinese-character/#linux-snap-unable-to-input-chinese-character/</guid><pubDate>Wed, 19 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;近期整修电脑装上了 Ubuntu 作为日常用处，并用 App Center (&lt;a href=&quot;https://ivonblog.com/posts/linux-snap-pros-and-cons/&quot;&gt;Snap&lt;/a&gt;) 安装常用的 App 如 VSCode，事后才发现中文字都没办法正确输入……&lt;/p&gt;
&lt;p&gt;基于它独特的沙盒机制导致其 App 没办法正确取得系统设置，看起来要整包重新构建才能解决，或许这也是为什么 VSCode &lt;a href=&quot;https://github.com/microsoft/vscode/issues/96041&quot;&gt;相关问题&lt;/a&gt;讨论从 2020 开启到至今都还未解决。Firefox 或 Discord 就没这样的问题。&lt;/p&gt;
&lt;p&gt;另外试试水温的 &lt;a href=&quot;https://zed.dev/&quot;&gt;Zed 编辑器&lt;/a&gt; 也有无法输入中文的问题，又是一个坑要填……&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://leimao.github.io/blog/Multilingual-Issues-Snap-Applications-Linux/&quot;&gt;Multilingual Issues with Snap Applications on Linux&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>Linux Snap (VSCode) 無法輸入中文字</title><link>https://www.webdong.dev/zh-tw/shortpost/linux-snap-unable-to-input-chinese-character/#linux-snap-unable-to-input-chinese-character/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/linux-snap-unable-to-input-chinese-character/#linux-snap-unable-to-input-chinese-character/</guid><pubDate>Wed, 19 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;近期整修電腦裝上了 Ubuntu 做為日常用途，並用 App Center (&lt;a href=&quot;https://ivonblog.com/posts/linux-snap-pros-and-cons/&quot;&gt;Snap&lt;/a&gt;) 安裝常用的 App 如 VSCode，事後才發覺中文字都沒辦法正確輸入……&lt;/p&gt;
&lt;p&gt;基於它獨特的沙盒機制導致其 App 沒辦法正確取得系統設定，看起來要整包重新建構才能解決，或許這也是為什麼 VSCode &lt;a href=&quot;https://github.com/microsoft/vscode/issues/96041&quot;&gt;相關問題&lt;/a&gt;討論從 2020 開啟到至今都還未解決。Firefox 或 Discord 就沒這樣的問題。&lt;/p&gt;
&lt;p&gt;另外試試水溫的 &lt;a href=&quot;https://zed.dev/&quot;&gt;Zed 編輯器&lt;/a&gt; 也有無法輸入中文的問題，又是一個坑要填……&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://leimao.github.io/blog/Multilingual-Issues-Snap-Applications-Linux/&quot;&gt;Multilingual Issues with Snap Applications on Linux&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>Thoughts on Validating Exact Type Equality in TypeScript</title><link>https://www.webdong.dev/en/shortpost/typescript-exact-type/#typescript-exact-type/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/typescript-exact-type/#typescript-exact-type/</guid><pubDate>Thu, 20 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;pre&gt;&lt;code&gt;type User = {
  name: string;
};

function printUser(user: User) {
  console.log(user);
}

printUser({ name: &apos;Joe&apos;, email: &apos;joe@email.com&apos; });
// ❌ Error: Object literal may only specify known properties, and &apos;email&apos; does not exist in type &apos;AllowedType&apos;.

const userData = {
  name: &apos;Joe&apos;,
  email: &apos;joe@email.com&apos;,
};

printUser(userData);
// ✅ No error
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;TypeScript follows a Structural Type system, meaning that if two types have the same structure, in this case, &quot;objects with the same property names and types&quot; they are considered the same, even if they have different type names. Therefore, when passing a variable to a function, TypeScript determines type compatibility based on structure; as long as the variable contains all the properties required by the function, they are compatible.&lt;/p&gt;
&lt;p&gt;However, when directly passing an &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#object_literals&quot;&gt;object literal&lt;/a&gt; to a function, TypeScript performs stricter checks, requiring the object literal to fully conform to the type definition of the function parameters due to the concept of &lt;a href=&quot;https://basarat.gitbook.io/typescript/type-system/freshness&quot;&gt;Freshness&lt;/a&gt;. In other words, this is Strict Object Literal Checking.&lt;/p&gt;
&lt;p&gt;This checking mechanism is primarily &lt;strong&gt;to enhance the accuracy and reliability of the code, avoiding spelling mistakes&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If you want TypeScript to perform strict type checking, here is a generic workaround for &lt;code&gt;Exact&lt;/code&gt; that can be used:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;type Exact&amp;lt;A, B&amp;gt; = A extends B ? (B extends A ? A : never) : never;

type User = {
  name: string;
};

function printUser&amp;lt;T&amp;gt;(user: Exact&amp;lt;T, User&amp;gt;) {
  console.log(user);
}

printUser({ name: &apos;Joe&apos;, email: &apos;joe@email.com&apos; });
// ❌ Error: Argument of type &apos;{ name: string; email: string; }&apos; is not assignable to parameter of type &apos;never&apos;.

const userData = {
  name: &apos;Joe&apos;,
  email: &apos;joe@email.com&apos;,
};

printUser(userData);
// ❌ Error: Argument of type &apos;{ name: string; email: string; }&apos; is not assignable to parameter of type &apos;never&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Further Reading:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.petermekhaeil.com/til/ts-exact-types/&quot;&gt;TypeScript Exact Types&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>TypeScript</category></item><item><title>TypeScript 验证类型是否完全相同的思考（Freshness 概念）</title><link>https://www.webdong.dev/zh-cn/shortpost/typescript-exact-type/#typescript-exact-type/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/typescript-exact-type/#typescript-exact-type/</guid><pubDate>Thu, 20 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;pre&gt;&lt;code&gt;type User = {
  name: string;
};

function printUser(user: User) {
  console.log(user);
}

printUser({ name: &apos;Joe&apos;, email: &apos;joe@email.com&apos; });
// ❌ Error: Object literal may only specify known properties, and &apos;email&apos; does not exist in type &apos;AllowedType&apos;.

const userData = {
  name: &apos;Joe&apos;,
  email: &apos;joe@email.com&apos;,
};

printUser(userData);
// ✅ No error
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;TypeScript 遵循 Structural Type（结构类型系统），意味着如果两个类型有相同的结构，在这里的案例指「对象有相同的属性名称与类型」会被认为是相同的，即使是不同的类型名称，因此当传递一个变量给函数时，TypeScript 会根据结构来判断类型兼容性，只要变量包含函数所需的所有属性，就认为它们是兼容的。&lt;/p&gt;
&lt;p&gt;但当直接传递一个对象字面量（&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#object_literals&quot;&gt;Object Literal&lt;/a&gt;）给函数时，TypeScript 会进行更严格的检查，要求对象字面量完全符合函数参数的类型定义由于 &lt;a href=&quot;https://basarat.gitbook.io/typescript/type-system/freshness&quot;&gt;Freshness&lt;/a&gt; 的概念，换句话说就是 Strict Object Literal Checking。&lt;/p&gt;
&lt;p&gt;这种检查机制主要是&lt;strong&gt;为了提高代码的准确性和可靠性，避免拼写错误&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;如果希望 TypeScript 进行严格的类型检查，这里是一个 &lt;code&gt;Exact&lt;/code&gt; 的泛型变通方案可以采用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;type Exact&amp;lt;A, B&amp;gt; = A extends B ? (B extends A ? A : never) : never;

type User = {
  name: string;
};

function printUser&amp;lt;T&amp;gt;(user: Exact&amp;lt;T, User&amp;gt;) {
  console.log(user);
}

printUser({ name: &apos;Joe&apos;, email: &apos;joe@email.com&apos; });
// ❌ Error: Argument of type &apos;{ name: string; email: string; }&apos; is not assignable to parameter of type &apos;never&apos;.

const userData = {
  name: &apos;Joe&apos;,
  email: &apos;joe@email.com&apos;,
};

printUser(userData);
// ❌ Error: Argument of type &apos;{ name: string; email: string; }&apos; is not assignable to parameter of type &apos;never&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;延伸阅读：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.petermekhaeil.com/til/ts-exact-types/&quot;&gt;TypeScript Exact Types&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>TypeScript</category></item><item><title>TypeScript 驗證型別是否完全相同的思考（Freshness 概念）</title><link>https://www.webdong.dev/zh-tw/shortpost/typescript-exact-type/#typescript-exact-type/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/typescript-exact-type/#typescript-exact-type/</guid><pubDate>Thu, 20 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;pre&gt;&lt;code&gt;type User = {
  name: string;
};

function printUser(user: User) {
  console.log(user);
}

printUser({ name: &apos;Joe&apos;, email: &apos;joe@email.com&apos; });
// ❌ Error: Object literal may only specify known properties, and &apos;email&apos; does not exist in type &apos;AllowedType&apos;.

const userData = {
  name: &apos;Joe&apos;,
  email: &apos;joe@email.com&apos;,
};

printUser(userData);
// ✅ No error
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;TypeScript 遵循 Structural Type（結構型別系統），意味著如果兩個型別有相同的結構，在這裡的案例指「物件有相同的屬性名稱與類型」會被認為是相同的，即使是不同的型別名稱，因此當傳遞一個變數給函式時，TypeScript 會根據結構來判斷型別相容性，只要變數包含函數所需的所有屬性，就認為它們是相容的。&lt;/p&gt;
&lt;p&gt;但當直接傳遞一個物件實字（&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#object_literals&quot;&gt;Object Literal&lt;/a&gt;）給函數時，TypeScript 會進行更嚴格的檢查，要求物件字面量完全符合函數參數的型別定義由於 &lt;a href=&quot;https://basarat.gitbook.io/typescript/type-system/freshness&quot;&gt;Freshness&lt;/a&gt; 的概念，換句話說就是 Strict Object Literal Checking。&lt;/p&gt;
&lt;p&gt;這種檢查機制主要是&lt;strong&gt;為了提高程式碼的準確性和可靠性，避免拼寫錯誤&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;如果希望 TypeScript 進行嚴格的型別檢查，這裡是一個 &lt;code&gt;Exact&lt;/code&gt; 的泛型變通方案可以採用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;type Exact&amp;lt;A, B&amp;gt; = A extends B ? (B extends A ? A : never) : never;

type User = {
  name: string;
};

function printUser&amp;lt;T&amp;gt;(user: Exact&amp;lt;T, User&amp;gt;) {
  console.log(user);
}

printUser({ name: &apos;Joe&apos;, email: &apos;joe@email.com&apos; });
// ❌ Error: Argument of type &apos;{ name: string; email: string; }&apos; is not assignable to parameter of type &apos;never&apos;.

const userData = {
  name: &apos;Joe&apos;,
  email: &apos;joe@email.com&apos;,
};

printUser(userData);
// ❌ Error: Argument of type &apos;{ name: string; email: string; }&apos; is not assignable to parameter of type &apos;never&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;延伸閱讀：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.petermekhaeil.com/til/ts-exact-types/&quot;&gt;TypeScript Exact Types&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>TypeScript</category></item><item><title>Create a Native Accordion with Details and Summary (with Animation!)</title><link>https://www.webdong.dev/en/shortpost/build-a-native-accordion/#build-a-native-accordion/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/build-a-native-accordion/#build-a-native-accordion/</guid><pubDate>Wed, 19 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;An accordion typically refers to a UI pattern with a series of vertically stacked headings that can expand and collapse different information. In the past, this required JavaScript to manage the open and close states and animation.&lt;/p&gt;
&lt;p&gt;Fortunately, HTML has a new syntax &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt; that helps us quickly achieve similar functionality, along with new CSS properties like &lt;code&gt;interpolate-size&lt;/code&gt; and &lt;code&gt;transition-behavior&lt;/code&gt; to create smooth expand and collapse animations.&lt;/p&gt;
&lt;p&gt;I read the relevant documentation and created a minimal viable accordion with animation. It&apos;s worth noting that the animation-related syntax is primarily supported by Chromium-based browsers, making it a nice feature to progressively enhance.&lt;/p&gt;
&lt;p&gt;Further reading: &lt;a href=&quot;https://www.webdong.dev/en/post/build-a-native-accordion-using-html-details-and-summary/&quot;&gt;Create a Native Accordion with Details and Summary (with Animation!)&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>HTML</category></item><item><title>使用 Details 与 Summary 制作原生手风琴 (含收合动画！)</title><link>https://www.webdong.dev/zh-cn/shortpost/build-a-native-accordion/#build-a-native-accordion/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/build-a-native-accordion/#build-a-native-accordion/</guid><pubDate>Wed, 19 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;手风琴通常指一系列垂直堆叠标题可用于展开收合不同信息的 UI 模式，在早期会需要用 JS 制作开合状态，动画更是需要计算开合后的高度并制作动画。&lt;/p&gt;
&lt;p&gt;幸亏在 HTML 当中有项新颖的语法 &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; 和 &lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt; 可以帮助我们快速实现类似的功能，并且配合上新的 CSS interpolate-size 和 transition-behavior 制作滑顺的展开闭合动画。&lt;/p&gt;
&lt;p&gt;翻了一下相关文件并制作了一个最小可行的手风琴含动画。要留意动画相关语法大致只有 Chromium 引擎浏览器支持，是个不错可以渐进增强加入的小功能。&lt;/p&gt;
&lt;p&gt;延伸阅读：&lt;a href=&quot;https://www.webdong.dev/zh-cn/post/build-a-native-accordion-using-html-details-and-summary/&quot;&gt;使用 Details 与 Summary 制作原生手风琴 (含收合动画！)&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>HTML</category></item><item><title>使用 Details 與 Summary 製作原生手風琴 (含收合動畫！)</title><link>https://www.webdong.dev/zh-tw/shortpost/build-a-native-accordion/#build-a-native-accordion/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/build-a-native-accordion/#build-a-native-accordion/</guid><pubDate>Wed, 19 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;手風琴通常指一系列垂直堆疊標題可用於展開收合不同資訊的 UI 模式，在早期會需要用 JS 製作開合狀態，動畫更是需要計算開合後的高度並製作動畫。&lt;/p&gt;
&lt;p&gt;幸虧在 HTML 當中有項新穎的語法 &lt;code&gt;&amp;lt;details&amp;gt;&lt;/code&gt; 和 &lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt; 可以幫助我們快速實現類似的功能，並且配合上新的 CSS interpolate-size 和 transition-behavior 製作滑順的展開閉合動畫。&lt;/p&gt;
&lt;p&gt;翻了一下相關文件並製作了一個最小可行的手風琴含動畫。要留意動畫相關語法大致只有 Chromium 引擎瀏覽器支援，是個不錯可以漸進增強加入的小功能。&lt;/p&gt;
&lt;p&gt;延伸閱讀：&lt;a href=&quot;https://www.webdong.dev/post/build-a-native-accordion-using-html-details-and-summary/&quot;&gt;使用 Details 與 Summary 製作原生手風琴 (含收合動畫！)&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>HTML</category></item><item><title>Optimizing Assets (preload/fetch/dns-prefetch/preconnect)</title><link>https://www.webdong.dev/en/shortpost/optimizing-assets/#optimizing-assets/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/optimizing-assets/#optimizing-assets/</guid><pubDate>Sat, 15 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;During a previous interview, I was asked about a SPA website I created early on, where the image loading experience was not very good after page transitions. I shared all the answers I could think of 😅, and while I managed to answer a bit, I wasn&apos;t very confident since I hadn&apos;t used them much. My responses included:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Images should have width and height set to avoid CLS (Cumulative Layout Shift)&lt;/li&gt;
&lt;li&gt;Images can add a skeleton or loader to indicate loading&lt;/li&gt;
&lt;li&gt;Initially display smaller images, replacing them with the actual larger images at the right time&lt;/li&gt;
&lt;li&gt;Images can use &lt;code&gt;fetchpriority&lt;/code&gt; to prioritize resource loading&lt;/li&gt;
&lt;li&gt;Inline SVG or data URI can be used for images&lt;/li&gt;
&lt;li&gt;Use preload to pre-load critical images...?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So I revisited the relevant documents to understand how browsers optimize resource loading through the following methods:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;preload&lt;/li&gt;
&lt;li&gt;prefetch&lt;/li&gt;
&lt;li&gt;dns-prefetch&lt;/li&gt;
&lt;li&gt;preconnect&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Further reading:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.webdong.dev/en/post/optimizing-assets-loading-in-advance/&quot;&gt;Optimizing Assets (preload/fetch/dns-prefetch/preconnect)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Images are a major performance bottleneck; I previously wrote about image performance optimization, which you can also check out: &lt;a href=&quot;https://www.webdong.dev/en/post/all-you-need-to-know-about-optimal-images/&quot;&gt;All the tips for optimizing web images are written here!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Web Performance</category></item><item><title>优化网页资产加载 (preload, prefetch, dns-prefetch, preconnect)</title><link>https://www.webdong.dev/zh-cn/shortpost/optimizing-assets/#optimizing-assets/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/optimizing-assets/#optimizing-assets/</guid><pubDate>Sat, 15 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;先前面试时被问到早期制作的一个 SPA 网站在换页后图片加载体验不太好的问题，当时把脑袋能想的所有答案都提出来了 😅，最终有答到一点，但太少用所以回答的不是很确定，当时回答：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;图片应设置宽高以避免 CLS （累积布局偏移）&lt;/li&gt;
&lt;li&gt;图片可以添加 Skeleton 或 Loader 示意加载中&lt;/li&gt;
&lt;li&gt;首先显示较小的图，适当时机再替换实际大张的图&lt;/li&gt;
&lt;li&gt;图片可以使用 &lt;code&gt;fetchpriority&lt;/code&gt; 安排资源加载优先程度&lt;/li&gt;
&lt;li&gt;图片内嵌使用 inline SVG 或 data URI&lt;/li&gt;
&lt;li&gt;使用 Preload 预先加载关键图片……？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以重新翻了一下相关文件，了解浏览器如何通过以下方法来优化资源的加载：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;preload&lt;/li&gt;
&lt;li&gt;prefetch&lt;/li&gt;
&lt;li&gt;dns-prefetch&lt;/li&gt;
&lt;li&gt;preconnect&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;延伸阅读：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.webdong.dev/zh-cn/post/optimizing-assets-loading-in-advance/&quot;&gt;使用 preload、prefetch、dns-prefetch、preconnect 最佳化资源加载顺序！&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;图片是性能的重灾区，先前写过图片的性能优化研究也可以看看：&lt;a href=&quot;https://www.webdong.dev/zh-cn/post/all-you-need-to-know-about-optimal-images/&quot;&gt;所有优化网页图片的技巧都写在这了！&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Web Performance</category></item><item><title>最佳化網頁資產載入 (preload, prefetch, dns-prefetch, preconnect)</title><link>https://www.webdong.dev/zh-tw/shortpost/optimizing-assets/#optimizing-assets/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/optimizing-assets/#optimizing-assets/</guid><pubDate>Sat, 15 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;先前面試時被問到早期製作的一個 SPA 網站在換頁後圖片載入體驗不太好的問題，當時把腦袋能想的所有答案都提出來了 😅，最終有答到一點，但太少用所以回答的不是很確定，當時回答：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;圖片應設定寬高以避免 CLS （累積布局偏移）&lt;/li&gt;
&lt;li&gt;圖片可以添加 Skeleton 或 Loader 示意加載中&lt;/li&gt;
&lt;li&gt;首先顯示較小的圖，適當時機再替換實際大張的圖&lt;/li&gt;
&lt;li&gt;圖片可以使用 &lt;code&gt;fetchpriority&lt;/code&gt; 安排資源載入優先程度&lt;/li&gt;
&lt;li&gt;圖片內嵌使用 inline SVG 或 data URI&lt;/li&gt;
&lt;li&gt;使用 Preload 預先加載關鍵圖片……？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以重新翻了一下相關文件，了解瀏覽器如何透過以下方法來最佳化資源的加載：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;preload&lt;/li&gt;
&lt;li&gt;prefetch&lt;/li&gt;
&lt;li&gt;dns-prefetch&lt;/li&gt;
&lt;li&gt;preconnect&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;延伸閱讀：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.webdong.dev/post/optimizing-assets-loading-in-advance/&quot;&gt;使用 preload、prefetch、dns-prefetch、preconnect 最佳化資源載入順序！&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;圖片是效能的重災區，先前寫過圖片的效能最佳化研究也可以看看：&lt;a href=&quot;https://www.webdong.dev/post/all-you-need-to-know-about-optimal-images/&quot;&gt;所有最佳化網頁圖片的技巧都寫在這了！&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Web Performance</category></item><item><title>Is TypeScript a Linter? How to View TS?</title><link>https://www.webdong.dev/en/shortpost/about-typescript-is-it-a-linter/#about-typescript-is-it-a-linter/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/about-typescript-is-it-a-linter/#about-typescript-is-it-a-linter/</guid><pubDate>Tue, 11 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;By definition, the term Linter usually refers to a tool for static code analysis that checks for specific writing styles. For example, ESLint is the most widely used Linter in the JS ecosystem, helping you check for anti-patterns or dead and outdated code, among other things.&lt;/p&gt;
&lt;p&gt;When it comes to TypeScript, it is often imagined as a separate language that requires learning. This idea previously caused me a lot of doubts before adopting or learning it.&lt;/p&gt;
&lt;p&gt;TypeScript&apos;s non-invasive design allows it to coexist with JS. As a superset of JS, explaining TS from a Linter&apos;s perspective becomes much easier, as TS is essentially JS but with type checks.&lt;/p&gt;
&lt;p&gt;It can be easily adopted and just as easily removed. Writing TS is equivalent to writing JS, but it requires you to have an understanding of types and commit to maintenance. It is essential for medium to large projects.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.totaltypescript.com/is-typescript-just-a-linter&quot;&gt;Is TypeScript Just A Linter? - TotalTypeScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=cEMSGF6hGmg&quot;&gt;The Thing Nobody Says About TypeScript - Theo-t3.gg&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>TypeScript</category></item><item><title>TypeScript 是个 Linter 吗？怎么看待 TS？</title><link>https://www.webdong.dev/zh-cn/shortpost/about-typescript-is-it-a-linter/#about-typescript-is-it-a-linter/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/about-typescript-is-it-a-linter/#about-typescript-is-it-a-linter/</guid><pubDate>Tue, 11 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;定义上 Linter 这个词意思通常是对代码静态执行检查的工具用来检测特定的写作风格，像是 ESLint 就是 JS 生态内最广泛使用的 Linter，替你检查有没有反模式或死掉过时的代码……等事情。&lt;/p&gt;
&lt;p&gt;而说到 TypeScript 通常会想象是一门独立的语言习惯要学习，这样的想法在之前也让我在导入或学习前有很多疑虑。&lt;/p&gt;
&lt;p&gt;TypeScript 不侵略性的设计让它能够与 JS 共进共存，作为一个 JS 的超集，从 Linter 的角度解释 TS 会轻松很多，因为 TS 就是 JS 但类型上会替你把关。&lt;/p&gt;
&lt;p&gt;可以轻易导入也可以轻易取消，写 TS 就等于写 JS 但要求你对类型有认知且投入维护，在中大型项目可说是必备。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.totaltypescript.com/is-typescript-just-a-linter&quot;&gt;Is TypeScript Just A Linter? - TotalTypeScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=cEMSGF6hGmg&quot;&gt;The Thing Nobody Says About TypeScript - Theo-t3.gg&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>TypeScript</category></item><item><title>TypeScript 是個 Linter 嗎？怎麼看待 TS？</title><link>https://www.webdong.dev/zh-tw/shortpost/about-typescript-is-it-a-linter/#about-typescript-is-it-a-linter/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/about-typescript-is-it-a-linter/#about-typescript-is-it-a-linter/</guid><pubDate>Tue, 11 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;定義上 Linter 這個詞意思通常是對代碼靜態執行檢查的工具用來檢測特定的寫作風格，像是 ESLint 就是 JS 生態內最廣泛使用的 Linter，替你檢查有沒有反模式或死掉過時的代碼……等事情。&lt;/p&gt;
&lt;p&gt;而說到 TypeScript 通常會想像是一門獨立的語言習慣要學習，這樣的想法在之前也讓我在導入或學習前有很多疑慮。&lt;/p&gt;
&lt;p&gt;TypeScript 不侵略性的設計讓它能夠與 JS 共進共存，作為一個 JS 的超集，從 Linter 的角度解釋 TS 會輕鬆很多，因為 TS 就是 JS 但型別上會替你把關。&lt;/p&gt;
&lt;p&gt;可以輕易導入也可以輕易取消，寫 TS 就等於寫 JS 但要求你對型別有認知且投入維護，在中大型專案可說是必備。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.totaltypescript.com/is-typescript-just-a-linter&quot;&gt;Is TypeScript Just A Linter? - TotalTypeScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=cEMSGF6hGmg&quot;&gt;The Thing Nobody Says About TypeScript - Theo-t3.gg&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>TypeScript</category></item><item><title>Find Various Code Smell Patterns - Code Smells Catalog</title><link>https://www.webdong.dev/en/shortpost/code-smells-catalog/#code-smells-catalog/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/code-smells-catalog/#code-smells-catalog/</guid><pubDate>Tue, 04 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I forgot where I originally found this information, documenting various code smell patterns:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Attributes&lt;/li&gt;
&lt;li&gt;Classes&lt;/li&gt;
&lt;li&gt;Types&lt;/li&gt;
&lt;li&gt;Their relationships&lt;/li&gt;
&lt;li&gt;Problems caused&lt;/li&gt;
&lt;li&gt;Refactoring methods&lt;/li&gt;
&lt;li&gt;History&lt;/li&gt;
&lt;li&gt;Examples&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://luzkan.github.io/smells/&quot;&gt;Code Smells Catalog&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Share</category></item><item><title>记录大量代码异味模式的网站 - Code Smells Catalog</title><link>https://www.webdong.dev/zh-cn/shortpost/code-smells-catalog/#code-smells-catalog/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/code-smells-catalog/#code-smells-catalog/</guid><pubDate>Tue, 04 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;忘了原先在哪裡翻到的資料，记录各类问题代码的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;属性&lt;/li&gt;
&lt;li&gt;类别&lt;/li&gt;
&lt;li&gt;类型&lt;/li&gt;
&lt;li&gt;它们之间的关系&lt;/li&gt;
&lt;li&gt;所造成的问题&lt;/li&gt;
&lt;li&gt;重构方法&lt;/li&gt;
&lt;li&gt;历史&lt;/li&gt;
&lt;li&gt;示例&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://luzkan.github.io/smells/&quot;&gt;Code Smells Catalog&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Share</category></item><item><title>紀載大量 Code Smell （代碼異味）模式的網站 - Code Smells Catalog</title><link>https://www.webdong.dev/zh-tw/shortpost/code-smells-catalog/#code-smells-catalog/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/code-smells-catalog/#code-smells-catalog/</guid><pubDate>Tue, 04 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;忘了原先在哪裡翻到的資料，紀錄各類問題代碼的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;屬性&lt;/li&gt;
&lt;li&gt;類別&lt;/li&gt;
&lt;li&gt;類型&lt;/li&gt;
&lt;li&gt;它們之間的關係&lt;/li&gt;
&lt;li&gt;所造成的問題&lt;/li&gt;
&lt;li&gt;重構方法&lt;/li&gt;
&lt;li&gt;歷史&lt;/li&gt;
&lt;li&gt;範例&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://luzkan.github.io/smells/&quot;&gt;Code Smells Catalog&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Share</category></item><item><title>Why You Should Use pnpm?</title><link>https://www.webdong.dev/en/shortpost/why-pnpm/#why-pnpm/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/why-pnpm/#why-pnpm/</guid><pubDate>Mon, 03 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Developers new to the JS ecosystem may feel overwhelmed by the variety of options. To understand these options, we need to review their history:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;npm is the default Node package manager.&lt;/li&gt;
&lt;li&gt;Yarn became popular mainly due to the introduction of &lt;code&gt;yarn.lock&lt;/code&gt;, which ensured better dependency version management and solved the issue of early npm versions not being able to lock exact versions.&lt;/li&gt;
&lt;li&gt;pnpm gained popularity primarily because of its use of symlink strategies, significantly improving performance and sharing the same dependencies to save disk space.&lt;/li&gt;
&lt;li&gt;Bun, in addition to being a package manager, also includes a built-in JavaScript runtime, build with performance in mind.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Based on my experience so far:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I used Yarn for a while, but many switched away when Yarn 2 made significant changes.&lt;/li&gt;
&lt;li&gt;pnpm is fast and mature, widely adopted by many open-source projects, and has good support for monorepos.&lt;/li&gt;
&lt;li&gt;I haven&apos;t used Bun, but I&apos;ve heard it is still not very mature.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In summary, npm is definitely the safest option. Ultimately, the differences in choosing which package manager to use are not significant in most environments, and the cost of switching is low. Just choose one that feels comfortable and is familiar to the team.&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>为什么应该用 pnpm？</title><link>https://www.webdong.dev/zh-cn/shortpost/why-pnpm/#why-pnpm/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/why-pnpm/#why-pnpm/</guid><pubDate>Mon, 03 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;刚加入 JS 生态系的开发者应该会被多元的选项给弄得头昏脑胀，要了解这些选项需要回顾它们的历史：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;npm 是默认的 node 套件管理器&lt;/li&gt;
&lt;li&gt;Yarn 开始流行主要因为推出了 &lt;code&gt;yarn.lock&lt;/code&gt;，确保了更好的依赖版本管理，解决了 npm 早期版本无法锁定确切版本的问题。&lt;/li&gt;
&lt;li&gt;pnpm 开始流行主要因为使用 symlink（符号链接）策略，大幅改善了性能，并且共享相同的依赖以节省磁盘空间。&lt;/li&gt;
&lt;li&gt;bun 除了作为套件管理器，也包含了内建的 JavaScript 执行环境，标榜高性能。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;就我自己的累积至今的经验与评价：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用过一阵子 Yarn，之后 Yarn 2 改太大很多人跳槽了&lt;/li&gt;
&lt;li&gt;pnpm 快且成熟，很多开源项目都采用，并且对于 monorepo 支持良好。&lt;/li&gt;
&lt;li&gt;bun 没用过，听说还不太成熟。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;总结来说 npm 绝对是最稳妥的选项，最终选择使用哪款套件管理器差异在大多环境下其实不大，切换的成本也不高，挑选顺手且团队都熟悉的使用即可。&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>為什麼應該用 pnpm？</title><link>https://www.webdong.dev/zh-tw/shortpost/why-pnpm/#why-pnpm/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/why-pnpm/#why-pnpm/</guid><pubDate>Mon, 03 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;剛加入 JS 生態系的開發者應該會被多元的選項給弄得頭昏腦脹，要了解這些選項需要回顧它們的歷史：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;npm 是預設的 node 套件管理器&lt;/li&gt;
&lt;li&gt;Yarn 開始流行主要因為推出了 &lt;code&gt;yarn.lock&lt;/code&gt;，確保了更好的依賴版本管理，解決了 npm 早期版本無法鎖定確切版本的問題。&lt;/li&gt;
&lt;li&gt;pnpm 開始流行主要因為使用 symlink（符號連結）策略，大幅改善了效能，並且共享相同的依賴以節省磁碟空間。&lt;/li&gt;
&lt;li&gt;bun 除了作為套件管理器，也包含了內建的 JavaScript 執行環境，標榜高效能。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;就我自己的累積至今的經驗與評價：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用過一陣子 Yarn，之後 Yarn 2 改太大很多人跳槽了&lt;/li&gt;
&lt;li&gt;pnpm 快且成熟，很多開源專案都採用，並且對於 monorepo 支援良好。&lt;/li&gt;
&lt;li&gt;bun 沒用過，聽說還不太成熟。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;總結來說 npm 絕對是最穩妥的選項，最終選擇使用哪款套件管理器差異在大多環境下其實不大，切換的成本也不高，挑選順手且團隊都熟悉的使用即可。&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>Customized News Feeds and Community for Developers - Daily.dev</title><link>https://www.webdong.dev/en/shortpost/daily-dot-dev/#daily-dot-dev/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/daily-dot-dev/#daily-dot-dev/</guid><pubDate>Sun, 02 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Unintentionally, many articles I translated last year started from &lt;a href=&quot;https://daily.dev/&quot;&gt;daily.dev&lt;/a&gt;, a browser extension and PWA that can be used in any environment. I remember seeing it recommended by Fireship, so I downloaded it to check it out, and gradually developed the habit of consuming development articles from different sources every day.&lt;/p&gt;
&lt;p&gt;Free, open-source, diverse themes, and an active community, definitely worth a try!&lt;/p&gt;
</content:encoded><category>Share</category></item><item><title>针对开发者提供定制化新闻提要与社区 - Daily.dev</title><link>https://www.webdong.dev/zh-cn/shortpost/daily-dot-dev/#daily-dot-dev/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/daily-dot-dev/#daily-dot-dev/</guid><pubDate>Sun, 02 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;前年不知不觉中翻的许多文章起点都是从 &lt;a href=&quot;https://daily.dev/&quot;&gt;daily.dev&lt;/a&gt; 找到的，一个浏览器插件与 PWA 可以在任何环境上使用。印象中是看到 Fireship 推荐所以载来看看，渐渐就养成每天吸收不同来源开发文章的习惯。&lt;/p&gt;
&lt;p&gt;免费、开源、主题多元、社区活跃，值得试试看！&lt;/p&gt;
</content:encoded><category>Share</category></item><item><title>針對開發者提供客製化新聞提要與社群 - Daily.dev</title><link>https://www.webdong.dev/zh-tw/shortpost/daily-dot-dev/#daily-dot-dev/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/daily-dot-dev/#daily-dot-dev/</guid><pubDate>Sun, 02 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;前年不知不覺中翻的許多文章起點都是從 &lt;a href=&quot;https://daily.dev/&quot;&gt;daily.dev&lt;/a&gt; 找到的，一個瀏覽器插件與 PWA 可以在任何環境上使用。印象中是看到 Fireship 推薦所以載來看看，漸漸就養成每天吸收不同來源開發文章的習慣。&lt;/p&gt;
&lt;p&gt;免費、開源、主題多元、社群活躍，值得試試看！&lt;/p&gt;
</content:encoded><category>Share</category></item><item><title>Why Set Up Absolute Path Imports in Vite Projects</title><link>https://www.webdong.dev/en/shortpost/use-absolute-import-in-vite/#use-absolute-import-in-vite/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/use-absolute-import-in-vite/#use-absolute-import-in-vite/</guid><pubDate>Sat, 01 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Using relative path &lt;code&gt;import&lt;/code&gt; for another file is usually not a big issue, but as the project scales, the relationships between files become more complex, leading to the following problems:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;File paths become too nested and hard to understand&lt;/li&gt;
&lt;li&gt;&lt;code&gt;import&lt;/code&gt; represents different paths in different files&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Therefore, an alias such as &lt;code&gt;@&lt;/code&gt; or &lt;code&gt;~&lt;/code&gt; is set to point to the project root, allowing the use of absolute path imports. You can refer to the relevant documentation for &lt;a href=&quot;https://vite.dev/config/shared-options#resolve-alias&quot;&gt;Vite&lt;/a&gt; and &lt;a href=&quot;https://github.com/rollup/plugins/tree/master/packages/alias#entries&quot;&gt;rollup/plugin-alias&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>为什么要在 Vite 项目设置使用绝对路径 import</title><link>https://www.webdong.dev/zh-cn/shortpost/use-absolute-import-in-vite/#use-absolute-import-in-vite/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/use-absolute-import-in-vite/#use-absolute-import-in-vite/</guid><pubDate>Sat, 01 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;使用相对路径 &lt;code&gt;import&lt;/code&gt; 另一文件通常不是问题，但随着项目规模庞大，文件之间的关系也随之复杂起来，会造成以下问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;文件路径太多层难以理解&lt;/li&gt;
&lt;li&gt;&lt;code&gt;import&lt;/code&gt; 在不同文件所代表的路径不同&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;所以会设置一个别名（Alias）例如 &lt;code&gt;@&lt;/code&gt; 或 &lt;code&gt;~&lt;/code&gt; 符号指向项目根部，这样就可以使用绝对路径 import。具体可以翻翻看 &lt;a href=&quot;https://vite.dev/config/shared-options#resolve-alias&quot;&gt;Vite&lt;/a&gt;、&lt;a href=&quot;https://github.com/rollup/plugins/tree/master/packages/alias#entries&quot;&gt;rollup/plugin-alias&lt;/a&gt; 相关文件。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>為什麼要在 Vite 專案設定使用絕對路徑 import</title><link>https://www.webdong.dev/zh-tw/shortpost/use-absolute-import-in-vite/#use-absolute-import-in-vite/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/use-absolute-import-in-vite/#use-absolute-import-in-vite/</guid><pubDate>Sat, 01 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;使用相對路徑 &lt;code&gt;import&lt;/code&gt; 另一檔案通常不是什麼大問題，但隨著專案規模龐大，檔案之間的關係也隨之複雜起來，會造成以下問題：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;檔案路徑太多層難以理解&lt;/li&gt;
&lt;li&gt;&lt;code&gt;import&lt;/code&gt; 在不同檔案所代表的路徑不同&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;所以會設置一個別名（Alias）例如 &lt;code&gt;@&lt;/code&gt; 或 &lt;code&gt;~&lt;/code&gt; 符號指向專案根部，這樣就可以使用絕對路徑 import。具體可以翻翻看 &lt;a href=&quot;https://vite.dev/config/shared-options#resolve-alias&quot;&gt;Vite&lt;/a&gt;、&lt;a href=&quot;https://github.com/rollup/plugins/tree/master/packages/alias#entries&quot;&gt;rollup/plugin-alias&lt;/a&gt; 相關文件。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>Impact of Excessive DOM Size</title><link>https://www.webdong.dev/en/shortpost/impact-of-excessive-dom-size/#impact-of-excessive-dom-size/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/impact-of-excessive-dom-size/#impact-of-excessive-dom-size/</guid><pubDate>Fri, 31 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You may notice that Lighthouse will issue a warning when the page content exceeds 800 nodes and an error when it exceeds 1400 nodes.&lt;/p&gt;
&lt;p&gt;In addition to paying attention to the number of nodes, the depth of the DOM and CSS styles can also profoundly affect the efficiency of web page rendering. Keeping the web structure simple and clean is the best solution.&lt;/p&gt;
&lt;p&gt;In situations where displaying a large number of DOM nodes is unavoidable, consider using Virtual Scrolling techniques to avoid displaying all data at once. The general idea is to only render items that are visible within the viewport.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://frontendatscale.com/blog/how-deep-is-your-dom/&quot;&gt;How Deep is Your DOM? - FRONTEND AT SCALE&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>HTML</category></item><item><title>DOM 过大对网页的影响</title><link>https://www.webdong.dev/zh-cn/shortpost/impact-of-excessive-dom-size/#impact-of-excessive-dom-size/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/impact-of-excessive-dom-size/#impact-of-excessive-dom-size/</guid><pubDate>Fri, 31 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;你可能会留意到 Lighthouse 检测会在页面内容超过 800 个节点时标示警告，超过 1400 个节点时标示错误。&lt;/p&gt;
&lt;p&gt;除了留意节点数量外，DOM 的深度、CSS 样式也会深刻影响网页渲染的效率，保持网页结构简洁干净是最好的解决方法。&lt;/p&gt;
&lt;p&gt;在不可避免需要显示大量 DOM 节点的情况下可以考虑使用 Virtual Scrolling 技巧来避免一次性显示所有资料，大概念就是只渲染视角内可见的项目。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://frontendatscale.com/blog/how-deep-is-your-dom/&quot;&gt;How Deep is Your DOM? - FRONTEND AT SCALE&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>HTML</category></item><item><title>DOM 過大對網頁的影響</title><link>https://www.webdong.dev/zh-tw/shortpost/impact-of-excessive-dom-size/#impact-of-excessive-dom-size/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/impact-of-excessive-dom-size/#impact-of-excessive-dom-size/</guid><pubDate>Fri, 31 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;你可能會留意到 Lighthouse 檢測會在頁面內容超過 800 個節點時標示警告，超過 1400 個節點時標示錯誤。&lt;/p&gt;
&lt;p&gt;除了留意節點數量外，DOM 的深度、CSS 樣式也會深刻影響網頁渲染的效率，保持網頁結構簡潔乾淨是最好的解決方法。&lt;/p&gt;
&lt;p&gt;在不可避免需要顯示大量 DOM 節點的情況下可以考慮使用 Virtual Scrolling 技巧來避免一次性顯示所有資料，大概念就是只渲染視角內可見的項目。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://frontendatscale.com/blog/how-deep-is-your-dom/&quot;&gt;How Deep is Your DOM? - FRONTEND AT SCALE&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>HTML</category></item><item><title>Print QR Codes - Simple and Fast QR Code Generator for printing</title><link>https://www.webdong.dev/en/shortpost/print-qr-codes/#print-qr-codes/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/print-qr-codes/#print-qr-codes/</guid><pubDate>Thu, 30 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;During a recent event, I found that converting multiple links into QR Codes took a lot of time for generation and formatting. So, I created an online webpage where you can input URLs anytime and download them. You can then take the files to any 7-11 convenience store to print. Free to use locally 👇&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://qr-code-printer.pages.dev/&quot;&gt;Print QR Codes Online Website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/riceball-tw/qr-code-printer&quot;&gt;Print QR Codes GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Share</category></item><item><title>Print QR Codes - 简单快速生成 QR Code 供输出用</title><link>https://www.webdong.dev/zh-cn/shortpost/print-qr-codes/#print-qr-codes/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/print-qr-codes/#print-qr-codes/</guid><pubDate>Thu, 30 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;先前参加活动时交换链接发现要把多个链接转换成 QR Code 会需要花时间生成再排版挺花时间，所以写了个线上网页可以随时输入网址下载，文件再拿到 ibon 任意 7-11 超商都能打印。免费本地端可用 👇&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://qr-code-printer.pages.dev/&quot;&gt;Print QR Codes 线上网站&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/riceball-tw/qr-code-printer&quot;&gt;Print QR Codes GitHub 仓库&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Share</category></item><item><title>Print QR Codes - 簡單快速生成 QR Code 供輸出用</title><link>https://www.webdong.dev/zh-tw/shortpost/print-qr-codes/#print-qr-codes/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/print-qr-codes/#print-qr-codes/</guid><pubDate>Thu, 30 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;先前參加活動時交換連結發現要把多個連結轉換成 QR Code 會需要花時間生成再排版挺花時間，所以寫了個線上網頁可以隨時輸入網址下載，檔案再拿到 ibon 任意 7-11 超商都能列印。免費本地端可用 👇&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://qr-code-printer.pages.dev/&quot;&gt;Print QR Codes 線上網站&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/riceball-tw/qr-code-printer&quot;&gt;Print QR Codes GitHub 倉庫&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Share</category></item><item><title>Major Homepage Style Changes in Tailwind 4.0</title><link>https://www.webdong.dev/en/shortpost/tailwind-4-ui/#tailwind-4-ui/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/tailwind-4-ui/#tailwind-4-ui/</guid><pubDate>Thu, 23 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;It can be said that it is actually a collection of various UI trends:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dark mode&lt;/li&gt;
&lt;li&gt;Gradients&lt;/li&gt;
&lt;li&gt;Grids&lt;/li&gt;
&lt;li&gt;Glassmorphism&lt;/li&gt;
&lt;li&gt;Bento Grid&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What do people on the internet call this style? It&apos;s quite interesting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Generic-modern-futuristic&lt;/li&gt;
&lt;li&gt;&quot;Programmers will like this&quot; style&lt;/li&gt;
&lt;li&gt;Post-Bootstrapism&lt;/li&gt;
&lt;li&gt;Linear design&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I previously wrote about why websites look similar: &lt;a href=&quot;https://www.webdong.dev/post/why-websites-looks-the-same-nowaday/&quot;&gt;Why websites looks the same nowaday&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>UI</category></item><item><title>最近翻 Tailwind 文件发现 4.0 版网站风格大改，变得很 Vercel 感？</title><link>https://www.webdong.dev/zh-cn/shortpost/tailwind-4-ui/#tailwind-4-ui/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/tailwind-4-ui/#tailwind-4-ui/</guid><pubDate>Thu, 23 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;可以说其实就是各种 UI 流行趋势的集合：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;深色模式&lt;/li&gt;
&lt;li&gt;渐变&lt;/li&gt;
&lt;li&gt;格线&lt;/li&gt;
&lt;li&gt;Glassmorphism&lt;/li&gt;
&lt;li&gt;Bento Grid&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;网络上如何称呼这类风格的呢？还蛮有趣的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Generic-modern-futuristic&lt;/li&gt;
&lt;li&gt;&quot;Programmers will like this&quot; style&lt;/li&gt;
&lt;li&gt;Post-Bootstrapisim&lt;/li&gt;
&lt;li&gt;Linear design&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;之前写过关于为什么网页看起来都差不多的研究：&lt;a href=&quot;https://www.webdong.dev/post/why-websites-looks-the-same-nowaday/&quot;&gt;无聊的 UI 是好的 UX，为什么现在的网站都长得差不多？&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>UI</category></item><item><title>最近翻 Tailwind 文件發現 4.0 版網站風格大改，變得很 Vercel 感？</title><link>https://www.webdong.dev/zh-tw/shortpost/tailwind-4-ui/#tailwind-4-ui/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/tailwind-4-ui/#tailwind-4-ui/</guid><pubDate>Thu, 23 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;可以說其實就是各種 UI 流行趨勢的集合：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;深色模式&lt;/li&gt;
&lt;li&gt;漸層&lt;/li&gt;
&lt;li&gt;格線&lt;/li&gt;
&lt;li&gt;Glassmorphism&lt;/li&gt;
&lt;li&gt;Bento Grid&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;網路上如何稱互這類風格的呢？還蠻有趣的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Generic-modern-futuristic&lt;/li&gt;
&lt;li&gt;&quot;Programmers will like this&quot; style&lt;/li&gt;
&lt;li&gt;Post-Bootstrapisim&lt;/li&gt;
&lt;li&gt;Linear design&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;之前寫過關於為什麼網頁看起來都差不多的研究：&lt;a href=&quot;https://www.webdong.dev/post/why-websites-looks-the-same-nowaday/&quot;&gt;無聊的 UI 是好的 UX，為什麼現在的網站都長得差不多？&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>UI</category></item><item><title>How to Maintain Motivation?</title><link>https://www.webdong.dev/en/shortpost/how-to-maintain-motivation/#how-to-maintain-motivation/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/how-to-maintain-motivation/#how-to-maintain-motivation/</guid><pubDate>Sun, 29 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Recently, during an interview, I was asked how I can consistently maintain the habit of writing a technical blog. Do I have any tips? Here are my thoughts:&lt;/p&gt;
&lt;h2&gt;1. Reduce Friction&lt;/h2&gt;
&lt;p&gt;If there are a lot of trivial tasks before starting something, I would rather give up. It&apos;s crucial to understand how to build a productive environment and eliminate distractions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Before exercising, everything should be prepared in advance for easy access.&lt;/li&gt;
&lt;li&gt;Similarly, when writing, I should spend minimal effort to deploy progress, so I set up automated processes for the blog to focus on what truly matters.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;2. Just Take Action&lt;/h2&gt;
&lt;p&gt;Once you get into the flow, your body will respond actively. Set a minimum output for those lazy moments and allow yourself to accept lower productivity.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If I&apos;m too lazy to exercise, I&apos;ll go for a light walk; who knows, I might just get into the mood.&lt;/li&gt;
&lt;li&gt;Similarly, when I&apos;m extremely lazy to write or learn something, I&apos;ll translate an old article, which also helps me practice English.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;3. Understand What You Are Pursuing&lt;/h2&gt;
&lt;p&gt;Motivation is subjectively formed. Pursuing money, fame, or knowledge is reasonable, but one should not blindly chase after or be trapped by formalized results.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Is exercising for health? External validation? Or is it a profitable business?&lt;/li&gt;
&lt;li&gt;I believe writing is a refinement of thought; I&apos;m not pursuing a high volume of articles or seeking praise from many people, but rather I continue writing because I deeply understand certain concepts and glad to share it.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>如何保持习惯动力？</title><link>https://www.webdong.dev/zh-cn/shortpost/how-to-maintain-motivation/#how-to-maintain-motivation/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/how-to-maintain-motivation/#how-to-maintain-motivation/</guid><pubDate>Sun, 29 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;近期面试被问到为什么能一直保持写技术博客的习惯，有没有什么诀窍？我的想法：&lt;/p&gt;
&lt;h2&gt;一、降低阻力&lt;/h2&gt;
&lt;p&gt;如果开始某项事情之前有一大票琐碎的任务，我宁愿直接放弃。懂得合理建设生产环境排除杂事非常重要。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;运动前东西应该都要准备好，方便拿了直接走&lt;/li&gt;
&lt;li&gt;同理写作时应该花很少的力气就能部署进度，所以博客建立自动化流程来把专注力集中给真正需要关心的事。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;二、先行动就是了&lt;/h2&gt;
&lt;p&gt;进入状态后身体就会主动回应，定个想偷懒时的最低限度产出，放过自己接受低产出的状态。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;懒得运动就去轻松健走，走一走说不定就进入状况了。&lt;/li&gt;
&lt;li&gt;同理超懒得写文章学东西我就会去翻译一篇旧文章，反正当练英文。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;三、了解你在追求什么&lt;/h2&gt;
&lt;p&gt;动力是主观形成的，追求金钱、名声或知识都很合理，但不应该盲目追求或被形式化的结果所绑架。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;运动是在练身体健康？外人评价？还是它是一项赚钱的事业？&lt;/li&gt;
&lt;li&gt;因为相信写作是思考的精炼，我并非在追求时间内发很多文章或受很多人赞赏而是因为理解透彻某些概念而持续写作。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>如何保持習慣動力？</title><link>https://www.webdong.dev/zh-tw/shortpost/how-to-maintain-motivation/#how-to-maintain-motivation/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/how-to-maintain-motivation/#how-to-maintain-motivation/</guid><pubDate>Sun, 29 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;近期面試被問到為什麼能一直保持寫技術部落格的習慣，有沒有什麼訣竅？我的想法：&lt;/p&gt;
&lt;h2&gt;一、降低阻力&lt;/h2&gt;
&lt;p&gt;如果開始某項事情之前有一大票瑣碎的任務，我寧願直接放棄。懂得合理建設生產環境排除雜事非常重要。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;運動前東西應該都要準備好，方便拿了直接走&lt;/li&gt;
&lt;li&gt;同理寫作時應該花很少的力氣就能部屬進度，所以部落格建立自動化流程來把專注力集中給真正需要關心的事。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;二、先行動就是了&lt;/h2&gt;
&lt;p&gt;進入狀態後身體就會主動回應，定個想偷懶時的最低限度產出，放過自己接受低產出的狀態。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;懶得運動就去輕鬆健走，走一走說不定就進入狀況了。&lt;/li&gt;
&lt;li&gt;同理超懶得寫文章學東西我就會去翻譯一篇舊文章，反正當練英文。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;三、了解你在追求什麼&lt;/h2&gt;
&lt;p&gt;動力是主觀形成的，追求金錢、名聲或知識都很合理，但不應該盲目追求或被形式化的結果所綁架。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;運動是在練身體健康？外人評價？還是它是一項賺錢的事業？&lt;/li&gt;
&lt;li&gt;因為相信寫作是思考的精煉，我並非在追求時間內發很多文章或受很多人讚賞而是因為理解通透某些概念而持續寫作。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>What Happens After Entering a URL in the Browser?</title><link>https://www.webdong.dev/en/shortpost/what-happens-when-you-type-a-url-into-your-browser/#what-happens-when-you-type-a-url-into-your-browser/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/what-happens-when-you-type-a-url-into-your-browser/#what-happens-when-you-type-a-url-into-your-browser/</guid><pubDate>Sat, 28 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;What Happens After Entering a URL in the Browser?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;DNS Resolution Phase (Obtain Target Server IP)&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Check if there is a DNS cache available&lt;/li&gt;
&lt;li&gt;Query the local DNS server provided by the ISP&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;TCP Connection Establishment (Establish Connection with Target Server)&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Initiate TCP connection request to the target IP address&lt;/li&gt;
&lt;li&gt;Perform TCP three-way handshake (SYN, SYN-ACK, ACK)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;TLS/SSL Encrypted Connection (Establish Encrypted Connection with Target Server)&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Perform handshake and exchange encryption keys&lt;/li&gt;
&lt;li&gt;Validate certificates&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;Request and Response (Retrieve Web Content)&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;The browser sends a request to the server&lt;/li&gt;
&lt;li&gt;The server processes the request and returns resources&lt;/li&gt;
&lt;li&gt;The browser begins to receive and parse resources&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ol&gt;
&lt;li&gt;Browser Rendering Page (Render Web Page)&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Parse HTML to create DOM Tree&lt;/li&gt;
&lt;li&gt;Parse CSS to create CSSOM Tree&lt;/li&gt;
&lt;li&gt;Combine DOM and CSSOM to create Render Tree&lt;/li&gt;
&lt;li&gt;Calculate element positions and sizes (Layout)&lt;/li&gt;
&lt;li&gt;Paint the page content (Paint)&lt;/li&gt;
&lt;li&gt;Divide the page into multiple layers (Layering)&lt;/li&gt;
&lt;li&gt;Convert layers to pixels (Rasterization)&lt;/li&gt;
&lt;li&gt;GPU composites multiple layers (Compositing)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Depending on the position, one can gradually identify the areas of interest through communication. For instance, front-end developers may be eager to learn more about how browsers operate. I believe back-end friends also have different focal points on this topic.&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>浏览器输入 URL 搜索后发生了什么事？</title><link>https://www.webdong.dev/zh-cn/shortpost/what-happens-when-you-type-a-url-into-your-browser/#what-happens-when-you-type-a-url-into-your-browser/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/what-happens-when-you-type-a-url-into-your-browser/#what-happens-when-you-type-a-url-into-your-browser/</guid><pubDate>Sat, 28 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;浏览器输入 URL 搜索后发生了什么事？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一、DNS 解析阶段（获取目标服务器 IP）
&lt;ul&gt;
&lt;li&gt;检查是否有 DNS 缓存可使用&lt;/li&gt;
&lt;li&gt;向网络供应商提供的 本地 DNS 服务器进行查询请求&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;二、TCP 连接建立（与目标服务器建立连接）
&lt;ul&gt;
&lt;li&gt;对目标 IP 地址发起 TCP 连接请求&lt;/li&gt;
&lt;li&gt;进行 TCP 三次握手 (SYN, SYN-ACK, ACK)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;三、TLS/SSL 加密连接（与目标服务器建立加密连接）
&lt;ul&gt;
&lt;li&gt;进行握手，交换加密密钥&lt;/li&gt;
&lt;li&gt;验证凭证&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;四、请求与响应 (获取网页内容)
&lt;ul&gt;
&lt;li&gt;浏览器发送请求到服务器&lt;/li&gt;
&lt;li&gt;服务器处理请求并回传资源&lt;/li&gt;
&lt;li&gt;浏览器开始接收和解析资源&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;五、浏览器渲染页面 (渲染网页)
&lt;ul&gt;
&lt;li&gt;解析 HTML 建立 DOM Tree&lt;/li&gt;
&lt;li&gt;解析 CSS 建立 CSSOM Tree&lt;/li&gt;
&lt;li&gt;结合 DOM 和 CSSOM 建立 Render Tree&lt;/li&gt;
&lt;li&gt;计算元素位置和大小 (Layout)&lt;/li&gt;
&lt;li&gt;绘制页面内容 (Paint)&lt;/li&gt;
&lt;li&gt;将页面分为多个图层 (Layering)&lt;/li&gt;
&lt;li&gt;将图层转换为像素 (Rasterization)&lt;/li&gt;
&lt;li&gt;GPU 将多个图层进行合成 (Compositing)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;视职位可以通过沟通逐渐锁定对方感兴趣的区块，像是面前端可能就会期待对于浏览器的运作机制了解更多。相信后端的朋友针对这个主题也有不同着重的点。&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>瀏覽器輸入 URL 搜尋後發生了什麼事？</title><link>https://www.webdong.dev/zh-tw/shortpost/what-happens-when-you-type-a-url-into-your-browser/#what-happens-when-you-type-a-url-into-your-browser/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/what-happens-when-you-type-a-url-into-your-browser/#what-happens-when-you-type-a-url-into-your-browser/</guid><pubDate>Sat, 28 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;瀏覽器輸入 URL 搜尋後發生了什麼事？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一、DNS 解析階段（取得目標伺服器 IP）
&lt;ul&gt;
&lt;li&gt;檢查是否有 DNS 快取可使用&lt;/li&gt;
&lt;li&gt;向網路供應商提供的 本地 DNS 伺服器進行查詢請求&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;二、TCP 連線建立（與目標伺服器建立連線）
&lt;ul&gt;
&lt;li&gt;對目標 IP 位址發起 TCP 連線請求&lt;/li&gt;
&lt;li&gt;進行 TCP 三次握手 (SYN, SYN-ACK, ACK)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;三、TLS/SSL 加密連線（與目標伺服器建立加密連線）
&lt;ul&gt;
&lt;li&gt;進行握手，交換加密金鑰&lt;/li&gt;
&lt;li&gt;驗證憑證&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;四、請求與響應 (獲取網頁內容)
&lt;ul&gt;
&lt;li&gt;瀏覽器發送請求到伺服器&lt;/li&gt;
&lt;li&gt;伺服器處理請求並回傳資源&lt;/li&gt;
&lt;li&gt;瀏覽器開始接收和解析資源&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;五、瀏覽器渲染頁面 (渲染網頁)
&lt;ul&gt;
&lt;li&gt;解析 HTML 建立 DOM Tree&lt;/li&gt;
&lt;li&gt;解析 CSS 建立 CSSOM Tree&lt;/li&gt;
&lt;li&gt;結合 DOM 和 CSSOM 建立 Render Tree&lt;/li&gt;
&lt;li&gt;計算元素位置和大小 (Layout)&lt;/li&gt;
&lt;li&gt;繪製頁面內容 (Paint)&lt;/li&gt;
&lt;li&gt;將頁面分為多個圖層 (Layering)&lt;/li&gt;
&lt;li&gt;將圖層轉換為像素 (Rasterization)&lt;/li&gt;
&lt;li&gt;GPU 將多個圖層進行合成 (Compositing)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;視職位可以透過溝通逐漸鎖定對方有興趣的區塊，像是面前端可能就會期待對於瀏覽器的運作機制了解更多。相信後端的朋友針對這個主題也有不同著重的點。&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>How to Structure an Awesome Frontend Project in 2025</title><link>https://www.webdong.dev/en/shortpost/how-to-build-an-awesome-frontend-project-in-2025/#how-to-build-an-awesome-frontend-project-in-2025/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/how-to-build-an-awesome-frontend-project-in-2025/#how-to-build-an-awesome-frontend-project-in-2025/</guid><pubDate>Tue, 24 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Recently, I might be asked some questions about development habits and project architecture in interviews, so I have outlined how I would typically structure a project in the Vue ecosystem and the thinking behind it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Framework Selection&lt;/li&gt;
&lt;li&gt;Project Best Practices&lt;/li&gt;
&lt;li&gt;Managing UI&lt;/li&gt;
&lt;li&gt;Choosing the Right Tools&lt;/li&gt;
&lt;li&gt;How to Operate a Project&lt;/li&gt;
&lt;li&gt;How to Manage Large Projects&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://www.webdong.dev/post/how-to-build-a-awesome-frontend-project-in-2025/&quot;&gt;How to Structure an Awesome Frontend Project in 2025 (feat. Vue)&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Vue</category></item><item><title>如何架构一个超赞的前端项目于 2025 年</title><link>https://www.webdong.dev/zh-cn/shortpost/how-to-build-an-awesome-frontend-project-in-2025/#how-to-build-an-awesome-frontend-project-in-2025/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/how-to-build-an-awesome-frontend-project-in-2025/#how-to-build-an-awesome-frontend-project-in-2025/</guid><pubDate>Tue, 24 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;近期面试应该会被问到一些开发习惯和项目架构的问题，所以初步梳理出如果我在前端 Vue 生态系通常会怎么架构一个项目与背后的思考。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;框架选择&lt;/li&gt;
&lt;li&gt;项目习惯&lt;/li&gt;
&lt;li&gt;如何维护 UI&lt;/li&gt;
&lt;li&gt;选择趁手工具&lt;/li&gt;
&lt;li&gt;如何运营项目&lt;/li&gt;
&lt;li&gt;如何管理巨型项目&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://www.webdong.dev/post/how-to-build-a-awesome-frontend-project-in-2025/&quot;&gt;如何架构一个超赞的前端项目于 2025 年 (feat. Vue)&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Vue</category></item><item><title>如何架構一個超讚的前端專案於 2025 年</title><link>https://www.webdong.dev/zh-tw/shortpost/how-to-build-an-awesome-frontend-project-in-2025/#how-to-build-an-awesome-frontend-project-in-2025/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/how-to-build-an-awesome-frontend-project-in-2025/#how-to-build-an-awesome-frontend-project-in-2025/</guid><pubDate>Tue, 24 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;近期面試應該會被問到一些開發習慣和專案架構的問題，所以初步梳理出如果我在前端 Vue 生態系通常會怎麼架構一個專案與背後的思考。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;框架選擇&lt;/li&gt;
&lt;li&gt;專案習慣&lt;/li&gt;
&lt;li&gt;如何維護 UI&lt;/li&gt;
&lt;li&gt;選擇趁手工具&lt;/li&gt;
&lt;li&gt;如何運營專案&lt;/li&gt;
&lt;li&gt;如何管理巨型專案&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://www.webdong.dev/post/how-to-build-a-awesome-frontend-project-in-2025/&quot;&gt;如何架構一個超讚的前端專案於 2025 年 (feat. Vue)&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Vue</category></item><item><title>WebDong Threads Subscriber Number is Over a Thousand!</title><link>https://www.webdong.dev/en/shortpost/threads-subscriber-number-is-over-a-thousand/#threads-subscriber-number-is-over-a-thousand/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/threads-subscriber-number-is-over-a-thousand/#threads-subscriber-number-is-over-a-thousand/</guid><pubDate>Sun, 22 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;WebDong is my web development blog, and after writing 95 short articles, I have surpassed 1000 followers! So here&apos;s an update on my recent activities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wrote over 200 long and short articles&lt;/li&gt;
&lt;li&gt;AI-assisted translation of multilingual articles (currently a total of 116 articles)&lt;/li&gt;
&lt;li&gt;Launched a web toolbox to collect resources related to web development&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;About 2 months ago, I quit my job to focus on learning:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;English speaking and writing&lt;/li&gt;
&lt;li&gt;Backend development, and I am preparing to start a new job early next year. If you have web development topics or just want to practice English speaking, feel free to chat.
(There is a GitHub link in the website footer)&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Personal</category></item><item><title>网页东东 Threads 订阅人数突破千人！</title><link>https://www.webdong.dev/zh-cn/shortpost/threads-subscriber-number-is-over-a-thousand/#threads-subscriber-number-is-over-a-thousand/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/threads-subscriber-number-is-over-a-thousand/#threads-subscriber-number-is-over-a-thousand/</guid><pubDate>Sun, 22 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;网页东东是我的网页开发博客，在写 95 篇短文后追踪突破 1000 人了！于是更新一下近况置顶：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;撰写超过 200 篇长短文&lt;/li&gt;
&lt;li&gt;AI 协同翻译多语系文章 (长短文目前共 116 篇)&lt;/li&gt;
&lt;li&gt;推出网页工具箱收集网页开发相关资源&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;约 2 个月前辞去工作专心学习：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;英语口说写作&lt;/li&gt;
&lt;li&gt;后端开发年初也准备开始面新工作中，如果有网页开发话题或单纯练练英文口说都欢迎聊聊看。
（网站 Footer 有 GitHub 链接）&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Personal</category></item><item><title>網頁東東 Threads 訂閱人數突破千人！</title><link>https://www.webdong.dev/zh-tw/shortpost/threads-subscriber-number-is-over-a-thousand/#threads-subscriber-number-is-over-a-thousand/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/threads-subscriber-number-is-over-a-thousand/#threads-subscriber-number-is-over-a-thousand/</guid><pubDate>Sun, 22 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;網頁東東是我的網頁開發部落格，在寫 95 篇短文後追蹤突破 1000 人了！於是更新一下近況置頂：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;撰寫超過 200 篇長短文&lt;/li&gt;
&lt;li&gt;AI 協同翻譯多語系文章 (長短文目前共 116 篇)&lt;/li&gt;
&lt;li&gt;推出網頁工具箱蒐集網頁開發相關資源&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;約 2 個月前辭去工作專心學習：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;英語口說寫作&lt;/li&gt;
&lt;li&gt;後端開發年初也準備開始面新工作中，如果有網頁開發話題或單純練練英文口說都歡迎聊聊看。
（網站 Footer 有 GitHub 連結）&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Personal</category></item><item><title>Learn the New Concept of Backend for Frontend (BFF)</title><link>https://www.webdong.dev/en/shortpost/backend-for-frontend/#backend-for-frontend/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/backend-for-frontend/#backend-for-frontend/</guid><pubDate>Sat, 21 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Understanding that BFF is an extension of the API Gateway Pattern, it is essentially a proxy architecture for APIs, designed to meet the diverse needs of front-end applications with a dedicated back-end (focusing on business logic, data integration, transformation, and trimming).&lt;/p&gt;
&lt;p&gt;For example, when multiple front-ends need to request data from various services, issues may arise:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The front-end is either tightly coupled with multiple back-end services (leading to high dependency) or uses overly generic APIs (which cannot meet specific needs).&lt;/li&gt;
&lt;li&gt;Frequent communication with different services is required.&lt;/li&gt;
&lt;li&gt;Security issues (exposing specific service endpoints).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;At this point, adding an extra layer of BFF can centralize all communications and provide the most suitable APIs for front-end use, but it also introduces additional problems:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Increased complexity.&lt;/li&gt;
&lt;li&gt;Increased latency.&lt;/li&gt;
&lt;li&gt;Higher potential for single points of failure.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the complexity of front-end and back-end services reaches a certain level, creating a BFF is an option to solve the problem. Many modern frameworks like Next or Nuxt have full-stack capabilities, making them a good option for quick adoption. They also allow the team handling the client to take over the BFF, reducing maintenance costs and improving development efficiency.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/starbugs/%E5%89%8D%E7%AB%AF%E9%96%8B%E7%99%BC%E8%80%85%E8%A9%B2%E8%B2%A0%E8%B2%AC%E5%AF%AB-api-endpoints-%E5%97%8E-the-backend-for-frontend-pattern-bff-in-microservices-world-1368362c141c&quot;&gt;前端開發者該負責寫 API Endpoints 嗎？The Backend For Frontend Pattern (BFF) In Microservices World - 莫力全 Kyle Mo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Zli-u9kxw0w&quot;&gt;What is BFF?! (With Nuxt, Nitro and h3) - Alexander Lichter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>学会新概念 Backend for Frontend (BFF)</title><link>https://www.webdong.dev/zh-cn/shortpost/backend-for-frontend/#backend-for-frontend/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/backend-for-frontend/#backend-for-frontend/</guid><pubDate>Sat, 21 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;了解一下发现是一种 API Gateway Pattern 的延伸，简单来说是一个 API 的代理架构，用来满足多样化前端需求的专属后端（注重业务逻辑，进行数据整合、转换和裁剪）。&lt;/p&gt;
&lt;p&gt;举例多种前端需要和多个服务索取资料，将产生问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;前端不是与多个后端服务紧密耦合（造成依赖性高）就是使用过于通用的 API（无法满足特定需求）&lt;/li&gt;
&lt;li&gt;须与不同服务频繁沟通&lt;/li&gt;
&lt;li&gt;安全性问题（暴露具体服务 Endpoint）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这时候如果多设置一层 BFF，可以将所有沟通进行集中并且提供最合乎需求的 API 供前端使用，当然也会产生额外的问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;增加复杂度&lt;/li&gt;
&lt;li&gt;增加延迟&lt;/li&gt;
&lt;li&gt;增加单点故障的可能性&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果前端和后端服务达到一定复杂程度，创建 BFF 是一种解决问题的选项。许多现代框架像是 Next 或 Nuxt 都具备全端能力，是一个快速切入的好选项，也可以让处理 Client 的团队接手 BFF 降低维护成本并提高开发效率。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/starbugs/%E5%89%8D%E7%AB%AF%E9%96%8B%E7%99%BC%E8%80%85%E8%A9%B2%E8%B2%A0%E8%B2%AC%E5%AF%AB-api-endpoints-%E5%97%8E-the-backend-for-frontend-pattern-bff-in-microservices-world-1368362c141c&quot;&gt;前端開發者該負責寫 API Endpoints 嗎？The Backend For Frontend Pattern (BFF) In Microservices World - 莫力全 Kyle Mo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Zli-u9kxw0w&quot;&gt;What is BFF?! (With Nuxt, Nitro and h3) - Alexander Lichter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>學會新概念 Backend for Frontend (BFF)</title><link>https://www.webdong.dev/zh-tw/shortpost/backend-for-frontend/#backend-for-frontend/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/backend-for-frontend/#backend-for-frontend/</guid><pubDate>Sat, 21 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;了解一下發現是一種 API Gateway Pattern 的延伸，簡單來說是一個 API 的代理架構，用來滿足多樣化前端需求的專屬後端（注重業務邏輯，進行數據整合、轉換和裁剪）。&lt;/p&gt;
&lt;p&gt;舉例多種前端需要和多個服務索取資料，將產生問題：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;前端不是與多個後端服務緊密耦合（造成依賴性高）就是使用過於通用的 API（無法滿足特定需求）&lt;/li&gt;
&lt;li&gt;須與不同服務頻繁溝通&lt;/li&gt;
&lt;li&gt;安全性問題（暴露具體服務 Endpoint）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;這時候如果多設置一層 BFF，可以將所有溝通進行集中並且提供最合乎需求的 API 供前端使用，當然也會產生額外的問題：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;增加複雜度&lt;/li&gt;
&lt;li&gt;增加延遲&lt;/li&gt;
&lt;li&gt;增加單點故障的可能性&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果前端和後端服務到達一定複雜程度，創建 BFF 是一種解決問題的選項。許多現代框架像是 Next 或 Nuxt 都具備全端能力，是一個快速切入的好選項，也可以讓處理 Client 的團隊接手 BFF 降低維護成本並提高開發效率。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/starbugs/%E5%89%8D%E7%AB%AF%E9%96%8B%E7%99%BC%E8%80%85%E8%A9%B2%E8%B2%A0%E8%B2%AC%E5%AF%AB-api-endpoints-%E5%97%8E-the-backend-for-frontend-pattern-bff-in-microservices-world-1368362c141c&quot;&gt;前端開發者該負責寫 API Endpoints 嗎？The Backend For Frontend Pattern (BFF) In Microservices World - 莫力全 Kyle Mo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Zli-u9kxw0w&quot;&gt;What is BFF?! (With Nuxt, Nitro and h3) - Alexander Lichter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>Auto Publish TypeScript Package with Semver to NPM</title><link>https://www.webdong.dev/en/shortpost/publish-semver-typescript-package/#publish-semver-typescript-package/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/publish-semver-typescript-package/#publish-semver-typescript-package/</guid><pubDate>Fri, 13 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Have you ever been curious about the development process behind a package? Recently, I followed a video by Matt Pocock to create a package and publish it to NPM. The best part is that many steps are automated, saving a lot of effort:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Use tsup to convert ts to esm and cjs module formats&lt;/li&gt;
&lt;li&gt;Use changeset to manage changelog and version updates&lt;/li&gt;
&lt;li&gt;Use GitHub Actions to automate the CI/CD process&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=eh89VE3Mk5g&quot;&gt;Blazing Fast Tips: Publishing to NPM - Matt Pocock&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can refer to my experience: &lt;a href=&quot;https://www.webdong.dev/post/auto-publish-typescript-package-with-semver-to-npm/&quot;&gt;Writing an Automated Semantic Versioning TypeScript NPM Package&lt;/a&gt;. Later, I wrote a TS package for public release: &lt;a href=&quot;https://github.com/riceball-tw/edit-element&quot;&gt;edit-element&lt;/a&gt;. I also tried out Playwright for E2E testing.&lt;/p&gt;
</content:encoded><category>CI-CD</category></item><item><title>撰写自动化发布语义化版本 TypeScript NPM 套件</title><link>https://www.webdong.dev/zh-cn/shortpost/publish-semver-typescript-package/#publish-semver-typescript-package/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/publish-semver-typescript-package/#publish-semver-typescript-package/</guid><pubDate>Fri, 13 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;使用套件时总是会好奇开发的流程是如何做到的？近期路过 Matt Pocock 的影片跟着做出一个套件发到 NPM 上，最棒的是很多步骤都达成自动化省下不少功夫：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用 tsup 将 ts 转为 esm 与 cjs 模块格式&lt;/li&gt;
&lt;li&gt;使用 changeset 管理更新 changelog 与 version&lt;/li&gt;
&lt;li&gt;使用 GitHub Actions 自动化 CI/CD 流程&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=eh89VE3Mk5g&quot;&gt;Blazing Fast Tips: Publishing to NPM - Matt Pocock&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;我的经历可以参考：&lt;a href=&quot;https://www.webdong.dev/post/auto-publish-typescript-package-with-semver-to-npm/&quot;&gt;撰写自动化发布语义化版本 TypeScript NPM 套件&lt;/a&gt;，后续写了一个 TS 套件公开发布：&lt;a href=&quot;https://github.com/riceball-tw/edit-element&quot;&gt;edit-element&lt;/a&gt;。也顺带玩玩看 Playwright 做 E2E 测试&lt;/p&gt;
</content:encoded><category>CI-CD</category></item><item><title>撰寫自動化發布語意化版本 TypeScript NPM 套件</title><link>https://www.webdong.dev/zh-tw/shortpost/publish-semver-typescript-package/#publish-semver-typescript-package/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/publish-semver-typescript-package/#publish-semver-typescript-package/</guid><pubDate>Fri, 13 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;使用套件時總是會好奇開發的流程是如何做到的？近期路過 Matt Pocock 的影片跟著做出一個套件發到 NPM 上，最棒的是很多步驟都達成自動化省下不少功夫：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用 tsup 將 ts 轉為 esm 與 cjs 模組格式&lt;/li&gt;
&lt;li&gt;使用 changeset 管理更新 changelog 與 version&lt;/li&gt;
&lt;li&gt;使用 GitHub Actions 自動化 CI/CD 流程&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=eh89VE3Mk5g&quot;&gt;Blazing Fast Tips: Publishing to NPM - Matt Pocock&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;我的經歷可以參考：&lt;a href=&quot;https://www.webdong.dev/post/auto-publish-typescript-package-with-semver-to-npm/&quot;&gt;撰寫自動化發布語意化版本 TypeScript NPM 套件&lt;/a&gt;，後續寫了一個 TS 套件公開發布：&lt;a href=&quot;https://github.com/riceball-tw/edit-element&quot;&gt;edit-element&lt;/a&gt;。也順帶玩玩看 Playwright 做 E2E 測試&lt;/p&gt;
</content:encoded><category>CI-CD</category></item><item><title>Online File Structure ASCII Generator</title><link>https://www.webdong.dev/en/shortpost/online-ascii-folder-tree-generator/#online-ascii-folder-tree-generator/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/online-ascii-folder-tree-generator/#online-ascii-folder-tree-generator/</guid><pubDate>Wed, 04 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;When writing documents, it&apos;s very useful to represent some diagrams related to file structures, generating text directly embedded in Markdown without having to think about where to place images, how to place them, and how to import them.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://tree.nathanfriend.com/&quot;&gt;https://tree.nathanfriend.com/&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Share</category></item><item><title>在线文件结构 ASCII 图生成器</title><link>https://www.webdong.dev/zh-cn/shortpost/online-ascii-folder-tree-generator/#online-ascii-folder-tree-generator/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/online-ascii-folder-tree-generator/#online-ascii-folder-tree-generator/</guid><pubDate>Wed, 04 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;写文件时要表示一些文件结构相关的图表非常好用，直接生成文字嵌入在 Markdown 里面，不用像图片一样还要思考放在哪里、怎么放与怎么引入。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://tree.nathanfriend.com/&quot;&gt;https://tree.nathanfriend.com/&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Share</category></item><item><title>線上檔案結構 ASCII 圖生成器</title><link>https://www.webdong.dev/zh-tw/shortpost/online-ascii-folder-tree-generator/#online-ascii-folder-tree-generator/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/online-ascii-folder-tree-generator/#online-ascii-folder-tree-generator/</guid><pubDate>Wed, 04 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;寫文件時要表示一些檔案結構相關的圖表非常好用，直接生成文字嵌入在 Markdown 裡面，不用像圖片一樣還要思考放在哪裡、怎麼放與怎麼引入。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://tree.nathanfriend.com/&quot;&gt;https://tree.nathanfriend.com/&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Share</category></item><item><title>Are Git Pre-Commit Hooks Good or Bad?</title><link>https://www.webdong.dev/en/shortpost/is-pre-commit-hook-good-or-bad/#is-pre-commit-hook-good-or-bad/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/is-pre-commit-hook-good-or-bad/#is-pre-commit-hook-good-or-bad/</guid><pubDate>Thu, 28 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Thinking of Theo&apos;s video: &lt;a href=&quot;https://www.youtube.com/watch?v=RAelLqnnOp0&quot;&gt;Pre-Commit Hooks Are Bad&lt;/a&gt;, there are some debates in the comments. In short, Git can trigger actions during a commit, usually used to run some CI checks. This seems like a good opportunity to intercept errors before they enter the version control system, but it can also become a barrier.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ Positive:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Early Detection of Errors&lt;/strong&gt;: Checks can be performed before the code enters version control, avoiding low-quality or bad code, reducing wasted time during Code Review.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reduced CI Pressure&lt;/strong&gt;: Developers can detect and warn about errors locally.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;❌ Negative:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Over-reliance on Local Environment&lt;/strong&gt;: The execution of hooks depends on the developer&apos;s local environment; if the environment is not correctly configured, it may lead to inconsistent behavior.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Impact on Developer Flexibility&lt;/strong&gt;: Interferes with developers&apos; ability to experiment quickly locally, forcing the committed code to meet certain standards.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the past, I encountered project Pre-Commit Hooks that always took about 5 or 6 seconds to run. While still acceptable, waiting for checks during frequent commits can be quite annoying. I tend to prefer CI checks and follow team&apos;s habit.&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>Git Pre-Commit Hook 是好是壞？</title><link>https://www.webdong.dev/zh-cn/shortpost/is-pre-commit-hook-good-or-bad/#is-pre-commit-hook-good-or-bad/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/is-pre-commit-hook-good-or-bad/#is-pre-commit-hook-good-or-bad/</guid><pubDate>Thu, 28 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;想到 Theo 的影片：&lt;a href=&quot;https://www.youtube.com/watch?v=RAelLqnnOp0&quot;&gt;Pre-Commit Hooks Are Bad&lt;/a&gt;，評論也有一些爭論。简单来说 Git 可以在 Commit 时触发行为，通常会用来跑一些 CI 代码检测流程。这似乎是一个很好的时机可以在错误进入版本控制系统之前拦截，但同时也可能成为阻碍。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ 正向：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提早发现错误&lt;/strong&gt;： 可以在代码进入版本控制之前进行检测，迴避低质量或错误的代码，减少了 Code Review 时浪费的时间。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;减少 CI 压力&lt;/strong&gt;：开发者本地检测并提早警告错误，降低负担。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;❌ 负面：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;过度依赖本地环境&lt;/strong&gt;：Hook 的执行依赖开发者的本地环境，如果环境未正确配置，可能导致不一致的行为。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;影响开发者的灵活性&lt;/strong&gt;：干扰开发者在本地进行快速实验，强制提交的代码符合某些规范。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;过往我遇到专案 Pre-Commit Hooks 总是要跑个 5 、 6 秒，虽然还能接受但频繁的 commit 时等待检测是挺恼人的，我会偏向 CI 检测要有再看团队习惯。&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>Git Pre-Commit Hook 是好是壞？</title><link>https://www.webdong.dev/zh-tw/shortpost/is-pre-commit-hook-good-or-bad/#is-pre-commit-hook-good-or-bad/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/is-pre-commit-hook-good-or-bad/#is-pre-commit-hook-good-or-bad/</guid><pubDate>Thu, 28 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;想到 Theo 的影片：&lt;a href=&quot;https://www.youtube.com/watch?v=RAelLqnnOp0&quot;&gt;Pre-Commit Hooks Are Bad&lt;/a&gt;，評論也有一些爭論。簡單來說 Git 可以在 Commit 時觸發行為，通常會用來跑一些 CI 程式碼檢測流程。這似乎是一個很好的時機可以在錯誤進入版本控制系統之前攔截，但同時也可能成為阻礙。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ 正向：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;提早發現錯誤&lt;/strong&gt;： 可以在程式碼進入版本控制之前進行檢測，迴避低品質或錯誤的程式碼，減少了 Code Review 時浪費的時間。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;減少 CI 壓力&lt;/strong&gt;：開發者本地檢測並提早警告錯誤，降低負擔。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;❌ 負面：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;過度依賴本地環境&lt;/strong&gt;：Hook 的執行依賴開發者的本地環境，如果環境未正確配置，可能導致不一致的行為。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;影響開發者的靈活性&lt;/strong&gt;：干擾開發者在本地進行快速實驗，強制提交的程式碼符合某些規範。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;過往我遇到專案 Pre-Commit Hooks 總是要跑個 5 、 6 秒，雖然還能接受但頻繁的 commit 時等待檢測是挺惱人的，我會偏向 CI 檢測要有再看團隊習慣。&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>Guideline for Color Contrast in Web</title><link>https://www.webdong.dev/en/shortpost/guideline-for-color-contrast-in-web/#guideline-for-color-contrast-in-web/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/guideline-for-color-contrast-in-web/#guideline-for-color-contrast-in-web/</guid><pubDate>Sat, 23 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The accessibility standards for web colors can specifically refer to the WCAG color contrast guidelines, which classify color contrast into AA or AAA levels. Higher intensity is usually more noticeable and friendlier for more users to identify (this detection standard can be found in Chrome DevTools, Lighthouse, or various other tools).&lt;/p&gt;
&lt;p&gt;However, it&apos;s not that simple. Although the WCAG color contrast is a commonly used standard in the industry, it was born in the era of CRT monitors, and there are many reasons why it is no longer suitable as today&apos;s standard. The &lt;a href=&quot;https://git.apcacontrast.com/documentation/APCAeasyIntro&quot;&gt;APCA&lt;/a&gt; algorithm was thus born and is expected to become the new standard for future WCAG 3.&lt;/p&gt;
&lt;p&gt;If you are looking for a compromise solution during this period, you might consider &lt;a href=&quot;https://bridgepca.com/&quot;&gt;Bridge-PCA&lt;/a&gt;, which is 100% compatible with WCAG2 contrast and addresses existing issues.&lt;/p&gt;
&lt;p&gt;Strictly determining pass or fail based on color contrast is not a guiding principle and may not necessarily meet the needs of specific users. In fact, when it comes to contrast, the needs of different users can conflict with each other — what is beneficial for some may be harmful to others. This even applies to font size. - &lt;a href=&quot;https://git.apcacontrast.com/documentation/APCA_in_a_Nutshell#failing-passfail&quot;&gt;APCA in a Nutshell&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.webdong.dev/post/accessibility-and-webpage/&quot;&gt;Accessibility Web Knowledge for Frontend Developers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Accessibility</category></item><item><title>网页色彩对比度怎么规范？</title><link>https://www.webdong.dev/zh-cn/shortpost/guideline-for-color-contrast-in-web/#guideline-for-color-contrast-in-web/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/guideline-for-color-contrast-in-web/#guideline-for-color-contrast-in-web/</guid><pubDate>Sat, 23 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;网页色彩的无障碍规范具体可以参考 WCAG 颜色对比度规范，通常会依照 WCAG 将色彩对比度划分为 AA 或 AAA 等级，更高强度通常更显眼且对更多用户识别上更友善（可以在 Chrome 检色器、 lighthouse 或各大工具中找到此项检测标准）。&lt;/p&gt;
&lt;p&gt;不过事情没有这么简单。虽然 WCAG 颜色对比度是业界常用标准，但仍诞生在 CRT 显示器流行的时代，有很多原因导致它不再适合作为当今标准，&lt;a href=&quot;https://git.apcacontrast.com/documentation/APCAeasyIntro&quot;&gt;APCA&lt;/a&gt; 算法因而诞生并有望成为未来 WCAG 3 的新标准。&lt;/p&gt;
&lt;p&gt;如果在这个时期希望有个折衷方案可以考虑看看 &lt;a href=&quot;https://bridgepca.com/&quot;&gt;Bridge-PCA&lt;/a&gt;，100% 兼容 WCAG2 对比度并解决现有问题。&lt;/p&gt;
&lt;p&gt;依照色彩对比度进行严格的通过或不通过判定，作为指导方针并不具有指导性，而且不一定能解决特定使用者的需求。事实上，当谈到对比度时，不同使用者的需求是相互冲突的 —— 对某些人有益的，可能对另一些人有害。这一点甚至适用于字体大小。 - &lt;a href=&quot;https://git.apcacontrast.com/documentation/APCA_in_a_Nutshell#failing-passfail&quot;&gt;APCA in a Nutshell&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.webdong.dev/post/accessibility-and-webpage/&quot;&gt;前端需要知道的无障碍网页&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Accessibility</category></item><item><title>網頁色彩對比度怎麼規範？</title><link>https://www.webdong.dev/zh-tw/shortpost/guideline-for-color-contrast-in-web/#guideline-for-color-contrast-in-web/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/guideline-for-color-contrast-in-web/#guideline-for-color-contrast-in-web/</guid><pubDate>Sat, 23 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;網頁色彩的無障礙規範具體可以參考 WCAG 顏色對比度規範，通常會依照 WCAG 將色彩對比度劃分為 AA 或 AAA 等級，更高強度通常更顯眼且對更多用戶識別上更友善（可以在 Chrome 檢色器、 lighthouse 或各大工具中找到此項檢測標準）。&lt;/p&gt;
&lt;p&gt;不過事情沒有這麼簡單。雖然 WCAG 顏色對比度是業界常用標準，但仍誕生在 CRT 螢幕流行的時代，有很多原因導致它不再適合作為當今標準，&lt;a href=&quot;https://git.apcacontrast.com/documentation/APCAeasyIntro&quot;&gt;APCA&lt;/a&gt; 算法因而誕生並有望成為未來 WCAG 3 的新標準。&lt;/p&gt;
&lt;p&gt;如果在這個時期希望有個折衷方案可以考慮看看 &lt;a href=&quot;https://bridgepca.com/&quot;&gt;Bridge-PCA&lt;/a&gt;，100% 兼容 WCAG2 對比度並解決現有問題。&lt;/p&gt;
&lt;p&gt;依照色彩對比度進行嚴格的通過或不通過判定，作為指導方針並不具有指導性，而且不一定能解決特定使用者的需求。事實上，當談到對比度時，不同使用者的需求是相互衝突的 —— 對某些人有益的，可能對另一些人有害。這一點甚至適用於字體大小。 - &lt;a href=&quot;https://git.apcacontrast.com/documentation/APCA_in_a_Nutshell#failing-passfail&quot;&gt;APCA in a Nutshell&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.webdong.dev/post/accessibility-and-webpage/&quot;&gt;前端需要知道的無障礙網頁&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Accessibility</category></item><item><title>什麼是 ARIA - Accessible Rich Internet Applications？</title><link>https://www.webdong.dev/zh-tw/shortpost/what-is-aria/#what-is-aria/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/what-is-aria/#what-is-aria/</guid><pubDate>Fri, 15 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ARIA 是一系列 HTML 屬性用於額外標註資訊於網頁元素當中，幫助用戶透過無障礙輔助（Assistive Technologies）來完善體驗。&lt;/p&gt;
&lt;p&gt;大多前端都應該明白應透過語意化的方式（HTML5）去建構網頁，以便讓搜尋引擎等爬蟲理解資料進而增進搜尋體驗與名次，而語意化的網頁也同時會是無障礙網頁的第一步，可以幫助瀏覽器或無障礙輔助用戶更清楚網頁的內容。&lt;/p&gt;
&lt;p&gt;一些動態網頁應用會需要額外標示 ARIA 才能提供完善的無障礙體驗，舉例：「頁面中動態顯示或改動的資訊」就會需要標示 ARIA 屬性告知無障礙輔助，以便在改動時可以聲音告知用戶。在 ARIA 之前應當確保網頁語意化充分，錯誤設置 ARIA 可能造成反效果，比沒設置時的體驗來得糟糕。&lt;/p&gt;
&lt;p&gt;之後才知道原來大多現代瀏覽器普遍都具備觀測無障礙屬性相關的專屬功能，舉例 Chrome Accessibility Tree：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;F12 打開瀏覽器 DevTools&lt;/li&gt;
&lt;li&gt;Ctrl + Shift + P 或 ⌘ + Shift + P 輸入執行指令 Show Accessibility&lt;/li&gt;
&lt;li&gt;Accessibility Tree &amp;gt; 勾選 Enable full-page accessibility tree&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;這樣觀測瀏覽器怎麼解讀網頁就方便得多。&lt;/p&gt;
</content:encoded><category>Accessibility</category></item><item><title>What is an Accessible Web Page?</title><link>https://www.webdong.dev/en/shortpost/what-is-accessible-web/#what-is-accessible-web/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/what-is-accessible-web/#what-is-accessible-web/</guid><pubDate>Thu, 14 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A web page designed with accessibility in mind, similar to the concept of accessible facilities, considers the needs of users with different physical abilities and environmental experiences. For example, visually impaired or keyboard users may need websites to have appropriate visual processing or other assistive indicators to ensure that the website information can be correctly conveyed and interacted with, as previously discussed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.webdong.dev/en/shortpost/focus-indicator/#focus-indicator&quot;&gt;Why does a blue outline appear when pressing a browser tab?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.webdong.dev/en/shortpost/color-blind-website-preview/#color-blind-website-preview&quot;&gt;What Do Websites Look Like to Different Types of Colorblind Eyes?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Accessible web pages are special measures for specific minority groups? Not entirely.&lt;/p&gt;
&lt;p&gt;Related to physical degeneration, harsh environments, limited hardware and preferences, etc., ultimately, accessible web pages consider creating an inclusive user experience, ensuring that everyone can use the web equally and smoothly.
Finally, I would like to share &lt;a href=&quot;https://www.whocanuse.com/?bg=533399&amp;amp;fg=ffffff&amp;amp;fs=16&amp;amp;fw=&quot;&gt;WhoCanUse&lt;/a&gt;, a website that simulates the differences in experiences of the same button for different types of visual impairments or environmental simulations.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/a11yvillage/%E7%82%BA%E6%89%80%E6%9C%89%E4%BA%BA%E6%89%93%E9%80%A0%E7%94%A2%E5%93%81-%E7%84%A1%E9%9A%9C%E7%A4%99accessibility%E6%98%AF%E4%BB%80%E9%BA%BC-fb852ac32d42&quot;&gt;Creating Products for Everyone: What is Accessibility? - A11y Village&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Accessibility</category></item><item><title>什么是无障碍网页？</title><link>https://www.webdong.dev/zh-cn/shortpost/what-is-accessible-web/#what-is-accessible-web/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/what-is-accessible-web/#what-is-accessible-web/</guid><pubDate>Thu, 14 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;和无障碍设施同样的概念，考量不同身体机能和环境使用体验的网页就是无障碍网页。举例视障或键盘用户在使用网站时可能会需要网站具备适当的视觉处理或其他辅助标示来确保网站资讯能够正确的被传递与互动，像是先前探讨过：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.webdong.dev/shortpost/focus-indicator/#focus-indicator&quot;&gt;为什么浏览器 Tab 按下去会显示蓝蓝的外框？ - Focus Indicators&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.webdong.dev/shortpost/color-blind-website-preview/#color-blind-website-preview&quot;&gt;好奇不同种类色盲眼中的网站是长什么样子？&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;听起来是无障碍网页为了特定少数族群而做的特别措施？不全然如此。
关联到身体退化、恶劣环境、有限的硬件设施、习惯偏好……等，说到底无障碍网页考量的是打造包容性的使用体验，确保所有人都能平等流畅的使用网页。
最后分享 &lt;a href=&quot;https://www.whocanuse.com/?bg=533399&amp;amp;fg=ffffff&amp;amp;fs=16&amp;amp;fw=&quot;&gt;WhoCanUse&lt;/a&gt; 这个网站，可以模拟看看相同按钮对不同种类视障或环境上模拟的体验差异。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/a11yvillage/%E7%82%BA%E6%89%80%E6%9C%89%E4%BA%BA%E6%89%93%E9%80%A0%E7%94%A2%E5%93%81-%E7%84%A1%E9%9A%9C%E7%A4%99accessibility%E6%98%AF%E4%BB%80%E9%BA%BC-fb852ac32d42&quot;&gt;为所有人打造产品：无障碍 Accessibility 是什么？ - A11y 新手村&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Accessibility</category></item><item><title>什麼是無障礙網頁？</title><link>https://www.webdong.dev/zh-tw/shortpost/what-is-accessible-web/#what-is-accessible-web/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/what-is-accessible-web/#what-is-accessible-web/</guid><pubDate>Thu, 14 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;和無障礙設施同樣的概念，考量不同身體機能和環境使用體驗的網頁就是無障礙網頁。舉例視障或鍵盤用戶在使用網站時可能會需要網站具備適當的視覺處理或其他輔助標示來確保網站資訊能夠正確的被傳遞與互動，像是先前探討過：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.webdong.dev/shortpost/focus-indicator/#focus-indicator&quot;&gt;為什麼瀏覽器 Tab 按下去會顯示藍藍的外框？ - Focus Indicators&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.webdong.dev/shortpost/color-blind-website-preview/#color-blind-website-preview&quot;&gt;好奇不同種類色盲眼中的網站是長什麼樣子？&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;聽起來是無障礙網頁為了特定少數族群而做的特別措施？不全然如此。
關連到身體退化、惡劣環境、有限的硬體設施、習慣偏好……等，說到底無障礙網頁考量的是打造包容性的使用體驗，確保所有人都能平等流暢的使用網頁。
最後分享 &lt;a href=&quot;https://www.whocanuse.com/?bg=533399&amp;amp;fg=ffffff&amp;amp;fs=16&amp;amp;fw=&quot;&gt;WhoCanUse&lt;/a&gt; 這個網站，可以模擬看看相同按鈕對不同種類視障或環境上模擬的體驗差異。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/a11yvillage/%E7%82%BA%E6%89%80%E6%9C%89%E4%BA%BA%E6%89%93%E9%80%A0%E7%94%A2%E5%93%81-%E7%84%A1%E9%9A%9C%E7%A4%99accessibility%E6%98%AF%E4%BB%80%E9%BA%BC-fb852ac32d42&quot;&gt;為所有人打造產品：無障礙 Accessibility 是什麼？ - A11y 新手村&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Accessibility</category></item><item><title>How to publish local website and server</title><link>https://www.webdong.dev/en/shortpost/how-to-publish-local-website-and-server/#how-to-publish-local-website-and-server/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/how-to-publish-local-website-and-server/#how-to-publish-local-website-and-server/</guid><pubDate>Sat, 09 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;First, let&apos;s look at these two memes:&lt;/p&gt;
&lt;p&gt;👉 Misunderstanding that other computers can directly connect to local files&lt;/p&gt;
&lt;p&gt;Make good use of static web hosting services, upload to GitHub Pages, Netlify, or Vercel, etc..., to generate a public URL, so others can view the website through that link.&lt;/p&gt;
&lt;p&gt;👉 Misunderstanding that other computers can directly connect to local server ports&lt;/p&gt;
&lt;p&gt;Use the internal IP address: On the same internal network (for example, on the same Wi-Fi), you can use the local IP address to access the server, allowing other devices on the same subnet to access it directly through this IP address.
Expose the local server: If you want to access the local server from the external network, you can use tools like ngrok, LocalTunnel, or Cloudflare Tunnel to create a temporary URL that maps the local server to the external network.&lt;/p&gt;
&lt;p&gt;Frontend developers often need to test on different devices and browser environments, and the commonly used &lt;a href=&quot;https://code.visualstudio.com/docs/editor/port-forwarding&quot;&gt;VSCode editor actually has built-in Microsoft dev tunnels&lt;/a&gt;, allowing you to quickly put the development server online for testing with just a few clicks.&lt;/p&gt;
&lt;p&gt;Even &lt;a href=&quot;https://www.youtube.com/watch?v=b4nXOFTXI_c&quot;&gt;Nuxt has built-in support for Cloudflare Quick Tunnels&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>怎么让外网连结本地网站与伺服器？</title><link>https://www.webdong.dev/zh-cn/shortpost/how-to-publish-local-website-and-server/#how-to-publish-local-website-and-server/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/how-to-publish-local-website-and-server/#how-to-publish-local-website-and-server/</guid><pubDate>Sat, 09 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;先看这两个 Meme 怎么解：&lt;/p&gt;
&lt;p&gt;👉 误以为其他电脑可以直接连接本地档案&lt;/p&gt;
&lt;p&gt;善用静态网页托管服务，上传到 GitHub Pages、Netlify 或 Vercel ……等服务生成一个公共 URL，其他人便能透过该连结来查看网站。&lt;/p&gt;
&lt;p&gt;👉 误以为其他电脑可以直接连接本地伺服器端口&lt;/p&gt;
&lt;p&gt;使用内网 IP 地址：在同一个内部网路（例如在同一个 Wi-Fi）下，可以使用本地 IP 位址来访问伺服器，这样其他同网段的装置可以直接通过这个 IP 位址进行访问。
公开本地伺服器：如果希望在外网访问本地伺服器，可以使用一些工具如 ngrok、LocalTunnel 或者 Cloudflare Tunnel 创建一个暂时网址，将本地伺服器映射到外网。&lt;/p&gt;
&lt;p&gt;前端时常要在不同装置与浏览器环境上测试，而常用的&lt;a href=&quot;https://code.visualstudio.com/docs/editor/port-forwarding&quot;&gt;VSCode 编辑器其实就有内建 Microsoft dev tunnels&lt;/a&gt;，可以迅速几个按钮把开发伺服器放上网测试。&lt;/p&gt;
&lt;p&gt;甚至 &lt;a href=&quot;https://www.youtube.com/watch?v=b4nXOFTXI_c&quot;&gt;Nuxt 有内建支援 Cloudflare Quick Tunnels&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>怎麼讓外網連結本地網站與伺服器？</title><link>https://www.webdong.dev/zh-tw/shortpost/how-to-publish-local-website-and-server/#how-to-publish-local-website-and-server/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/how-to-publish-local-website-and-server/#how-to-publish-local-website-and-server/</guid><pubDate>Sat, 09 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;先看這兩個 Meme 怎麼解：&lt;/p&gt;
&lt;p&gt;👉 誤以為其他電腦可以直接連接本地檔案&lt;/p&gt;
&lt;p&gt;善用靜態網頁托管服務，上傳到 GitHub Pages、Netlify 或 Vercel ……等服務生成一個公共 URL，其他人便能透過該連結來查看網站。&lt;/p&gt;
&lt;p&gt;👉 誤以為其他電腦可以直接連接本地伺服器端口&lt;/p&gt;
&lt;p&gt;使用內網 IP 地址：在同一個內部網路（例如在同一個 Wi-Fi）下，可以使用本地 IP 位址來訪問伺服器，這樣其他同網段的裝置可以直接通過這個 IP 位址進行訪問。
公開本地伺服器：如果希望在外網訪問本地伺服器，可以使用一些工具如 ngrok、LocalTunnel 或者 Cloudflare Tunnel 創建一個暫時網址，將本地伺服器映射到外網。&lt;/p&gt;
&lt;p&gt;前端時常要在不同裝置與瀏覽器環境上測試，而常用的 &lt;a href=&quot;https://code.visualstudio.com/docs/editor/port-forwarding&quot;&gt;VSCode 編輯器其實就有內建 Microsoft dev tunnels&lt;/a&gt;，可以迅速幾個按鈕把開發伺服器放上網測試。&lt;/p&gt;
&lt;p&gt;甚至 &lt;a href=&quot;https://www.youtube.com/watch?v=b4nXOFTXI_c&quot;&gt;Nuxt 有內建支援 Cloudflare Quick Tunnels&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>Three Essentials of Developer Writing: Clarity, Personality, Consistency</title><link>https://www.webdong.dev/en/shortpost/writing-for-developers/#writing-for-developers/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/writing-for-developers/#writing-for-developers/</guid><pubDate>Fri, 08 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Clarity: In addition to basic sentence structure, the need for details varies depending on the type of writing, making the choice to retain or omit content equally important.&lt;/p&gt;
&lt;p&gt;Personality: A sufficient amount of personality and an authentic voice make readers believe that what they are reading is written by someone who is genuinely interested and knowledgeable about the subject, without hindering the communication of the content.&lt;/p&gt;
&lt;p&gt;Consistency: Find a style that is beneficial and preferred by the platform and target audience.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What common problems do people encounter?&lt;/li&gt;
&lt;li&gt;What misunderstandings or anti-patterns do you often face?&lt;/li&gt;
&lt;li&gt;What new trends or interesting new things are emerging?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Write for yourself, identify the content you want to read, and then write it down. As a developer writing for developers, you are the reader.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rmoff.net/2023/07/19/blog-writing-for-developers/&quot;&gt;Blog Writing for Developers - rmoff.net&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>开发者写作三要素：清晰、个性、一致性</title><link>https://www.webdong.dev/zh-cn/shortpost/writing-for-developers/#writing-for-developers/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/writing-for-developers/#writing-for-developers/</guid><pubDate>Fri, 08 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;清晰：除了基本语句结构外，根据不同的写作类型对细节的需求会有所不同，选择保留或省略内容一样重要。&lt;/p&gt;
&lt;p&gt;个性：足够的个性和真实的声音让读者相信阅读的东西是由真正对此事感兴趣且了解情况的人写的，但又不至于妨碍内容传达。&lt;/p&gt;
&lt;p&gt;一致性：找到平台与目标受众偏好且有益的文体。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;人们常遇到什么问题？&lt;/li&gt;
&lt;li&gt;哪些误会或反模式你常遇到？&lt;/li&gt;
&lt;li&gt;哪些新趋势或有趣的新事物？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;为自己写，找出你想读的内容然后写下来，身为替开发人员写作的开发人员你就是读者。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rmoff.net/2023/07/19/blog-writing-for-developers/&quot;&gt;Blog Writing for Developers - rmoff.net&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>開發者寫作三要素：清晰、個性、一致性</title><link>https://www.webdong.dev/zh-tw/shortpost/writing-for-developers/#writing-for-developers/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/writing-for-developers/#writing-for-developers/</guid><pubDate>Fri, 08 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;清晰：除了基本語句結構外，根據不同的寫作類型對細節的需求會有所不同，選擇保留或省略內容一樣重要。&lt;/p&gt;
&lt;p&gt;個性：足夠的個性和真實的聲音讓讀者相信閱讀的東西是由真正對此事感興趣且了解情況的人寫的，但又不至於妨礙內容傳達。&lt;/p&gt;
&lt;p&gt;一致性：找到平台與目標受眾偏好且有益的文體。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;人們常遇到什麼問題？&lt;/li&gt;
&lt;li&gt;哪些誤會或反模式你常遇到？&lt;/li&gt;
&lt;li&gt;哪些新趨勢或有趣的新事物？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;為自己寫，找出你想讀的內容然後寫下來，身為替開發人員寫作的開發人員你就是讀者。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://rmoff.net/2023/07/19/blog-writing-for-developers/&quot;&gt;Blog Writing for Developers - rmoff.net&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>Why does Object.keys in TypeScript return only string[] type for any object?</title><link>https://www.webdong.dev/en/shortpost/object-keys-and-typescript/#object-keys-and-typescript/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/object-keys-and-typescript/#object-keys-and-typescript/</guid><pubDate>Wed, 06 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;As indicated by the error message in the image, &lt;code&gt;person&lt;/code&gt; needs to accept specific values for &lt;code&gt;key&lt;/code&gt; rather than any &lt;code&gt;string&lt;/code&gt;. So what is the reason behind &lt;code&gt;Object.keys&lt;/code&gt; returning a more wide &lt;code&gt;string[]&lt;/code&gt; type? It is obvious that all &lt;code&gt;key&lt;/code&gt; types can be derived through &lt;code&gt;keyof&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;Because JavaScript objects can “dynamically change their content at runtime.”&lt;/p&gt;
&lt;p&gt;If &lt;code&gt;Object.keys&lt;/code&gt; were designed to return &lt;code&gt;(keyof T)[]&lt;/code&gt;, that type definition would not accurately reflect the changes that JavaScript objects may encounter at runtime. Since object properties can be dynamically modified, TypeScript chooses to use the more wider &lt;code&gt;string[]&lt;/code&gt; type to ensure safety.&lt;/p&gt;
&lt;p&gt;Conclusion: TypeScript respects the dynamic typing characteristics of JavaScript, which leads to &lt;code&gt;Object.keys&lt;/code&gt; being able to guarantee a return type of at most &lt;code&gt;string[]&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Details of the analysis and references, along with three coping strategies, are written in the blog: &lt;a href=&quot;https://www.webdong.dev/post/why-object-keys-returns-array-of-strings-in-typescript/&quot;&gt;Why Object.keys returns string[] in TypeScript&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>TypeScript</category></item><item><title>为什么 TypeScript 中 Object.keys 接受任何对象都只返回 string[] 类型？</title><link>https://www.webdong.dev/zh-cn/shortpost/object-keys-and-typescript/#object-keys-and-typescript/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/object-keys-and-typescript/#object-keys-and-typescript/</guid><pubDate>Wed, 06 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;如图中错误信息得知 &lt;code&gt;person&lt;/code&gt; 会需要接受特定值的 &lt;code&gt;key&lt;/code&gt; 而非任意 &lt;code&gt;string&lt;/code&gt;，那背后又是什么原因 &lt;code&gt;Object.keys&lt;/code&gt; 被设计成返回更为松散的 &lt;code&gt;string[]&lt;/code&gt; 类型呢？明明很明显可以通过 &lt;code&gt;keyof&lt;/code&gt; 得出所有 &lt;code&gt;key&lt;/code&gt; 的类型？&lt;/p&gt;
&lt;p&gt;因为 JavaScript 对象可以 「在运行时动态改变其内容」。&lt;/p&gt;
&lt;p&gt;如果将 &lt;code&gt;Object.keys&lt;/code&gt; 设计成返回 &lt;code&gt;(keyof T)[]&lt;/code&gt;，该类型定义无法准确反映 JavaScript 对象在运行时可能遭遇的变化，因为对象属性可以被动态修改，所以 TypeScript 选择使用更宽松的 &lt;code&gt;string[]&lt;/code&gt; 类型来确保安全。&lt;/p&gt;
&lt;p&gt;结论： TypeScript 尊重 JavaScript 动态类型的特性，导致 Object.keys 最多只能确保返回 &lt;code&gt;string[]&lt;/code&gt; 类型。&lt;/p&gt;
&lt;p&gt;分析细节与引用参考还有三种应对方式写在博客中：&lt;a href=&quot;https://www.webdong.dev/post/why-object-keys-returns-array-of-strings-in-typescript/&quot;&gt;为什么 TypeScript 中 Object.keys 返回 string[] 类型？&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>TypeScript</category></item><item><title>為什麼 TypeScript 中 Object.keys 接受任何物件都只返回 string[] 型別？</title><link>https://www.webdong.dev/zh-tw/shortpost/object-keys-and-typescript/#object-keys-and-typescript/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/object-keys-and-typescript/#object-keys-and-typescript/</guid><pubDate>Wed, 06 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;如圖中錯誤訊息得知 &lt;code&gt;person&lt;/code&gt; 會需要接受特定值的 &lt;code&gt;key&lt;/code&gt; 而非任意 &lt;code&gt;string&lt;/code&gt;，那背後麼又是什麼原因 &lt;code&gt;Object.keys&lt;/code&gt; 被設計成返回更為鬆散的 &lt;code&gt;string[]&lt;/code&gt; 型別呢？明明很明顯可以透過 &lt;code&gt;keyof&lt;/code&gt; 得出所有 &lt;code&gt;key&lt;/code&gt; 的型別？&lt;/p&gt;
&lt;p&gt;因為 JavaScript 物件可以 「在執行時動態改變其內容」。&lt;/p&gt;
&lt;p&gt;如果將 &lt;code&gt;Object.keys&lt;/code&gt; 設計成返回 &lt;code&gt;(keyof T)[]&lt;/code&gt;，該型別定義無法準確反映 JavaScript 物件在運行時可能遭遇的變化，因為物件屬性可以被動態修改，所以 TypeScript 選擇使用更寬鬆的 &lt;code&gt;string[]&lt;/code&gt; 型別來確保安全。&lt;/p&gt;
&lt;p&gt;結論： TypeScript 尊重 JavaScript 動態型別的特性，導致 Object.keys 最多只能確保返回 &lt;code&gt;string[]&lt;/code&gt; 型別。&lt;/p&gt;
&lt;p&gt;分析細節與引用參考還有三種應對方式寫在部落格中：&lt;a href=&quot;https://www.webdong.dev/post/why-object-keys-returns-array-of-strings-in-typescript/&quot;&gt;為什麼 TypeScript 中 Object.keys 返回 string[] 型別？&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>TypeScript</category></item><item><title>Translated 168 Blog Posts in 2 Days for Less Than $0.1 Using GPT-4o</title><link>https://www.webdong.dev/en/shortpost/gpt-markdown-translator/#gpt-markdown-translator/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/gpt-markdown-translator/#gpt-markdown-translator/</guid><pubDate>Mon, 04 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Recently, while creating a multilingual blog (Simplified Chinese and English), I happened to see a post on Huli&apos;s blog mentioning that he successfully translated hundreds of articles by modifying the open-source chatgpt-md-translator. So, I decided to experiment as well, and the results were quite good!&lt;/p&gt;
&lt;p&gt;👀 Observations:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Compared to translating literal meanings, AI can provide better translation results based on cultural and domain backgrounds. I don&apos;t understand the usage background of Simplified Chinese, such as... 部落格 - 博客, 品質 - 质量? It feels like as a non-native speaker, AI understands language habits better than I do when translating.&lt;/li&gt;
&lt;li&gt;With Grammarly, I found that AI&apos;s grammar is impeccable.&lt;/li&gt;
&lt;li&gt;Most of the time was spent on manual proofreading, as translations involving deep cultural or specialized domains require special attention.
If you&apos;re interested in the results, you can scroll to the bottom of the &lt;a href=&quot;https://www.webdong.dev/en/shortpost/&quot;&gt;blog&lt;/a&gt; where there&apos;s a globe button to switch languages. I plan to translate the entire website more thoroughly before placing it in a prominent position.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;If you want to jump in and play around, you can refer to the instructions in the &lt;a href=&quot;https://github.com/riceball-tw/gpt-markdown-translator&quot;&gt;README&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;You can also check out my blog project, using &lt;a href=&quot;https://github.com/riceball-tw/web-dong-blog/pull/133&quot;&gt;Git Submodules to link the translation project&lt;/a&gt; for convenient translation use.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>借助 GPT-4o 用不到 0.1 美元在 2 天内翻译了 168 篇部落格短文</title><link>https://www.webdong.dev/zh-cn/shortpost/gpt-markdown-translator/#gpt-markdown-translator/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/gpt-markdown-translator/#gpt-markdown-translator/</guid><pubDate>Mon, 04 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;近期制作博客多语系（简中、英文）时碰巧看见 Huli 博客提到他通过修改开源的 chatgpt-md-translator 来成功翻译上百篇文章，于是我也来实验看看，成效不错！&lt;/p&gt;
&lt;p&gt;👀 观察：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;相较于翻译字面意思，AI 更能根据文化与领域背景提供更好的翻译结果。我是不懂简体中文使用背景的，像是……部落格 - 博客、品質 - 质量？感觉身为非母语者翻译时， AI 对语言使用习惯上会懂得比我多。&lt;/li&gt;
&lt;li&gt;搭配 Grammarly 发现 AI 语法上无懈可击。&lt;/li&gt;
&lt;li&gt;大多时间都在人工校对，太深层文化或专有领域方面翻译需要特别关注。
对成果感兴趣可以滑到&lt;a href=&quot;https://www.webdong.dev/en/shortpost/&quot;&gt;博客&lt;/a&gt;底下有颗地球按钮切换语系，打算整个网站翻译成熟一点再摆到显眼的位置。&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;想要跳下来玩玩看可以参考看看，说明都在 &lt;a href=&quot;https://github.com/riceball-tw/gpt-markdown-translator&quot;&gt;README&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;实际可以参考我的博客项目，用 &lt;a href=&quot;https://github.com/riceball-tw/web-dong-blog/pull/133&quot;&gt;Git Submodules 将翻译项目挂上&lt;/a&gt;，方便平时翻译使用。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>借助 GPT-4o 用不到 0.1 美元在 2 天內翻譯了 168 篇部落格短文</title><link>https://www.webdong.dev/zh-tw/shortpost/gpt-markdown-translator/#gpt-markdown-translator/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/gpt-markdown-translator/#gpt-markdown-translator/</guid><pubDate>Mon, 04 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;近期製作部落格多語系（簡中、英文）時碰巧看見 Huli 部落格提到他透過修改開源的 chatgpt-md-translator 來成功翻譯上百篇文章，於是我也來實驗看看，成效不錯！&lt;/p&gt;
&lt;p&gt;👀 觀察：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;相較於翻譯字面意思，AI 更能根據文化與領域背景提供更好的翻譯結果。我是不懂簡體中文使用背景的，像是……部落格 - 博客、品質 - 質量？感覺身為非母語者翻譯時， AI 對語言使用習慣上會懂得比我多。&lt;/li&gt;
&lt;li&gt;搭配 Grammarly 發現 AI 文法上無懈可擊。&lt;/li&gt;
&lt;li&gt;大多時間都在人工校對，太深層文化或專有領域方面翻譯需要特別關注。
對成果感興趣可以滑到&lt;a href=&quot;https://www.webdong.dev/en/shortpost/&quot;&gt;部落格&lt;/a&gt;底下有顆地球按鈕切換語系，打算整個網站翻譯成熟一點再擺到顯眼的位置。&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;想要跳下來玩玩看可以參考看看，說明都在 &lt;a href=&quot;https://github.com/riceball-tw/gpt-markdown-translator&quot;&gt;README&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;實際可以參考我的部落格專案，用 &lt;a href=&quot;https://github.com/riceball-tw/web-dong-blog/pull/133&quot;&gt;Git Submodules 將翻譯專案掛上&lt;/a&gt;，方便平時翻譯使用。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>Digital Garden Template — Quartz</title><link>https://www.webdong.dev/en/shortpost/digital-garden-template-quartz/#digital-garden-template-quartz/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/digital-garden-template-quartz/#digital-garden-template-quartz/</guid><pubDate>Fri, 01 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I often browse different blogs online to learn, and today I came across this static site generator focused on converting Markdown documents into a fully functional digital garden, equipped with many impressive features such as built-in search, backlinks, link previews, multilingual support, Mermaid diagrams, LaTeX, and more.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://quartz.jzhao.xyz/&quot;&gt;Quartz&lt;/a&gt; supports multiple Markdown formats like: Obsidian, OxHugo, and Roam Research, suitable for content creators who don&apos;t have time to set up their personal note-taking site, licensed under MIT.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded><category>Share</category></item><item><title>即拿即用的数字花园模板 —— Quartz</title><link>https://www.webdong.dev/zh-cn/shortpost/digital-garden-template-quartz/#digital-garden-template-quartz/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/digital-garden-template-quartz/#digital-garden-template-quartz/</guid><pubDate>Fri, 01 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我时常会翻找网络上不同的博客学习，今天遇到这款静态网页生成器专注于转换 Markdown 文件为功能齐全的数字花园，自带许多亮眼的功能像是：内建搜索、反向链接、链接预览、多语系、Mermaid 图表、LaTeX……等。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://quartz.jzhao.xyz/&quot;&gt;Quartz&lt;/a&gt; 支持 Obsidian、OxHugo、Roam Research 风味的 Markdown 格式，推荐给没有时间架站的内容创作者快速搭建个人笔记网站，MIT 授权。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded><category>Share</category></item><item><title>即拿即用的數位花園模板 —— Quartz</title><link>https://www.webdong.dev/zh-tw/shortpost/digital-garden-template-quartz/#digital-garden-template-quartz/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/digital-garden-template-quartz/#digital-garden-template-quartz/</guid><pubDate>Fri, 01 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我時常會翻找網路上不同的部落格學習，今天遇到這款靜態網頁生成器專注於轉換 Markdown 文件為功能齊全的數位花園，自帶許多亮眼的功能像是：內建搜尋、反向連結、連結預覽、多語系、Mermaid 圖表、LaTeX……等。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://quartz.jzhao.xyz/&quot;&gt;Quartz&lt;/a&gt; 支援 Obsidian、OxHugo、Roam Research 風味的 Markdown 格式，推薦給沒有時間架站的內容創作者快速搭建個人筆記網站，MIT 授權。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded><category>Share</category></item><item><title>The level of abstraction in test code should match that of the system being tested</title><link>https://www.webdong.dev/en/shortpost/abstraction-in-testing/#abstraction-in-testing/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/abstraction-in-testing/#abstraction-in-testing/</guid><pubDate>Mon, 28 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;For example, when writing system-level tests today, you should not leave practical details (low abstraction) in the test cases (high abstraction). Doing so not only harms readability but also undermines the responsibility of the test document itself (to describe the expected behavior of the system).&lt;/p&gt;
&lt;p&gt;This idea applies to all levels of testing: system level, component level, unit level... As for how to conceptualize whether the tests have the correct level of abstraction?&lt;/p&gt;
&lt;p&gt;💭 Imagine sitting next to a person using the system being tested, think about how to explain the behavior you are testing to them, and then write the tests using similar language. You can practice with the diagram below.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=G_0yKeh0Sf0&quot;&gt;Levels of abstraction in testing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Software Testing</category></item><item><title>测试代码应该与被测试系统有相同程度的抽象</title><link>https://www.webdong.dev/zh-cn/shortpost/abstraction-in-testing/#abstraction-in-testing/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/abstraction-in-testing/#abstraction-in-testing/</guid><pubDate>Mon, 28 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;举例，今天在撰写系统层级的测试时就不应该把实践细节（低抽象）留在测试案例（高抽象）当中，这么做除了伤害可读性外也破坏了测试文件本身的职责（描述系统的预期行为）。&lt;/p&gt;
&lt;p&gt;该想法适用于所有层级的测试：系统层级、组件层级、单元层级……至于要如何对测试是否有正确程度的抽象有概念？&lt;/p&gt;
&lt;p&gt;💭 想像坐在正在使用测试中系统的人旁边，想像如何向他解释你正在测试的行为，然后使用类似的词语编写测试。可用下图练习看看。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=G_0yKeh0Sf0&quot;&gt;Levels of abstraction in testing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Software Testing</category></item><item><title>測試代碼應該與被測試系統有相同程度的抽象</title><link>https://www.webdong.dev/zh-tw/shortpost/abstraction-in-testing/#abstraction-in-testing/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/abstraction-in-testing/#abstraction-in-testing/</guid><pubDate>Mon, 28 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;舉例，今天在撰寫系統層級的測試時就不應該把實踐細節（低抽象）留在測試案例（高抽象）當中，這麼做除了傷害閱讀性外也破壞了測試文件本身的職責（描述系統的預期行為）。&lt;/p&gt;
&lt;p&gt;該想法適用於所有層級的測試：系統層級、元件層級、單元層級……至於要如何對測試是否有正確程度的抽象有概念？&lt;/p&gt;
&lt;p&gt;💭 想像坐在正在使用測試中系統的人旁邊，想像如何向他解釋你正在測試的行為，然後使用類似的詞語編寫測試。可用下圖練習看看。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=G_0yKeh0Sf0&quot;&gt;Levels of abstraction in testing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Software Testing</category></item><item><title>Web Sticky Scroll Snapping —— scroll-snap-type</title><link>https://www.webdong.dev/en/shortpost/scroll-snap-type/#scroll-snap-type/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/scroll-snap-type/#scroll-snap-type/</guid><pubDate>Fri, 25 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import Video from &apos;@/components/atoms/video/Video.astro&apos;;&lt;/p&gt;
&lt;p&gt;At first, I was quite excited to learn about this property, imagining many interface cases where it could be used. Could even the slideshow feature be easily solved with native scrolling? However, only by actually using it will you realize that they are completely different experiences.&lt;/p&gt;
&lt;p&gt;This property focuses on the sticky adhesion of the scroll, so it works whether you are scrolling with a mouse or touching the screen. However, if you want to drag elements to scroll, this property won&apos;t help; you&apos;ll still need to write custom JS to solve that.&lt;/p&gt;
&lt;p&gt;You can refer to the well-established slideshow library &lt;a href=&quot;https://swiperjs.com/demos#css-mode&quot;&gt;Swiper&lt;/a&gt;, which actually implements this property in its CSS Mode.&lt;/p&gt;
&lt;p&gt;For more practical examples and implementation details, you can check out &lt;a href=&quot;https://css-tricks.com/practical-css-scroll-snapping/&quot;&gt;Practical CSS Scroll Snapping - CSS-Tricks&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;Video
width={2242}
height={1014}
data={[
{
type: &apos;webm&apos;,
src: &apos;images/shortposts/scroll-snap-type/scroll-snap-type-demo.webm&apos;,
},
{
type: &apos;mp4&apos;,
src: &apos;images/shortposts/scroll-snap-type/scroll-snap-type-demo.mp4&apos;,
},
]}&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;/Video&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>CSS</category></item><item><title>网页黏性卷轴滑动 —— scroll-snap-type</title><link>https://www.webdong.dev/zh-cn/shortpost/scroll-snap-type/#scroll-snap-type/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/scroll-snap-type/#scroll-snap-type/</guid><pubDate>Fri, 25 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import Video from &apos;@/components/atoms/video/Video.astro&apos;;&lt;/p&gt;
&lt;p&gt;一开始得知存在这个属性还蛮兴奋的，想象很多可以使用上的界面案例，甚至投影片功能也能轻松用原生卷轴来解决？不过实际用下去才会知道它们是截然不同的体验。&lt;/p&gt;
&lt;p&gt;这项属性专注在卷轴的黏性吸附，因此无论是滚动卷轴还是触控时都能生效，但如果想要拖动元素来滑动就不是这个属性能帮上忙的地方了，还是要写客制化 JS 去解决。&lt;/p&gt;
&lt;p&gt;具体可以参考看看老牌投影片套件 &lt;a href=&quot;https://swiperjs.com/demos#css-mode&quot;&gt;Swiper&lt;/a&gt; 有个 CSS Mode 实际上就是用该属性实现的。&lt;/p&gt;
&lt;p&gt;更多实用范例与实现细节可以参考 &lt;a href=&quot;https://css-tricks.com/practical-css-scroll-snapping/&quot;&gt;Practical CSS Scroll Snapping - CSS-Tricks&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;Video
width={2242}
height={1014}
data={[
{
type: &apos;webm&apos;,
src: &apos;images/shortposts/scroll-snap-type/scroll-snap-type-demo.webm&apos;,
},
{
type: &apos;mp4&apos;,
src: &apos;images/shortposts/scroll-snap-type/scroll-snap-type-demo.mp4&apos;,
},
]}&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;/Video&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>CSS</category></item><item><title>網頁黏性卷軸滑動 —— scroll-snap-type</title><link>https://www.webdong.dev/zh-tw/shortpost/scroll-snap-type/#scroll-snap-type/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/scroll-snap-type/#scroll-snap-type/</guid><pubDate>Fri, 25 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;import Video from &apos;@/components/atoms/video/Video.astro&apos;;&lt;/p&gt;
&lt;p&gt;一開始得知存在這個屬性還蠻興奮的，想像很多可以使用上的介面案例，甚至投影片功能也能輕鬆用原生卷軸來解決？不過實際用下去才會知道它們是截然不同的體驗。&lt;/p&gt;
&lt;p&gt;這項屬性專注在卷軸的黏性吸附，因此無論是滾動卷軸還是觸控時都能生效，但如果想要拖動元素來滑動就不是這個屬性能幫上忙的地方了，還是要寫客製化 JS 去解決。&lt;/p&gt;
&lt;p&gt;具體可以參考看看老牌投影片套件 &lt;a href=&quot;https://swiperjs.com/demos#css-mode&quot;&gt;Swiper&lt;/a&gt; 有個 CSS Mode 實際上就是用該屬性實作的。&lt;/p&gt;
&lt;p&gt;更多實用範例與實作細節可以參考 &lt;a href=&quot;https://css-tricks.com/practical-css-scroll-snapping/&quot;&gt;Practical CSS Scroll Snapping - CSS-Tricks&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;Video
width={2242}
height={1014}
data={[
{
type: &apos;webm&apos;,
src: &apos;images/shortposts/scroll-snap-type/scroll-snap-type-demo.webm&apos;,
},
{
type: &apos;mp4&apos;,
src: &apos;images/shortposts/scroll-snap-type/scroll-snap-type-demo.mp4&apos;,
},
]}&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;/Video&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>CSS</category></item><item><title>How to Directly Modify Project Dependency Package Source Code (node_modules)?</title><link>https://www.webdong.dev/en/shortpost/patch-package/#patch-package/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/patch-package/#patch-package/</guid><pubDate>Thu, 24 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;During development, there are times when the packages being used have some bugs or features that need to be added, and there isn&apos;t enough time to slowly submit requests and wait for package updates. In such situations, the usual approach is to fork the package, rewrite it, and then modify the dependency source.&lt;/p&gt;
&lt;p&gt;I always thought that forking and rewriting my own package was the only proper way to go, until I accidentally stumbled upon &lt;a href=&quot;https://www.npmjs.com/package/patch-package&quot;&gt;patch-package&lt;/a&gt; and, after reading the documentation carefully, discovered that pnpm and yarn2+ have long supported the ability to modify the source code of dependency packages.&lt;/p&gt;
&lt;p&gt;pnpm has some good &lt;a href=&quot;https://pnpm.io/cli/patch&quot;&gt;documentation and video examples&lt;/a&gt; describing how to patch specific packages.
In simple terms, it creates a patches folder to store the modified packages and references the modified packages through patchedDependencies, which is a more elegant way to manage temporary fixes to packages.&lt;/p&gt;
&lt;p&gt;You can also take a look at &lt;a href=&quot;https://github.com/antfu/pnpm-patch-i&quot;&gt;pnpm-patch-i&lt;/a&gt;.&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>如何直接修改项目依赖包原始代码（node_modules）？</title><link>https://www.webdong.dev/zh-cn/shortpost/patch-package/#patch-package/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/patch-package/#patch-package/</guid><pubDate>Thu, 24 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;开发时有时会遇到使用的包存在一些 BUG 或功能需要补上，且没有时间慢慢发请求等待包更新，像这样的情境通常就是 fork 包改写后修改依赖来源。&lt;/p&gt;
&lt;p&gt;我一直以为 fork 并改写出自己的包并接上是唯一妥善的方式，直到无意间翻到 &lt;a href=&quot;https://www.npmjs.com/package/patch-package&quot;&gt;patch-package&lt;/a&gt; 这个包，并且在细读文档后才发现原来 pnpm 与 yarn2+ 早就已经支持修改依赖包原始代码的功能。&lt;/p&gt;
&lt;p&gt;pnpm 有不错的&lt;a href=&quot;https://pnpm.io/cli/patch&quot;&gt;文档与视频范例&lt;/a&gt;描述如何 patch 特定包。
简单来说会创建一个 patches 文件夹存放修改过的包，并且通过 patchedDependencies 来引用被修改过的包，算是一个更优雅的方式去管理临时对包的修补。&lt;/p&gt;
&lt;p&gt;pnpm 还可以参考看看 &lt;a href=&quot;https://github.com/antfu/pnpm-patch-i&quot;&gt;pnpm-patch-i&lt;/a&gt;。&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>如何直接修改專案依賴套件原始碼（node_modules）？</title><link>https://www.webdong.dev/zh-tw/shortpost/patch-package/#patch-package/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/patch-package/#patch-package/</guid><pubDate>Thu, 24 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;開發時有時會遇到使用的套件存在一些 BUG 或功能需要補上，且沒有時間慢慢發請求等待套件更新，像這樣的情境通常就是 fork 套件改寫後修改依賴來源。&lt;/p&gt;
&lt;p&gt;我一直以為 fork 並改寫出自己的套件並接上是唯一妥善的方式，直到無意間翻到 &lt;a href=&quot;https://www.npmjs.com/package/patch-package&quot;&gt;patch-package&lt;/a&gt; 這個套件，並且在細讀文件後才發現原來 pnpm 與 yarn2+ 早就已經支援修改依賴套件原始碼的功能。&lt;/p&gt;
&lt;p&gt;pnpm 有不錯的&lt;a href=&quot;https://pnpm.io/cli/patch&quot;&gt;文件與影片範例&lt;/a&gt;描述如何 patch 特定套件。
簡單來說會創建一個 patches 資料夾存放修改過的套件，並且透過 patchedDependencies 來引用被修改過的套件，算是一個更優雅的方式去管理臨時對套件的修補。&lt;/p&gt;
&lt;p&gt;pnpm 還可以參考看看 &lt;a href=&quot;https://github.com/antfu/pnpm-patch-i&quot;&gt;pnpm-patch-i&lt;/a&gt;。&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>Why does a blue outline appear when pressing a browser tab?</title><link>https://www.webdong.dev/en/shortpost/focus-indicator/#focus-indicator/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/focus-indicator/#focus-indicator/</guid><pubDate>Tue, 22 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Recently, the designer reported that some interactive elements on the website show a blue outline when focused, and hopes to remove it. However, before removing it, I think it is necessary to discuss the reason behind it.&lt;/p&gt;
&lt;p&gt;The blue outline is specifically called Focus Indicators, and it is also referred to as Focus Ring or Focus Outline. Its purpose is to help users easily locate the content that is currently focused on the webpage, usually providing clearer indications for users with visual impairments or those who navigate the webpage using a keyboard.&lt;/p&gt;
&lt;p&gt;Browsers and major style libraries typically have this style pattern built-in to ensure the usability of webpages, which is why there is a blue outline by default when elements are interacted with. Of course, this standard is not absolute; it can be adjusted according to the needs of the website&apos;s user, but it can be confirmed that designs that emphasize usability requirements pay more attention to ensuring that the basic functionality of styles can be correctly identified.&lt;/p&gt;
&lt;p&gt;Ultimately, a consensus was reached, to remove the weird Focus Ring and enhance the contrast of borders. 👍&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html&quot;&gt;The Web Content Accessibility Guidelines (WCAG) provide a deeper definition of the appearance of focus states&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>UX</category></item><item><title>为什么浏览器 Tab 按下去会显示蓝蓝的外框？</title><link>https://www.webdong.dev/zh-cn/shortpost/focus-indicator/#focus-indicator/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/focus-indicator/#focus-indicator/</guid><pubDate>Tue, 22 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;近期设计反映前端一些互动元素聚焦时都会出现规格外的不明蓝色外框，希望可以取消掉，不过移除前我认为有必要讨论一下细节原因。&lt;/p&gt;
&lt;p&gt;蓝色的外框具体名称叫做聚焦标示 Focus Indicators，也有人叫做 Focus Ring 或 Focus Outline，用途是让用户更容易找到网页中聚焦中的内容，通常给视力不良或使用键盘预览网页的用户提供更明确的指示。&lt;/p&gt;
&lt;p&gt;浏览器与各大样式库通常内建了这套样式模式来确保网页的适用性，也是为什么默认元素互动时会有蓝色外框的原因。当然这套标准并不是绝对，还是可以取舍网站用户的客群需求并适当调整样式，但可以确定的是越是讲究适用性需求的设计越讲究样式的基本功能可以被正确识别。&lt;/p&gt;
&lt;p&gt;最终和设计折中达成共识移除突兀的 Focus Ring 并强化边框对比度 👍&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html&quot;&gt;无障碍网页内容指引 WCAG 有更深刻的聚焦状态的外貌定义&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>UX</category></item><item><title>為什麼瀏覽器 Tab 按下去會顯示藍藍的外框？</title><link>https://www.webdong.dev/zh-tw/shortpost/focus-indicator/#focus-indicator/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/focus-indicator/#focus-indicator/</guid><pubDate>Tue, 22 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;近期設計反映前端一些互動元素聚焦時都會出現規格外的不明藍色外框，希望可以取消掉，不過移除前我認為有必要討論一下細節原因。&lt;/p&gt;
&lt;p&gt;藍色的外框具體名稱叫做聚焦標示 Focus Indicators，也有人叫做 Focus Ring 或 Focus Outline，用途是讓用戶更容易找到網頁中聚焦中的內容，通常給視力不良或使用鍵盤預覽網頁的用戶提供更明確的指示。&lt;/p&gt;
&lt;p&gt;瀏覽器與各大樣式庫通常內建了這套樣式模式來確保網頁的適用性，也是為什麼預設元素互動時會有藍色外框的原因。當然這套標準並不是絕對，還是可以取捨網站用戶的客群需求並適當調整樣式，但可以確定的是越是講究適用性需求的設計越講究樣式的基本功能可以被正確識別。&lt;/p&gt;
&lt;p&gt;最終和設計折中達成共識移除突兀的 Focus Ring 並強化邊框對比度 👍&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html&quot;&gt;無障礙網頁內容指引 WCAG 有更深刻的聚焦狀態的外貌定義&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>UX</category></item><item><title>The most efficient way to improve webpage speed is to enhance content, reducing website loading time by 50% is not a dream</title><link>https://www.webdong.dev/en/shortpost/the-most-efficient-way-to-improve-website-performance/#the-most-efficient-way-to-improve-website-performance/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/the-most-efficient-way-to-improve-website-performance/#the-most-efficient-way-to-improve-website-performance/</guid><pubDate>Fri, 18 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If there is a very slow website and I can only choose one way to improve it, I would definitely focus on the content of the website itself: images, videos, fonts, audio, because this is the option with the lowest investment but the highest return. You can...&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Consider how detailed the user needs the information and only load necessary content (lazy loading, appropriately sized images)&lt;/li&gt;
&lt;li&gt;Consider the user&apos;s environment and adopt more efficient formats that are more suitable for the context (gif / webp) (SVG / PNG)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Most of the time, these aspects that do not require any actual development skills are the main reason that contribute to a poor web experience.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The above is one aspect of the traditional document nature of webpages. As webpages evolve from their original document nature more towards application experiences, this is indeed an area where developers need to put in effort. Here is an interesting statistic: &lt;a href=&quot;https://tonsky.me/blog/js-bloat/&quot;&gt;JavaScript Bloat in 2024&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Even simple images should not be underestimated. I previously wrote a lengthy article delving into the intricacies of web images: &lt;a href=&quot;https://www.webdong.dev/post/all-you-need-to-know-about-optimal-images/&quot;&gt;All the tips for optimizing web images are written here!&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Frontend</category></item><item><title>最有效率提升网頁速度的方式是改善内容，网站加载时间 -50% 也不是梦</title><link>https://www.webdong.dev/zh-cn/shortpost/the-most-efficient-way-to-improve-website-performance/#the-most-efficient-way-to-improve-website-performance/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/the-most-efficient-way-to-improve-website-performance/#the-most-efficient-way-to-improve-website-performance/</guid><pubDate>Fri, 18 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;如果有个很慢的网站只能挑一种方式去改善，那我一定会从网站内容本身下手：图片、影片、字体、音讯，因为这是最低投入但最高回报的选项，你可以……&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;考量用户需要多精细的资料，只载入必要内容（懒加载、适当尺寸影像）&lt;/li&gt;
&lt;li&gt;考量用户环境，采用更有效率更贴切场合需求的格式（gif / webp）（SVG / PNG）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;大多时候这些不需要实际碰到任何开发细节的部分才是构成网页体验差劲的元凶。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;以上是网页传统文件性质的一面，网页从原先文件性质更多的朝向应用程序体验发展，那就真的是开发需要努力的领域了，这里有个有趣的统计：&lt;a href=&quot;https://tonsky.me/blog/js-bloat/&quot;&gt;JavaScript Bloat in 2024&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;就算是简单的图片也不容小觑，之前写了一篇大长文细挖网页图片的奥妙：&lt;a href=&quot;https://www.webdong.dev/post/all-you-need-to-know-about-optimal-images/&quot;&gt;所有最佳化网页图片的技巧都写在这了！&lt;/a&gt;。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Frontend</category></item><item><title>最有效率提升網頁速度的方式是改善內容，網站加載時間 -50% 也不是夢</title><link>https://www.webdong.dev/zh-tw/shortpost/the-most-efficient-way-to-improve-website-performance/#the-most-efficient-way-to-improve-website-performance/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/the-most-efficient-way-to-improve-website-performance/#the-most-efficient-way-to-improve-website-performance/</guid><pubDate>Fri, 18 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;如果有個很慢的網站只能挑一種方式去改善，那我一定會從網站內容本身下手：圖片、影片、字體、音訊，因為這是最低投入但最高回報的選項，你可以……&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;考量用戶需要多精細的資料，只載入必要內容（懶加載、適當尺寸影像）&lt;/li&gt;
&lt;li&gt;考量用戶環境，採用更有效率更貼切場合需求的格式（gif / webp）（SVG / PNG）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;大多時候這些不需要實際碰到任何開發細節的部分才是構成網頁體驗差勁的元兇。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;以上是網頁傳統文件性質的一面，網頁從原先文件性質更多的朝向應用程式體驗發展，那就真的是開發需要努力的領域了，這裡有個有趣的統計：&lt;a href=&quot;https://tonsky.me/blog/js-bloat/&quot;&gt;JavaScript Bloat in 2024&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;就算是簡單的圖片也不容小覷，之前寫了一篇大長文細挖網頁圖片的奧妙：&lt;a href=&quot;https://www.webdong.dev/post/all-you-need-to-know-about-optimal-images/&quot;&gt;所有最佳化網頁圖片的技巧都寫在這了！&lt;/a&gt;。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Frontend</category></item><item><title>Creates a Block Editor Experience Similar to Notion - Editor.js</title><link>https://www.webdong.dev/en/shortpost/editorjs-experience/#editorjs-experience/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/editorjs-experience/#editorjs-experience/</guid><pubDate>Thu, 17 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Recently, I encountered the need to create a content editor interface similar to Notion, where users can write articles or embed specific customized components.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.threads.net/@webdong.dev/post/DBObFgJBHg-&quot;&gt;Editor.js&lt;/a&gt; differs from traditional WYSIWYG editors that edit Markdown or HTML; it uses a custom JSON format to store data. While this brings great flexibility, it also requires additional conversion to be used elsewhere since it is not a universal format.&lt;/p&gt;
&lt;p&gt;During development, I stumbled upon many pitfalls, such as the entire ecosystem not being particularly active and mature. Some basic features (undo/redo/block dragging/text color) rely on community plugins that have been ongoing for several years, yet many issues remain unresolved.&lt;/p&gt;
&lt;p&gt;It can be expected that after installing plugins, there will still be a need for some patching. However, it seems there are no more suitable options in open-source projects, making it suitable for scenarios that require highly customized text editors.&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>Editor.js 打造类似 Notion 的区块编辑器体验</title><link>https://www.webdong.dev/zh-cn/shortpost/editorjs-experience/#editorjs-experience/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/editorjs-experience/#editorjs-experience/</guid><pubDate>Thu, 17 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;近期碰到制作类似 Notion 内容编辑器界面的功能，用户可以用来编写文章或植入特定定制的组件。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.threads.net/@webdong.dev/post/DBObFgJBHg-&quot;&gt;Editor.js&lt;/a&gt; 相较于传统的所见及所得编辑器通过编辑 Markdown 或 HTML ，它采用自定义的 JSON 格式来存储数据，虽带来很大的灵活性但也因为不是通用的格式所以会需要额外转换才能使用在其他地方。&lt;/p&gt;
&lt;p&gt;开发下来踩中了蛮多坑，像是整个生态圈并没有到特别热络成熟，一些基本的功能 (复原/ 取消复原 / 区块抓取滑动 / 文字颜色) 都依赖社区套件且已经持续数年，仍有许多问题未解。&lt;/p&gt;
&lt;p&gt;可以预期插件装上去后还时常会需要自己修修补补，不过开源项目中好像没有更合适的选项了，适合需要高度定制化的文字编辑器场景。&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>Editor.js 打造類似 Notion 的區塊編輯器體驗</title><link>https://www.webdong.dev/zh-tw/shortpost/editorjs-experience/#editorjs-experience/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/editorjs-experience/#editorjs-experience/</guid><pubDate>Thu, 17 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;近期碰到製作類似 Notion 內容編輯器介面的功能，使用者可以用來編寫文章或植入特定客製化的組件。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.threads.net/@webdong.dev/post/DBObFgJBHg-&quot;&gt;Editor.js&lt;/a&gt; 相較於傳統的所見及所得編輯器透過編輯 Markdown 或 HTML ，它採用自訂的 JSON 格式來存儲資料，雖帶來很大的彈性但也因為不是通用的格式所以會需要額外轉換才能使用在其他地方。&lt;/p&gt;
&lt;p&gt;開發下來踩中了蠻多坑，像是整個生態圈並沒有到特別熱絡成熟，一些基本的功能 (復原/ 取消復原 / 區塊抓取滑動 / 文字顏色) 都依賴社群套件且已經持續數年，仍有許多問題未解。&lt;/p&gt;
&lt;p&gt;可以預期插件裝上去後還時常會需要自己修修補補，不過開源專案中好像沒有更合適的選項了，適合需要高度客製化的文字編輯器場景。&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>My Blog&apos;s About Page Was Useless, So I Removed It</title><link>https://www.webdong.dev/en/shortpost/my-about-page-is-useless-so-i-remove-it/#my-about-page-is-useless-so-i-remove-it/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/my-about-page-is-useless-so-i-remove-it/#my-about-page-is-useless-so-i-remove-it/</guid><pubDate>Tue, 15 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In the process of writing my blog, I learned that the meaning of a static webpage lies in its content, not in its experience. A blog is a very traditional type of webpage: some text, some links that can connect to other pages, and some images and scripts that are not necessarily required.&lt;/p&gt;
&lt;p&gt;Therefore, when creating a webpage, planning the content is far more important than how you present it. As the blog upgraded, I focused on refining the overall visual effect but deviated from the original intent. Look at the image below, do you care?&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Not really! The point is that I write valuable and opinionated articles, which is why this blog has value. I quite like the current homepage: simple and focused on content, with no unnecessary nonsense. This is why I removed the about page, as it did not bring value to my readers. I will reconsider adding it back only when there is enough content.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded><category>UX</category></item><item><title>What is ARIA - Accessible Rich Internet Applications?</title><link>https://www.webdong.dev/en/shortpost/what-is-aria/#what-is-aria/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/what-is-aria/#what-is-aria/</guid><pubDate>Tue, 15 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ARIA is a set of HTML attributes used to provide additional annotations to web elements, helping users enhance their experience through Assistive Technologies.&lt;/p&gt;
&lt;p&gt;Most front-end developers should understand that web pages should be constructed semantically (HTML5) to allow search engines and other crawlers to comprehend the data, thereby improving search experience and rankings. A semantic web page is also the first step towards an accessible web page, as it helps browsers or assistive technologies better understand the content of the web page.&lt;/p&gt;
&lt;p&gt;Some dynamic web applications may require additional ARIA annotations to provide a complete accessible experience. For example, &quot;information that is dynamically displayed or changed on the page&quot; will need ARIA attributes to inform assistive technologies so that users can be audibly notified of changes. Before implementing ARIA, it is essential to ensure that the web page is sufficiently semantic; incorrectly setting ARIA may lead to adverse effects, making the experience worse than if ARIA were not set at all.&lt;/p&gt;
&lt;p&gt;Later, I learned that most modern browsers generally have dedicated features to observe accessibility attributes, such as the Chrome Accessibility Tree:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Press F12 to open the browser DevTools&lt;/li&gt;
&lt;li&gt;Press Ctrl + Shift + P or ⌘ + Shift + P and enter the command Show Accessibility&lt;/li&gt;
&lt;li&gt;Accessibility Tree &amp;gt; Check Enable full-page accessibility tree&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This makes it much easier to observe how the browser interprets the web page.&lt;/p&gt;
</content:encoded><category>Accessibility</category></item><item><title>我的部落格 About Page 没有用处，所以把它砍了</title><link>https://www.webdong.dev/zh-cn/shortpost/my-about-page-is-useless-so-i-remove-it/#my-about-page-is-useless-so-i-remove-it/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/my-about-page-is-useless-so-i-remove-it/#my-about-page-is-useless-so-i-remove-it/</guid><pubDate>Tue, 15 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在撰寫部落格的過程中我學到静态网页存在的意义即是内容，而不是体验。部落格是一种很传统的网页类型：一些文字、一些链接可以链接其他页面、一些不一定要有的图片和程序脚本。&lt;/p&gt;
&lt;p&gt;所以制作网页时规划内容远远重要于你要怎么呈现，随着部落格升级我着重在打磨整体视觉效果但偏离了原意，看看以下图片，你在乎吗？&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;不在乎！重点是我撰写有价值有观点的文章所以这个部落格才有价值，我就挺喜欢目前的首页：简洁且着重内容，没有多余的描述废话，这是为什么我把介绍页面给砍了，因为它并没有替我的读者带来价值。直到有足够的内容我才会重新考虑添加回来。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded><category>UX</category></item><item><title>什么是 ARIA - Accessible Rich Internet Applications？</title><link>https://www.webdong.dev/zh-cn/shortpost/what-is-aria/#what-is-aria/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/what-is-aria/#what-is-aria/</guid><pubDate>Tue, 15 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ARIA 是一系列 HTML 属性用于额外标注信息于网页元素当中，帮助用户通过无障碍辅助（Assistive Technologies）来完善体验。&lt;/p&gt;
&lt;p&gt;大多前端都应该明白应通过语义化的方式（HTML5）去构建网页，以便让搜索引擎等爬虫理解数据进而增进搜索体验与名次，而语义化的网页也同时会是无障碍网页的第一步，可以帮助浏览器或无障碍辅助用户更清楚网页的内容。&lt;/p&gt;
&lt;p&gt;一些动态网页应用会需要额外标示 ARIA 才能提供完善的无障碍体验，举例：“页面中动态显示或改动的信息”就会需要标示 ARIA 属性告知无障碍辅助，以便在改动时可以声音告知用户。在 ARIA 之前应当确保网页语义化充分，错误设置 ARIA 可能造成反效果，比没设置时的体验来得糟糕。&lt;/p&gt;
&lt;p&gt;之后才知道原来大多现代浏览器普遍都具备观察无障碍属性相关的专属功能，举例 Chrome Accessibility Tree：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;F12 打开浏览器 DevTools&lt;/li&gt;
&lt;li&gt;Ctrl + Shift + P 或 ⌘ + Shift + P 输入执行指令 Show Accessibility&lt;/li&gt;
&lt;li&gt;Accessibility Tree &amp;gt; 勾选 Enable full-page accessibility tree&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这样观察浏览器怎么解读网页就方便得多。&lt;/p&gt;
</content:encoded><category>Accessibility</category></item><item><title>我的部落格 About Page 沒有用處，所以把它砍了</title><link>https://www.webdong.dev/zh-tw/shortpost/my-about-page-is-useless-so-i-remove-it/#my-about-page-is-useless-so-i-remove-it/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/my-about-page-is-useless-so-i-remove-it/#my-about-page-is-useless-so-i-remove-it/</guid><pubDate>Tue, 15 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在撰寫部落格的過程中我學到靜態網頁存在的意義即是內容，而不是體驗。部落格是一種很傳統的網頁類型：一些文字、一些連結可以連結其他頁面、一些不一定要有的圖片和程式腳本。&lt;/p&gt;
&lt;p&gt;所以製作網頁時規劃內容遠遠重要於你要怎麼呈現，隨著部落格升級我著重在打磨整體視覺效果但偏離了原意，看看以下圖片，你在乎嗎？&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;不在乎！重點是我撰寫有價值有觀點的文章所以這個部落格才有價值，我就挺喜歡目前的首頁：簡潔且著重內容，沒有多餘的描述廢話，這是為什麼我把介紹頁面給砍了，因為它並沒有替我的讀者帶來價值。直到有足夠的內容我才會重新考慮添加回來。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded><category>UX</category></item><item><title>Frontend and SEO</title><link>https://www.webdong.dev/en/shortpost/what-is-seo/#what-is-seo/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/what-is-seo/#what-is-seo/</guid><pubDate>Mon, 14 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I categorize &quot;Search Engine Optimization&quot; into two directions for discussion: content and technical aspects.&lt;/p&gt;
&lt;p&gt;Search engines visit websites and record the content of the sites. When users input keywords into the search engine, it retrieves relevant websites from its database and displays them to the users. Naturally, search engines prefer websites that are rich in content, have a certain level of authority, and provide a good user experience, as this leads to a better search experience.&lt;/p&gt;
&lt;p&gt;In other words, producing valuable web content is the primary requirement, and then we can explore:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Can search engines correctly interpret the website content? (HTML5 semantic web, rendering modes, multilingual)&lt;/li&gt;
&lt;li&gt;Can they provide additional information to help users preview? (Open Graph, JSONLD, Meta Tag)&lt;/li&gt;
&lt;li&gt;Is the website experience good?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In practice, there are various ways to improve a website&apos;s ranking in search engines, such as...&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Finding good titles based on popular keywords in the search area&lt;/li&gt;
&lt;li&gt;Analyzing the website and user experience through tools like ahref, Google Search Console, or Google Analytics&lt;/li&gt;
&lt;li&gt;Using Lighthouse to analyze website performance and best practices&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But remember, the ultimate audience for the website should be the users; there is no need to overly please search engines or exploit loopholes. In the long run, search engine algorithms will continue to change, and continuously producing content that is helpful to users is the most important thing.&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>前端怎么看 SEO？</title><link>https://www.webdong.dev/zh-cn/shortpost/what-is-seo/#what-is-seo/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/what-is-seo/#what-is-seo/</guid><pubDate>Mon, 14 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我会将「搜索引擎优化」归类为两种方向可以探讨：内容与技术层面。&lt;/p&gt;
&lt;p&gt;搜索引擎访问网站，并将网站的内容记录下来，当用户在搜索引擎输入关键字时会从数据库中找出相关的网站，并且将这些网站显示给用户，当然搜索引擎偏好内容丰富、具备一定威信且体验良好的网站，这样才能提供更好的搜索体验。&lt;/p&gt;
&lt;p&gt;也就是说产出有价值的网页内容是首要条件，再去探讨：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;搜索引擎能不能正确的解读网站内容？（HTML5 语义化网页、渲染模式、多语言）&lt;/li&gt;
&lt;li&gt;能不能提供额外信息方便用户预览？（Open Graph、JSONLD、Meta Tag）&lt;/li&gt;
&lt;li&gt;网站的体验是否良好？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实作上有各式各样的方式去提高网站在搜索引擎的排名像是……&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;搜索区域热门关键字下个好标题&lt;/li&gt;
&lt;li&gt;通过 ahref、Google Search Console 或 Google Analytics 等工具分析网站与客群体验&lt;/li&gt;
&lt;li&gt;Lighthouse 分析网站性能与最佳实践&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;但要记得最终网站的服务对象应该是用户，不需要过度讨好搜索引擎或钻漏洞，长远来说搜索引擎算法会持续更动，持续产出对用户有帮助的内容才是最重要的。&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>前端怎麼看 SEO？</title><link>https://www.webdong.dev/zh-tw/shortpost/what-is-seo/#what-is-seo/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/what-is-seo/#what-is-seo/</guid><pubDate>Mon, 14 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;前端怎麼看 SEO？&lt;/p&gt;
&lt;p&gt;我會將「搜尋引擎優化」歸類為兩種方向可以探討：內容與技術層面。&lt;/p&gt;
&lt;p&gt;搜尋引擎造訪網站，並將網站的內容紀錄下來，當使用者在搜尋引擎輸入關鍵字時會從資料庫中找出相關的網站，並且將這些網站顯示給使用者，當然搜尋引擎偏好內容豐富、具備一定威信且體驗良好的網站，這樣才能提供更好的搜尋體驗。&lt;/p&gt;
&lt;p&gt;也就是說產出有價值的網頁內容是首要條件，再去探討：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;搜尋引擎能不能正確的解讀網站內容？（HTML5 語意化網頁、渲染模式、多語系）&lt;/li&gt;
&lt;li&gt;能不能提供額外資訊方便用戶預覽？（Open Graph、JSONLD、Meta Tag）&lt;/li&gt;
&lt;li&gt;網站的體驗是否良好？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;實作上有各式各樣的方式去提高網站在搜尋引擎的排名像是……&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;搜尋區域熱門關鍵字下個好標題&lt;/li&gt;
&lt;li&gt;透過 ahref、Google Search Console 或 Google Analytics 等工具分析網站與客群體驗&lt;/li&gt;
&lt;li&gt;Lighthouse 分析網站性能與最佳實踐&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;但要記得最終網站的服務對象應該是用戶，不需要過度討好搜尋引擎或鑽漏洞，長遠來說搜尋引擎演算法會持續更動，持續產出對用戶有幫助的內容才是最重要的。&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>Browser Zoom cause Display Errors</title><link>https://www.webdong.dev/en/shortpost/browser-scale-cause-weird-pixel-offset/#browser-scale-cause-weird-pixel-offset/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/browser-scale-cause-weird-pixel-offset/#browser-scale-cause-weird-pixel-offset/</guid><pubDate>Sat, 05 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If you, like me, use a 4K monitor, you probably often use the browser&apos;s zoom feature. With more pixels packed into the same screen size, everything on the interface becomes smaller and more detailed. This also led me to notice a unique issue: the &lt;code&gt;1px&lt;/code&gt; display error caused by browser zoom.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;For example, I have occasionally observed this issue in Shadcn UI and Google Search Console. It relates to how browsers handle &lt;strong&gt;non-integer pixels after zooming&lt;/strong&gt;. Since the smallest display unit on the screen is &lt;code&gt;1px&lt;/code&gt;, there will be discrepancies in the final display compared to expectations.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/32184316/html-border-thickness-on-zoom&quot;&gt;How various browsers should deal with the unsolvable problem of pixel scaling&lt;/a&gt;, so there isn&apos;t much that frontend developers can try. I&apos;ve heard that older versions of Chrome tend to make &lt;code&gt;1px&lt;/code&gt; lines disappear after zooming, and there are some &lt;a href=&quot;https://muffinman.io/blog/fix-for-chrome-not-rendering-borders/&quot;&gt;workarounds&lt;/a&gt; you can refer to.&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>浏览器缩放与显示误差</title><link>https://www.webdong.dev/zh-cn/shortpost/browser-scale-cause-weird-pixel-offset/#browser-scale-cause-weird-pixel-offset/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/browser-scale-cause-weird-pixel-offset/#browser-scale-cause-weird-pixel-offset/</guid><pubDate>Sat, 05 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;如果你像我一样使用 4k 屏幕那么应该很常会使用到浏览器的缩放功能，因为在同尺寸的屏幕塞入更多像素后一切界面都会变得更渺小细致，这也导致我留意到一个独特的问题：浏览器缩放造成 &lt;code&gt;1px&lt;/code&gt; 显示误差。&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;举例在 Shadcn UI 或是 Google Search Console 都有偶然观察到这样的问题。关系到浏览器如何处理&lt;strong&gt;缩放后不满整数的像素&lt;/strong&gt;的情况，由于屏幕的最小显示单位是 &lt;code&gt;1px&lt;/code&gt;，因此在最终显示时就会与预期相比出现差异。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/32184316/html-border-thickness-on-zoom&quot;&gt;偏向各家浏览器应该如何应对像素缩放这个无解的问题&lt;/a&gt;，因此其实也没什么前端能尝试的。听说旧版本 Chrome 容易将 &lt;code&gt;1px&lt;/code&gt; 线条在缩放后变成不显示，有一些&lt;a href=&quot;https://muffinman.io/blog/fix-for-chrome-not-rendering-borders/&quot;&gt;变通方法&lt;/a&gt;可以参考看看。&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>瀏覽器縮放與顯示誤差</title><link>https://www.webdong.dev/zh-tw/shortpost/browser-scale-cause-weird-pixel-offset/#browser-scale-cause-weird-pixel-offset/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/browser-scale-cause-weird-pixel-offset/#browser-scale-cause-weird-pixel-offset/</guid><pubDate>Sat, 05 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;如果你像我一樣使用 4k 螢幕那麼應該很常會使用到瀏覽器的縮放功能，因為在同尺寸的螢幕塞入更多像素後一切介面都會變得更渺小細緻，這也導致我留意到一個獨特的問題：瀏覽器縮放造成 &lt;code&gt;1px&lt;/code&gt; 顯示誤差。&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;舉例在 Shadcn UI 或是 Google Search Console 都有偶然觀察到這樣的問題。關係到瀏覽器如何處理&lt;strong&gt;縮放後不滿整數的像素&lt;/strong&gt;的情況，由於螢幕的最小顯示單位是 &lt;code&gt;1px&lt;/code&gt;，因此在最終顯示時就會與預期相比出現差異。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/32184316/html-border-thickness-on-zoom&quot;&gt;偏向各家瀏覽器應該如何應對像素縮放這個無解的問題&lt;/a&gt;，因此其實也沒什麼前端能嘗試的。聽說舊版本 Chrome 容易將 &lt;code&gt;1px&lt;/code&gt; 線條在縮放後變成不顯示，有一些&lt;a href=&quot;https://muffinman.io/blog/fix-for-chrome-not-rendering-borders/&quot;&gt;變通方法&lt;/a&gt;可以參考看看。&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>Intersection Observer Real Case: Automatic Toc Update</title><link>https://www.webdong.dev/en/shortpost/make-a-toc/#make-a-toc/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/make-a-toc/#make-a-toc/</guid><pubDate>Sat, 21 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Recently, while working on a Table of Contents feature, I found it to be a great case for using the Intersection Observer. By listening to specific elements, we can automatically update the status of the TOC.&lt;/p&gt;
&lt;p&gt;In the past, we might have needed to use methods like &lt;code&gt;getBoundingClientRect&lt;/code&gt; to calculate whether an element had left the viewport, but with the new browser API to detect whether elements enter the viewport, it has become much easier to implement.&lt;/p&gt;
&lt;p&gt;Recently, I launched a series of real-world cases that front-end developers encounter in their daily work: showcasing the thought process behind solving problems and the implementation results.&lt;/p&gt;
&lt;p&gt;If you&apos;re interested, feel free to check out the recent article: &lt;a href=&quot;https://www.webdong.dev/post/real-use-case-of-intersection-observer-toc/&quot;&gt;Intersection Observer Real Case: Automatic Toc Update&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>Intersection Observer 真实案例：自动更新目录</title><link>https://www.webdong.dev/zh-cn/shortpost/make-a-toc/#make-a-toc/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/make-a-toc/#make-a-toc/</guid><pubDate>Sat, 21 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;近期制作到内容大纲（Table of Contents）相关的功能，发现是一个很适合使用 Intersection Observer 的案例，通过监听特定元素来自动更新目录的状态。&lt;/p&gt;
&lt;p&gt;在早期可能会需要通过 &lt;code&gt;getBoundingClientRect&lt;/code&gt; 之类的方法来计算元素有没有离开窗口，但随着专门侦测元素是否进入窗口的 API 出现，这样的需求就变得更加容易实现。&lt;/p&gt;
&lt;p&gt;近期推出一系列日常前端工作会碰到的真实案例：会将解题的思考过程到实现结果都展现出来。&lt;/p&gt;
&lt;p&gt;有兴趣可以来翻看看近期新文章：&lt;a href=&quot;https://www.webdong.dev/post/real-use-case-of-intersection-observer-toc/&quot;&gt;Intersection Observer 真实案例：自动更新目录&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>Intersection Observer 真實案例：自動更新目錄</title><link>https://www.webdong.dev/zh-tw/shortpost/make-a-toc/#make-a-toc/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/make-a-toc/#make-a-toc/</guid><pubDate>Sat, 21 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;近期製作到內容大綱（Table of Contents）相關的功能，發現是一個很適合使用 Intersection Observer 的案例，透過監聽特定元素來自動更新目錄的狀態。&lt;/p&gt;
&lt;p&gt;在早期可能會需要透過 &lt;code&gt;getBoundingClientRect&lt;/code&gt; 之類的方法來計算元素有沒有離開視窗，但隨著專門偵測元素是否進入視窗的 API 出現，這樣的需求就變得更加容易實現。&lt;/p&gt;
&lt;p&gt;近期推出一系列日常前端工作會碰到的真實案例：會將解題的思考過程到實作結果都展現出來。&lt;/p&gt;
&lt;p&gt;有興趣可以來翻看看近期新文章：&lt;a href=&quot;https://www.webdong.dev/post/real-use-case-of-intersection-observer-toc/&quot;&gt;Intersection Observer 真實案例：自動更新目錄&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>Thinking About Web Layouts from a Two-Dimensional Perspective</title><link>https://www.webdong.dev/en/shortpost/2d-website-layout/#2d-website-layout/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/2d-website-layout/#2d-website-layout/</guid><pubDate>Mon, 16 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Recently, I encountered a requirement to implement a responsive webpage as shown in the image below. It became clear that this layout could not be achieved using traditional one-dimensional layout methods, as the containers they belong to differ between the two sizes.&lt;/p&gt;
&lt;p&gt;For example, the sidebar should be contained within the main parent container, but it also needs to align with the top of the intro on larger device sizes. Clearly, such a requirement is difficult to achieve with traditional CSS layouts. Whether using negative &lt;code&gt;margin&lt;/code&gt; to push elements, or &lt;code&gt;absolute&lt;/code&gt;, &lt;code&gt;transform&lt;/code&gt;, it can quickly become chaotic and hard to maintain, even requiring JavaScript to calculate positions 😐.&lt;/p&gt;
&lt;p&gt;After resolving this with CSS Grid and Subgrid, I felt it was a great case study, so I wrote a complete article: &lt;a href=&quot;https://www.webdong.dev/post/real-use-case-of-css-grid-extended-sidebar/&quot;&gt;CSS Grid Real Use Case: The Process of Creating an Extended Sidebar&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>CSS</category></item><item><title>用二维角度思考网页布局</title><link>https://www.webdong.dev/zh-cn/shortpost/2d-website-layout/#2d-website-layout/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/2d-website-layout/#2d-website-layout/</guid><pubDate>Mon, 16 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;近期遇到一个需求是实现下图样貌的自适应网页，会发现该布局并没办法用传统一维版面的方式达成，因为在两种大小中它们需要隶属的容器也不同。&lt;/p&gt;
&lt;p&gt;举例 sidebar 来说，它应该要是一起装在 main 的父容器当中，但在大设备尺寸下又要对齐 intro 的顶部，明显这样的需求在传统的 CSS 布局下是很难达成的，不管是用负数 &lt;code&gt;margin&lt;/code&gt; 推移还是 &lt;code&gt;absolute&lt;/code&gt; 、 &lt;code&gt;transform&lt;/code&gt; 都会搞得一团乱很难维护，甚至要动用到 JavaScript 来计算位置 😐。&lt;/p&gt;
&lt;p&gt;事后用 CSS Grid 和 Subgrid 解决后觉得是一个很好的案例，于是写成完整文章：&lt;a href=&quot;https://www.webdong.dev/post/real-use-case-of-css-grid-extended-sidebar/&quot;&gt;CSS Grid 真实案例：凸出的侧栏解析制作过程&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>CSS</category></item><item><title>用二維角度思考網頁布局</title><link>https://www.webdong.dev/zh-tw/shortpost/2d-website-layout/#2d-website-layout/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/2d-website-layout/#2d-website-layout/</guid><pubDate>Mon, 16 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;近期遇到一個需求是實作下圖樣貌的自適應網頁，會發現該布局並沒辦法用傳統一維版面的方式達成，因為在兩種大小中他們需要隸屬的容器也不同。&lt;/p&gt;
&lt;p&gt;舉例 sidebar 來說，它應該要是一起裝在 main 的父容器當中，但在大裝置尺寸下又要對齊 intro 的頂部，明顯這樣的需求在傳統的 CSS 布局下是很難達成的，不管是用負數 &lt;code&gt;margin&lt;/code&gt; 推移還是 &lt;code&gt;absolute&lt;/code&gt; 、 &lt;code&gt;transform&lt;/code&gt; 都會搞得一團亂很難維護，甚至要動用到 JavaScript 來計算位置 😐。&lt;/p&gt;
&lt;p&gt;事後用 CSS Grid 和 Subgrid 解決後覺得是一個很好的案例，於是寫成完整文章：&lt;a href=&quot;https://www.webdong.dev/post/real-use-case-of-css-grid-extended-sidebar/&quot;&gt;CSS Grid 真實案例：凸出的側欄解析製作過程&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>CSS</category></item><item><title>Developer Productivity Myth: Estimation = Endpoint</title><link>https://www.webdong.dev/en/shortpost/accuracy-of-estimation/#accuracy-of-estimation/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/accuracy-of-estimation/#accuracy-of-estimation/</guid><pubDate>Tue, 03 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Estimation itself carries a sense of commitment, &quot;This is a three-day workload = I commit to trying to complete it within three days.&quot;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If it exceeds three days, you will find yourself in trouble because the commitment was not met.&lt;/li&gt;
&lt;li&gt;Encourages early completion to fulfill the commitment.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In such cases, developers are encouraged to estimate based on the worst-case scenario.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Commitments are fixed, unknown problems are dynamic.&lt;/li&gt;
&lt;li&gt;Estimates can also be overly optimistic, and the level of optimism varies among different developers.&lt;/li&gt;
&lt;li&gt;Sometimes, experience or actual pitfalls are needed to make more accurate estimates.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you cannot effectively measure or evaluate certain things, can you not create a feasible plan?&lt;/p&gt;
&lt;p&gt;Depending on the type of development, the essence of a developer&apos;s work is not solely about writing code to solve known problems. From the moment of estimation, a developer&apos;s work has already begun. We learn to grasp the boundaries of unknown problems and propose satisfactory solutions with limited resources.&lt;/p&gt;
&lt;p&gt;There is no absolute answer to this question, but my thought is that maintaining agility in planning and smooth communication can help the entire team move forward together.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Understand that estimation is a checkpoint, not an endpoint.&lt;/li&gt;
&lt;li&gt;Understand that there are individual differences in estimation.&lt;/li&gt;
&lt;li&gt;Understand that some things require time and experience to validate.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>Developer Productivity Myth: Story Points = Productivity</title><link>https://www.webdong.dev/en/shortpost/storypoint-and-estimation/#storypoint-and-estimation/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/storypoint-and-estimation/#storypoint-and-estimation/</guid><pubDate>Tue, 03 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Story points are a unit of measurement used to express estimates of overall work progress. Teams allocate story points based on &lt;strong&gt;work complexity, workload, risk, or uncertainty&lt;/strong&gt;. If we consistently record story points and estimate the points achieved by each developer after each sprint, can we then deduce the productivity of each developer?&lt;/p&gt;
&lt;p&gt;Story points sound similar to work hours; one is a relative unit and the other is an absolute unit. Ultimately, regardless of how productivity is measured, it must be converted into absolute objective indicators: What will be completed? What can be accomplished?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Adaptation Curve&lt;/strong&gt;: The entire thinking framework requires time to adapt and coordinate among members.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expectations Need Time to Calibrate&lt;/strong&gt;: Story points are meaningless until enough comparative data is accumulated, and different people may have different understandings of story points.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Of course, we can reach a consensus on the value of points through discussions and run through the entire process a few times, but in situations where clear delivery dates are required, it still needs to be repeatedly converted into time for measurement, more like a framework for thinking about task complexity.&lt;/p&gt;
&lt;p&gt;Can it effectively assess productivity? Perhaps it is a direction worth trying in teams with mutual trust and consensus.&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>开发者生产力迷思：估算 = 终点</title><link>https://www.webdong.dev/zh-cn/shortpost/accuracy-of-estimation/#accuracy-of-estimation/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/accuracy-of-estimation/#accuracy-of-estimation/</guid><pubDate>Tue, 03 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;估算本身就有承诺的意味在内，「这是三天的工作量 = 我承诺可以尝试在三天内完成」。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果超过三天你就会陷入困境，因为没有达到承诺&lt;/li&gt;
&lt;li&gt;鼓励提早完成，以达成承诺&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这样的情况下会鼓励开发者根据最坏的情况进行估算。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;承诺是死的，未知问题是活的&lt;/li&gt;
&lt;li&gt;估算也可能会过于乐观，且不同开发者的乐观程度也不一致&lt;/li&gt;
&lt;li&gt;有时候需要经验或实际踩坑下去，才能更准确的估算&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你不能对某些事情进行有效的测量或评估，就无法制定切实可行的计划吗？&lt;/p&gt;
&lt;p&gt;视开发类型而定，开发者本质工作并不全然的是通过撰写程序来解决已知问题，从估算的那一刻起开发者的工作就已经开始了，我们学习捉摸未知问题的边界，在有限的资源下提出满意的解决方案。&lt;/p&gt;
&lt;p&gt;这个问题并没有一个绝对的答案，不过我的想法是计划上应当保持敏捷与沟通顺畅可以帮助整个团队一同前进。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;了解估算是检查点不是终点&lt;/li&gt;
&lt;li&gt;了解预估有个体上的差异&lt;/li&gt;
&lt;li&gt;了解有些事情需要时间和经验去验证&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>开发者生产力迷思：故事点 = 生产力</title><link>https://www.webdong.dev/zh-cn/shortpost/storypoint-and-estimation/#storypoint-and-estimation/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/storypoint-and-estimation/#storypoint-and-estimation/</guid><pubDate>Tue, 03 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;故事点是一种衡量单位，用于表达对整体工作进度的估计，团队根据&lt;strong&gt;工作复杂性、工作量、风险或不确定性&lt;/strong&gt;分配故事点。如果我们稳定的记录故事点并且估算每位开发者完成每次冲刺后达成的点数，那么应该就能推算出每位开发者的生产力？&lt;/p&gt;
&lt;p&gt;故事点听起来和工作时数很像，一个是相对单位一个是绝对单位，说到底无论用任何方式去衡量生产力，最终都要转换为绝对客观的指标：事情什么会完成？能够完成哪些事？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;适应曲线&lt;/strong&gt;：整套思考框架需要时间适应与成员之间的配合&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;期望需要时间校准&lt;/strong&gt;：故事点是没有意义的，直到累积足够的比对资料，不同人对于故事点的理解可能不同&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当然我们可以借由讨论替点数的价值订下共识，多跑几趟适应整个流程，但在要求明确交付日期的情况下，其实还是需要反复转换为时间来衡量，更像是一个思考任务复杂度的框架。&lt;/p&gt;
&lt;p&gt;它能有效的评估生产力吗？或许在互信有共识的团队中是个可以尝试的方向。&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>開發者生產力迷思：估算 = 終點</title><link>https://www.webdong.dev/zh-tw/shortpost/accuracy-of-estimation/#accuracy-of-estimation/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/accuracy-of-estimation/#accuracy-of-estimation/</guid><pubDate>Tue, 03 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;估算本身就有承諾的意味在內，「這是三天的工作量 = 我承諾可以嘗試在三天內完成」。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果超過三天你就會陷入困境，因為沒有達到承諾&lt;/li&gt;
&lt;li&gt;鼓勵提早完成，以達成承諾&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這樣的情況下會鼓勵開發者根據最壞的情況進行估算。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;承諾是死的，未知問題是活的&lt;/li&gt;
&lt;li&gt;估算也可能會過於樂觀，且不同開發者的樂觀程度也不一致&lt;/li&gt;
&lt;li&gt;有時候需要經驗或實際踩坑下去，才能更準確的估算&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你不能對某些事情進行有效的測量或評估，就無法制定切實可行的計劃嗎？&lt;/p&gt;
&lt;p&gt;視開發類型而定，開發者本質工作並不全然的是透過撰寫程式來解決已知問題，從估算的那一刻起開發者的工作就已經開始了，我們學習捉摸未知問題的邊界，在有限的資源下提出滿意的解決方案。&lt;/p&gt;
&lt;p&gt;這個問題並沒有一個絕對的答案，不過我的想法是計畫上應當保持敏捷與溝通順暢可以幫助整個團隊一同前進。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;了解估算是檢查點不是終點&lt;/li&gt;
&lt;li&gt;了解預估有個體上的差異&lt;/li&gt;
&lt;li&gt;了解有些事情需要時間和經驗去驗證&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>開發者生產力迷思：故事點 = 生產力</title><link>https://www.webdong.dev/zh-tw/shortpost/storypoint-and-estimation/#storypoint-and-estimation/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/storypoint-and-estimation/#storypoint-and-estimation/</guid><pubDate>Tue, 03 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;故事點是一種衡量單位，用於表達對整體工作進度的估計，團隊根據&lt;strong&gt;工作複雜性、工作量、風險或不確定性&lt;/strong&gt;分配故事點。如果我們穩定的紀錄故事點並且估算每位開發者完成每次衝刺後達成的點數，那麼應該就能推算出每位開發者的生產力？&lt;/p&gt;
&lt;p&gt;故事點聽起來和工作時數很像，一個是相對單位一個是絕對單位，說到底無論用任何方式去衡量生產力，最終都要轉換為絕對客觀的指標：事情什麼會完成？能夠完成哪些事？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;適應曲線&lt;/strong&gt;：整套思考框架需要時間適應與成員之間的配合&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;期望需要時間校準&lt;/strong&gt;：故事點是沒有意義的，直到累積足夠的比對資料，不同人對於故事點的理解可能不同&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;當然我們可以藉由討論替點數的價值訂下共識，多跑幾趟適應整個流程，但在要求明確交付日期的情況下，其實還是需要反覆轉換為時間來衡量，比較像是一個思考任務複雜度的框架。&lt;/p&gt;
&lt;p&gt;它能有效的評估生產力嗎？或許在互信有共識的團隊中是個可以嘗試的方向。&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>Developer Productivity Myth: Low Defects = Productivity</title><link>https://www.webdong.dev/en/shortpost/myth-of-developer-productivity-defect-rate/#myth-of-developer-productivity-defect-rate/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/myth-of-developer-productivity-defect-rate/#myth-of-developer-productivity-defect-rate/</guid><pubDate>Tue, 27 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Measuring the yield of each developer&apos;s code to assess productivity seems like a reasonable decision, but yield does not fully represent productivity:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Risk Aversion&lt;/strong&gt;: This leads developers to prefer conservative fixes for known bugs, as this approach can largely ensure a low defect rate.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Short-term Thinking&lt;/strong&gt;: Excessive risk aversion may cause teams to overlook long-term improvements and innovations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Yield Definition and Value are Fluid&lt;/strong&gt;: There may be multiple defects reported as a single defect or vice versa, and the severity caused by different defects may also vary, making defects inherently unequal and difficult to measure.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>开发者生产力迷思：低缺陷 = 生产力</title><link>https://www.webdong.dev/zh-cn/shortpost/myth-of-developer-productivity-defect-rate/#myth-of-developer-productivity-defect-rate/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/myth-of-developer-productivity-defect-rate/#myth-of-developer-productivity-defect-rate/</guid><pubDate>Tue, 27 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;借由测量每位开发者代码的良率来评估生产力是一件看似合情合理的决策，但良率并不全然代表生产力：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;风险规避&lt;/strong&gt;：让开发者倾向于选择保守修复已知的错误，因为这样做能大程度确保低缺陷率。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;短期思维&lt;/strong&gt;：过分规避风险可能导致团队忽视长远的改进和创新。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;良率定义与价值是浮动的&lt;/strong&gt;：可能有多个缺陷被回报为单个缺陷或相反，不同缺陷造成的严重性也可能不同，缺陷之间天生不平等难以测量。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>開發者生產力迷思：低缺陷 = 生產力</title><link>https://www.webdong.dev/zh-tw/shortpost/myth-of-developer-productivity-defect-rate/#myth-of-developer-productivity-defect-rate/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/myth-of-developer-productivity-defect-rate/#myth-of-developer-productivity-defect-rate/</guid><pubDate>Tue, 27 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;藉由測量每位開發者代碼的良率來評估生產力是一件看似合情合理的決策，但良率並不全然代表生產力：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;風險規避&lt;/strong&gt;：讓開發者傾向於選擇保守修復已知的錯誤，因為這樣做能大程度確保低缺陷率。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;短期思維&lt;/strong&gt;：過分規避風險可能導致團隊忽視長遠的改進和創新。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;良率定義與價值是浮動的&lt;/strong&gt;：可能有多個缺陷被回報為單個缺陷或相反，不同缺陷造成的嚴重性也可能不同，缺陷之間天生不平等難以測量。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>Developer Productivity Myth: Lines of Code = Productivity</title><link>https://www.webdong.dev/en/shortpost/line-of-code-and-productivity/#line-of-code-and-productivity/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/line-of-code-and-productivity/#line-of-code-and-productivity/</guid><pubDate>Mon, 26 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In early 1982, the Lisa software team was preparing for a full sprint, and some managers thought it was a good idea to measure progress by tracking the amount of code each engineer wrote each week. They designed a form that required each engineer to submit every Friday, which included a column for the number of lines of code written that week.&lt;/p&gt;
&lt;p&gt;Bill Atkinson, the author of Quickdraw, believed that measuring productivity by lines of code was absurd. His goal was to write programs that were as small and fast as possible, and the lines of code metric would only encourage engineers to write messy, bloated, and error-prone code.&lt;/p&gt;
&lt;p&gt;After adopting a more streamlined algorithm, the new algorithm increased operational speed by nearly 6 times, and as a byproduct, it also reduced about 2000 lines of code. Just after completing the optimization, it was time to fill out the management form for the first time. When he saw the lines of code column, he thought for a moment and then filled in a number: -2000.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;The key to assessing productivity lies in how much output the team produces (helping users, customers, and stakeholders achieve their goals) rather than how much effort is put into producing code. While it is a metric that can roughly track the scale and complexity of a system, it is not very helpful in measuring productivity.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.folklore.org/Negative_2000_Lines_Of_Code.html&quot;&gt;-2000 Lines Of Code - FOLKLORE&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>开发者生产力迷思：程序行数 = 生产力</title><link>https://www.webdong.dev/zh-cn/shortpost/line-of-code-and-productivity/#line-of-code-and-productivity/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/line-of-code-and-productivity/#line-of-code-and-productivity/</guid><pubDate>Mon, 26 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在 1982 年初，Lisa 软件团队正准备全力冲刺，部分管理者认为通过追踪每个工程师每周编写的代码量来衡量进度是个好主意。于是设计了一份表格，要求每位工程师每周五提交，其中有一栏是填写当周编写的程序行数。&lt;/p&gt;
&lt;p&gt;Bill Atkinson 是 Quickdraw 的作者，认为以程序行数来衡量生产力是荒谬的。他的目标是写出尽可能小而快速的程序，而代码行数这个指标只会鼓励工程师写出混乱、臃肿且易出错的代码。&lt;/p&gt;
&lt;p&gt;在采用更精简的算法后，新算法使操作速度几乎提高了 6 倍，而作为副产品也连带减少了约 2000 行代码。就在完成优化后，正好是第一次填写管理表格的时间，当他看到代码行数这一栏时，思考了片刻，然后填写了一个数字：-2000。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;评估生产力关键在于替团队产出多少成果（帮助用户、客户和利益相关者实现目标）而不是下多少功夫产出多少程序。虽然是一个可以大致追踪了解系统的规模和复杂性的指标，但在测量生产力方面没有太大帮助。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.folklore.org/Negative_2000_Lines_Of_Code.html&quot;&gt;-2000 Lines Of Code - FOLKLORE&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>開發者生產力迷思：程式行數 = 生產力</title><link>https://www.webdong.dev/zh-tw/shortpost/line-of-code-and-productivity/#line-of-code-and-productivity/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/line-of-code-and-productivity/#line-of-code-and-productivity/</guid><pubDate>Mon, 26 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在 1982 年初，Lisa 軟體團隊正準備全力衝刺，部分管理者認為透過追蹤每個工程師每週編寫的程式碼量來衡量進度是個好主意。於是設計了一份表格，要求每位工程師每週五提交，其中有一欄是填寫當週編寫的程式行數。&lt;/p&gt;
&lt;p&gt;Bill Atkinson 是 Quickdraw 的作者，認為以程式行數來衡量生產力是荒謬的。他的目標是寫出盡可能小而快速的程序，而程式碼行數這個指標只會鼓勵工程師寫出混亂、臃腫且易出錯的程式碼。&lt;/p&gt;
&lt;p&gt;在採用更精簡的演算法後，新演算法使操作速度幾乎提高了 6 倍，而作為副產品也連帶減少了約 2000 行程式碼。就在完成最佳化後，正好是第一次填寫管理表格的時間，當他看到程式碼行數這一欄時，思考了片刻，然後填寫了一個數字：-2000。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;評估生產力關鍵在於替團隊產出多少成果（幫助用戶、客戶和利害關係人實現目標）而不是下多少功夫產出多少程式。雖然是一個可以大致追蹤了解系統的規模和複雜性的指標，但在測量生產力方面沒有太大幫助。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.folklore.org/Negative_2000_Lines_Of_Code.html&quot;&gt;-2000 Lines Of Code - FOLKLORE&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>Developer Productivity Myths: Work Hours = Productivity</title><link>https://www.webdong.dev/en/shortpost/worktime-and-productivity/#worktime-and-productivity/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/worktime-and-productivity/#worktime-and-productivity/</guid><pubDate>Mon, 19 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If you work 8 hours a day, then the daily productivity divided by 8 hours is 12.5% productivity per hour. If you change it to 10 hours a day, you should be able to complete 25% more work, right? This is the most common and intuitive way to assess productivity: &quot;Work hours = Productivity.&quot;&lt;/p&gt;
&lt;p&gt;But developers are not machines; everyone has limits. Physical strength, focus, mood, and daily routines can all be affected. Once you start to worship the idea that &quot;working longer hours = higher productivity,&quot; it can destroy personal efficiency and team morale. &quot;Two pregnant women do not make a baby come faster.&quot; Many times, creating a product is similar; increasing productivity is not just about having more people work longer hours. Why shouldn&apos;t productivity be assessed based on work hours?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Everyone has a different tolerance for overtime.&lt;/li&gt;
&lt;li&gt;The nature of the work does not necessarily reward labor-intensive hours.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Therefore, I believe that overtime should not be a regular means of improving work efficiency. It can be a short-term emergency measure or specific types of work (more chickens lay more eggs = the more chickens, the more eggs). For most development work, overtime is not a good way to increase productivity.&lt;/p&gt;
&lt;p&gt;Seeing a good article prompts me to sort out my own views, and I expect to write more about developer productivity assessment metrics.&lt;/p&gt;
</content:encoded><category>Team</category></item><item><title>开发者生产力迷思：工作时数 = 生产力</title><link>https://www.webdong.dev/zh-cn/shortpost/worktime-and-productivity/#worktime-and-productivity/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/worktime-and-productivity/#worktime-and-productivity/</guid><pubDate>Mon, 19 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;如果一天工作 8 小时，那么一天生产力除以 8 小时就是每小时的生产力占 12.5%，假如改为一天 10 小时，那么应该可以多完成 25% 的工作量吧？这是最常见也是最直观的生产力评估方式：“工作时数 = 生产力”。&lt;/p&gt;
&lt;p&gt;但开发者不是机器，只要是人都有上限，不管是体力、专注力、心情或作息都可能会受影响。一旦开始崇拜“努力加长工作时间 = 更高生产力”可能会摧毁个人效率与团队气氛。“两个孕妇不会更快生出一个小孩”，很多时候打造产品也是同理，要提高生产力不只是更多人工作更久可以解决的事，为什么不该依据工作时数评估生产力？&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;每个人对于加班承受度不同&lt;/li&gt;
&lt;li&gt;工作性质不一定奖励劳力时间密集&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;因此我认为加班不应该是常规提升工作效率的手段，它可以是短期应急或是特定性质的工作（两只鸡生更多蛋 = 越多鸡生越多蛋），就大多数开发工作来说，加班不是提高生产力的好方法。&lt;/p&gt;
&lt;p&gt;看到不错的文章就来梳理一下自己的看法，预期会写更多开发者生产力的评估指标。&lt;/p&gt;
</content:encoded><category>Team</category></item><item><title>開發者生產力迷思：工作時數 = 生產力</title><link>https://www.webdong.dev/zh-tw/shortpost/worktime-and-productivity/#worktime-and-productivity/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/worktime-and-productivity/#worktime-and-productivity/</guid><pubDate>Mon, 19 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;如果一日工作 8 小時，那麼一日生產力除以 8 小時就是每小時的生產力占 12.5%，假如改為一日 10 小時，那麼應該可以多完成 25% 的工作量吧？這是最常見也是最直覺的生產力評估方式：「工作時數 = 生產力」。&lt;/p&gt;
&lt;p&gt;但開發者不是機器，只要是人都有上限，不管是體力、專注力、心情或作息都可能會受影響。一旦開始崇拜「努力加長工作時間 = 更高生產力」可能會摧毀個人效率與團隊氣氛。「兩個孕婦不會更快生出一個小孩」，很多時候打造產品也是同理，要提高生產力不只是更多人工作更久可以解決的事，為什麼不該依據工作時數評估生產力？&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;每個人對於加班承受度不同&lt;/li&gt;
&lt;li&gt;工作性質不一定獎勵勞力時間密集&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;因此我認為加班不應該是常規提升工作效率的手段，它可以是短期應急或是特定性質的工作（兩隻雞生更多蛋 = 越多雞生越多蛋），就大多開發工作來說，加班不是提高生產力的好方法。&lt;/p&gt;
&lt;p&gt;看到不錯的文章就來梳理一下自己的看法，預期會寫更多開發者生產力的評估指標。&lt;/p&gt;
</content:encoded><category>Team</category></item><item><title>How to Manage Utility Functions</title><link>https://www.webdong.dev/en/shortpost/how-to-organize-utility-functions/#how-to-organize-utility-functions/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/how-to-organize-utility-functions/#how-to-organize-utility-functions/</guid><pubDate>Thu, 15 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;As projects expand, many common functions are scattered in different places. Therefore, I took the time to organize a unified structural rule for the team to use. Many times, our impression of these utility functions only stays at the point of extracting them to a certain folder for storage. As for how to manage or maintain these functions, there are not many thoughts, leading to many chaotic situations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;❌ Over-abstraction: The logic has been separated, but it seems to have little meaning, instead increasing the cost of understanding and maintenance.&lt;/li&gt;
&lt;li&gt;❌ Ambiguous naming: Because they are too generic, the names are also very vague.&lt;/li&gt;
&lt;li&gt;❌ God-level functions: A single function does too many things, making it difficult to maintain.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To address the above issues, I wrote a &lt;a href=&quot;https://www.webdong.dev/post/how-to-organize-utility-functions/&quot;&gt;new article&lt;/a&gt; summarizing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;👉🏻 Real-world problems I encountered&lt;/li&gt;
&lt;li&gt;👉🏻 Definition of utility functions&lt;/li&gt;
&lt;li&gt;👉🏻 When to extract utility functions&lt;/li&gt;
&lt;li&gt;👉🏻 Key points for managing utility functions&lt;/li&gt;
&lt;li&gt;👉🏻 Practical examples&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Actually, I have no concept of whether there are better practices, but I think that such a flexible problem will be solved effectively if the whole team has a consensus and writes it down.&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>如何管理通用工具函式 (Utility Function)</title><link>https://www.webdong.dev/zh-cn/shortpost/how-to-organize-utility-functions/#how-to-organize-utility-functions/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/how-to-organize-utility-functions/#how-to-organize-utility-functions/</guid><pubDate>Thu, 15 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;随着项目扩大许多通用的函数散乱分布在不同地方，于是趁有空时整理出一个统一的结构规则以便团队使用，很多时候我们对这些通用工具函数的印象只停留在要抽离到某个文件夹存好，至于要怎么管理或是维护这些函数就没有太多想法，导致许多乱象产生：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;❌ 过度抽象：逻辑抽离是抽离了，但好像意义也不大，反而增加理解维护成本&lt;/li&gt;
&lt;li&gt;❌ 意义不明的命名：因为太过于通用，所以名称也取得很笼统&lt;/li&gt;
&lt;li&gt;❌ 神级函数：一个函数做太多事情，导致难以维护&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;为了解决以上问题写了一篇&lt;a href=&quot;https://www.webdong.dev/post/how-to-organize-utility-functions/&quot;&gt;新文章&lt;/a&gt;总结：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;👉🏻 我遇到的真实世界问题&lt;/li&gt;
&lt;li&gt;👉🏻 通用函数定义&lt;/li&gt;
&lt;li&gt;👉🏻 什么时候抽离通用函数&lt;/li&gt;
&lt;li&gt;👉🏻 管理通用函数要点&lt;/li&gt;
&lt;li&gt;👉🏻 实际案例&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其实我也没概念有没有更好的做法，但我想这种弹性大的事情就是整个团队有共识并写下来严谨遵守就会有效果。&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>如何管理通用工具函式 (Utility Function)</title><link>https://www.webdong.dev/zh-tw/shortpost/how-to-organize-utility-functions/#how-to-organize-utility-functions/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/how-to-organize-utility-functions/#how-to-organize-utility-functions/</guid><pubDate>Thu, 15 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;隨著專案擴大許多通用的函式散亂分布在不同地方，於是趁有空時整理出一個統一的結構規則以便團隊使用，很多時候我們對這些通用工具函式的印象只停留在要抽離到某個資料夾存好，至於要怎麼管理或是維護這些函式就沒有太多想法，導致許多亂象產生：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;❌ 過度抽象：邏輯抽離是抽離了，但好像意義也不大，反而增加理解維護成本&lt;/li&gt;
&lt;li&gt;❌ 意義不明的命名：因為太過於通用，所以名稱也取得很攏統&lt;/li&gt;
&lt;li&gt;❌ 神級函式：一個函式做太多事情，導致難以維護&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;為了解決以上問題寫了一篇&lt;a href=&quot;https://www.webdong.dev/post/how-to-organize-utility-functions/&quot;&gt;新文章&lt;/a&gt;總結：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;👉🏻 我遇到的真實世界問題&lt;/li&gt;
&lt;li&gt;👉🏻 通用函式定義&lt;/li&gt;
&lt;li&gt;👉🏻 什麼時候抽離通用函式&lt;/li&gt;
&lt;li&gt;👉🏻 管理通用函式要點&lt;/li&gt;
&lt;li&gt;👉🏻 實際案例&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其實我也沒概念有沒有更好的做法，但我想這種彈性大的事情就是整個團隊有共識並寫下來嚴謹遵守就會有效果。&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>Put AI on CI - PR Agent</title><link>https://www.webdong.dev/en/shortpost/put-ai-on-ci-pr-agent/#put-ai-on-ci-pr-agent/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/put-ai-on-ci-pr-agent/#put-ai-on-ci-pr-agent/</guid><pubDate>Tue, 13 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Recently, I&apos;ve been dealing with CI and thought that if we could feed every PR to AI to automatically identify some simple errors or create document, it could save the entire team time and improve efficiency.&lt;/p&gt;
&lt;p&gt;In the end, I chose Codium&apos;s PR Agent to integrate into CI, as it is quite common and doesn&apos;t feel too vendor-locked. Here are some points I find useful:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Easy installation (ready-made CI scripts that can be adjusted a bit and put into operation)&lt;/li&gt;
&lt;li&gt;Supports various Git service providers, multiple deployment methods, and customizable models&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can also purchase their PR-Agent Pro, but it&apos;s not necessary; just adjusting the configuration file allows you to switch to your own model at any time. If you&apos;re interested in putting AI on CI, you might want to give it a try.&lt;/p&gt;
&lt;p&gt;As for the actual experience? I plan to use it for a while longer before writing down my thoughts.&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>把 AI 放上 CI - PR Agent</title><link>https://www.webdong.dev/zh-cn/shortpost/put-ai-on-ci-pr-agent/#put-ai-on-ci-pr-agent/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/put-ai-on-ci-pr-agent/#put-ai-on-ci-pr-agent/</guid><pubDate>Tue, 13 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近都在处理 CI 设施，想说如果把每个 PR 都喂给 AI，自动化挑一些简单的错误或文件补充，应该可以帮整个团队节省时间并提升效率。&lt;/p&gt;
&lt;p&gt;最终是挑了 Codium 的 PR Agent 加入 CI 当中，因为很常见且没有太多供应商绑定的感觉，目前觉得好用的点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;安装方便 (现成 CI 脚本，调整两三下就能放上去运作)&lt;/li&gt;
&lt;li&gt;允许多种 Git 服务供应商、多种架设方式、多种模型可自定义&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;也可以买他们的 PR-Agent Pro 不过不是必要的，只需要调整一下设置档随时都能改用自备的模型，如果对于把 AI 放上 CI 感兴趣可以尝试看看。&lt;/p&gt;
&lt;p&gt;至于实际体验？打算多用一阵子再来写写看心得。&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>把 AI 放上 CI - PR Agent</title><link>https://www.webdong.dev/zh-tw/shortpost/put-ai-on-ci-pr-agent/#put-ai-on-ci-pr-agent/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/put-ai-on-ci-pr-agent/#put-ai-on-ci-pr-agent/</guid><pubDate>Tue, 13 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近都在處理 CI 設施，想說如果把每個 PR 都餵給 AI，自動化挑一些簡單的錯誤或文件補充，應該可以幫整個團隊節省時間並提升效率。&lt;/p&gt;
&lt;p&gt;最終是挑了 Codium 的 PR Agent 加入 CI 當中，因為很常見且沒有太多供應商綁定的感覺，目前覺得好用的點：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;安裝方便 (現成 CI 腳本，調整兩三下就能放上去運作)&lt;/li&gt;
&lt;li&gt;允許多種 Git 服務供應商、多種架設方式、多種模型可自定義&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;也可以買他們的 PR-Agent Pro 不過不是必要的，只需要調整一下設定檔隨時都能改用自備的模型，如果對於把 AI 放上 CI 感興趣可以嘗試看看。&lt;/p&gt;
&lt;p&gt;至於實際體驗？打算多用一陣子再來寫寫看心得。&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>CSS blur() Performance Issues in Safari</title><link>https://www.webdong.dev/en/shortpost/css-blur-safari-performance-issue/#css-blur-safari-performance-issue/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/css-blur-safari-performance-issue/#css-blur-safari-performance-issue/</guid><pubDate>Mon, 12 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;CSS blur() is an interesting function used to blur any element, and it has been supported by most browsers for several years. Recently, it has also been used to create some exquisite effect cards.&lt;/p&gt;
&lt;p&gt;However, the problem is that these cards perform poorly in Safari. The reason is that Safari uses the CPU instead of the GPU for rendering. Therefore, adding a meaningless &lt;code&gt;translateZ()&lt;/code&gt; or &lt;code&gt;translate3d()&lt;/code&gt; can allow the GPU to intervene and compute these blurred elements more efficiently.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;filter: blur(100px);
transform: translate3d(0, 0, 0); // Safari hack to turn on GPU
transform: translateZ(0); // Safari hack to turn on GPU
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>CSS blur() 在 Safari 上要留意的效能问题</title><link>https://www.webdong.dev/zh-cn/shortpost/css-blur-safari-performance-issue/#css-blur-safari-performance-issue/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/css-blur-safari-performance-issue/#css-blur-safari-performance-issue/</guid><pubDate>Mon, 12 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;CSS blur() 是一个很有趣的函数，用来替任何元素进行模糊化，并且数年前就已经被大多数浏览器所支持，近期也用它来制作一些精致特效的卡片。&lt;/p&gt;
&lt;p&gt;不过问题在于这些卡片在 Safari 上性能实在是太差了，原因是因为 Safari 使用 CPU 而非 GPU 渲染，因此加个无意义的 &lt;code&gt;translateZ()&lt;/code&gt; 或 &lt;code&gt;translate3d()&lt;/code&gt; 就可以让 GPU 介入用更高效的方式运算这些模糊元素。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;filter: blur(100px);
transform: translate3d(0, 0, 0); // Safari hack to turn on GPU
transform: translateZ(0); // Safari hack to turn on GPU
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>CSS blur() 在 Safari 上要留意的效能問題</title><link>https://www.webdong.dev/zh-tw/shortpost/css-blur-safari-performance-issue/#css-blur-safari-performance-issue/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/css-blur-safari-performance-issue/#css-blur-safari-performance-issue/</guid><pubDate>Mon, 12 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;CSS blur() 是一個很有趣的函式，用來替任何元素進行模糊化，並且數年前就已經被大多數瀏覽器所支援，近期也用它來製作一些精緻特效的卡片。&lt;/p&gt;
&lt;p&gt;不過問題在於這些卡片在 Safari 上效能實在是太差了，原因是因為 Safari 使用 CPU 而非 GPU 渲染，因此加個無意義的 &lt;code&gt;translateZ()&lt;/code&gt; 或 &lt;code&gt;translate3d()&lt;/code&gt; 就可以讓 GPU 介入用更高效的方式運算這些模糊元素。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;filter: blur(100px);
transform: translate3d(0, 0, 0); // Safari hack to turn on GPU
transform: translateZ(0); // Safari hack to turn on GPU
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>The bfcache Causes Issues Between Pages</title><link>https://www.webdong.dev/en/shortpost/bfcache/#bfcache/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/bfcache/#bfcache/</guid><pubDate>Wed, 31 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Recently, I observed a strange web bug that only occurs when clicking the back button to return to a webpage. After some investigation, I found that it was caused by the bfcache.&lt;/p&gt;
&lt;p&gt;The bfcache has become widespread across major browsers, allowing users to return to previously visited pages almost instantaneously. The downside is that it can lead users to interact with outdated pages stored in the local cache.&lt;/p&gt;
&lt;p&gt;Specifically, the issue I encountered was that when a SPA recovers a page through bfcache, it seems to skip Nuxt&apos;s Middleware and directly reaches the corresponding page. The solution is quite simple:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Use a meta tag to disable caching for the page.&lt;/li&gt;
&lt;li&gt;Check if there is a bfcache and refresh the page if so.&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><category>Frontend</category></item><item><title>往返快取（bfcache）造成前后页面状态问题</title><link>https://www.webdong.dev/zh-cn/shortpost/bfcache/#bfcache/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/bfcache/#bfcache/</guid><pubDate>Wed, 31 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;近期观察到一个奇怪的网页 BUG，只有出现在点击上一页返回网页时才会出现，经过一番查证后发现是往返快取造成的问题。&lt;/p&gt;
&lt;p&gt;往返快取已经普及到各大浏览器，让返回先前访问过的页面几乎是瞬时的，缺点是会让用户使用到存放于本地快取中的旧网页。&lt;/p&gt;
&lt;p&gt;具体来说我遇到的问题是 SPA 在通过 bfcache 恢复页面后看起来是直接跳过 Nuxt 的 Middleware 到达对应页面，解决方法也非常简单：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;通过 meta 标签取消页面被快取&lt;/li&gt;
&lt;li&gt;判断如果有 bfcache 就刷新页面&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><category>Frontend</category></item><item><title>往返快取（bfcache）造成前後頁面狀態問題</title><link>https://www.webdong.dev/zh-tw/shortpost/bfcache/#bfcache/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/bfcache/#bfcache/</guid><pubDate>Wed, 31 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;近期觀察到一個奇怪的網頁 BUG，只有出現在點擊上一頁返回網頁時才會出現，經過一番查證後發現是往返快取造成的問題。&lt;/p&gt;
&lt;p&gt;往返快取已經普及到各大瀏覽器，讓返回先前訪問過的頁面幾乎是瞬時的，缺點是會讓用戶使用到存放於本地快取中的舊網頁。&lt;/p&gt;
&lt;p&gt;具體來說我遇到的問題是 SPA 在透過 bfcache 回復頁面後看起來是直接跳過 Nuxt 的 Middleware 到達對應頁面，解決方法也非常簡單：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;透過 meta 標籤取消頁面被快取&lt;/li&gt;
&lt;li&gt;判斷如果有 bfcache 就刷新頁面&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><category>Frontend</category></item><item><title>What is the Barrel File pattern?</title><link>https://www.webdong.dev/en/shortpost/barrel-file/#barrel-file/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/barrel-file/#barrel-file/</guid><pubDate>Tue, 30 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;In simple terms, it is to create a file that imports all modules and then exports them.&lt;/p&gt;
&lt;p&gt;The reason for investigating this topic is that my team heavily uses this pattern, but Vite does not perform Tree Shake (removing unused code) during development, resulting in a large amount of useless code being bundled into each development environment, severely affecting the development experience.&lt;/p&gt;
&lt;p&gt;Some people believe that barrel files are an anti-pattern with no benefits, while others think that doing so can better organize modules, unify interfaces, and enhance readability.
For more detailed analysis, you can refer to the newly written article: &lt;a href=&quot;https://www.webdong.dev/post/what-is-barrel-file/&quot;&gt;What is the Barrel File pattern?&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Pattern</category></item><item><title>什么是桶文件（Barrel File）模式？</title><link>https://www.webdong.dev/zh-cn/shortpost/barrel-file/#barrel-file/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/barrel-file/#barrel-file/</guid><pubDate>Tue, 30 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;简单来说就是创一个文件，把所有模块都引入再输出。&lt;/p&gt;
&lt;p&gt;会想调查这个主题是因为目前所在的团队大量地使用到这样的模式，但 Vite 并不会在开发中进行 Tree Shake（移除没用到的代码）导致每一次开发环境都有大量的无用代码被打包进去，严重影响到开发体验。&lt;/p&gt;
&lt;p&gt;有的人认为桶文件是个 Anti-Pattern 没有任何好处，但也有人认为这么做可以更好的组织模块、统一接口并增进可读性。
更多细节分析可以参考新写的文章：&lt;a href=&quot;https://www.webdong.dev/post/what-is-barrel-file/&quot;&gt;什么是桶文件（Barrel File）模式？&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Pattern</category></item><item><title>什麼是桶文件（Barrel File）模式？</title><link>https://www.webdong.dev/zh-tw/shortpost/barrel-file/#barrel-file/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/barrel-file/#barrel-file/</guid><pubDate>Tue, 30 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;簡單來說就是創一個檔案，把所有模組都引入再輸出。&lt;/p&gt;
&lt;p&gt;會想調查這個主題是因為目前所在的團隊大量地使用到這樣的模式，但 Vite 並不會在開發中進行 Tree Shake（移除沒用到的代碼）導致每一次開發環境都有大量的無用代碼被打包進去，嚴重影響到開發體驗。&lt;/p&gt;
&lt;p&gt;有的人認為桶文件是個 Anti-Pattern 沒有任何好處，但也有人認為這麼做可以更好的組織模組、統一接口並增進可讀性。
更多細節分析可以參考新寫的文章：&lt;a href=&quot;https://www.webdong.dev/post/what-is-barrel-file/&quot;&gt;什麼是桶文件（Barrel File）模式？&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Pattern</category></item><item><title>Future of the Web - Native Web Components</title><link>https://www.webdong.dev/en/shortpost/web-component/#web-component/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/web-component/#web-component/</guid><pubDate>Sun, 28 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I have known for a long time that browsers began to introduce Web Components APIs and standards, but I never had the opportunity to use this technology in practice. Over time, I found that the application scope of Web Components is becoming broader, and I can also see that major framework packages are successively supporting the use of Web Components, which catched my interest. Simply put, in the face of the current complex frontend demands such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Declarative and concise efficient template systems&lt;/li&gt;
&lt;li&gt;Responsive state and corresponding cross-component communication&lt;/li&gt;
&lt;li&gt;Server-side rendering of Web Components is still impossible 😅, and it will not replace existing solutions, but we can expect more implementations of web components to align with the browser&apos;s native APIs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I researched a bit and wrote an article: &lt;a href=&quot;https://www.webdong.dev/post/future-of-the-web-native-web-components/&quot;&gt;Future of the Web - Native Web Components&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>了解网页元件化的未来：Web Components</title><link>https://www.webdong.dev/zh-cn/shortpost/web-component/#web-component/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/web-component/#web-component/</guid><pubDate>Sun, 28 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;从很早以前就大致知道浏览器开始推出 Web Components 相关 API 与标准，但一直没有机会在实战中使用这项技术。随着时间过去发现 Web Components 的应用范围越来越广，并且也可以看到各大框架套件相继支持使用 Web Components 引起我的兴趣。简单来说，面对当前复杂的前端需求像是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;宣告式且简洁高效的模板系统&lt;/li&gt;
&lt;li&gt;响应式的状态与对应的跨组件通讯&lt;/li&gt;
&lt;li&gt;服务器端渲染 Web Components 一样都没有 😅，并不会取代现有的解决方案，不过可以期待更多网页组件的实现方式会向浏览器原生 API 靠拢。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;研究了一下并写成文章：&lt;a href=&quot;https://www.webdong.dev/post/future-of-the-web-native-web-components/&quot;&gt;了解網頁元件化的未來：Web Components&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>了解網頁元件化的未來：Web Components</title><link>https://www.webdong.dev/zh-tw/shortpost/web-component/#web-component/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/web-component/#web-component/</guid><pubDate>Sun, 28 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;從很早以前就大致知道瀏覽器開始推出 Web Components 相關 API 與標準，但一直沒有機會在實戰中使用這項技術。隨著時間過去發現 Web Components 的應用範疇越來越廣，並且也可以看到各大框架套件相繼支援使用 Web Components 引起我的興趣。簡單來說，面對當前複雜的前端需求像是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;宣告式且簡潔高效的模板系統&lt;/li&gt;
&lt;li&gt;響應式的狀態與對應的跨組件通訊&lt;/li&gt;
&lt;li&gt;伺服端渲染 Web Components 一樣都沒有 😅，並不會取代現有的解決方案，不過可以期待更多網頁元件的實作方式會向瀏覽器原生 API 靠攏。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;研究了一下並寫成文章：&lt;a href=&quot;https://www.webdong.dev/post/future-of-the-web-native-web-components/&quot;&gt;了解網頁元件化的未來：Web Components&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>If you don&apos;t know what you&apos;re doing, probably no one else does.</title><link>https://www.webdong.dev/en/shortpost/problem-solving-mindset/#problem-solving-mindset/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/problem-solving-mindset/#problem-solving-mindset/</guid><pubDate>Thu, 25 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Things aren&apos;t working, why?
Things are working, why?&lt;/p&gt;
&lt;p&gt;You have to figure it out yourself. Even if you become skilled, the pitfalls will only be different, not fewer.
Patience, communication, and thinking outside the box are virtues that a problem solver can possess.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.webdong.dev/post/three-virtues-from-a-good-software-engineer/&quot;&gt;Three Virtues of a Good Software Engineer&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>如果不知道自己在干嘛，那大概也没人知道。</title><link>https://www.webdong.dev/zh-cn/shortpost/problem-solving-mindset/#problem-solving-mindset/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/problem-solving-mindset/#problem-solving-mindset/</guid><pubDate>Thu, 25 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;东西不能运作了，为什么？
东西运作了，为什么？&lt;/p&gt;
&lt;p&gt;你得自己想办法。就算变得熟练，踩的坑只会不同而不会变少。
耐心、沟通、跳脱框架是一个解决问题的人可以具备的美德。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.webdong.dev/post/three-virtues-from-a-good-software-engineer/&quot;&gt;软件工程师可以具备的 3 种优良美德&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>如果不知道自己在幹嘛，那大概也沒人知道。</title><link>https://www.webdong.dev/zh-tw/shortpost/problem-solving-mindset/#problem-solving-mindset/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/problem-solving-mindset/#problem-solving-mindset/</guid><pubDate>Thu, 25 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;東西不能運作了，為什麼？
東西運作了，為什麼？&lt;/p&gt;
&lt;p&gt;你得自己想辦法。就算變得熟練，踩的坑只會不同而不會變少。
耐心、溝通、跳脫框架是一個解決問題的人可以具備的美德。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.webdong.dev/post/three-virtues-from-a-good-software-engineer/&quot;&gt;軟體工程師可以具備的 3 種優良美德&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>Why Should Software Be Tested?</title><link>https://www.webdong.dev/en/shortpost/why-testing-software/#why-testing-software/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/why-testing-software/#why-testing-software/</guid><pubDate>Tue, 23 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Writing tests is a good thing, right? It can automatically verify the behavior of the program and ensure its correctness, so you don&apos;t have to test manually every time.&lt;/p&gt;
&lt;p&gt;This was my initial thought, and then I dove in and wrote a lot of tests, spending a lot of time adding tests for every feature, only to find out... it didn&apos;t really make much difference.&lt;/p&gt;
&lt;p&gt;⚠ Tests are only valuable when executed&lt;/p&gt;
&lt;p&gt;The value of a program is reflected when it is executed and used, and the value of a test is also reflected in its ability to verify the correctness of a certain behavior of the program; even if the program&apos;s architecture is poor, it can still produce value because it works. Similarly, a test can be perfect, but if it doesn&apos;t verify any behavior, it has no value.&lt;/p&gt;
&lt;p&gt;The biggest mistake I made was simply writing a lot of tests without actively executing them. Letting the tests run and verifying the behavior of the program is where the value of testing lies; successful tests give you confidence, while failing tests help you catch bugs.&lt;/p&gt;
&lt;p&gt;The confidence here refers to being sure that the program behaves as expected, allowing you to structure the code with more confidence and ensure that changes won&apos;t affect the verified behaviors. The importance of integrating tests into the development process is as significant as the tests themselves; tests that don&apos;t run are merely case documents. Does anyone ever look at infrequently used and non-binding specification documents? No!&lt;/p&gt;
</content:encoded><category>Software Testing</category></item><item><title>为什么要替软件进行测试？</title><link>https://www.webdong.dev/zh-cn/shortpost/why-testing-software/#why-testing-software/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/why-testing-software/#why-testing-software/</guid><pubDate>Tue, 23 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;写测试是一件好事对吧？可以自动的验证程序的行为，确保程序的正确性，这样就不用每次都要手动测试了。&lt;/p&gt;
&lt;p&gt;这是我最初的想法，然后就一头栽进去写很多测试，花大把的时间替每个功能都加上测试，然后发现……没发挥什么作用。&lt;/p&gt;
&lt;p&gt;⚠ 测试只在被执行时才有价值&lt;/p&gt;
&lt;p&gt;一个程序的价值体现在它被执行使用的时候，而一段测试的价值也体现在它验证了程序的某个行为的正确性；就算程序架构得再烂但因为可以运作所以持续的产出价值，同理一段测试再完美但因为没有验证到任何行为所以是没有价值的。&lt;/p&gt;
&lt;p&gt;我犯下最大的错就是单纯写了很多测试但没有积极的去执行。让测试尽量跑起来，验证程序的行为就是测试的价值所在，成功的测试带给你信心，错误的测试替你抓 BUG。&lt;/p&gt;
&lt;p&gt;这里的信心是指确定程序如预期般的行动，你会更有自信的去架构代码并确保改动不会对被验证过的的行为造成影响。将测试导入开发流程的重要性不亚于测试本身，不会动的测试就是单纯的案例文件，有人没事会去看不常用且没有约束力的规格文件吗？没有！&lt;/p&gt;
</content:encoded><category>Software Testing</category></item><item><title>為什麼要替軟體進行測試？</title><link>https://www.webdong.dev/zh-tw/shortpost/why-testing-software/#why-testing-software/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/why-testing-software/#why-testing-software/</guid><pubDate>Tue, 23 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;寫測試是一件好事對吧？可以自動的驗證程式的行為，確保程式的正確性，這樣就不用每次都要手動測試了。&lt;/p&gt;
&lt;p&gt;這是我最初的想法，然後就一頭栽進去寫很多測試，花大把的時間替每個功能都加上測試，然後發現……沒發揮什麼作用。&lt;/p&gt;
&lt;p&gt;⚠ 測試只在被執行時才有價值&lt;/p&gt;
&lt;p&gt;一個程式的價值體現在它被執行使用的時候，而一段測試的價值也體現在它驗證了程式的某個行為的正確性；就算程式架構得再爛但因為可以運作所以持續的產出價值，同理一段測試再完美但因為沒有驗證到任何行為所以是沒有價值的。&lt;/p&gt;
&lt;p&gt;我犯下最大的錯就是單純寫了很多測試但沒有積極的去執行。讓測試盡量跑起來，驗證程式的行為就是測試的價值所在，成功的測試帶給你信心，錯誤的測試替你抓 BUG。&lt;/p&gt;
&lt;p&gt;這裡的信心是指確定程式如預期般的行動，你會更有自信的去架構代碼並確保改動不會對被驗證過的的行為造成影響。將測試導入開發流程的重要性不亞於測試本身，不會動的測試就是單純的案例文件，有人沒事會去看不常用且沒有約束力的規格文件嗎？沒有！&lt;/p&gt;
</content:encoded><category>Software Testing</category></item><item><title>Understanding Built-in Data Structures in ES6 JavaScript: Map</title><link>https://www.webdong.dev/en/shortpost/javascript-map/#javascript-map/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/javascript-map/#javascript-map/</guid><pubDate>Thu, 18 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In JavaScript ES6, there is a data structure similar to objects whose purpose I&apos;ve never been quite clear about.&lt;/p&gt;
&lt;p&gt;For more details, you can check the new article: &lt;a href=&quot;https://www.webdong.dev/post/javascript-maps/&quot;&gt;Understanding Built-in Data Structures in ES6 JavaScript: Map&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The summary of the article is: treat Map as an object for frequent read and write operations, which offers better performance and clearer syntax, while objects can be used to store fixed key-value pairs when frequent read and write operations are not needed.&lt;/p&gt;
</content:encoded><category>JavaScript</category></item><item><title>了解 ES6 JavaScript 当中的内建数据结构： Map</title><link>https://www.webdong.dev/zh-cn/shortpost/javascript-map/#javascript-map/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/javascript-map/#javascript-map/</guid><pubDate>Thu, 18 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;JavaScript ES6 中有一个用法与对象近似的数据结构我一直不是很清楚用途。&lt;/p&gt;
&lt;p&gt;写完文章总结：把 Map 当作是用来频繁读写的对象，具备更好的性能、更明确的语法，而对象可以用作存储固定的键值，在不需要频繁读写的情况下使用。&lt;/p&gt;
&lt;p&gt;更多说明可以看新文章：&lt;a href=&quot;https://www.webdong.dev/post/javascript-maps/&quot;&gt;了解 ES6 JavaScript 当中的内建数据结构： Map&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>JavaScript</category></item><item><title>了解 ES6 JavaScript 當中的內建資料結構： Map</title><link>https://www.webdong.dev/zh-tw/shortpost/javascript-map/#javascript-map/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/javascript-map/#javascript-map/</guid><pubDate>Thu, 18 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;JavaScript ES6 中有一個用法與物件近似的資料結構我一直不是很清楚用途。&lt;/p&gt;
&lt;p&gt;寫完文章總結：把 Map 當作是用來頻繁讀寫的物件，具備更好的性能、更明確的語法，而物件可以用作儲存固定的鍵值，在不需要頻繁讀寫的情況下使用。&lt;/p&gt;
&lt;p&gt;更多說明可以看新文章：&lt;a href=&quot;https://www.webdong.dev/post/javascript-maps/&quot;&gt;了解 ES6 JavaScript 當中的內建資料結構： Map&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>JavaScript</category></item><item><title>The Most Noticeable Shortcuts in Frontend</title><link>https://www.webdong.dev/en/shortpost/browser-response-mode/#browser-response-mode/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/browser-response-mode/#browser-response-mode/</guid><pubDate>Tue, 16 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The most noticeable shortcuts in frontend are definitely pressed hundreds of times a day with these two buttons!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Inspect page elements: Ctrl + Shift + C&lt;/li&gt;
&lt;li&gt;Device size preview: Ctrl + Shift + M&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some browsers may require opening DevTools (F12) for them to take effect.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>前端最有感的的快捷鍵</title><link>https://www.webdong.dev/zh-cn/shortpost/browser-response-mode/#browser-response-mode/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/browser-response-mode/#browser-response-mode/</guid><pubDate>Tue, 16 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;前端最有感的的快捷鍵天天按這兩顆按鈕绝对有上百次不为过吧！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;检视页面元素：Ctrl + Shift + C&lt;/li&gt;
&lt;li&gt;设备尺寸预览：Ctrl + Shift + M&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一些浏览器会需要开 DevTools (F12) 才会生效&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>前端最有感的的快捷鍵</title><link>https://www.webdong.dev/zh-tw/shortpost/browser-response-mode/#browser-response-mode/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/browser-response-mode/#browser-response-mode/</guid><pubDate>Tue, 16 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;前端最有感的的快捷鍵天天按這兩顆按鈕絕對有上百次不為過吧！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;檢視頁面元素：Ctrl + Shift + C&lt;/li&gt;
&lt;li&gt;裝置尺寸預覽：Ctrl + Shift + M&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一些瀏覽器會需要開 DevTools (F12) 才會生效&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>Why is it so difficult to estimate project time?</title><link>https://www.webdong.dev/en/shortpost/why-is-time-estimating-hard/#why-is-time-estimating-hard/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/why-is-time-estimating-hard/#why-is-time-estimating-hard/</guid><pubDate>Mon, 15 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Why is it so difficult to estimate project time?&lt;/p&gt;
&lt;p&gt;Core Issues:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Many tasks are actually &quot;meta-work&quot; (work needed to enable the actual work) rather than &quot;core work&quot; itself&lt;/li&gt;
&lt;li&gt;These non-core tasks are often underestimated or overlooked in project planning&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We tend to estimate timelines based on ideal scenarios, avoiding consideration of uncertainties. This relates to confidence management and pressure handling. Instead of relying on optimistic intuition, we should establish a framework that comprehensively evaluates both core work and supporting tasks.&lt;/p&gt;
&lt;p&gt;Project Work Categories:&lt;/p&gt;
&lt;h2&gt;⚫ Project Administration&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Meetings, reviews, project management&lt;/li&gt;
&lt;li&gt;Team coordination and communication&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;🔴 Project Acquisition&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Research and experimentation&lt;/li&gt;
&lt;li&gt;Scope definition&lt;/li&gt;
&lt;li&gt;Quote preparation&lt;/li&gt;
&lt;li&gt;Stakeholder persuasion&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;🟠 Project Preparation&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Environment setup&lt;/li&gt;
&lt;li&gt;Infrastructure configuration&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;🟡 Core Project Execution&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Product design&lt;/li&gt;
&lt;li&gt;Development&lt;/li&gt;
&lt;li&gt;Testing&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;🟢 Inter-Project Iteration&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Debugging cycles&lt;/li&gt;
&lt;li&gt;Code refactoring&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;🔵 Project Extensions&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Scope adjustments&lt;/li&gt;
&lt;li&gt;Change requests&lt;/li&gt;
&lt;li&gt;Additional requirements&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;🟣 External Factors&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Unexpected events&lt;/li&gt;
&lt;li&gt;Extended dependencies&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;🟤 Post-Project Support&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Deployment&lt;/li&gt;
&lt;li&gt;Security maintenance&lt;/li&gt;
&lt;li&gt;System updates&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Key Takeaways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Review completed projects to calibrate future estimates&lt;/li&gt;
&lt;li&gt;Acknowledge that most projects contain significant hidden work&lt;/li&gt;
&lt;li&gt;When issues arise, focus on improving estimation methods rather than just working longer hours&lt;/li&gt;
&lt;li&gt;Pay special attention to fixed-budget projects and their unique risks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://www.webdong.dev/post/why-is-time-estimating-hard/&quot;&gt;Why is time estimating hard&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Team</category></item><item><title>为什么专案时间预估这么难？</title><link>https://www.webdong.dev/zh-cn/shortpost/why-is-time-estimating-hard/#why-is-time-estimating-hard/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/why-is-time-estimating-hard/#why-is-time-estimating-hard/</guid><pubDate>Mon, 15 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;许多工作是「为了完成工作而做的工作」，而不是「实际的工作」&lt;/li&gt;
&lt;li&gt;大部分工作因为不是「实际的工作」，所以被低估或未估计&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我们喜欢预估事情如果在专业的执行下会有多顺利，而不是关心捉摸不定的变数，这也牵扯到自尊与压力等问题，与其盲目相信直觉上事情会多顺利，或许能够建立一套框架流程，用于将工作与其连带的附加工作也纳入评估当中。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;⚫ 围绕在专案的工作（行政）：开会、评论、专案管理&lt;/li&gt;
&lt;li&gt;🔴 为了得到专案而做的工作（获取）：研究、实验、定义边界、报价、说服&lt;/li&gt;
&lt;li&gt;🟠 专案之前的工作（准备）：设置、基础建设&lt;/li&gt;
&lt;li&gt;🟡 专案本身（执行）：实际产品设计、开发、测试&lt;/li&gt;
&lt;li&gt;🟢 专案之间的工作（迭代）：迭代除错、重构&lt;/li&gt;
&lt;li&gt;🔵 专案延伸的工作（改变）：遗漏、新变动、可额外添加事项&lt;/li&gt;
&lt;li&gt;🟣 案之外的工作（问题）：意外事件、延伸任务&lt;/li&gt;
&lt;li&gt;🟤 专案之后的工作（支援）：部署、安全问题、更新由于执行因素持续变动是不可改变的因素，要学会如何在预估失败时快速调整。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;总结是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;替结束的专案进行评估，将期望拉回现实&lt;/li&gt;
&lt;li&gt;留意绝大多数专案都存在隐性工作&lt;/li&gt;
&lt;li&gt;出事时与其持续埋头苦干，思考改进估计偏差和弱点&lt;/li&gt;
&lt;li&gt;留意固定代价的专案&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://www.webdong.dev/post/why-is-time-estimating-hard/&quot;&gt;为什么专案时间预估这么难？具体可以如何解决时程预判问题&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Team</category></item><item><title>為什麼專案時間預估這麼難？</title><link>https://www.webdong.dev/zh-tw/shortpost/why-is-time-estimating-hard/#why-is-time-estimating-hard/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/why-is-time-estimating-hard/#why-is-time-estimating-hard/</guid><pubDate>Mon, 15 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;許多工作是「為了完成工作而做的工作」，而不是「實際的工作」&lt;/li&gt;
&lt;li&gt;大部分工作因為不是「實際的工作」，所以被低估或未估計&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我們喜歡預估事情如果在專業的執行下會有多順利，而不是關心捉摸不定的變數，這也牽扯到自尊與壓力等問題，與其盲目相信直覺上事情會多順利，或許能夠建立一套框架流程，用於將工作與其連帶的附加工作也納入評估當中。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;⚫ 圍繞在專案的工作（行政）：開會、評論、專案管理&lt;/li&gt;
&lt;li&gt;🔴 為了得到專案而做的工作（獲取）：研究、實驗、定義邊界、報價、說服&lt;/li&gt;
&lt;li&gt;🟠 專案之前的工作（準備）：設定、基礎建設&lt;/li&gt;
&lt;li&gt;🟡 專案本身（執行）：實際產品設計、開發、測試&lt;/li&gt;
&lt;li&gt;🟢 專案之間的工作（迭代）：迭代除錯、重構&lt;/li&gt;
&lt;li&gt;🔵 專案延伸的工作（改變）：遺漏、新變動、可額外添加事項&lt;/li&gt;
&lt;li&gt;🟣 案之外的工作（問題）：意外事件、延伸任務&lt;/li&gt;
&lt;li&gt;🟤 專案之後的工作（支援）：部屬、安全問題、更新由於執行因素持續變動是不可改變的因素，要學會如何在預估失敗時快速調整。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;總結是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;替結束的專案進行評估，將期望拉回現實&lt;/li&gt;
&lt;li&gt;留意絕大多數專案都存在隱性工作&lt;/li&gt;
&lt;li&gt;出事時與其持續埋頭苦幹，思考改進估計偏差和弱點&lt;/li&gt;
&lt;li&gt;留意固定代價的專案&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://www.webdong.dev/post/why-is-time-estimating-hard/&quot;&gt;為什麼專案時間預估這麼難？具體可以如何解決時程預判問題&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Team</category></item><item><title>Organize Tailwind and UI variable</title><link>https://www.webdong.dev/en/shortpost/tailwind-and-ui-variable/#tailwind-and-ui-variable/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/tailwind-and-ui-variable/#tailwind-and-ui-variable/</guid><pubDate>Sat, 13 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Recently, developing a new architecture has been fulfilling. We listed some best practices and tried to implement them in the project. One of them is &quot;no magic numbers should exist in each UI component.&quot; For example, a card has size variants, with the large version having a maximum width of 600px and the small version having a maximum width of 300px.&lt;/p&gt;
&lt;p&gt;If you don&apos;t think too much and write it in Tailwind, it might look like this: &lt;code&gt;lg:max-w-[600px] max-w-[300px]&lt;/code&gt;. But having these magic numbers throughout the product can be quite a headache!!! Especially in situations where:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The design side lacks a good design system (design however you want)&lt;/li&gt;
&lt;li&gt;The development side is strictly scrutinized for Pixel Perfect (treating RWD like AWD)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This can result in beautifully crafted poop 💩.&lt;/p&gt;
&lt;p&gt;UI designers should also pay attention to the fact that every value in the design should have a basis behind it. If the product is not a one-time development, then establishing a design system is essential. Collaborating with the front end, if a lot of the early UI work is done well, the front end can also benefit (how to slice components, how to manage them, what interfaces to open, how to name them...).&lt;/p&gt;
&lt;p&gt;Returning to the main topic, please define a name for each value. If that&apos;s really not possible, define variables within the component instead of hardcoding values.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.webdong.dev/post/tailwind-anti-patterns/&quot;&gt;Tailwind Anti-Patterns&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>CSS</category></item><item><title>管理 Tailwind 当中的变量可以这样做</title><link>https://www.webdong.dev/zh-cn/shortpost/tailwind-and-ui-variable/#tailwind-and-ui-variable/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/tailwind-and-ui-variable/#tailwind-and-ui-variable/</guid><pubDate>Sat, 13 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近在开发新架构过得很充实，我们列出了一些最佳实践并尝试实践在项目当中，其中一项是「每个 UI 组件不应该有魔法数值」，举例：某卡片有大小版本，大的最大宽 600px，小的最大宽 300px。&lt;/p&gt;
&lt;p&gt;如果没想太多用 Tailwind 写可能就会像是这样：&lt;code&gt;lg:max-w-[600px] max-w-[300px]&lt;/code&gt;。但整个产品都充斥这种魔法数字会让人有够头痛！！！特别是在：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;设计端没有良好设计系统（想怎么设计就怎么设计）&lt;/li&gt;
&lt;li&gt;开发端被严格审视 Pixel Perfect（把 RWD 看得跟 AWD 一样）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;会产出精美的大便 💩。&lt;/p&gt;
&lt;p&gt;UI 设计师也应当留意设计下的每个数值应该背后都要有依据，如果产品不是一次性开发，那么建立设计系统是必须的。与前端合作，其实很多 UI 前期工作做得好，前端也能受益（组件怎么切、怎么管理、开放那些接口、怎么命名……）。&lt;/p&gt;
&lt;p&gt;回归主题，请替每个数值定义好名称，真的不行就定义组件内的变量，而不是写死数值。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.webdong.dev/post/tailwind-anti-patterns/&quot;&gt;绝对要避免的 5 项 Tailwind 反模式&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>CSS</category></item><item><title>管理 Tailwind 當中的變數可以這樣做</title><link>https://www.webdong.dev/zh-tw/shortpost/tailwind-and-ui-variable/#tailwind-and-ui-variable/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/tailwind-and-ui-variable/#tailwind-and-ui-variable/</guid><pubDate>Sat, 13 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近在開發新架構過得很充實，我們列出了一些最佳實踐並嘗試實踐在專案當中，其中一項是「每個 UI 元件不應該有魔法數值」，舉例：某卡片有大小版本，大的最大寬 600px，小的最大寬 300px。&lt;/p&gt;
&lt;p&gt;如果沒想太多用 Tailwind 寫可能就會像是這樣：&lt;code&gt;lg:max-w-[600px] max-w-[300px]&lt;/code&gt;。但整個產品都充斥這種魔法數字會讓人有夠頭痛！！！特別是在：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;設計端沒有良好設計系統（想怎麼設計就怎麼設計）&lt;/li&gt;
&lt;li&gt;開發端被嚴格審視 Pixel Perfect（把 RWD 看得跟 AWD 一樣）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;會產出精美的大便 💩。&lt;/p&gt;
&lt;p&gt;UI 設計師也應當留意設計下的每個數值應該背後都要有依據，如果產品不是一次性開發，那麼建立設計系統是必須的。與前端合作，其實很多 UI 前期工作做得好，前端也能受益（元件怎麼切、怎麼管理、開放那些接口、怎麼命名……）。&lt;/p&gt;
&lt;p&gt;回歸主題，請替每個數值定義好名稱，真的不行就定義元件內的變數，而不是寫死數值。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.webdong.dev/post/tailwind-anti-patterns/&quot;&gt;絕對要避免的 5 項 Tailwind 反模式&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>CSS</category></item><item><title>How to Establish and Manage UI Variables in Digital Products</title><link>https://www.webdong.dev/en/shortpost/build-digital-product-token/#build-digital-product-token/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/build-digital-product-token/#build-digital-product-token/</guid><pubDate>Mon, 08 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In previous projects, there were no specific guidelines on how to define values in the UI, leading to magic numbers (values without specifications or descriptions) spreading throughout the product, causing significant issues.&lt;/p&gt;
&lt;p&gt;Therefore, during this architectural overhaul, I reviewed Figma&apos;s documentation on Design Tokens and summarized a new article to guide the team in quickly understanding how to manage UI variables in digital products through the following three classification methods:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Primitive Variable&lt;/li&gt;
&lt;li&gt;Semantic Variable&lt;/li&gt;
&lt;li&gt;Component Variable&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more details, please refer to: &lt;a href=&quot;https://www.webdong.dev/post/how-to-organize-your-digital-product/&quot;&gt;How to Establish and Manage Design Tokens or Variables in Products&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>UI</category></item><item><title>具体来说可以怎么建立与管理数字产品的 UI 变量</title><link>https://www.webdong.dev/zh-cn/shortpost/build-digital-product-token/#build-digital-product-token/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/build-digital-product-token/#build-digital-product-token/</guid><pubDate>Mon, 08 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;先前项目并没有具体规范应该如何定义 UI 当中的数值，导致魔法数字（没有规范与描述的值）流窜于整个产品当中，造成了非常大的困扰。&lt;/p&gt;
&lt;p&gt;因此这次架构翻新查阅了一下 Figma 关于 Design Token 相关文件并总结出新文章，引导团队了解可以快速了解如何管理数字产品当中的 UI 变量，通过以下三种分类方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;原始值变量 Primitive Variable&lt;/li&gt;
&lt;li&gt;语义化变量 Semantic Variable&lt;/li&gt;
&lt;li&gt;组件变量 Component Variable&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;详细可以参考：&lt;a href=&quot;https://www.webdong.dev/post/how-to-organize-your-digital-product/&quot;&gt;具体来说可以怎么建立与管理产品的设计令牌或变量&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>UI</category></item><item><title>具體來說可以怎麼建立與管理數位產品的 UI 變數</title><link>https://www.webdong.dev/zh-tw/shortpost/build-digital-product-token/#build-digital-product-token/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/build-digital-product-token/#build-digital-product-token/</guid><pubDate>Mon, 08 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;先前專案並沒有具體規範應該如何定義 UI 當中的數值，導致魔法數字（沒有規範與描述的值）流竄於整個產品當中，造成了非常大的困擾。&lt;/p&gt;
&lt;p&gt;因此這次架構翻新查閱了一下 Figma 關於 Design Token 相關文件並總結出新文章，引導團隊了解可以快速了解如何管理數位產品當中的 UI 變數，透過以下三種分類方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;原始值變數 Primitive Variable&lt;/li&gt;
&lt;li&gt;語意化變數 Semantic Variable&lt;/li&gt;
&lt;li&gt;元件變數 Component Variable&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;詳細可以參考：&lt;a href=&quot;https://www.webdong.dev/post/how-to-organize-your-digital-product/&quot;&gt;具體來說可以怎麼建立與管理產品的設計令牌或變數&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>UI</category></item><item><title>Do Not Tell Users &quot;Read More&quot;</title><link>https://www.webdong.dev/en/shortpost/readmore-is-bad/#readmore-is-bad/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/readmore-is-bad/#readmore-is-bad/</guid><pubDate>Thu, 04 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Many times, it is not necessary to display all the information at once; instead, a button is created to let users know &quot;if interested, click here to get more related information.&quot;&lt;/p&gt;
&lt;p&gt;The problem is that &quot;more&quot; is an ambiguous term.&lt;/p&gt;
&lt;p&gt;Crawlers (bots that access websites) do not know what &quot;more&quot; means, users with screen readers do not know what &quot;more&quot; means, and poor UI can also leave people unclear about what &quot;more&quot; is... Leaving the description to be judged by context can easily lead to confusion and misunderstanding. Therefore, do not just tell users whether to &quot;see more&quot; or &quot;are you sure,&quot; clearly informing users of the impact of their actions is one of the basic ways to enhance the UX experience.&lt;/p&gt;
&lt;p&gt;I wanted to share this topic because I found that many newly planned pages have &quot;see more,&quot; while reminding myself that this issue needs improvement 🥺.&lt;/p&gt;
</content:encoded><category>UX</category></item><item><title>不要告诉使用者「查看更多」</title><link>https://www.webdong.dev/zh-cn/shortpost/readmore-is-bad/#readmore-is-bad/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/readmore-is-bad/#readmore-is-bad/</guid><pubDate>Thu, 04 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;很多时候不会需要一次把所有资料显示出来，而是会制作一个按钮让用户了解「如果感兴趣可以点这里获取更多相关的资料」。&lt;/p&gt;
&lt;p&gt;问题在于「更多」是含糊的词汇。&lt;/p&gt;
&lt;p&gt;爬虫（访问网站的机器人）并不知道更多是什么、使用屏幕阅读器的人不知道更多是什么、糟糕的 UI 也会让人不清楚更多是什么……将描述交由情境去判断容易造成混淆与误解。所以不要只告诉用户是否「查看更多」、「确不确定」，明确把行动会造成的影响告知用户是基本提升 UX 体验的方式之一。&lt;/p&gt;
&lt;p&gt;会想分享这个主题是因为发现新规划的页面很多「查看更多」，同时告诫自己这种问题要改进 🥺。&lt;/p&gt;
</content:encoded><category>UX</category></item><item><title>不要告訴使用者「查看更多」</title><link>https://www.webdong.dev/zh-tw/shortpost/readmore-is-bad/#readmore-is-bad/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/readmore-is-bad/#readmore-is-bad/</guid><pubDate>Thu, 04 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;很多時候不會需要一次把所有資料顯示出來，而是會製作一顆按鈕讓用戶了解「如果感興趣可以點這裡獲取更多相關的資料」。&lt;/p&gt;
&lt;p&gt;問題在於「更多」是含糊的詞彙。&lt;/p&gt;
&lt;p&gt;爬蟲（訪問網站的機器人）並不知道更多是什麼、使用螢幕閱讀器的人不知道更多是什麼、糟糕的 UI 也會讓人不清楚更多是什麼……將描述交由情境去判斷容易造成混淆與誤解。所以不要只告訴使用者是否「查看更多」、「確不確定」，明確把行動會造成的影響告知用戶是基本提升 UX 體驗的方式之一。&lt;/p&gt;
&lt;p&gt;會想分享這個主題是因為發現新規劃的頁面很多「查看更多」，同時告誡自己這種問題要改進 🥺。&lt;/p&gt;
</content:encoded><category>UX</category></item><item><title>How to Escape a Container with CSS Grid</title><link>https://www.webdong.dev/en/shortpost/container-bleed/#container-bleed/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/container-bleed/#container-bleed/</guid><pubDate>Wed, 03 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;How to Escape a Container with CSS Grid Almost every webpage needs to ensure that content stays within a reasonable range, often requiring a fixed maximum size on the outer layer to limit the webpage content. However, recently I encountered a UI requirement that needs to overflow the container to the edge of the page, which doesn&apos;t seem achievable just by setting a maximum range! ☹&lt;/p&gt;
&lt;p&gt;Fortunately, modern CSS has features like Grid, minmax, variables, etc., to assist in achieving such layouts. &lt;a href=&quot;https://www.webdong.dev/post/how-to-escape-container-by-using-css-grid/&quot;&gt;New Article&lt;/a&gt; will take you through how to accomplish this 👇🏻&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grid-template-columns: {
minmax(var(--container-padding-inline), 1fr)
minmax(0, var(--max-container-width-half))
minmax(0, var(--max-container-width-half))
minmax(var(--container-padding-inline), 1fr);
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>CSS</category></item><item><title>如何透过 CSS Grid 让元素跳脱容器</title><link>https://www.webdong.dev/zh-cn/shortpost/container-bleed/#container-bleed/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/container-bleed/#container-bleed/</guid><pubDate>Wed, 03 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;近乎每个网页为了确保内容保持在合理的范围内，很多时候会需要在外层使用固定的最大尺寸来限制网页内容。但近期我碰上需要溢出容器到页面边缘的视觉，这看起来就不是简单设个最大范围能达成的吧 ！☹&lt;/p&gt;
&lt;p&gt;好险现代 CSS 具备 Grid、minmax、变量……等语法协助达成这类布局。&lt;a href=&quot;https://www.webdong.dev/post/how-to-escape-container-by-using-css-grid/&quot;&gt;新的文章&lt;/a&gt;带你了解这个酷酷的 Grid 是如何做到的 👇🏻&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grid-template-columns: {
minmax(var(--container-padding-inline), 1fr)
minmax(0, var(--max-container-width-half))
minmax(0, var(--max-container-width-half))
minmax(var(--container-padding-inline), 1fr);
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>CSS</category></item><item><title>如何透過 CSS Grid 讓元素跳脫容器</title><link>https://www.webdong.dev/zh-tw/shortpost/container-bleed/#container-bleed/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/container-bleed/#container-bleed/</guid><pubDate>Wed, 03 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;近乎每個網頁為了確保內容保持在合理的範圍內，很多時候會需要在外層使用固定的最大尺寸來限制網頁內容。但近期我碰上需要溢出容器到頁面邊緣的視覺，這看起來就不是簡單設個最大範圍能達成的吧 ！☹&lt;/p&gt;
&lt;p&gt;好險現代 CSS 具備 Grid、minmax、變數……等語法協助達成這類布局。&lt;a href=&quot;https://www.webdong.dev/post/how-to-escape-container-by-using-css-grid/&quot;&gt;新的文章&lt;/a&gt;帶你了解 J 個酷酷的 Grid 是如何做到的 👇🏻&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grid-template-columns: {
minmax(var(--container-padding-inline), 1fr)
minmax(0, var(--max-container-width-half))
minmax(0, var(--max-container-width-half))
minmax(var(--container-padding-inline), 1fr);
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>CSS</category></item><item><title>Generate Fake Data with TestDataHub</title><link>https://www.webdong.dev/en/shortpost/generate-testdata/#generate-testdata/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/generate-testdata/#generate-testdata/</guid><pubDate>Tue, 02 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Sometimes you want to test what happens when you throw strange data outside the specifications at the software, but you don&apos;t have the corresponding data on hand, and collecting or creating it can be troublesome, so you can give it a try.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Image generation&lt;/li&gt;
&lt;li&gt;File generation&lt;/li&gt;
&lt;li&gt;JSON / CSV generation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All data is generated locally, so the experience is very fast and convenient.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://testdatahub.com/&quot;&gt;TestDataHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Share</category></item><item><title>生成假资料可以用 TestDataHub</title><link>https://www.webdong.dev/zh-cn/shortpost/generate-testdata/#generate-testdata/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/generate-testdata/#generate-testdata/</guid><pubDate>Tue, 02 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;有时候想要测试丢规范外的怪资料去测试软件会发生什么事，但手边又没有对应资料，收集或制作又很麻烦就可以试看看。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;图片生成&lt;/li&gt;
&lt;li&gt;文件生成&lt;/li&gt;
&lt;li&gt;JSON / CSV 生成&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所有资料都是在本地生成，所以体验上很快速方便&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://testdatahub.com/&quot;&gt;TestDataHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Share</category></item><item><title>生成假資料可以用 TestDataHub</title><link>https://www.webdong.dev/zh-tw/shortpost/generate-testdata/#generate-testdata/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/generate-testdata/#generate-testdata/</guid><pubDate>Tue, 02 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;有時候想要測試丟規範外的怪資料去測試軟體會發生什麼事，但手邊又沒有對應資料，蒐集或製作又很麻煩就可以試看看。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;圖片生成&lt;/li&gt;
&lt;li&gt;檔案生成&lt;/li&gt;
&lt;li&gt;JSON / CSV 生成&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所有資料都是在本地生成，所以體驗上很快速方便&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://testdatahub.com/&quot;&gt;TestDataHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Share</category></item><item><title>Why the Overall Experience of the Frontend Ecosystem is Moving Towards 😐</title><link>https://www.webdong.dev/en/shortpost/why-web-environment-experience-falling/#why-web-environment-experience-falling/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/why-web-environment-experience-falling/#why-web-environment-experience-falling/</guid><pubDate>Mon, 01 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;With the release of the State of JavaScript 2023, it can be observed that the satisfaction levels of many gradually maturing technologies are declining, such as Next.js, Nuxt.js, Svelte, etc. The summary of &lt;a href=&quot;https://www.youtube.com/watch?v=rdKQczxKwe8&quot;&gt;Theo&apos;s perspective&lt;/a&gt; is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;As usage increases, people are forced to adopt solutions that are not their own choices.&lt;/li&gt;
&lt;li&gt;As technologies mature and are widely applied, broader problems need to be solved, thus breaking old habits.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There seems to be a saying that there are only two types of technologies (or anything):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Those that are disliked&lt;/li&gt;
&lt;li&gt;Those that no one uses&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Frontend</category></item><item><title>为什么前端生态整体体验迈向 😐</title><link>https://www.webdong.dev/zh-cn/shortpost/why-web-environment-experience-falling/#why-web-environment-experience-falling/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/why-web-environment-experience-falling/#why-web-environment-experience-falling/</guid><pubDate>Mon, 01 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;随着 State of JavaScript 2023 出炉，可以发现许多逐渐成熟的技术满意度都在下降，像是 Next.js、Nuxt.js、Svelte……等，总结 &lt;a href=&quot;https://www.youtube.com/watch?v=rdKQczxKwe8&quot;&gt;Theo 的看法&lt;/a&gt;是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;随着使用度提高，人们被迫为选择不是自己决定的解决方案。&lt;/li&gt;
&lt;li&gt;随着技术成熟与广泛应用，更广阔的问题需要被解决因此打破旧有习惯。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;好像有一句话是说只存在两类技术（或任何事物）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;被嫌的&lt;/li&gt;
&lt;li&gt;没人用的&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Frontend</category></item><item><title>為什麼前端生態整體體驗邁向 😐</title><link>https://www.webdong.dev/zh-tw/shortpost/why-web-environment-experience-falling/#why-web-environment-experience-falling/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/why-web-environment-experience-falling/#why-web-environment-experience-falling/</guid><pubDate>Mon, 01 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;隨著 State of JavaScript 2023 出爐，可以發現許多逐漸成熟的技術滿意度都在下降，像是 Next.js、Nuxt.js、Svelte……等，總結 &lt;a href=&quot;https://www.youtube.com/watch?v=rdKQczxKwe8&quot;&gt;Theo 的看法&lt;/a&gt;是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;隨著使用度提高，人們被迫為選擇不是自己決定的解決方案。&lt;/li&gt;
&lt;li&gt;隨著技術成熟與廣泛應用，更廣闊的問題需要被解決因此打破舊有習慣。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;好像有一句話是說只存在兩類技術（或任何事物）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;被嫌的&lt;/li&gt;
&lt;li&gt;沒人用的&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Frontend</category></item><item><title>CSS Property Maximum Value</title><link>https://www.webdong.dev/en/shortpost/infinity-inside-css/#infinity-inside-css/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/infinity-inside-css/#infinity-inside-css/</guid><pubDate>Fri, 28 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Previously read that the maximum z-index value in CSS is 2147483647 because it is the maximum value that a 32-bit signed integer can represent, but this number is quite ugly. Is there another way to express &quot;maximum&quot;?&lt;/p&gt;
&lt;p&gt;There actually is. CSS has an infinity constant that can be used to express infinity, but it can only be used within calc().&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://codersblock.com/blog/playing-with-infinity-in-css/&quot;&gt;Playing with Infinity in CSS - codersblock&lt;/a&gt; describes what happens if you put CSS infinity on different properties:&lt;/p&gt;
&lt;p&gt;Are there any practical cases summarized? Basically none 😐&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Super rounded corners&lt;/li&gt;
&lt;li&gt;Setting an element far off the screen so that users can&apos;t see it, but screen readers can (nostalgic hack)&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>CSS</category></item><item><title>CSS 属性的最大值</title><link>https://www.webdong.dev/zh-cn/shortpost/infinity-inside-css/#infinity-inside-css/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/infinity-inside-css/#infinity-inside-css/</guid><pubDate>Fri, 28 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;之前读到 CSS 中最大 z-index 值是 2147483647 是因为是 32 位元 signed integer 能表示的最大值，但这个数字有够丑，有没有其他方式表示「最大」？&lt;/p&gt;
&lt;p&gt;还真的有，CSS 存在 infinity 常数可用于表达无限，不过只能用于 calc() 当中。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://codersblock.com/blog/playing-with-infinity-in-css/&quot;&gt;Playing with Infinity in CSS - codersblock&lt;/a&gt; 描述如果把 CSS infinity 放到不同属性上会发生什么事：&lt;/p&gt;
&lt;p&gt;总结有什么实用的案例吗？基本没有 😐&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;超圆的圆角&lt;/li&gt;
&lt;li&gt;将元素设置到画面超远的地方让用户看不到但屏幕阅读器读得到（好怀念的 Hack）&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>CSS</category></item><item><title>CSS 屬性的最大值</title><link>https://www.webdong.dev/zh-tw/shortpost/infinity-inside-css/#infinity-inside-css/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/infinity-inside-css/#infinity-inside-css/</guid><pubDate>Fri, 28 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;之前讀到 CSS 中最大 z-index 值是 2147483647 是因為是 32 位元 signed integer 能表示的最大值，但這個數字有夠醜，有沒有其他方式表示「最大」？&lt;/p&gt;
&lt;p&gt;還真的有，CSS 存在 infinity 常數可用於表達無限，不過只能用於 calc() 當中。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://codersblock.com/blog/playing-with-infinity-in-css/&quot;&gt;Playing with Infinity in CSS - codersblock&lt;/a&gt; 描述如果把 CSS infinity 放到不同屬性上會發生什麼事：&lt;/p&gt;
&lt;p&gt;總結有什麼實用的案例嗎？基本沒有 😐&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;超圓的圓角&lt;/li&gt;
&lt;li&gt;將元素設置到畫面超遠的地方讓用戶看不到但螢幕閱讀器讀得到（好懷念的 Hack）&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>CSS</category></item><item><title>Avoid boring documentation, Add interactivity to it</title><link>https://www.webdong.dev/en/shortpost/interactive-document/#interactive-document/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/interactive-document/#interactive-document/</guid><pubDate>Thu, 27 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Adding interactivity to documents to avoid monotony, there are some details or niche requirements in website planning that are easily forgotten, and it&apos;s always too late when the problem is discovered. For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Multilingual support&lt;/li&gt;
&lt;li&gt;Page Meta information&lt;/li&gt;
&lt;li&gt;Complete UI component states&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Therefore, writing a checklist makes it easy to quickly verify or help newcomers get started, but such documents are often only looked at a few times before no one revisits them 😅. Who likes to flip through documents for no reason!&lt;/p&gt;
&lt;p&gt;Instead of &quot;suggesting&quot; to check document A when performing action A, perhaps creating an SOP checklist without unnecessary words, following the &quot;required&quot; process, might lead to a greater sense of accomplishment and accuracy. The &lt;a href=&quot;https://www.threads.net/@webdong.dev/post/C8uA0A7hi9V&quot;&gt;Checklist Design&lt;/a&gt; website has many excellent SOP documents, such as best practices for components, pages, or designs.&lt;/p&gt;
</content:encoded><category>Team</category></item><item><title>替文件增添互动性避免枯燥</title><link>https://www.webdong.dev/zh-cn/shortpost/interactive-document/#interactive-document/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/interactive-document/#interactive-document/</guid><pubDate>Thu, 27 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;替文件增添互动性避免枯燥规划网站时有些细节或偏门的需求很容易会被遗忘，直到发现问题时总是太晚，举例来说：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;多语系&lt;/li&gt;
&lt;li&gt;页面 Meta 资料&lt;/li&gt;
&lt;li&gt;完整 UI 组件状态&lt;/li&gt;
&lt;li&gt;……&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以会写成清单方便快速核对或让新人上手，但这样的文件常常写好看过几次就没人去翻 😅，谁喜欢没事翻文件！&lt;/p&gt;
&lt;p&gt;所以与其在进行 A 行为时「建议」找 A 文件查核一下，或许制作个 SOP 清单，没有废话，照着「要求」流程走下去，或许成就感和准确性会更高。&lt;a href=&quot;https://www.threads.net/@webdong.dev/post/C8uA0A7hi9V&quot;&gt;Checklist Design&lt;/a&gt; 网站有许多不错的 SOP 文件，像是组件、页面或设计的最佳实践都找得到。&lt;/p&gt;
</content:encoded><category>Team</category></item><item><title>替文件增添互動性避免枯燥</title><link>https://www.webdong.dev/zh-tw/shortpost/interactive-document/#interactive-document/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/interactive-document/#interactive-document/</guid><pubDate>Thu, 27 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;替文件增添互動性避免枯燥規劃網站時有些細節或偏門的需求很容易會被遺忘，直到發現問題時總是太晚，舉例來說：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;多語系&lt;/li&gt;
&lt;li&gt;頁面 Meta 資料&lt;/li&gt;
&lt;li&gt;完整 UI 元件狀態&lt;/li&gt;
&lt;li&gt;……&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以會寫成清單方便快速核對或讓新人上手，但這樣的文件常常寫好看過幾次就沒人去翻 😅，誰喜歡沒事翻文件！&lt;/p&gt;
&lt;p&gt;所以與其在進行 A 行為時「建議」找 A 文件查核一下，或許製作個 SOP 清單，沒有廢話，照著「要求」流程走下去，或許成就感和準確性會更高。&lt;a href=&quot;https://www.threads.net/@webdong.dev/post/C8uA0A7hi9V&quot;&gt;Checklist Design&lt;/a&gt; 網站有許多不錯的 SOP 文件，像是元件、頁面或設計的最佳實踐都找得到。&lt;/p&gt;
</content:encoded><category>Team</category></item><item><title>Set Linguist in .gitattributes to Change Project Language Statistics</title><link>https://www.webdong.dev/en/shortpost/gitattributes-linguist/#gitattributes-linguist/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/gitattributes-linguist/#gitattributes-linguist/</guid><pubDate>Wed, 26 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/github-linguist/linguist&quot;&gt;Linguist&lt;/a&gt; is used to calculate the language proportions in GitHub repositories.&lt;/p&gt;
&lt;p&gt;For example, the &lt;a href=&quot;https://github.com/microsoft/TypeScript/blob/main/.gitattributes&quot;&gt;TypeScript project&lt;/a&gt; specifically replaces the statistics of all &lt;code&gt;.js&lt;/code&gt; files with TypeScript, which is why the entire project shows a statistic of &lt;code&gt;99.9%&lt;/code&gt; TypeScript.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;*.js linguist-language=TypeScript
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Other uses include excluding specific files or directories from the statistics, which can help us eliminate unimportant information and make the actual project language statistics more accurate (as displayed on GitHub repositories).&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Exclude specific files
*.md linguist-vendored

# Exclude specific directories
docs/* linguist-vendored
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>在 .gitattributes 设置 Linguist 改变项目语言统计</title><link>https://www.webdong.dev/zh-cn/shortpost/gitattributes-linguist/#gitattributes-linguist/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/gitattributes-linguist/#gitattributes-linguist/</guid><pubDate>Wed, 26 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/github-linguist/linguist&quot;&gt;Linguist&lt;/a&gt; 用于统计 GitHub 仓库中的语言比例。&lt;/p&gt;
&lt;p&gt;像是 &lt;a href=&quot;https://github.com/microsoft/TypeScript/blob/main/.gitattributes&quot;&gt;TypeScript 项目&lt;/a&gt;就特意将所有 &lt;code&gt;.js&lt;/code&gt; 文件统计替换成 TypeScript，才会出现整个项目由 &lt;code&gt;99.9%&lt;/code&gt; TypeScript 构成的统计结果。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;*.js linguist-language=TypeScript
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其他用途像是排除特定的文件或目录于统计中，可以帮助我们把不重要的信息排除，让真正的项目语言统计更加准确（在 GitHub 仓库显示上）。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 排除特定文件
*.md linguist-vendored

# 排除特定目录
docs/* linguist-vendored
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>在 .gitattributes 設置 Linguist 改變專案語言統計</title><link>https://www.webdong.dev/zh-tw/shortpost/gitattributes-linguist/#gitattributes-linguist/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/gitattributes-linguist/#gitattributes-linguist/</guid><pubDate>Wed, 26 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/github-linguist/linguist&quot;&gt;Linguist&lt;/a&gt; 用於統計 GitHub 倉庫中的語言比例。&lt;/p&gt;
&lt;p&gt;像是 &lt;a href=&quot;https://github.com/microsoft/TypeScript/blob/main/.gitattributes&quot;&gt;TypeScript 專案&lt;/a&gt;就特意將所有 &lt;code&gt;.js&lt;/code&gt; 檔案統計替換成 TypeScript，才會出現整個專案由 &lt;code&gt;99.9%&lt;/code&gt; TypeScript 構成的統計結果。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;*.js linguist-language=TypeScript
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其他用途像是排除特定的檔案或目錄於統計中，可以幫助我們把不重要的資訊排除，讓真正的專案語言統計更加準確（在 GitHub 倉庫顯示上）。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 排除特定檔案
*.md linguist-vendored

# 排除特定目錄
docs/* linguist-vendored
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>Creating Dark Mode (or Any Website Style) the Right Way 🌞</title><link>https://www.webdong.dev/en/shortpost/build-theme-the-right-way/#build-theme-the-right-way/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/build-theme-the-right-way/#build-theme-the-right-way/</guid><pubDate>Tue, 25 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Adding dark mode inevitably introduce additional design, development, and maintenance costs. However, if you can create website styles correctly from the beginning, many problems can be effectively avoided. The summarized practical approaches can be divided into two categories:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Specify colors for different styles&lt;/li&gt;
&lt;li&gt;Define different styles for colors&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you always directly use Tailwind&apos;s Darkmode feature or are struggling with how to apply skins to your website, the following newly written articles are worth referencing.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The UX behind dark mode can be referenced: &lt;a href=&quot;https://www.webdong.dev/post/cost-behind-adding-darkmode/&quot;&gt;The Cost of Adding Dark Mode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Complete article: &lt;a href=&quot;https://www.webdong.dev/post/build-theme-the-right-way/&quot;&gt;Creating Dark Mode (or Any Website Style) the Right Way&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Frontend</category></item><item><title>用正確的方式制作深色模式（或任何网站风格🌞）</title><link>https://www.webdong.dev/zh-cn/shortpost/build-theme-the-right-way/#build-theme-the-right-way/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/build-theme-the-right-way/#build-theme-the-right-way/</guid><pubDate>Tue, 25 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;添加深色模式无可避免的会造成额外的设计、开发与维护成本，但如果能在一开始用正确的方式制作网页风格，那么是可以有效规避许多问题的。总结实践的做法分为两类：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;为不同风格指定颜色&lt;/li&gt;
&lt;li&gt;为颜色制定不同风格&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果你总是直接采用 Tailwind 的 Darkmode 功能，或是在苦恼怎么为网站套皮肤都适合参考以下新写的文章。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;深色模式背后的 UX 可以参考：&lt;a href=&quot;https://www.webdong.dev/post/cost-behind-adding-darkmode/&quot;&gt;添加深色模式要考虑的代价&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;完整文章：&lt;a href=&quot;https://www.webdong.dev/post/build-theme-the-right-way/&quot;&gt;用正确的方式制作深色模式（或任何网站风格）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Frontend</category></item><item><title>用正確的方式製作深色模式（或任何網站風格🌞）</title><link>https://www.webdong.dev/zh-tw/shortpost/build-theme-the-right-way/#build-theme-the-right-way/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/build-theme-the-right-way/#build-theme-the-right-way/</guid><pubDate>Tue, 25 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;添加深色模式無可避免的會造成額外的設計、開發與維護成本，但如果能在一開始用正確的方式製作網頁風格，那麼是可以有效迴避許多問題的。總結實踐的作法分為兩類：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;替不同風格指定顏色&lt;/li&gt;
&lt;li&gt;替顏色制定不同風格&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果你總是直接採用 Tailwind 的 Darkmode 功能，或是在苦惱怎麼替網站套皮膚都適合參考以下新寫的文章。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;深色模式背後的 UX 可以參考：&lt;a href=&quot;https://www.webdong.dev/post/cost-behind-adding-darkmode/&quot;&gt;添加深色模式要考慮的代價&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;完整文章：&lt;a href=&quot;https://www.webdong.dev/post/build-theme-the-right-way/&quot;&gt;用正確的方式製作深色模式（或任何網站風格）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Frontend</category></item><item><title>Frontend Environment Diversity</title><link>https://www.webdong.dev/en/shortpost/frontend-environment-diversity/#frontend-environment-diversity/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/frontend-environment-diversity/#frontend-environment-diversity/</guid><pubDate>Fri, 21 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;As a frontend engineer, theoretically, having multiple browsers in the work environment and regularly testing new features is a basic operation.&lt;/p&gt;
&lt;p&gt;However, in reality, we often assume everything is fine when it works in our preferred browser and push the code without thorough testing. Constantly switching between browsers and versions seems impractical and increases overhead. Is there any solution to this problem?&lt;/p&gt;
&lt;p&gt;I mainly use Firefox while the rest of my team uses Chrome, and surprisingly, many Firefox-specific bugs are discovered by me - which turns out to be an unexpected form of diversity 🙂.&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>前端与开发环境多样性</title><link>https://www.webdong.dev/zh-cn/shortpost/frontend-environment-diversity/#frontend-environment-diversity/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/frontend-environment-diversity/#frontend-environment-diversity/</guid><pubDate>Fri, 21 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;身为前端工程师，理论上工作环境都会配备多种浏览器并没事就检测看看做好的新功能是基础操作。&lt;/p&gt;
&lt;p&gt;但事实上很多时候自己常用的环境 OK 就默认为没问题推上去了，而一直切换浏览器和版本显得拉高成本不实际，不知道有什么方式解决这个问题？&lt;/p&gt;
&lt;p&gt;我常用 Firefox 而其余团队成员则都用 Chrome ，意外很多 Firefox 上特有的 BUG 都是由我观察到的，算是一种意外的多样性 🙂。&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>前端與開發環境多樣性</title><link>https://www.webdong.dev/zh-tw/shortpost/frontend-environment-diversity/#frontend-environment-diversity/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/frontend-environment-diversity/#frontend-environment-diversity/</guid><pubDate>Fri, 21 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;身為前端工程師，理論上工作環境都會配備多種瀏覽器並沒事就檢測看看做好的新功能是基礎操作。&lt;/p&gt;
&lt;p&gt;但事實上很多時候自己常用的環境 OK 就默認沒問題推上去了，而一直切換瀏覽器和版本顯得拉高成本不實際，不知道有什麼方式解決這個問題？&lt;/p&gt;
&lt;p&gt;我常用 Firefox 而其餘團隊成員則都用 Chrome ，意外很多 Firefox 上特有的 BUG 都是由我觀測到的，算是一種意外的多樣性 🙂。&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>Cypress and jQuery</title><link>https://www.webdong.dev/en/shortpost/cypress-and-jquery/#cypress-and-jquery/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/cypress-and-jquery/#cypress-and-jquery/</guid><pubDate>Thu, 20 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Using Cypress to write End-to-End tests always gives me a familiar feeling. I found out that some methods behind it are actually provided by Chai-jQuery. I didn&apos;t expect that a technology commonly regarded as outdated is still shining in another field.&lt;/p&gt;
&lt;p&gt;I wonder how many people were introduced to frontend development not through JavaScript but jQuery. Just thinking about it brings back memories! But please, don&apos;t make me go back to the chaotic internet era 🫠.&lt;/p&gt;
&lt;p&gt;Speaking of jQuery, it reminds me that someone created an &lt;a href=&quot;https://puter.com/&quot;&gt;online operating system&lt;/a&gt; with it. Cool!&lt;/p&gt;
</content:encoded><category>Software Testing</category></item><item><title>Cypress 與 jQuery</title><link>https://www.webdong.dev/zh-cn/shortpost/cypress-and-jquery/#cypress-and-jquery/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/cypress-and-jquery/#cypress-and-jquery/</guid><pubDate>Thu, 20 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在用 Cypress 写 End-to-End 测试时总是有一种回到家熟悉的感觉，查了一下原来背后其实一些方法是由 Chai-jQuery 提供的，没想到一个已经普遍被视为过时的技术还在另一个领域发光发热。&lt;/p&gt;
&lt;p&gt;不知道有多少人前端开发启蒙阶段碰的不是 JavaScript 而是 jQuery，想到就很怀念！但拜托不要让我回到以前混沌的网络时代 🫠。&lt;/p&gt;
&lt;p&gt;说到 jQuery 让我想到有人拿它做了一个&lt;a href=&quot;https://puter.com/&quot;&gt;线上作业系统&lt;/a&gt;，酷！&lt;/p&gt;
</content:encoded><category>Software Testing</category></item><item><title>Cypress 與 jQuery</title><link>https://www.webdong.dev/zh-tw/shortpost/cypress-and-jquery/#cypress-and-jquery/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/cypress-and-jquery/#cypress-and-jquery/</guid><pubDate>Thu, 20 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在用 Cypress 寫 End-to-End 測試時總是有一種回到家熟悉的感覺，查了一下原來背後其實一些方法是由 Chai-jQuery 提供的，沒想到一個已經普遍被視為過時的技術還在另一個領域發光發熱。&lt;/p&gt;
&lt;p&gt;不知道有多少人前端開發啟蒙階段碰的不是 JavaScript 而是 jQuery，想到就很懷念！但拜託不要讓我回到以前渾沌的網路時代 🫠。&lt;/p&gt;
&lt;p&gt;說到 jQuery 讓我想到有人拿它做了一個&lt;a href=&quot;https://puter.com/&quot;&gt;線上作業系統&lt;/a&gt;，酷！&lt;/p&gt;
</content:encoded><category>Software Testing</category></item><item><title>About Low-code / No-code</title><link>https://www.webdong.dev/en/shortpost/about-low-code-no-code/#about-low-code-no-code/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/about-low-code-no-code/#about-low-code-no-code/</guid><pubDate>Wed, 19 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The failure of tools like Frontpage, Dreamweaver, Adobe Muse... has greatly contributed to our distrust of Low Code / No Code. Nevertheless, I still believe these tools have their shining moments. Local examples like Studioming and TenTen have created stunning commercial works using such tools.&lt;/p&gt;
&lt;p&gt;The goal is to make good use of tools to solve problems, avoiding vendor lock-in as much as possible, and learning the truly unchanging fundamentals is key. Breaking down the boundaries between developers and designers, and accelerating product iteration, is a trend worth looking forward to.&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>Story Between Me and Web Design</title><link>https://www.webdong.dev/en/shortpost/story-between-me-and-web-design/#story-between-me-and-web-design/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/story-between-me-and-web-design/#story-between-me-and-web-design/</guid><pubDate>Wed, 19 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Speaking of No Code (building websites without coding), it reminds me of a past experience.&lt;/p&gt;
&lt;p&gt;During my vocational high school years, I unexpectedly became the school&apos;s representative for the &quot;National Skills Competition in Web Design.&quot; This competition gathers students from across the country for technical testing, and high scores can lead to special applications to schools. I remember that for about half a year, I didn&apos;t have to attend classes and spent every day self-studying web design.&lt;/p&gt;
&lt;p&gt;The competition involved first taking some web-related tests, and then spending 2 hours locked in a classroom competing to create a website, with the final results evaluated by judges.&lt;/p&gt;
&lt;p&gt;Those who don&apos;t understand web design might think it&apos;s normal—just like drawing or cooking, where the goal is to see who can do it faster and better within a time limit. But web design doesn&apos;t work that way! 🫠 At that time, I was under immense pressure: - Poor grades meant no hope for further education &amp;gt; I reluctantly decided to give it a try.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The teachers didn&apos;t understand web design &amp;gt; I had to find my own way.&lt;/li&gt;
&lt;li&gt;Resources were immature &amp;gt; It was still the era of Table layouts and Flash.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In short, on the day of the competition, I proudly used extraordinary perseverance to self-learn web design under a bunch of bizarre conditions and submitted a work that met the latest industry standards. Surely, first place was mine, right?&lt;/p&gt;
&lt;p&gt;No, a website created using Adobe Muse by dragging and dropping a few pre-designed modules won first place.&lt;/p&gt;
&lt;p&gt;At that moment, I felt utterly foolish (even though I always thought the competition itself was quite silly).&lt;/p&gt;
&lt;p&gt;The Ministry of Education holds this competition annually, allowing students from all over the country to compete for superficial accolades in the name of promoting skills, while in reality, it focuses on outdated, off-track, and meaningless things.&lt;/p&gt;
&lt;p&gt;Anyway, after a long time, I accepted that this competition wasn&apos;t really about web design but rather about the students&apos; ability to think outside the box! I&apos;m curious about how this competition is now and if there are any juniors experiencing similar stories. If anyone has questions about web design, I&apos;m more than happy to help, as I&apos;ve been stumbling through it since then.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://old-riceball.github.io/2019-05_TaiwanStore_site/&quot;&gt;website&lt;/a&gt; I created in two hours during the competition (the font has already gone).&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>关于 Low-code / No-code</title><link>https://www.webdong.dev/zh-cn/shortpost/about-low-code-no-code/#about-low-code-no-code/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/about-low-code-no-code/#about-low-code-no-code/</guid><pubDate>Wed, 19 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;可能 Frontpage、Dreamweaver、Adobe Muse……这类工具的惨败收场造成我们对 Low Code / No Code 有极大的不信任感，就算这样我仍认为这类工具还是有它们发光发热的地方，在地范例像是 Studioming、TenTen 都有用这类工具打造过惊艳的商业作品。&lt;/p&gt;
&lt;p&gt;目标是善用工具解决问题，尽可能避免供应商锁定，学习真正不变的基础是重点。打破开发与设计者的界线，加速产品迭代，是值得期待的趋势。&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>我透过网页升学的故事</title><link>https://www.webdong.dev/zh-cn/shortpost/story-between-me-and-web-design/#story-between-me-and-web-design/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/story-between-me-and-web-design/#story-between-me-and-web-design/</guid><pubDate>Wed, 19 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;说到 No Code （无代码建设网站）就让我想到一段往事&lt;/p&gt;
&lt;p&gt;高职时因缘际会下当上学校的「全国技艺竞赛网页设计选手」，这个比赛是招集全国学生进行技术比试，成绩高可以保送或技优申请学校，所以印象当时可能有半年的时间都不用上课，天天蹲在选手室自学网页。&lt;/p&gt;
&lt;p&gt;而比赛内容就是先考些网页丙检的内容，然后再花 2 个小时把所有人关在教室内比拼网页，最后成果交由评审评定成绩。&lt;/p&gt;
&lt;p&gt;不懂网页的人可能会觉得很正常，不就像绘图或烹饪看谁时间内做得又快又好吗？但网页不是这样运作的阿 🫠 ！那时是我压力最大的时刻：- 成绩不好升学无望 &amp;gt; 硬着头皮参加看看&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;老师也不懂网页 &amp;gt; 自己想办法找出路&lt;/li&gt;
&lt;li&gt;资源不成熟 &amp;gt; 当时还在流行 Table 切版跟 Flash 的年代&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;总之到了比赛当天我很自豪的用超乎常人的毅力在一堆诡异的条件下从头自学习网页并交出符合业界最新标准的作品，第一名非我莫属了吧？&lt;/p&gt;
&lt;p&gt;没有，一个用 Adobe Muse 拖拉几个现成设计开发好的模块组成的网站获得第一名。&lt;/p&gt;
&lt;p&gt;这才觉得真的蠢到极点（虽然一直觉得这个比赛本身就很蠢）。&lt;/p&gt;
&lt;p&gt;教育部每年全国举办比赛，让全国各地的学生为了升学去比些表象的东西，美其名是发扬技艺，实则是专门比过时、与业界脱轨、意义不明的东西。&lt;/p&gt;
&lt;p&gt;反正过很久也接受了，这项比赛本来就不是在比网页，而是学生的跳脱框架的能力吧！好奇现在这个比赛怎么样了，有没有学弟妹在经历类似的故事？如果对网页有问题，我都很乐意解答，因为我从当时就一直踩坑到现在。&lt;/p&gt;
&lt;p&gt;当时比赛两小时做出来的&lt;a href=&quot;https://old-riceball.github.io/2019-05_TaiwanStore_site/&quot;&gt;网站&lt;/a&gt;（字体已经跑掉了）&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>關於 Low-code / No-code</title><link>https://www.webdong.dev/zh-tw/shortpost/about-low-code-no-code/#about-low-code-no-code/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/about-low-code-no-code/#about-low-code-no-code/</guid><pubDate>Wed, 19 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;可能 Frontpage、Dreamweaver、Adobe Muse……這類工具的慘敗收場造成我們對 Low Code / No Code 有極大的不信任感，就算這樣我仍認為這類工具還是有它們發光發熱的地方，在地範例像是 Studioming、TenTen 都有用這類工具打造過驚豔的商業作品。&lt;/p&gt;
&lt;p&gt;目標是善用工具解決問題，盡可能避免供應商鎖定，學習真正不變的基礎是重點。打破開發與設計者的界線，加速產品迭代，是值得期待的趨勢。&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>我透過網頁升學的故事</title><link>https://www.webdong.dev/zh-tw/shortpost/story-between-me-and-web-design/#story-between-me-and-web-design/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/story-between-me-and-web-design/#story-between-me-and-web-design/</guid><pubDate>Wed, 19 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;說到 No Code （無程式碼建設網站）就讓我想到一段往事&lt;/p&gt;
&lt;p&gt;高職時因緣際會下當上學校的「全國技藝競賽網頁設計選手」，這個比賽是招集全國學生進行技術比試，成績高可以保送或技優申請學校，所以印象當時可能有半年的時間都不用上課，天天蹲在選手室自學網頁。&lt;/p&gt;
&lt;p&gt;而比賽內容就是先考些網頁丙檢的內容，然後再花 2 個小時把所有人關在教室內比拚網頁，最後成果交由評審評定成績。&lt;/p&gt;
&lt;p&gt;不懂網頁的人可能會覺得很正常，不就像繪圖或烹飪看誰時間內做得又快又好嗎？但網頁不是這樣運作的阿 🫠 ！那時是我壓力最大的時候：- 成績不好升學無望 &amp;gt; 硬著頭皮參加看看&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;老師也不懂網頁 &amp;gt; 自己想辦法找出路&lt;/li&gt;
&lt;li&gt;資源不成熟 &amp;gt; 當時還在流行 Table 切版跟 Flash 的年代&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;總之到了比賽當天我很自豪的用超乎常人的毅力在一堆詭異的條件下從頭自學習網頁並交出符合業界最新標準的作品，第一名非我莫屬了吧？&lt;/p&gt;
&lt;p&gt;沒有，一個用 Adobe Muse 拖拉幾個現成設計開發好的模塊組成的網站獲得第一名。&lt;/p&gt;
&lt;p&gt;這才覺得真的蠢到極點（雖然一直覺得這個比賽本身就很蠢）。&lt;/p&gt;
&lt;p&gt;教育部每年全國舉辦比賽，讓全國各地的學生為了升學去比些表象的東西，美其名是發揚技藝，實則是專門比過時、與業界脫軌、意義不明的東西。&lt;/p&gt;
&lt;p&gt;反正過很久也接受了，這項比賽本來就不是在比網頁，而是學生的跳脫框架的能力吧！好奇現在這個比賽怎麼樣了，有沒有學弟妹在經歷相似的故事？如果對網頁有問題，我都很樂意解答，因為我從當時就一直踩坑到現在。&lt;/p&gt;
&lt;p&gt;當時比賽兩小時做出來的&lt;a href=&quot;https://old-riceball.github.io/2019-05_TaiwanStore_site/&quot;&gt;網站&lt;/a&gt;（字體已經跑掉了）&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>What is the difference between &quot;Graceful Degradation&quot; and &quot;Progressive Enhancement&quot;?</title><link>https://www.webdong.dev/en/shortpost/graceful-degradation-vs-progressive-enhancement/#graceful-degradation-vs-progressive-enhancement/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/graceful-degradation-vs-progressive-enhancement/#graceful-degradation-vs-progressive-enhancement/</guid><pubDate>Tue, 18 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;They both describe patterns for how to implement experiences, but the difference lies in the perspective on achieving compatibility.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🔼 Progressive Enhancement (Old to New): Starting from an older experience and moving forward to adopt new experiences&lt;/li&gt;
&lt;li&gt;🔽 Graceful Degradation (New to Old): Starting from a newer experience and moving backward to maintain compatibility with older experiences&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If there were no constraints, adopting the latest environment would be ideal, but the reality is that we often need to support legacy users to some extent, which is why different approaches are necessary to achieve a consistent experience. Looking around, we can see these patterns applied in various fields on the web; for example, consider:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;👉🏻 Is the early trend of skeuomorphism a form of design progressive enhancement?&lt;/li&gt;
&lt;li&gt;👉🏻 Is loading high-resolution images on high-speed networks while loading low-resolution images on low-speed networks a form of graceful degradation?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The web is changing rapidly, but necessary compatibility based on user needs still needs to be addressed, and these two patterns can be relied upon to make decisions based on the situation.&lt;/p&gt;
</content:encoded><category>Pattern</category></item><item><title>「优雅降级」与「渐进增强」差异在哪？</title><link>https://www.webdong.dev/zh-cn/shortpost/graceful-degradation-vs-progressive-enhancement/#graceful-degradation-vs-progressive-enhancement/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/graceful-degradation-vs-progressive-enhancement/#graceful-degradation-vs-progressive-enhancement/</guid><pubDate>Tue, 18 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;它们都是描述应该如何实践体验的模式，差别在于如何达成兼容的角度不同。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🔼 渐进增强（旧到新）：从较旧后的体验为出发点，向前采用新体验&lt;/li&gt;
&lt;li&gt;🔽 优雅降级（新到旧）：从较新的体验为出发点，向后兼容新体验&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果没有任何包袱，全部采用最新的环境是最好的，但现实是我们或多或少会需要支援落后的用户，所以才会需要不同的手段去达成一致的体验。放眼望去网页许多地方都可以见到这些模式被应用到不同领域，举例可以思考看看：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;👉🏻 早期拟物化风潮是不是一种设计上的渐进增强？&lt;/li&gt;
&lt;li&gt;👉🏻 在高速网络下载入高解析度图片，而在低速网络中载入低解析度图片是不是一种优雅降级？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;现在网页变动得快，但根据用户需求必要的兼容还是得做，可以依靠这两种模式视情况决定。&lt;/p&gt;
</content:encoded><category>Pattern</category></item><item><title>「優雅降級」與「漸進增強」差異在哪？</title><link>https://www.webdong.dev/zh-tw/shortpost/graceful-degradation-vs-progressive-enhancement/#graceful-degradation-vs-progressive-enhancement/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/graceful-degradation-vs-progressive-enhancement/#graceful-degradation-vs-progressive-enhancement/</guid><pubDate>Tue, 18 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;它們都是描述應該如何實踐體驗的模式，差別在於如何達成兼容的角度不同。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🔼 漸進增強（舊到新）：從較舊後的體驗為出發點，向前採用新體驗&lt;/li&gt;
&lt;li&gt;🔽 優雅降級（新到舊）：從較新的體驗為出發點，向後兼容新體驗&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果沒有任何包袱，全部採用最新的環境是最好的，但現實是我們或多或少會需要支援落後的用戶，所以才會需要不同的手段去達成一致的體驗。放眼望去網頁許多地方都可以見到這些模式被應用到不同領域，舉例可以思考看看：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;👉🏻 早期擬物化風潮是不是一種設計上的漸進增強？&lt;/li&gt;
&lt;li&gt;👉🏻 在高速網絡下載入高解析度圖片，而在低速網絡中載入低解析度圖片是不是一種優雅降級？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;現在網頁變動得快，但根據用戶需求必要的兼容還是得做，可以依靠這兩種模式視情況決定。&lt;/p&gt;
</content:encoded><category>Pattern</category></item><item><title>What Do Websites Look Like to Different Types of Colorblind Eyes?</title><link>https://www.webdong.dev/en/shortpost/color-blind-website-preview/#color-blind-website-preview/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/color-blind-website-preview/#color-blind-website-preview/</guid><pubDate>Mon, 17 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I just found this &lt;a href=&quot;https://www.toptal.com/designers/colorfilter&quot;&gt;Toptal Colorblind Web Page Filter&lt;/a&gt; that allows you to preview how different websites look under various colorblind filters in real-time. Physiological limitations or environmental factors can affect the accuracy of how we receive information, so it&apos;s important to pay attention to user accessibility needs, specifically: WCAG, APCA.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Protanopia = Red-green color blindness (mainly red)&lt;/li&gt;
&lt;li&gt;Deuteranopia = Red-green color blindness (mainly green)&lt;/li&gt;
&lt;li&gt;Tritanopia = Blue-yellow color blindness&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;

&lt;/p&gt;
</content:encoded><category>UX</category></item><item><title>好奇不同種類色盲眼中的網站是长什么样子？</title><link>https://www.webdong.dev/zh-cn/shortpost/color-blind-website-preview/#color-blind-website-preview/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/color-blind-website-preview/#color-blind-website-preview/</guid><pubDate>Mon, 17 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;刚好找到这个 &lt;a href=&quot;https://www.toptal.com/designers/colorfilter&quot;&gt;Toptal Colorblind Web Page Filter&lt;/a&gt; 可以即时预览不同线上网站在不同色盲滤镜的样貌。生理限制或环境都有可能影响我们接收信息的正确性，因此可以试着多留意用户适用性方面的需求，具体来说像是：WCAG、APCA。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Protanopia = 红绿色盲（主要红色）&lt;/li&gt;
&lt;li&gt;Deuteranopia = 红绿色盲（主要绿色）&lt;/li&gt;
&lt;li&gt;Tritanopia = 蓝黄色盲&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;

&lt;/p&gt;
</content:encoded><category>UX</category></item><item><title>好奇不同種類色盲眼中的網站是長什麼樣子？</title><link>https://www.webdong.dev/zh-tw/shortpost/color-blind-website-preview/#color-blind-website-preview/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/color-blind-website-preview/#color-blind-website-preview/</guid><pubDate>Mon, 17 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;剛好找到這個 &lt;a href=&quot;https://www.toptal.com/designers/colorfilter&quot;&gt;Toptal Colorblind Web Page Filter&lt;/a&gt; 可以即時預覽不同線上網站在不同色盲濾鏡的樣貌。生理限制或環境都有可能影響我們接收訊息的正確性，因此可以試著多留意用戶適用性方面的需求，具體來說像是：WCAG、APCA。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Protanopia = 紅綠色盲（主要紅色）&lt;/li&gt;
&lt;li&gt;Deuteranopia = 紅綠色盲（主要綠色）&lt;/li&gt;
&lt;li&gt;Tritanopia = 藍黃色盲&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;

&lt;/p&gt;
</content:encoded><category>UX</category></item><item><title>Tips for Solving Problems</title><link>https://www.webdong.dev/en/shortpost/problem-solving-skill/#problem-solving-skill/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/problem-solving-skill/#problem-solving-skill/</guid><pubDate>Fri, 14 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;ol&gt;
&lt;li&gt;Write down the complete picture of the problem and prepare to message your colleague.&lt;/li&gt;
&lt;li&gt;Press the &quot;Submit&quot; button.&lt;/li&gt;
&lt;li&gt;Wait for solutions to automatically emerge and reply, &quot;It&apos;s okay, I found a solution.&quot;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Writing down the problem in detail is actually part of the debugging process; this time, your colleague is the rubber duck (rubber duck debugging). As for how to go from defining the problem to generating solutions, you can refer to a previous article I wrote: &lt;a href=&quot;https://www.webdong.dev/post/background-problem-solution/&quot;&gt;Goal, Problem, Solution&lt;/a&gt;.&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>解决问题的技巧</title><link>https://www.webdong.dev/zh-cn/shortpost/problem-solving-skill/#problem-solving-skill/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/problem-solving-skill/#problem-solving-skill/</guid><pubDate>Fri, 14 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;ol&gt;
&lt;li&gt;完整地写下问题的全貌，准备发消息询问同事&lt;/li&gt;
&lt;li&gt;按下「发送」按钮&lt;/li&gt;
&lt;li&gt;等待解决方案自动涌现，并回复「没事，找到解决方法了」&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;完整写下问题其实就是调试的过程，只是这次橡皮鸭是你的同事（橡皮鸭调试法）。至于如何从定义问题到产生解法可以参考看看之前写过的文章：&lt;a href=&quot;https://www.webdong.dev/post/background-problem-solution/&quot;&gt;达成共识的描述方式：目标、问题、解法&lt;/a&gt;。&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>解決問題的技巧</title><link>https://www.webdong.dev/zh-tw/shortpost/problem-solving-skill/#problem-solving-skill/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/problem-solving-skill/#problem-solving-skill/</guid><pubDate>Fri, 14 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;ol&gt;
&lt;li&gt;完整的寫下問題的全貌，準備發訊息詢問同事&lt;/li&gt;
&lt;li&gt;按下「送出」按鈕&lt;/li&gt;
&lt;li&gt;等待解決方案自動湧現，並回覆「沒事，找到解決方法了」&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;完整寫下問題其實就是除錯的過程，只是這次橡皮鴨是你的同事（橡皮鴨除錯法）。至於如何從定義問題到產生解方可以參考看看之前寫過的文章：&lt;a href=&quot;https://www.webdong.dev/post/background-problem-solution/&quot;&gt;達成共識的描述方式：目標、問題、解方&lt;/a&gt;。&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>Is it necessary to learn Sass in 2024?</title><link>https://www.webdong.dev/en/shortpost/should-i-learn-sass/#should-i-learn-sass/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/should-i-learn-sass/#should-i-learn-sass/</guid><pubDate>Thu, 13 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Recently, there was a discussion about whether it is possible to introduce Sass to solve some existing problems, and my response was negative:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Early CSS features were immature, which necessitated support from Sass (nested selectors, variables, calc, etc.)&lt;/li&gt;
&lt;li&gt;The additional translation step increases the complexity of the development environment and the cost of learning and maintenance&lt;/li&gt;
&lt;li&gt;Vendor lock-in&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For me, Sass is like CoffeeScript to JavaScript; when the native ecosystem matures, there is no need to use it. Every technology arises to solve underlying problems, and before using additional tools to address issues, one should often ask themselves why they are making such a choice and whether the trade-offs are reasonable.&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>已经 2024 了，会需要学 Sass 吗？</title><link>https://www.webdong.dev/zh-cn/shortpost/should-i-learn-sass/#should-i-learn-sass/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/should-i-learn-sass/#should-i-learn-sass/</guid><pubDate>Thu, 13 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;近期聊到有没有可能导入 Sass 来解决一些现有的问题，我的回应是反对的：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;早期 CSS 功能不成熟才需要 Sass 支援 （嵌套选取器、变量、calc ……）&lt;/li&gt;
&lt;li&gt;额外的转译步骤增加开发环境复杂性与学习维护成本&lt;/li&gt;
&lt;li&gt;功能供应商锁定 （Vendor Lock-in）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;对我来说 Sass 就像 CoffeeScript 之于 JavaScript，当原生生态成熟也没什么必要去用它。每项技术产生都有背后要解决的问题，用额外的工具来解决问题前也要时常问自己为什么要这么选择，是否取舍合理。&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>已經 2024 了，會需要學 Sass 嗎？</title><link>https://www.webdong.dev/zh-tw/shortpost/should-i-learn-sass/#should-i-learn-sass/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/should-i-learn-sass/#should-i-learn-sass/</guid><pubDate>Thu, 13 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;近期聊到有沒有可能導入 Sass 來解決一些現有的問題，我的回應是反對的：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;早期 CSS 功能不成熟才需要 Sass 支援 （嵌套選取器、變數、calc ……）&lt;/li&gt;
&lt;li&gt;額外的轉譯步驟增加開發環境複雜性與學習維護成本&lt;/li&gt;
&lt;li&gt;功能供應商鎖定 （Vendor Lock-in）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;對我來說 Sass 就像 CoffeeScript 之於 JavaScript，當原生生態成熟也沒什麼必要去用它。每項技術產生都有背後要解決的問題，用額外的工具來解決問題前也要時常問自己為什麼要這麼選擇，是否取捨合理。&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>What is common sense in your field of work that surprises others when they find out</title><link>https://www.webdong.dev/en/shortpost/common-sense-frontend/#common-sense-frontend/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/common-sense-frontend/#common-sense-frontend/</guid><pubDate>Wed, 12 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Why isn&apos;t there &quot;web frontend development&quot; version? Let&apos;s give it a try, I found it hard to write:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Most browsers today are based on the Chrome engine but have different skins (except for Safari and Firefox)&lt;/li&gt;
&lt;li&gt;Simply visiting or browsing a website theoretically won&apos;t infect your computer&lt;/li&gt;
&lt;li&gt;For a period, this position was not yet established; web designers were using Flash to create website interfaces&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><category>Frontend</category></item><item><title>iOS Home Indicator safe area</title><link>https://www.webdong.dev/en/shortpost/iphone-home-indicator-safe-area-css/#iphone-home-indicator-safe-area-css/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/iphone-home-indicator-safe-area-css/#iphone-home-indicator-safe-area-css/</guid><pubDate>Wed, 12 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;When redesigning the blog navigation experience, I noticed that iPhone&apos;s Home Indicator, which covers the navigation bar (Figure 1, left old and right new). Therefore, in the new design, a safe area indicator was set up, allowing the website to use CSS env() + calc() to calculate the actual safe display area for the navigation bar.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Add the page Meta attribute &lt;code&gt;&amp;lt;meta name=&quot;viewport&quot; content=&quot;viewport-fit=cover&quot; /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Use the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/env&quot;&gt;env(safe-area-inset-bottom)&lt;/a&gt; variable combined with &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/calc&quot;&gt;&lt;code&gt;calc&lt;/code&gt;&lt;/a&gt; to calculate the safe bottom distance for the navigation bar.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now the Home Indicator no longer covers elements that are on the edge of the screen 👍🏻 (Figure 1, left Chrome right Safari)&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/env&quot;&gt;env()&lt;/a&gt; was initially provided by iOS browsers, allowing developers to place web content within the safe area of the window to ensure that content displays correctly even on non-rectangular screens.&lt;/p&gt;
</content:encoded><category>CSS</category></item><item><title>什么事情在你的工作领域是 common sense 但别人知道了却很讶异</title><link>https://www.webdong.dev/zh-cn/shortpost/common-sense-frontend/#common-sense-frontend/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/common-sense-frontend/#common-sense-frontend/</guid><pubDate>Wed, 12 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;怎么没有「网页前端开发」的呢？ 来写写看，发现很难写：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;现今多数浏览器都是 Chrome 核心但换个皮（除了 Safari 和 Firefox）&lt;/li&gt;
&lt;li&gt;单纯访问或浏览网站理论上都不会让你的电脑中毒&lt;/li&gt;
&lt;li&gt;有一段时间这个职位尚不成体系，都是网页设计师在用 Flash 做网站界面&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><category>Frontend</category></item><item><title>iOS Home Indicator 安全区域 CSS 处理</title><link>https://www.webdong.dev/zh-cn/shortpost/iphone-home-indicator-safe-area-css/#iphone-home-indicator-safe-area-css/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/iphone-home-indicator-safe-area-css/#iphone-home-indicator-safe-area-css/</guid><pubDate>Wed, 12 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;重设计博客导航栏体验时有特别留意 iPhone 的 Home Indicator 会遮挡住导航栏（图一，左旧右新），因此在新设计中设置了安全区域标示，让网站使用 CSS env() + calc() 来让导航栏计算实际安全显示区域。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;添加页面 Meta 属性 &lt;code&gt;&amp;lt;meta name=&quot;viewport&quot; content=&quot;viewport-fit=cover&quot; /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;使用 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/env&quot;&gt;env(safe-area-inset-bottom)&lt;/a&gt; 变量搭配 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/calc&quot;&gt;&lt;code&gt;calc&lt;/code&gt;&lt;/a&gt; 计算导航栏安全底部距离&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;现在 Home Indicator 已经不会挡到紧贴画面的元素了 👍🏻（图一，左 Chrome 右 Safari）&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/env&quot;&gt;env()&lt;/a&gt; 最初由 iOS 浏览器提供，允许开发人员将网页内容放置在窗口的安全区域内，以确保即使在非矩形屏幕上，内容也能正确显示。&lt;/p&gt;
</content:encoded><category>CSS</category></item><item><title>什麼事情在你的工作領域是 common sense 但別人知道了卻很訝異</title><link>https://www.webdong.dev/zh-tw/shortpost/common-sense-frontend/#common-sense-frontend/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/common-sense-frontend/#common-sense-frontend/</guid><pubDate>Wed, 12 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;怎麼沒有「網頁前端開發」的呢？ 來寫寫看，發現很難寫：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;現今多數瀏覽器都是 Chrome 核心但換個皮（除了 Safari 和 Firefox）&lt;/li&gt;
&lt;li&gt;單純訪問或瀏覽網站理論上都不會讓你的電腦中毒&lt;/li&gt;
&lt;li&gt;有一段時間這個職位尚不成體系，都是網頁設計師在用 Flash 做網站介面&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><category>Frontend</category></item><item><title>iOS Home Indicator 安全區域 CSS 處理</title><link>https://www.webdong.dev/zh-tw/shortpost/iphone-home-indicator-safe-area-css/#iphone-home-indicator-safe-area-css/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/iphone-home-indicator-safe-area-css/#iphone-home-indicator-safe-area-css/</guid><pubDate>Wed, 12 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;重設計部落格導覽列體驗時有特別留意 iPhone 的 Home Indicator 會遮擋住導覽列（圖一，左舊右新），因此在新設計中設置了安全區域標示，讓網站使用 CSS env() + calc() 來讓導覽列計算實際安全顯示區域。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;添加頁面 Meta 屬性 &lt;code&gt;&amp;lt;meta name=&quot;viewport&quot; content=&quot;viewport-fit=cover&quot; /&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;使用 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/env&quot;&gt;env(safe-area-inset-bottom)&lt;/a&gt; 變數搭配 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/calc&quot;&gt;&lt;code&gt;calc&lt;/code&gt;&lt;/a&gt; 計算導覽列安全底部距離&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;現在 Home Indicator 已經不會擋到緊貼畫面的元素了 👍🏻（圖一，左 Chrome 右 Safari）&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/env&quot;&gt;env()&lt;/a&gt; 最初由 iOS 瀏覽器提供，允許開發人員將網頁內容放置在視窗的安全區域內，以確保即使在非矩形螢幕上，內容也能正確顯示。&lt;/p&gt;
</content:encoded><category>CSS</category></item><item><title>Technical authors place their articles in more than one location</title><link>https://www.webdong.dev/en/shortpost/authors-often-distribute-their-works/#authors-often-distribute-their-works/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/authors-often-distribute-their-works/#authors-often-distribute-their-works/</guid><pubDate>Fri, 07 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This means that some content placed behind paywalls (I&apos;m talking about Medium) can be bypassed, and by searching through author&apos;s personal profile, you can find the author&apos;s personal website to read openly. Of course, different platforms have different target audiences, and if managed thoughtfully, the content will also vary different.&lt;/p&gt;
&lt;p&gt;Perhaps it&apos;s because the only place that can truly be called a long-term &quot;home for content&quot; is a self-hosted platform. Sites like Wretch will shut down, Tumblr and X will change policies, and content on public platforms will always be like leaves swaying in the wind. Therefore, most of the Threads I write will also be stored on my own blog.&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>发现特别是技术类作者会把文章放置在不只一个地方</title><link>https://www.webdong.dev/zh-cn/shortpost/authors-often-distribute-their-works/#authors-often-distribute-their-works/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/authors-often-distribute-their-works/#authors-often-distribute-their-works/</guid><pubDate>Fri, 07 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;意味着一些放在付费墙（Medium 我说你）背后的内容可以绕个弯，翻翻个人介绍就能找到作者个人网站正大光明的阅读了。当然不同的平台有不同目标客群，有心的经营的话内容也会不大一样。&lt;/p&gt;
&lt;p&gt;大概是因为唯一称得上长期「内容的家」的地方只会是自架的平台，无名小站会收掉、Tumblr、X 会改政策，在公开平台上永远只会是随风摇摆的树叶，所以我写的多数 Thread 也会存到自己的博客内。&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>發現特別是技術類作者會把文章放置在不只一個地方</title><link>https://www.webdong.dev/zh-tw/shortpost/authors-often-distribute-their-works/#authors-often-distribute-their-works/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/authors-often-distribute-their-works/#authors-often-distribute-their-works/</guid><pubDate>Fri, 07 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;意味著一些放在付費牆（Medium 我說你）背後的內容可以繞個彎，翻翻個人介紹就能找到作者個人網站正大光明的閱讀了。當然不同的平台有不同目標客群，有心的經營的話內容也會不大一樣。&lt;/p&gt;
&lt;p&gt;大概是因為唯一稱得上長期「內容的家」的地方只會是自架的平台，無名小站會收掉、Tumblr、X 會改政策，在公開平台上永遠只會是隨風搖擺的樹葉，所以我寫的多數 Thread 也會存到自己的部落格內。&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>How to Achieve That Cool Web Background?</title><link>https://www.webdong.dev/en/shortpost/transparent-background/#transparent-background/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/transparent-background/#transparent-background/</guid><pubDate>Thu, 06 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;When I was still taking freelance jobs, I often needed to create visually-driven web pages, and one good way to enhance the quality of a web page through details is &quot;background textures.&quot;&lt;/p&gt;
&lt;p&gt;On &lt;a href=&quot;https://www.transparenttextures.com/&quot;&gt;TRANSPARENT TEXTURES&lt;/a&gt;, there are nearly a hundred ready-to-preview free web background textures. These small, square, seamless texture images can enhance entire website at a very low cost 🌟.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded><category>Share</category></item><item><title>那个酷酷的网页背景是怎么做到的？</title><link>https://www.webdong.dev/zh-cn/shortpost/transparent-background/#transparent-background/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/transparent-background/#transparent-background/</guid><pubDate>Thu, 06 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;之前還在接案的時候時常會需要製作一些視覺主導的網頁，而從細節中提升網頁質感的一個好方法就是「背景材質」。&lt;/p&gt;
&lt;p&gt;在 &lt;a href=&quot;https://www.transparenttextures.com/&quot;&gt;TRANSPARENT TEXTURES&lt;/a&gt; 上有近百個現成可預覽的免費網頁用背景材質，這些四方連續的小材質圖可以用很小的代價點綴整個網站 🌟。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded><category>Share</category></item><item><title>那個酷酷的網頁背景是怎麼做到的？</title><link>https://www.webdong.dev/zh-tw/shortpost/transparent-background/#transparent-background/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/transparent-background/#transparent-background/</guid><pubDate>Thu, 06 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;之前還在接案的時候時常會需要製作一些視覺主導的網頁，而從細節中提升網頁質感的一個好方法就是「背景材質」。&lt;/p&gt;
&lt;p&gt;在 &lt;a href=&quot;https://www.transparenttextures.com/&quot;&gt;TRANSPARENT TEXTURES&lt;/a&gt; 上有近百個現成可預覽的免費網頁用背景材質，這些四方連續的小材質圖可以用很小的代價點綴整個網站 🌟。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded><category>Share</category></item><item><title>Why Keep Package Versions Updated?</title><link>https://www.webdong.dev/en/shortpost/why-keep-packages-updated/#why-keep-packages-updated/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/why-keep-packages-updated/#why-keep-packages-updated/</guid><pubDate>Wed, 05 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We always put upgrade maintenance at the lowest importance level, which is a reasonable decision. After all, the core goal of product development is to meet user needs rather than to make developers happy. However, the relationship between the two is complementary. When technology stagnates, future upgrades will incur higher costs and face greater challenges.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Versions become increasingly outdated until they can no longer be modified...&lt;/li&gt;
&lt;li&gt;Fewer and fewer people want to understand old technologies, and the development community gradually fade away...&lt;/li&gt;
&lt;li&gt;Security issues...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Recently, I specifically added a CI for regularly automatically updating package versions to the company&apos;s new architecture project because the neglect of updates in old projects has caused a lot of pain. This way, at least the team is constantly reminded of this matter.&lt;/p&gt;
&lt;p&gt;Developers should keep up with the times. This does not contradict the long-term goals of the product. Try to pay attention to this point and use some tools to solve this problem! Such as GitHub Dependabot and Renovate.&lt;/p&gt;
&lt;p&gt;I heard that the Angular community has a good automated update solution (ng update), and Nx has also launched nx migrate to manage Monorepo architecture. More records can be found in &lt;a href=&quot;https://www.webdong.dev/post/nx-migrate-to-solve-upgrade-problem/&quot;&gt;Nx migrate to solve upgrade problem&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>为什么要保持套件版本更新？</title><link>https://www.webdong.dev/zh-cn/shortpost/why-keep-packages-updated/#why-keep-packages-updated/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/why-keep-packages-updated/#why-keep-packages-updated/</guid><pubDate>Wed, 05 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我们总是将升级维护的工作安排到最低的优先级，这是合情合理的决定，毕竟开发产品的核心目标是满足用户需求而不是让开发者们开心，但这之间的关系是相辅相成的，当滞后更新技术，未来升级将花费更多成本面对更大的挑战。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;版本越来越旧直到改不动……&lt;/li&gt;
&lt;li&gt;旧技术越来越没人想了解、开发社区逐渐远离……&lt;/li&gt;
&lt;li&gt;安全性问题……&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;于是近期我特地将公司的新架构专案添加了定期自动更新套件版本的 CI，因为旧专案疏于更新导致吃了非常多苦头，这么做至少时时刻刻都能提醒团队这件事。&lt;/p&gt;
&lt;p&gt;开发者应与时俱进，这不跟产品长期目标相违背，试试看关注这一点，尝试用一些工具来解决这个问题吧！ 像是 GitHub Dependabot、Renovate。&lt;/p&gt;
&lt;p&gt;听说 Angular 社区对于更新有不错的自动化更新方案（ng update），而 Nx 为了管理 Monorepo 架构也推出了 nx migrate，更多记录于&lt;a href=&quot;https://www.webdong.dev/post/nx-migrate-to-solve-upgrade-problem/&quot;&gt;来看看 Nx 如何解决套件框架更新的问题 - nx migrate&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>為什麼要保持套件版本更新？</title><link>https://www.webdong.dev/zh-tw/shortpost/why-keep-packages-updated/#why-keep-packages-updated/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/why-keep-packages-updated/#why-keep-packages-updated/</guid><pubDate>Wed, 05 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我們總是將升級維護的工作安排到最低的優先級，這是合情合理的決定，畢竟開發產品的核心目標是滿足用戶需求而不是讓開發者們開心，但這之間的關係是相輔相成的，當停滯更新技術，未來升級將花費更多成本面對更大的挑戰。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;版本越來越舊直到改不動……&lt;/li&gt;
&lt;li&gt;舊技術越來越沒人想了解、開發社群逐漸遠離……&lt;/li&gt;
&lt;li&gt;安全性問題……&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;於是近期我特地將公司的新架構專案添加了定期自動更新套件版本的 CI，因為舊專案疏於更新導致吃了非常多苦頭，這麼做至少時時刻刻都能提醒團隊這件事。&lt;/p&gt;
&lt;p&gt;開發者應與時俱進，這不跟產品長期目標相違背，試試看關注這一點，嘗試用一些工具來解決這個問題吧！ 像是 GitHub Dependabot、Renovate。&lt;/p&gt;
&lt;p&gt;聽說 Angular 社群對於更新有不錯的自動化更新方案（ng update），而 Nx 為了管理 Monorepo 架構也推出了 nx migrate，更多記錄於&lt;a href=&quot;https://www.webdong.dev/post/nx-migrate-to-solve-upgrade-problem/&quot;&gt;來看看 Nx 如何解決套件框架更新的問題 - nx migrate&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>Do You Remember Browser Vendor Prefixes?</title><link>https://www.webdong.dev/en/shortpost/vendor-prefix/#vendor-prefix/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/vendor-prefix/#vendor-prefix/</guid><pubDate>Fri, 31 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Typically, these are prefix syntaxes that need to be added before certain experimental and non-standard CSS, such as: -webkit-, -moz-, -o-, -ms-. These prefixes are meant to allow developers to implement new CSS features in situations where the browser has not yet officially supported them. At that time, it was also common to use preprocessors like PostCSS with the autoprefixer plugin to preprocess CSS and add these prefixes, so that the website syntax could adapt to a wider range of users.&lt;/p&gt;
&lt;p&gt;As for why browser prefixes have gradually disappeared?&lt;/p&gt;
&lt;p&gt;The reason is that the prefixes used for testing have deviated from their original purpose — functional experimentation.
With the increasing number of prefixes, things became more chaotic. Browser vendors gradually recognized that an excess of experimental prefixes could lead developers to rely on non-standardized features, which in turn affects the compatibility of websites across different browsers. Therefore, modern browsers are more cautious about introducing experimental features, ensuring that new features have sufficient completeness and cross-browser consistency before introduction, and gradually moving away from using browser vendor prefixes to test new features. Instead, they provide manual toggles within the browser or offer test versions of browsers for experimental purposes, such as Chrome Canary or Firefox Nightly.&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>你还记得浏览器引擎前缀 (Vendor Prefix) 吗？</title><link>https://www.webdong.dev/zh-cn/shortpost/vendor-prefix/#vendor-prefix/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/vendor-prefix/#vendor-prefix/</guid><pubDate>Fri, 31 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;通常是某些实验性、非标准的 CSS 前需要添加的前缀语法，像是：-webkit-、-moz-、-o-、-ms-。这些前缀是为了让开发者在浏览器尚未正式支持的情况下用于实现新的 CSS 特性，甚至当时还时常会使用 PostCSS 这类预处理器的 autoprefixer 插件来预处理 CSS 添加上这些前缀，以便让网站语法能够适应更广的用户。&lt;/p&gt;
&lt;p&gt;至于为什么浏览器前缀会逐渐消失？&lt;/p&gt;
&lt;p&gt;原因是因为测试用的前缀已经偏移其原始目的 —— 功能实验
随着前缀数量的增多，事情也变得愈加混乱，浏览器厂商逐渐认识到过多的实验性前缀会导致开发者对非标准化功能的依赖，进而影响到网站在不同浏览器中的兼容性。因此现今浏览器会更加谨慎地引入实验性功能，并在引入前确保新功能已经有足够的完成度以及跨浏览器的一致性，并且逐渐远离使用浏览器引擎前缀来测试新功能，而是通过在浏览器内设置手动切换，或是提供测试版本的浏览器用于实验用途，像是 Chrome Canary 或 Firefox Nightly。&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>你還記得瀏覽器引擎前綴 (Vendor Prefix) 嗎？</title><link>https://www.webdong.dev/zh-tw/shortpost/vendor-prefix/#vendor-prefix/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/vendor-prefix/#vendor-prefix/</guid><pubDate>Fri, 31 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;通常是某些實驗性、非標準的 CSS 前需要添加的前綴語法，像是：-webkit-、-moz-、-o-、-ms-。這些前綴是為了讓開發者在瀏覽器尚未正式支援的情況下用於實現新的 CSS 特性，甚至當時還時常會使用 PostCSS 這類預處理器的 autoprefixer 插件來預處理 CSS 添加上這些前綴，以便讓網站語法能夠適應更廣的用戶。&lt;/p&gt;
&lt;p&gt;至於為什麼瀏覽器前綴會逐漸消失？&lt;/p&gt;
&lt;p&gt;原因是因為測試用的前綴已經偏移其原始目的 —— 功能實驗
隨著前綴數量的增多，事情也變得愈加混亂，瀏覽器廠商逐漸認識到過多的實驗性前綴會導致開發者對非標準化功能的依賴，進而影響到網站在不同瀏覽器中的兼容性。因此現今瀏覽器會更加謹慎地引入實驗性功能，並在引入前確保新功能已經有足夠的完成度以及跨瀏覽器的一致性，並且逐漸遠離使用瀏覽器引擎前綴來測試新功能，而是透過在瀏覽器內設定手動切換，或是提供測試版本的瀏覽器用於實驗用途，像是 Chrome Canary 或 Firefox Nightly。&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>How to manage large files in Git?</title><link>https://www.webdong.dev/en/shortpost/large-files-in-git/#large-files-in-git/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/large-files-in-git/#large-files-in-git/</guid><pubDate>Thu, 30 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Git allows us to record changes to any file and easily revert to any version. However, when it comes to storing large files, Git can struggle because it was not designed for storing large files (images, videos, music, etc.) that are binary in nature.&lt;/p&gt;
&lt;p&gt;Imagine a 1MB image that has been modified 10 times; Git would store 10 versions of the image, which amounts to 10 MB in the repository! (Although this simplified explanation is not entirely accurate, as Git stores the differences between two versions rather than a complete copy of each version, the challenge of compressing differences between binary files remains.) This can lead to performance issues, wasted storage space, and excessive network resource consumption.&lt;/p&gt;
&lt;p&gt;Git LFS addresses this problem by storing the contents of large files on an external server instead of directly in the Git repository. By replacing the actual large files with pointers to the large files, the size of the Git repository does not increase, regardless of how large the files are or how many times they are modified.&lt;/p&gt;
&lt;p&gt;If you want to know more about how to use Git LFS, my personal experience with it, and any special considerations to keep in mind, you can refer to the new article: &lt;a href=&quot;https://www.webdong.dev/post/how-i-use-git-lfs-to-manage-large-git-files/&quot;&gt;How I use Git LFS to manage large Git files?&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>Git 如何管理大型档案？</title><link>https://www.webdong.dev/zh-cn/shortpost/large-files-in-git/#large-files-in-git/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/large-files-in-git/#large-files-in-git/</guid><pubDate>Thu, 30 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Git 允许我们记录任何文件的变更，并且可以轻松地回溯任何一个版本，但是当需要存储大型文件时 Git 就会显得力不从心，因为 Git 并不是为了存储大型文件（图片、视频、音乐……等二进制文件）而设计的。&lt;/p&gt;
&lt;p&gt;试想一张 1MB 的图片只要改动了 10 次，Git 就会存储 10 个版本的图片也就是 10 MB 到存储库当中！（虽然这样简略的说明不完全正确，实际 Git 会存储两个版本之间的差异，而不是存储每个版本的完整副本，但二进制文件间差异难压缩的问题仍是挑战）容易导致性能底下、浪费存储空间、耗费网络资源……等问题。&lt;/p&gt;
&lt;p&gt;而 Git LFS 解决问题的方式是将大型文件内容存储在额外的服务器上，而不是直接存储在 Git 存储库中，通过将实际大型文件替换成指向大型文件的指针，就算文件再大、变动再多次，Git 存储库的大小都不会增加。&lt;/p&gt;
&lt;p&gt;如果对于 Git LFS 详细如何使用、我实际使用它的体验、有些什么事项需要特别留意可以参考看看新文章：&lt;a href=&quot;https://www.webdong.dev/post/how-i-use-git-lfs-to-manage-large-git-files/&quot;&gt;我如何使用 Git LFS 来托付大型 Git 文件？&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>Git 如何管理大型檔案？</title><link>https://www.webdong.dev/zh-tw/shortpost/large-files-in-git/#large-files-in-git/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/large-files-in-git/#large-files-in-git/</guid><pubDate>Thu, 30 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Git 允許我們紀錄任何檔案的變更，並且可以輕鬆地回溯任何一版本，但是當需要儲存大型檔案時 Git 就會顯得力不從心，因為 Git 並不是為了儲存大型檔案（圖片、影片、音樂……等二進制檔案）而設計的。&lt;/p&gt;
&lt;p&gt;試想一張 1MB 的圖片只要改動了 10 次，Git 就會儲存 10 個版本的圖片也就是 10 MB 到儲存庫當中！（雖然這樣簡略的說明不完全正確，實際 Git 會儲存兩個版本之間的差異，而不是儲存每個版本的完整副本，但二進位文件間差異難壓縮的問題仍是挑戰）容易導致效能底下、浪費儲存空間、耗費網路資源……等問題。&lt;/p&gt;
&lt;p&gt;而 Git LFS 解決問題的方式是將大型檔案內容儲存在額外的伺服器上，而不是直接儲存在 Git 儲存庫中，藉由將實際大型檔案替換成指向大型檔案的指標，就算檔案再大、更動再多次，Git 儲存庫的大小都不會增加。&lt;/p&gt;
&lt;p&gt;如果對於 Git LFS 詳細如何使用、我實際使用它的體驗、有什麼事項需要特別留意可以參考看看新文章：&lt;a href=&quot;https://www.webdong.dev/post/how-i-use-git-lfs-to-manage-large-git-files/&quot;&gt;我如何使用 Git LFS 來託付大型 Git 檔案？&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>XML and AJAX</title><link>https://www.webdong.dev/en/shortpost/xml-and-ajax/#xml-and-ajax/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/xml-and-ajax/#xml-and-ajax/</guid><pubDate>Tue, 28 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Has anyone had the same question as me?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Why is XML (Extensible Markup Language) not called EML?&lt;/li&gt;
&lt;li&gt;Why is AJAX (Asynchronous JavaScript and XML) transmitting JSON not called AJAJ?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Strange thoughts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Because X sounds cooler (?)&lt;/li&gt;
&lt;li&gt;Because EML sounds like Email (?)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;table&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;th&amp;gt;Votes&amp;lt;/th&amp;gt;
&amp;lt;th&amp;gt;Abbreviation&amp;lt;/th&amp;gt;
&amp;lt;th&amp;gt;Full Name&amp;lt;/th&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;XML&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;Extensible Markup Language&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;MAGMA&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;Minimal Architecture for Generalized Markup Applications&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;SLIM&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;Structured Language for Internet Markup&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;MGML&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;Minimal Generalized Markup Language&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;p&gt;According to &lt;a href=&quot;https://softwareengineering.stackexchange.com/questions/88405/why-is-xml-not-called-eml&quot;&gt;Why is XML not called EML?&lt;/a&gt;, it turns out it was decided by voting, but it doesn&apos;t explain why it had to be X!&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>XML 和 AJAX</title><link>https://www.webdong.dev/zh-cn/shortpost/xml-and-ajax/#xml-and-ajax/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/xml-and-ajax/#xml-and-ajax/</guid><pubDate>Tue, 28 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;有人和我有过同样的疑问吗？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;为什么 XML (Extensible Markup Language) 不称为 EML&lt;/li&gt;
&lt;li&gt;为什么 AJAX (Asynchronous JavaScript and XML) 传 JSON 不称为 AJAJ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;奇怪的想法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;因为 X 听起来比较酷 （？）&lt;/li&gt;
&lt;li&gt;因为 EML 听起来很 Email（？）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;table&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;th&amp;gt;票数&amp;lt;/th&amp;gt;
&amp;lt;th&amp;gt;缩写&amp;lt;/th&amp;gt;
&amp;lt;th&amp;gt;全名&amp;lt;/th&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;XML&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;Extensible Markup Language&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;MAGMA&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;Minimal Architecture for Generalized Markup Applications&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;SLIM&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;Structured Language for Internet Markup&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;MGML&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;Minimal Generalized Markup Language&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;p&gt;根据 &lt;a href=&quot;https://softwareengineering.stackexchange.com/questions/88405/why-is-xml-not-called-eml&quot;&gt;Why is XML not called EML?&lt;/a&gt; 才发现原来是经过投票决定的，但也没解释为什么要是 X 啊！&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>XML 和 AJAX</title><link>https://www.webdong.dev/zh-tw/shortpost/xml-and-ajax/#xml-and-ajax/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/xml-and-ajax/#xml-and-ajax/</guid><pubDate>Tue, 28 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;有人和我有過同樣的疑問嗎？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;為什麼 XML (Extensible Markup Language) 不稱為 EML&lt;/li&gt;
&lt;li&gt;為什麼 AJAX (Asynchronous JavaScript and XML) 傳 JSON 不稱為 AJAJ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;奇怪的想法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;因為 X 聽起來比較酷 （？）&lt;/li&gt;
&lt;li&gt;因為 EML 聽起來很 Email（？）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;lt;table&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;th&amp;gt;票數&amp;lt;/th&amp;gt;
&amp;lt;th&amp;gt;縮寫&amp;lt;/th&amp;gt;
&amp;lt;th&amp;gt;全名&amp;lt;/th&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;XML&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;Extensible Markup Language&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;MAGMA&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;Minimal Architecture for Generalized Markup Applications&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;SLIM&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;Structured Language for Internet Markup&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;MGML&amp;lt;/td&amp;gt;
&amp;lt;td&amp;gt;Minimal Generalized Markup Language&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;p&gt;根據 &lt;a href=&quot;https://softwareengineering.stackexchange.com/questions/88405/why-is-xml-not-called-eml&quot;&gt;Why is XML not called EML?&lt;/a&gt; 才發現原來是經過投票決定的，但也沒解釋為什麼要是 X 阿！&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>Rethinking How to Build RWD Web Pages with CSS Container Queries</title><link>https://www.webdong.dev/en/shortpost/container-queries/#container-queries/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/container-queries/#container-queries/</guid><pubDate>Mon, 27 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Container Queries already have 90% global support and will become an important tool for building independent RWD component styles in the era of web componentization.&lt;/p&gt;
&lt;p&gt;Nowadays, we are more prefer to build web components and flexibly set them to adapt to various device sizes, rather than emphasizing specific designs for specific device sizes as in the early AWD. This is also why, despite the existence of Media Queries, there is still a need to introduce Container Queries - &quot;to observe changes in specific meta web elements and apply different styles.&quot;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Media Queries: Easy to specify overall page styles&lt;/li&gt;
&lt;li&gt;Container Queries: Easy to specify individual elements&apos; styles at different sizes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Web Dong Dong has launched a &lt;a href=&quot;https://www.webdong.dev/post/container-queries/&quot;&gt;related article&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To learn more about Container Queries and their examples, I highly recommend checking out &lt;a href=&quot;https://ishadeed.com/article/css-container-query-guide/#introduction&quot;&gt;Ahmad Shadeed&apos;s website&lt;/a&gt;; the interactive examples are really impressive!&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>重新思考如何建构 RWD 网页，透过 CSS Container Queries</title><link>https://www.webdong.dev/zh-cn/shortpost/container-queries/#container-queries/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/container-queries/#container-queries/</guid><pubDate>Mon, 27 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Container Queries 也已经有 90% 的全球支持度，将会在网页组件化的时代成为构建独立 RWD 组件样式的重要工具。&lt;/p&gt;
&lt;p&gt;如今我们更倾向构建网页组件并灵活设置使其适应各种设备尺寸，不再像早期 AWD 强调针对特定设备尺寸提供特定的设计，这也是为什么已经有了 Media Queries 却还需要再推出 Container Queries 的原因——「观察特定元网页元素的变化并套用不同样式」&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Media Queries：易于指定整体页面样式&lt;/li&gt;
&lt;li&gt;Container Queries：易于指定个别元素在不同尺寸时样式&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;网页东东新推出&lt;a href=&quot;https://www.webdong.dev/post/container-queries/&quot;&gt;相关文章&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;要详细了解 Container Queries 与其范例强烈推荐参考看看 &lt;a href=&quot;https://ishadeed.com/article/css-container-query-guide/#introduction&quot;&gt;Ahmad Shadeed 的网站&lt;/a&gt;，互动范例真的很厉害！&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>重新思考如何建構 RWD 網頁，透過 CSS Container Queries</title><link>https://www.webdong.dev/zh-tw/shortpost/container-queries/#container-queries/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/container-queries/#container-queries/</guid><pubDate>Mon, 27 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Container Queries 也已經有 90% 的全球支持度，將會在網頁元件化的時代成為建構獨立 RWD 元件樣式的重要工具。&lt;/p&gt;
&lt;p&gt;如今我們更傾向建構網頁元件並彈性設定使其適應各種裝置尺寸，不再像早期 AWD 強調針對特定裝置尺寸提供特定的設計，這也是為什麼已經有了 Media Queries 卻還需要再推出 Container Queries 的原因——「觀察特定元網頁元素的變化並套用不同樣式」&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Media Queries：易於指定整體頁面樣式&lt;/li&gt;
&lt;li&gt;Container Queries：易於指定個別元素在不同尺寸時樣式&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;網頁東東新推出&lt;a href=&quot;https://www.webdong.dev/post/container-queries/&quot;&gt;相關文章&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;要詳細了解 Container Queries 與其範例強烈推薦參考看看 &lt;a href=&quot;https://ishadeed.com/article/css-container-query-guide/#introduction&quot;&gt;Ahmad Shadeed 的網站&lt;/a&gt;，互動範例真的很厲害！&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>The font that improves your coding productivity — Commit Mono</title><link>https://www.webdong.dev/en/shortpost/commit-mono/#commit-mono/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/commit-mono/#commit-mono/</guid><pubDate>Sun, 26 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The most effective font is the one you don&apos;t notice. No super high x-height, no geometric structure, no eye-catching design, and no confusing ligatures. The &lt;a href=&quot;https://commitmono.com/&quot;&gt;Commit Mono&lt;/a&gt; font is designed to be neutral and anonymous, quietly doing its job. You can interact with this font directly on the website through typing, with mini-games, comparisons of existing fonts, and customization features to play with.&lt;/p&gt;
&lt;p&gt;So far, the font that suits my taste the most is &lt;a href=&quot;https://www.jetbrains.com/lp/mono/#design&quot;&gt;JetBrains Mono&lt;/a&gt;, which is more mechanical, orderly, and condense compared to other fonts. People tend to read more easily with familiar fonts, so choosing a font that looks good to you and using it consistently is the best fit for yourself~&lt;/p&gt;
&lt;p&gt;If you want to try different development fonts, you can refer to: &lt;a href=&quot;https://www.programmingfonts.org/&quot;&gt;Programming Fonts&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Share</category></item><item><title>听名称就感觉生产力 UP UP 的字体 —— Commit Mono</title><link>https://www.webdong.dev/zh-cn/shortpost/commit-mono/#commit-mono/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/commit-mono/#commit-mono/</guid><pubDate>Sun, 26 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最有效的字体是你不会注意到的那种。没有超高的 x 字高，没有几何结构，没有引人注目的设计，也没有让人困惑的连字。&lt;a href=&quot;https://commitmono.com/&quot;&gt;Commit Mono&lt;/a&gt; 字体设计得中立且匿名，悄然地发挥作用。可以到网站上直接通过打字与这款字体互动，有小游戏、比较现有字体、客制化功能可以玩。&lt;/p&gt;
&lt;p&gt;至今最合我胃口的字体仍是 &lt;a href=&quot;https://www.jetbrains.com/lp/mono/#design&quot;&gt;JetBrains Mono&lt;/a&gt;，相比于其他字体更为机械、规矩且细长。人们对于熟悉的字体会更善于阅读，所以挑选一款看顺眼的字体并持续使用就是最适合己的～&lt;/p&gt;
&lt;p&gt;想多尝试不同开发用字体可以参考：&lt;a href=&quot;https://www.programmingfonts.org/&quot;&gt;Programming Fonts&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Share</category></item><item><title>聽名稱就感覺生產力 UP UP 的字體 —— Commit Mono</title><link>https://www.webdong.dev/zh-tw/shortpost/commit-mono/#commit-mono/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/commit-mono/#commit-mono/</guid><pubDate>Sun, 26 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最有效的字體是你不會注意到的那種。沒有超高的 x 字高，沒有幾何結構，沒有引人注目的設計，也沒有讓人困惑的連字。&lt;a href=&quot;https://commitmono.com/&quot;&gt;Commit Mono&lt;/a&gt; 字體設計得中立且匿名，悄然地發揮作用。可以到網站上直接透過打字與這款字體互動，有小遊戲、比較現有字體、客製化功能可以玩。&lt;/p&gt;
&lt;p&gt;至今最合我胃口的字體仍是 &lt;a href=&quot;https://www.jetbrains.com/lp/mono/#design&quot;&gt;JetBrains Mono&lt;/a&gt;，相比於其他字體更為機械、規矩且細長。人們對於熟悉的字體會更善於閱讀，所以挑選一款看順眼的字體並持續使用就是最適合己的～&lt;/p&gt;
&lt;p&gt;想多嘗試不同開發用字體可以參考：&lt;a href=&quot;https://www.programmingfonts.org/&quot;&gt;Programming Fonts&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Share</category></item><item><title>Great Web Development Teaching Platform — Egghead.io</title><link>https://www.webdong.dev/en/shortpost/egghead/#egghead/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/egghead/#egghead/</guid><pubDate>Thu, 23 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;As someone who insists on learning without spending money, I usually learn by browsing official documents, blogs, and YouTube. However, recently while learning NX, I hit a wall. The official documentation was somewhat hard to digest, and there weren&apos;t many online tutorial videos available 😐. Just then, I found that &lt;a href=&quot;https://egghead.io&quot;&gt;Egghead&lt;/a&gt; offers related courses that are completely free! The experience has been excellent, and I was impressed by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Courses specifically focused on web development&lt;/li&gt;
&lt;li&gt;The quality of instruction seems quite good&lt;/li&gt;
&lt;li&gt;3x speed works smoothly, and subtitles are complete&lt;/li&gt;
&lt;li&gt;Beautiful course illustrations made me think, are these really free experiences?! Super value!

&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Share</category></item><item><title>Why are there _ in numbers?</title><link>https://www.webdong.dev/en/shortpost/why-underscore-inside-numbers/#why-underscore-inside-numbers/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/why-underscore-inside-numbers/#why-underscore-inside-numbers/</guid><pubDate>Thu, 23 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Actually, this is a feature added in JavaScript in ECMAScript 2021, called &quot;Numeric Separators,&quot; which allows us to insert &lt;code&gt;_&lt;/code&gt; between numbers to enhance readability.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const readableMiliion = 1_000_000;
const regularMiliion = 1000000;
const decimal = 1_000_000.220_720;
const binary = 0b01010110_00111000;
const hexa = 0x40_76_38_6a_73;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It has been supported since Node 12.5.0, Chrome 75, Firefox 70, and Safari 13.1, so you can use it with confidence. A quick search revealed that many programming languages also support this feature.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://v8.dev/features/numeric-separators&quot;&gt;Numeric separators&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>近期发现不错的免费英文网页开发教学平台 —— Egghead.io</title><link>https://www.webdong.dev/zh-cn/shortpost/egghead/#egghead/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/egghead/#egghead/</guid><pubDate>Thu, 23 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;身为连学习都坚持无课金的我通常学习就是翻翻官方文件、博客、YouTube 来吸收，直到近期在学 NX 才让我踢到铁板，官方文件有些生硬难啃，并且线上实际教学操作的视频资源也不多 😐，而刚好就在 &lt;a href=&quot;https://egghead.io&quot;&gt;Egghead&lt;/a&gt; 有开相关系列课程还是完全免费的！使用下来体验非常好，让我印象深刻：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;专门提供网页开发相关课程&lt;/li&gt;
&lt;li&gt;授课品质看起来都不赖&lt;/li&gt;
&lt;li&gt;3 倍速也不卡、字幕齐全&lt;/li&gt;
&lt;li&gt;漂亮的课程插图让我觉得，这些都是免费可以体验的东西吗？！超值！

&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Share</category></item><item><title>为什么会有 _ 在数字当中？</title><link>https://www.webdong.dev/zh-cn/shortpost/why-underscore-inside-numbers/#why-underscore-inside-numbers/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/why-underscore-inside-numbers/#why-underscore-inside-numbers/</guid><pubDate>Thu, 23 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;其实是 JavaScript 在 ECMAScript 2021 中新增的一个特性，叫做「Numeric Separators」，可以让我们在数字之间加入 &lt;code&gt;_&lt;/code&gt; 来增加可读性。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const readableMiliion = 1_000_000;
const regularMiliion = 1000000;
const decimal = 1_000_000.220_720;
const binary = 0b01010110_00111000;
const hexa = 0x40_76_38_6a_73;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;从 Node 12.5.0、Chrome 75、Firefox 70、Safari 13.1 都已经支持了，可以放心使用。延伸搜索了一下，发现蛮多程序语言皆有支持这样的特性。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://v8.dev/features/numeric-separators&quot;&gt;Numeric separators&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>近期發現不錯的免費英文網頁開發教學平台 —— Egghead.io</title><link>https://www.webdong.dev/zh-tw/shortpost/egghead/#egghead/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/egghead/#egghead/</guid><pubDate>Thu, 23 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;身為連學習都堅持無課金的我通常學習就是翻翻官方文件、部落格、YouTube 來吸收，直到近期在學 NX 才讓我踢到鐵板，官方文件有些生硬難啃，並且線上實際教學操作的影片資源也不多 😐，而剛好就在 &lt;a href=&quot;https://egghead.io&quot;&gt;Egghead&lt;/a&gt; 有開相關系列課程還是完全免費的！使用下來體驗非常好，讓我印象深刻：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;專門提供網頁開發相關課程&lt;/li&gt;
&lt;li&gt;授課品質看起來都不賴&lt;/li&gt;
&lt;li&gt;3 倍速也不卡、字幕齊全&lt;/li&gt;
&lt;li&gt;漂亮的課程插圖讓我覺得，這些都是免費可以體驗的東西嗎？！超值！

&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Share</category></item><item><title>為什麼會有 _ 在數字當中？</title><link>https://www.webdong.dev/zh-tw/shortpost/why-underscore-inside-numbers/#why-underscore-inside-numbers/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/why-underscore-inside-numbers/#why-underscore-inside-numbers/</guid><pubDate>Thu, 23 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;其實是 JavaScript 在 ECMAScript 2021 中新增的一個特性，叫做「Numeric Separators」，可以讓我們在數字之間加入 &lt;code&gt;_&lt;/code&gt; 來增加可讀性。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const readableMiliion = 1_000_000;
const regularMiliion = 1000000;
const decimal = 1_000_000.220_720;
const binary = 0b01010110_00111000;
const hexa = 0x40_76_38_6a_73;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;從 Node 12.5.0、Chrome 75、Firefox 70、Safari 13.1 都已經支援了，可以放心使用。延伸搜尋了一下，發現蠻多程式語言皆有支持這樣的特性。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://v8.dev/features/numeric-separators&quot;&gt;Numeric separators&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>How to Completely Remove Sensitive Files from Git History?</title><link>https://www.webdong.dev/en/shortpost/remove-git-file-from-history/#remove-git-file-from-history/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/remove-git-file-from-history/#remove-git-file-from-history/</guid><pubDate>Wed, 22 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Sometimes, sensitive files that shouldn&apos;t have been pushed are accidentally pushed to Git, and how to completely remove them from the records is a problem. The following explains how to fix this using the environment variable &lt;code&gt;.env&lt;/code&gt; as example.&lt;/p&gt;
&lt;p&gt;🐑 Step 1: Avoid mistake again&lt;/p&gt;
&lt;p&gt;First, add the file to &lt;code&gt;.gitignore&lt;/code&gt; to avoid making the same mistake in the future.&lt;/p&gt;
&lt;p&gt;🌿 Step 2: Surface Cleaning&lt;/p&gt;
&lt;p&gt;Run &lt;code&gt;git rm -r --cached .env&lt;/code&gt; to remove &lt;code&gt;.env&lt;/code&gt; from Git, but this only removes it from the staging area and does not remove it from the history.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;r&lt;/code&gt; Recursively delete files in the target folder&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--cached&lt;/code&gt; Only remove from the staging area, will not delete the actual file&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.env&lt;/code&gt; is the name of the file or folder to be deleted&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🧽 Step 3: Deep Cleaning&lt;/p&gt;
&lt;p&gt;Run &lt;code&gt;git filter-branch --index-filter &quot;git rm -rf --cached --ignore-unmatch .env&quot; HEAD&lt;/code&gt; to modify the history.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;r&lt;/code&gt; Recursively delete files in the target folder&lt;/li&gt;
&lt;li&gt;&lt;code&gt;f&lt;/code&gt; Force delete the file without confirmation&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--cached&lt;/code&gt; Only remove from the staging area, will not delete the actual file&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ignore-unmatch&lt;/code&gt; Ignore errors if the file does not exist. This option ensures that the command will execute successfully even if the &lt;code&gt;.env&lt;/code&gt; file does not exist in some commits&lt;/li&gt;
&lt;li&gt;HEAD indicates that the filtering operation should be performed on the current latest commit and its ancestors&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;✨ Step 4: Push Changes&lt;/p&gt;
&lt;p&gt;Use &lt;code&gt;git push --force&lt;/code&gt; to forcefully overwrite the modified results to the remote.&lt;/p&gt;
&lt;p&gt;⚠ Note: Any sensitive information that has been made public should be considered leaked and should be replaced immediately. Therefore, directly replacing all sensitive information rather than modifying the records is the safest approach. Recently, there have been issues with accidentally pushing sensitive information to private repositories, making this method quite suitable for removal.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://git-scm.com/docs/git-rm&quot;&gt;git-rm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git-scm.com/docs/git-filter-branch&quot;&gt;git-filter-branch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>如何从 Git 历史中彻底移除机密文件？</title><link>https://www.webdong.dev/zh-cn/shortpost/remove-git-file-from-history/#remove-git-file-from-history/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/remove-git-file-from-history/#remove-git-file-from-history/</guid><pubDate>Wed, 22 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;有时候不小心推送了不该推送的机密文件到 Git 当中，如何彻底从记录中移除是个问题。以下用环境变量 &lt;code&gt;.env&lt;/code&gt; 来解释可以怎么补救。&lt;/p&gt;
&lt;p&gt;🐑 第一步：亡羊补牢&lt;/p&gt;
&lt;p&gt;先把文件加入到 &lt;code&gt;.gitignore&lt;/code&gt; 中，避免未来犯下相同的错误。&lt;/p&gt;
&lt;p&gt;🌿 第二步：表面清洁&lt;/p&gt;
&lt;p&gt;执行 &lt;code&gt;git rm -r --cached .env&lt;/code&gt; ，把 &lt;code&gt;.env&lt;/code&gt; 从 Git 当中移除，但这样只是从暂存区移除，并没有从历史记录中移除。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;r&lt;/code&gt; 递归删除目标文件夹中的文件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--cached&lt;/code&gt; 只从暂存区删除，不会删除实际文件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.env&lt;/code&gt; 是要删除的文件或文件夹名称&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🧽 第三步：深层清理&lt;/p&gt;
&lt;p&gt;执行 &lt;code&gt;git filter-branch --index-filter &quot;git rm -rf --cached --ignore-unmatch .env&quot; HEAD&lt;/code&gt; 来修改历史。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;r&lt;/code&gt; 递归删除目标文件夹中的文件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;f&lt;/code&gt; 强制删除文件，无须确认&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--cached&lt;/code&gt; 只从暂存区删除，不会删除实际文件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ignore-unmatch&lt;/code&gt; 忽略如果文件不存在的错误。这个选项保证即使 &lt;code&gt;.env&lt;/code&gt; 文件在某些提交中不存在，命令也会执行成功&lt;/li&gt;
&lt;li&gt;HEAD 表示要对当前最新的提交及其祖先进行过滤操作&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;✨ 第四步：推送修改&lt;/p&gt;
&lt;p&gt;使用 &lt;code&gt;git push --force&lt;/code&gt; 来强制覆盖修改过结果到远端。&lt;/p&gt;
&lt;p&gt;⚠ 补充：任何公开过的敏感信息应当视为外泄，应立即替换不再使用，因此直接替换所有敏感信息而不是修改记录是最安全的做法。近期有遇到不小心把敏感信息推上私有仓库上的问题，就挺适合用这招来剔除。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://git-scm.com/docs/git-rm&quot;&gt;git-rm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git-scm.com/docs/git-filter-branch&quot;&gt;git-filter-branch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>如何從 Git 歷史中徹底移除機密文件？</title><link>https://www.webdong.dev/zh-tw/shortpost/remove-git-file-from-history/#remove-git-file-from-history/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/remove-git-file-from-history/#remove-git-file-from-history/</guid><pubDate>Wed, 22 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;有時候不小心推送了不該推送的機密文件到 Git 當中，如何徹底從記錄中移除是個問題。以下用環境變數 &lt;code&gt;.env&lt;/code&gt; 來解釋可以怎麼補救。&lt;/p&gt;
&lt;p&gt;🐑 第一步：亡羊補牢&lt;/p&gt;
&lt;p&gt;先把文件加入到 &lt;code&gt;.gitignore&lt;/code&gt; 中，避免未來犯下相同的錯誤。&lt;/p&gt;
&lt;p&gt;🌿 第二步：表面清潔&lt;/p&gt;
&lt;p&gt;執行 &lt;code&gt;git rm -r --cached .env&lt;/code&gt; ，把 &lt;code&gt;.env&lt;/code&gt; 從 Git 當中移除，但這樣只是從暫存區移除，並沒有從歷史記錄中移除。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;r&lt;/code&gt; 遞歸刪除目標資料夾中的文件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--cached&lt;/code&gt; 只從暫存區刪除，不會刪除實際文件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.env&lt;/code&gt; 是要刪除的文件或資料夾名稱&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🧽 第三步：深層清理&lt;/p&gt;
&lt;p&gt;執行 &lt;code&gt;git filter-branch --index-filter &quot;git rm -rf --cached --ignore-unmatch .env&quot; HEAD&lt;/code&gt; 來修改歷史。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;r&lt;/code&gt; 遞歸刪除目標資料夾中的文件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;f&lt;/code&gt; 強制刪除文件，無須確認&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--cached&lt;/code&gt; 只從暫存區刪除，不會刪除實際文件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ignore-unmatch&lt;/code&gt; 忽略如果文件不存在的錯誤。這個選項保證即使 &lt;code&gt;.env&lt;/code&gt; 文件在某些提交中不存在，命令也會執行成功&lt;/li&gt;
&lt;li&gt;HEAD 表示要對當前最新的提交及其祖先進行過濾操作&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;✨ 第四步：推送修改&lt;/p&gt;
&lt;p&gt;使用 &lt;code&gt;git push --force&lt;/code&gt; 來強制覆蓋修改過結果到遠端。&lt;/p&gt;
&lt;p&gt;⚠ 補充：任何公開過的敏感資訊應當視為外洩，應立即替換不再使用，因此直接替換所有敏感資訊而不是修改紀錄是最安全的做法。近期有遇到不小心把敏感資訊推上私有倉庫上的問題，就挺適合用這招來剔除。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://git-scm.com/docs/git-rm&quot;&gt;git-rm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git-scm.com/docs/git-filter-branch&quot;&gt;git-filter-branch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>Software Gardener</title><link>https://www.webdong.dev/en/shortpost/software-engineer-developer-programmer-coder/#software-engineer-developer-programmer-coder/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/software-engineer-developer-programmer-coder/#software-engineer-developer-programmer-coder/</guid><pubDate>Tue, 21 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;❌ Software Engineer&lt;/li&gt;
&lt;li&gt;❌ Software Programmer&lt;/li&gt;
&lt;li&gt;❌ Software Developer&lt;/li&gt;
&lt;li&gt;❌ Coder&lt;/li&gt;
&lt;li&gt;🌵 Software Gardener&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>软件园艺家 Software Gardener</title><link>https://www.webdong.dev/zh-cn/shortpost/software-engineer-developer-programmer-coder/#software-engineer-developer-programmer-coder/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/software-engineer-developer-programmer-coder/#software-engineer-developer-programmer-coder/</guid><pubDate>Tue, 21 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;❌ 软件工程师 Software Engineer&lt;/li&gt;
&lt;li&gt;❌ 程式设计师 Software Programmer&lt;/li&gt;
&lt;li&gt;❌ 软件开发者 Software Developer&lt;/li&gt;
&lt;li&gt;❌ 码农 Coder&lt;/li&gt;
&lt;li&gt;🌵 软件园艺家 Software Gardener&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>軟體園藝家 Software Gardener</title><link>https://www.webdong.dev/zh-tw/shortpost/software-engineer-developer-programmer-coder/#software-engineer-developer-programmer-coder/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/software-engineer-developer-programmer-coder/#software-engineer-developer-programmer-coder/</guid><pubDate>Tue, 21 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;❌ 軟體工程師 Software Engineer&lt;/li&gt;
&lt;li&gt;❌ 程式設計師 Software Programmer&lt;/li&gt;
&lt;li&gt;❌ 軟體開發者 Software Developer&lt;/li&gt;
&lt;li&gt;❌ 碼農 Coder&lt;/li&gt;
&lt;li&gt;🌵 軟體園藝家 Software Gardener&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>I always thought PowerShell was just the blue cmd</title><link>https://www.webdong.dev/en/shortpost/command-prompt-and-powershell/#command-prompt-and-powershell/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/command-prompt-and-powershell/#command-prompt-and-powershell/</guid><pubDate>Mon, 20 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I often develop on Windows, but I have never really understood the difference between Command Prompt and PowerShell. I always thought PowerShell was just the blue version of cmd.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Command Prompt&lt;/strong&gt;, a batch scripting language, is traditionally used to execute DOS commands and batch scripts. Its syntax is simple, suitable for handling basic file operations and system administration tasks, and it still exists to support legacy habits and programs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PowerShell&lt;/strong&gt;, a scripting language based on .NET, adapts to user habits, automatically mapping DOS commands to their corresponding command sets. For example, the command &lt;code&gt;cd&lt;/code&gt; actually executes &lt;code&gt;Set-Location&lt;/code&gt; behind the scenes. In summary: PowerShell is the modern cmd, with more powerful and comprehensive features.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So next time I encounter the two, I won&apos;t think of PowerShell as just the blue Command Prompt anymore (although most of the time, there really isn&apos;t much difference). I suddenly realized that the programming language that initially inspired me to code wasn&apos;t Visual Basic or JavaScript, but Batch Script!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=H0gwnFV_SFs&quot;&gt;Windows Powershell vs Command Prompt: What&apos;s The Difference Anyway? - ThioJoe&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>一直以为 PowerShell 就是蓝蓝的 cmd</title><link>https://www.webdong.dev/zh-cn/shortpost/command-prompt-and-powershell/#command-prompt-and-powershell/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/command-prompt-and-powershell/#command-prompt-and-powershell/</guid><pubDate>Mon, 20 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我经常用 Windows 开发，不过一直以来没有特别了解 Command Prompt 和 PowerShell 的差异，一直以为 PowerShell 就是蓝蓝的 cmd。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Command Prompt&lt;/strong&gt;，批处理脚本语言，传统主要用来执行 DOS 命令和批处理脚本。语法简单，适合处理基本的文件操作和系统管理任务，还存在是为了支援旧有习惯与程序。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PowerShell&lt;/strong&gt;，基于 .NET 的脚本语言，为了衔接用户的习惯，就算输入 DOS 指令也都会自动应对上对应的命令集，像是 cd 背后实际执行的是 Set-Location。总结：PowerShell 就是现代 cmd ，更强大功能更齐全。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以下次遇到他们两者的时候，我不会再把 PowerShell 当作是蓝蓝的 Command Prompt 了（虽然大多数时候也的确没有差别）。突然发现最初启蒙我写程序的不是 Visual Basic 或 JavaScript，而是 Batch Script 阿！&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=H0gwnFV_SFs&quot;&gt;Windows Powershell vs Command Prompt: What&apos;s The Difference Anyway? - ThioJoe&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>一直以為 PowerShell 就是藍藍的 cmd</title><link>https://www.webdong.dev/zh-tw/shortpost/command-prompt-and-powershell/#command-prompt-and-powershell/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/command-prompt-and-powershell/#command-prompt-and-powershell/</guid><pubDate>Mon, 20 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我經常用 Windows 開發，不過一直以來沒有特別了解 Command Prompt 和 PowerShell 的差異，一直以為 PowerShell 就是藍藍的 cmd。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Command Prompt&lt;/strong&gt;，批處理腳本語言，傳統主要用來執行 DOS 命令和批處理腳本。語法簡單，適合處理基本的文件操作和系統管理任務，還存在是為了支援舊有習慣與程式。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PowerShell&lt;/strong&gt;，基於 .NET 的腳本語言，為了銜接使用者的習慣，就算輸入 DOS 指令也都會自動應對上對應的命令集，像是 cd 背後實際執行的是 Set-Location。總結：PowerShell 就是現代 cmd ，更強大功能更齊全。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以下次遇到他們兩者的時候，我不會再把 PowerShell 當作是藍藍的 Command Prompt 了（雖然大多時候也的確沒有差別）。突然發現最初啟蒙我寫程式的不是 Visual Basic 或 JavaScript，而是 Batch Script 阿！&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=H0gwnFV_SFs&quot;&gt;Windows Powershell vs Command Prompt: What&apos;s The Difference Anyway? - ThioJoe&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>Share a tip I often use when previewing GitHub projects — Dot</title><link>https://www.webdong.dev/en/shortpost/vscode-inside-github/#vscode-inside-github/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/vscode-inside-github/#vscode-inside-github/</guid><pubDate>Tue, 14 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I’m not mistaken; try pressing the “.” key on any GitHub Repo to open a full VSCode editor. Although there are some limitations compared to local development, it’s still quite impressive!&lt;/p&gt;
&lt;p&gt;What stands out is being able to have a complete editing experience when browsing unfamiliar Repos without downloading anything, or being able to edit a project immediately by just finding a computer and opening a browser when the development environment isn’t at hand.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded><category>Share</category></item><item><title>分享一个我自己在预览 GitHub 专案时常用的诀窍 —— 点</title><link>https://www.webdong.dev/zh-cn/shortpost/vscode-inside-github/#vscode-inside-github/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/vscode-inside-github/#vscode-inside-github/</guid><pubDate>Tue, 14 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;我没打错，试试在任意 GitHub Repo 按下键盘上的「.」就可以打开一个完整的 VSCode 编辑器，虽然相较本地开发有些限制，不过还是挺震撼的吧！&lt;/p&gt;
&lt;p&gt;比较有感的是在翻一些陌生的 Repo 不用下载就可以有完整的编辑体验，或者是开发环境不在手边随便找台电脑打开浏览器也能立刻编辑专案。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded><category>Share</category></item><item><title>分享一個我自己在預覽 GitHub 專案時常用的訣竅 —— 點</title><link>https://www.webdong.dev/zh-tw/shortpost/vscode-inside-github/#vscode-inside-github/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/vscode-inside-github/#vscode-inside-github/</guid><pubDate>Tue, 14 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;我沒打錯，試試看在任意 GitHub Repo 按下鍵盤上的「.」就可以打開一個完整的 VSCode 編輯器，雖然相較本地開發有些限制，不過還是挺震撼的吧！&lt;/p&gt;
&lt;p&gt;比較有感的是在翻一些陌生的 Repo 不用下載就可以有完整的編輯體驗，或者是開發環境不在手邊隨便找台電腦打開瀏覽器也能立刻編輯專案。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
</content:encoded><category>Share</category></item><item><title>Tracking Browser Version Support — Can I Use Website</title><link>https://www.webdong.dev/en/shortpost/can-i-use/#can-i-use/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/can-i-use/#can-i-use/</guid><pubDate>Mon, 13 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;With the unification of various browser APIs, there are more and more tools available for building web pages in the frontend. But how can we know the support level of APIs across different browsers, potential issues, and global support percentages? You can try the &lt;a href=&quot;https://caniuse.com/&quot;&gt;Can I Use&lt;/a&gt; website, a &lt;a href=&quot;https://github.com/Fyrd/caniuse&quot;&gt;community-maintained&lt;/a&gt; browser support level search site.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Recently, I noticed this while creating a content of table. When clicking on a list item, the screen scrolls to the corresponding heading. In the past, I would have needed to use JS&apos;s &lt;code&gt;scrollTo()&lt;/code&gt; to calculate how far to scroll based on the target element and the current position, but with a newer API &lt;code&gt;scrollIntoView()&lt;/code&gt;, I just need to specify the heading to scroll to! It saves a lot of effort.&lt;/p&gt;
&lt;p&gt;When using some newer APIs, I always check this website to ensure that the target audience&apos;s versions are supported, and the team can supervise each other based on this website.&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>追蹤浏览器版本支持程度 —— Can I Use 网站</title><link>https://www.webdong.dev/zh-cn/shortpost/can-i-use/#can-i-use/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/can-i-use/#can-i-use/</guid><pubDate>Mon, 13 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;随着各项浏览器 API 的推动与统一，前端也越来越多工具可以用于构建网页，但要怎么知道 API 在不同的浏览器的支持程度、潜在问题与全球支持占比呢？可以试试看 &lt;a href=&quot;https://caniuse.com/&quot;&gt;Can I Use&lt;/a&gt; 网站，一项&lt;a href=&quot;https://github.com/Fyrd/caniuse&quot;&gt;由社区维护&lt;/a&gt; 的浏览器支持程度搜索网站。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;近期比较有感的是在制作一个标题清单，当点击清单项目时就让画面滑动到对应的标题，在更早以前会需要使用到 JS 的 &lt;code&gt;scrollTo()&lt;/code&gt; 去计算好目标元素与当前位置需要滚动多少距离，但换一支更新颖专门用途的的 API &lt;code&gt;scrollIntoView()&lt;/code&gt;就只要指定要滑动到的标题！省了许多功夫。&lt;/p&gt;
&lt;p&gt;在使用一些新颖的 API 时我都会上这个网站确保目标客群的版本可以支持，团队也可以相互依照这个网站为基准相互监督。&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>追蹤瀏覽器版本支援程度 —— Can I Use 網站</title><link>https://www.webdong.dev/zh-tw/shortpost/can-i-use/#can-i-use/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/can-i-use/#can-i-use/</guid><pubDate>Mon, 13 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;隨著各項瀏覽器 API 的推動與統一，前端也越來越多工具可以用於建構網頁，但要怎麼知道 API 在不同的瀏覽器的支援程度、潛在問題與全球支援占比呢？可以試試看 &lt;a href=&quot;https://caniuse.com/&quot;&gt;Can I Use&lt;/a&gt; 網站，一項&lt;a href=&quot;https://github.com/Fyrd/caniuse&quot;&gt;由社群維護&lt;/a&gt; 的瀏覽器支援程度搜尋網站。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;近期比較有感的是在製作一個標題清單，當點擊清單項目時就讓畫面滑動到對應的標題，在更早以前會需要使用到 JS 的 &lt;code&gt;scrollTo()&lt;/code&gt; 去計算好目標元素與當前位置需要滾動多少距離，但換一支更新穎專門用途的的 API &lt;code&gt;scrollIntoView()&lt;/code&gt;就只要指定要滑動到的標題！省了許多功夫。&lt;/p&gt;
&lt;p&gt;在使用一些新穎的 API 時我都會上這個網站確保目標客群的版本可以支援，團隊也可以相互依照這個網站為基準相互監督。&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>Chromium Developer Tools — Layers</title><link>https://www.webdong.dev/en/shortpost/chromium-layer/#chromium-layer/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/chromium-layer/#chromium-layer/</guid><pubDate>Sun, 12 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Recently, this cool feature has been considered for a vote to be removed! The reason is that after being launched for a while, too few people are using it and there are still too many bugs. Firefox had a similar feature in the early days, but it has already been discontinued.&lt;/p&gt;
&lt;p&gt;The Layers feature can help you freely preview the rendering situation of the entire webpage from a three-dimensional perspective. You might use this tool for the following purposes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Inspecting webpage rendering situations (lazy loading)&lt;/li&gt;
&lt;li&gt;Breaking down webpage animation effects&lt;/li&gt;
&lt;li&gt;Understanding the current page&apos;s Z-index hierarchy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For me, the most significant benefit has been understanding the relationship of Z-index levels when resolving issues with some externally imported components recently. It should be helpful for frontend developers who often create special visuals.&lt;/p&gt;
&lt;p&gt;

&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>Chromium 开发者工具 —— Layers</title><link>https://www.webdong.dev/zh-cn/shortpost/chromium-layer/#chromium-layer/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/chromium-layer/#chromium-layer/</guid><pubDate>Sun, 12 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;近期这个酷酷的功能正在考虑投票关闭！原因是因为推出一段时间后太少人用与 BUG 仍旧太多，Firefox 早期也有类似的功能不过已经被取消了。&lt;/p&gt;
&lt;p&gt;Layers 功能可以帮助你自由的从立体角度去预览整个网页渲染的情况，或许可以在以下用途使用这个工具：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;检测网页渲染情况（懒加载）&lt;/li&gt;
&lt;li&gt;拆解网页动画效果&lt;/li&gt;
&lt;li&gt;了解当前页面 Z-index 层级高低对&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我来说最有感的是近期解决一些外部导入的组件时了解 Z-index 层级的关系有用，应该会对时常制作特殊视觉的前端会有帮助。&lt;/p&gt;
&lt;p&gt;

&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>Chromium 開發者工具 —— Layers</title><link>https://www.webdong.dev/zh-tw/shortpost/chromium-layer/#chromium-layer/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/chromium-layer/#chromium-layer/</guid><pubDate>Sun, 12 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;近期這個酷酷的功能正在在考慮投票關閉！原因是因為推出一段時間後太少人用與 BUG 仍舊太多，Firefox 早期也有類似的功能不過已經被取消了。&lt;/p&gt;
&lt;p&gt;Layers 功能可以幫助你自由的從立體角度去預覽整個網頁渲染的情況，或許可以在以下用途使用這個工具：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;檢測網頁渲染情況（懶加載）&lt;/li&gt;
&lt;li&gt;拆解網頁動畫效果&lt;/li&gt;
&lt;li&gt;了解當前頁面 Z-index 層級高低對&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我來說最有感的是近期解決一些外部導入的元件時了解 Z-index 層級的關係有用，應該會對時常製作特殊視覺的前端會有幫助。&lt;/p&gt;
&lt;p&gt;

&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>Visualizing JSON Data - JSON Crack</title><link>https://www.webdong.dev/en/shortpost/visualize-json/#visualize-json/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/visualize-json/#visualize-json/</guid><pubDate>Sat, 11 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Sharing a great tool I use for visualizing data — JSON Crack&lt;/p&gt;
&lt;p&gt;Sometimes, when you get a large response from a third-party API, it can be quite challenging to read and find the target data. In such cases, visualizing the data can be very helpful. JSON Crack is an online tool that converts JSON (or other common data formats) into charts.&lt;/p&gt;
&lt;p&gt;For me, its highlights are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Visualized data&lt;/li&gt;
&lt;li&gt;Automatic type generation&lt;/li&gt;
&lt;li&gt;Free and no login required&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;/p&gt;
</content:encoded><category>Share</category></item><item><title>可视化 JSON 数据 - JSON Crack</title><link>https://www.webdong.dev/zh-cn/shortpost/visualize-json/#visualize-json/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/visualize-json/#visualize-json/</guid><pubDate>Sat, 11 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;分享一个我自己在接数据时视觉化辅助的好工具 —— JSON Crack&lt;/p&gt;
&lt;p&gt;有时候从第三方 API 拿到一大包回应光是读起来找到目标数据就很吃力，所以这时候通过视觉化数据辅助就方便很多。JSON Crack 是一个把 JSON （或其他常见数据格式）转换成图表的线上网站。&lt;/p&gt;
&lt;p&gt;对我来说它的亮点是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;视觉化数据&lt;/li&gt;
&lt;li&gt;自动生成类型&lt;/li&gt;
&lt;li&gt;免费免登录&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;/p&gt;
</content:encoded><category>Share</category></item><item><title>可視化 JSON 資料 - JSON Crack</title><link>https://www.webdong.dev/zh-tw/shortpost/visualize-json/#visualize-json/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/visualize-json/#visualize-json/</guid><pubDate>Sat, 11 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;分享一個我自己在接資料時視覺化輔助的好工具 —— JSON Crack&lt;/p&gt;
&lt;p&gt;有時候從第三方 API 拿到一大包回應光是讀起來找到目標資料就很吃力，所以這時候透過視覺化資料輔助就方便很多。JSON Crack 是一個把 JSON （或其他常見資料格式）轉換成圖表的線上網站。&lt;/p&gt;
&lt;p&gt;對我來說它的亮點是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;視覺化資料&lt;/li&gt;
&lt;li&gt;自動生成型別&lt;/li&gt;
&lt;li&gt;免費免登入&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;/p&gt;
</content:encoded><category>Share</category></item><item><title>How do different teams consolidate and document development practices?</title><link>https://www.webdong.dev/en/shortpost/document-culture/#document-culture/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/document-culture/#document-culture/</guid><pubDate>Fri, 10 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;Handover between team departments&lt;/li&gt;
&lt;li&gt;Architectural design choices, technical background&lt;/li&gt;
&lt;li&gt;Team synergy&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I really want to improve team documentation, but I always find it hard to find time to record experiences and consensus. Even when documents are recorded, there is no time to digest them, and they often get forgotten in some corner.&lt;/p&gt;
&lt;p&gt;The recent goal is: in the product, I hope to start trying to implement a BDD (Behavior-driven development) model that integrates testing, development, and business in new projects, allowing different fields to jointly maintain and collaborate on unified documentation. As for the fragmented knowledge and pitfall experiences, they are currently managed and recorded in Notion, and I need to find time to organize and archive them to ensure that new joiners can get up to speed immediately!&lt;/p&gt;
&lt;p&gt;Seeing the technical blogs of impressive companies is quite inspiring: &lt;a href=&quot;https://dropbox.tech&quot;&gt;dropbox.tech&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>不知道不同团队是如何巩固与记录开发制度的？</title><link>https://www.webdong.dev/zh-cn/shortpost/document-culture/#document-culture/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/document-culture/#document-culture/</guid><pubDate>Fri, 10 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;团队部门领域间交接&lt;/li&gt;
&lt;li&gt;架构设计抉择、技术背景&lt;/li&gt;
&lt;li&gt;团队默契&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;很想重视文件，但总是找不到时间去记录补足经验和共识，甚至文件记录下来也没有时间去消化，还会被遗忘在某个角落。&lt;/p&gt;
&lt;p&gt;近期目标是：在产品上希望在新的专案能开始尝试导入测试、开发、商业一体的 BDD （Behavior-driven development）模式，让不同领域共同维护与合作统一的文件。至于琐碎的知识和踩坑经验目前还是零散的用 Notion 管理记录，要找时间整理归档确保新加入的人也能马上上手！&lt;/p&gt;
&lt;p&gt;看到厉害公司的技术博客会有被激励的感觉：&lt;a href=&quot;https://dropbox.tech&quot;&gt;dropbox.tech&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>不知道不同團隊是如何鞏固與紀錄開發制度的？</title><link>https://www.webdong.dev/zh-tw/shortpost/document-culture/#document-culture/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/document-culture/#document-culture/</guid><pubDate>Fri, 10 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;團隊部門領域間交接&lt;/li&gt;
&lt;li&gt;架構設計抉擇、技術背景&lt;/li&gt;
&lt;li&gt;團隊默契&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;很想重視文件，但總是找不到時間去記錄補足經驗和共識，甚至文件記錄下來也沒有時間去消化，還會被遺忘在某個角落。&lt;/p&gt;
&lt;p&gt;近期目標是：在產品上希望在新的專案能開始嘗試導入測試、開發、商業一體的 BDD （Behavior-driven development）模式，讓不同領域共同維護與合作統一的文件。至於瑣碎的知識和踩坑經驗目前還是零散的用 Notion 管理紀錄，要找時間整理歸檔確保新加入的人也能馬上上手！&lt;/p&gt;
&lt;p&gt;看到厲害公司的技術部落格會有被激勵的感覺：&lt;a href=&quot;https://dropbox.tech&quot;&gt;dropbox.tech&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>Handling Currency, Units, and Time Conversions with Native JavaScript</title><link>https://www.webdong.dev/en/shortpost/js-intl/#js-intl/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/js-intl/#js-intl/</guid><pubDate>Thu, 09 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Recently, I rewrote a project that handles price displays, which required showing currency, thousand separators, and omitting decimal points... The old project&apos;s approach was to write individual functional functions and combine them to convert currency, which was quite cumbersome to use.&lt;/p&gt;
&lt;p&gt;So, I searched through the Vue i18n multilingual files I was using and found that it supports number conversion, which is fundamentally based on the native JavaScript &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl&quot;&gt;Intl&lt;/a&gt;. The Intl object is a namespace for the ECMAScript Internationalization API, providing accurate string comparison, number formatting, and date-time formatting.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;However, one thing I found puzzling is why the locale zh-TW only converts to the symbol $? Who would think that $123,456... represents New Taiwan Dollars!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=FUngCjDzFDo&quot;&gt;Social Media Style Number Formatting in JS - Beyond Fireship&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Frontend</category></item><item><title>处理金钱、单位、时间的转换原生 JavaScript 就办得到</title><link>https://www.webdong.dev/zh-cn/shortpost/js-intl/#js-intl/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/js-intl/#js-intl/</guid><pubDate>Thu, 09 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;近期重写项目处理价格标示需要替金额标示币别、千分位分隔、小数点省略这些东西……旧项目做法是撰写个别功能函数并组合起来去转换金钱，使用起来蛮麻烦的。&lt;/p&gt;
&lt;p&gt;于是翻了一下使用的 Vue i18n 多语言文件发现有支持数字转换，而底层就是用到 JavaScript 原生的 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl&quot;&gt;Intl&lt;/a&gt;。Intl 对象是 ECMAScript 国际化 API 的一个命名空间，它提供精确的字符串对比、数字格式化与日期时间格式化。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;不过有个让我很不解的地方是为什么语言是 zh-TW 转换出来符号只有 $？有谁会觉得 $123,456... 是代表新台币！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=FUngCjDzFDo&quot;&gt;Social Media Style Number Formatting in JS - Beyond Fireship&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Frontend</category></item><item><title>處理金錢、單位、時間的轉換原生 JavaScript 就辦得到</title><link>https://www.webdong.dev/zh-tw/shortpost/js-intl/#js-intl/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/js-intl/#js-intl/</guid><pubDate>Thu, 09 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;近期重寫專案處理價錢標示需要替金額標示幣別、千分位分隔、小數點省略這些東西……舊專案做法是撰寫個別功能函式並組合起來去轉換金錢，使用起來蠻麻煩的。&lt;/p&gt;
&lt;p&gt;於是翻了一下使用的 Vue i18n 多語系文件發現有支援數字轉換，而底層就是用到 JavaScript 原生的 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl&quot;&gt;Intl&lt;/a&gt;。Intl 物件是 ECMAScript 國際化 API 的一個命名空間，它提供精確的字串對比、數字格式化與日期時間格式化。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;不過有個讓我很不解的地方是為什麼語系是 zh-TW 轉換出來符號只有 $？有誰會覺得 $123,456... 是代表新台幣！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=FUngCjDzFDo&quot;&gt;Social Media Style Number Formatting in JS - Beyond Fireship&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Frontend</category></item><item><title>About Handmade</title><link>https://www.webdong.dev/en/shortpost/handmade/#handmade/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/handmade/#handmade/</guid><pubDate>Wed, 08 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The term &quot;Handmade&quot; only showed its value after the Industrial Revolution and the advent of mechanized production, because before that, everything was made purely by hand. Similarly, will the current situation where AI is making strides in various fields lead to &quot;pure handmade techniques and ideas in various fields&quot; gradually becoming a selling point?&lt;/p&gt;
&lt;p&gt;We are still in an era where information flows freely and the vast majority of content is purely handmade. We can go online and exchange ideas with real people, seeking high-quality information that we like. From a certain perspective, this might be the best era.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.kyomind.tw/not-by-ai/&quot;&gt;Is it necessary to label articles as Not By AI? I think it&apos;s completely unnecessary&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I believe that anyone who writes a blog would be interested in this article, and I am no exception.&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>How to quickly visualize the boundaries between web elements?</title><link>https://www.webdong.dev/en/shortpost/outline-website/#outline-website/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/outline-website/#outline-website/</guid><pubDate>Wed, 08 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You can add outlines to all web elements using a universal selector. Simply add the following extra styles in your browser (usually, you can open the browser&apos;s developer tools and click the + icon to add a new style).&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;* {
  outline: 1px solid red;
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>Frontend</category></item><item><title>关于纯手工</title><link>https://www.webdong.dev/zh-cn/shortpost/handmade/#handmade/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/handmade/#handmade/</guid><pubDate>Wed, 08 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;「纯手工」这个词只在工业革命后机械化生产才展现价值，因为在这之前任何东西都是纯手工制作的。同样的情境换套用现在 AI 在各个领域大展身手会不会直到「各领域技术与想法的纯手工」也会逐渐成为卖点？&lt;/p&gt;
&lt;p&gt;我们还在一个信息流通自由并且绝大多数内容都是纯手工的时代，可以上网和真实的人相互交流想法，索取自己喜欢的优质资讯，某种角度来说说不定是最好的年代。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.kyomind.tw/not-by-ai/&quot;&gt;为文章标注 Not By AI？ 我觉得大可不必&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;觉得写博客的人应该都会对这篇文章感到兴趣，我也不例外。&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>想要快速视觉化网页元素之间的边界可以怎么做？</title><link>https://www.webdong.dev/zh-cn/shortpost/outline-website/#outline-website/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/outline-website/#outline-website/</guid><pubDate>Wed, 08 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;可以替所有网页元素添加外框使用通用选取器，直接在浏览器中添加以下额外样式即可（通常只要打开浏览器终端样式区块找 + 号添加新样式即可）。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;* {
  outline: 1px solid red;
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>Frontend</category></item><item><title>關於純手工</title><link>https://www.webdong.dev/zh-tw/shortpost/handmade/#handmade/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/handmade/#handmade/</guid><pubDate>Wed, 08 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;「純手工」這個詞只在工業革命後機械化生產才展現價值，因為在這之前任何東西都是純手工製作的。同樣的情境換套用現在 AI 在各個領域大展身手會不會直到「各領域技術與想法的純手工」也會逐漸成為賣點？&lt;/p&gt;
&lt;p&gt;我們還在一個信息流通自由並且絕大多數內容都是純手工的時代，可以上網和真實的人相互交流想法，索取自己喜歡的優質資訊，某種角度來說說不定是最好的年代。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.kyomind.tw/not-by-ai/&quot;&gt;為文章標註 Not By AI？ 我覺得大可不必&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;覺得寫部落格的人應該都會對這篇文章感到興趣，我也不例外。&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>想要快速視覺化網頁元素之間的邊界可以怎麼做？</title><link>https://www.webdong.dev/zh-tw/shortpost/outline-website/#outline-website/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/outline-website/#outline-website/</guid><pubDate>Wed, 08 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;可以替所有網頁元素添加外框使用通用選取器，直接在瀏覽器中添加以下額外樣式即可（通常只要打開瀏覽器終端樣式區塊找 + 號添加新樣式即可）。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;* {
  outline: 1px solid red;
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>Frontend</category></item><item><title>The Origin of the Database Icon</title><link>https://www.webdong.dev/en/shortpost/database-icon/#database-icon/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/database-icon/#database-icon/</guid><pubDate>Wed, 01 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I have always been curious why databases are represented with a cylinder icon. Some say it represents a disk pack, Hard Disk Drive (HDD), or a CD. I remember when I was a child, I had to insert 5 CDs in sequence to complete a game installation, but that experience quickly faded from my childhood.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/2822650/why-is-a-database-always-represented-with-a-cylinder&quot;&gt;Why is a database always represented with a cylinder? [closed]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ux.stackexchange.com/questions/31784/what-is-the-origin-meaning-of-the-icon-used-for-database&quot;&gt;What is the origin / meaning of the icon used for &quot;database&quot;?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>How to Edit Web Page Content in Real Time?</title><link>https://www.webdong.dev/en/shortpost/design-mode/#design-mode/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/design-mode/#design-mode/</guid><pubDate>Wed, 01 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;You might think of pressing F12 to open the browser console and selecting the corresponding node to modify the text, but that&apos;s not fast enough!&lt;/p&gt;
&lt;p&gt;Try entering in the browser console: &lt;code&gt;document.designMode = &apos;on&apos;&lt;/code&gt; , and you can click on any web page element and edit its content. This is a property supported by all major browsers, used for convenient editing of client-side web pages.&lt;/p&gt;
&lt;p&gt;Congratulations, you&apos;ve gained a seemingly useful yet weird piece of web knowledge: &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Document/designMode&quot;&gt;designMode&lt;/a&gt;.&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>资料库图示的来由</title><link>https://www.webdong.dev/zh-cn/shortpost/database-icon/#database-icon/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/database-icon/#database-icon/</guid><pubDate>Wed, 01 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;一直很好奇数据库为什么都是用圆柱图示来表示，有人说是磁盘包、 Hard Disk Drive (HDD)或是光碟。记得小时候安装游戏要依序放入 5 张光碟片才能下载完成，不过这个经验很快就淡出我的童年了。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/2822650/why-is-a-database-always-represented-with-a-cylinder&quot;&gt;Why is a database always represented with a cylinder? [closed]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ux.stackexchange.com/questions/31784/what-is-the-origin-meaning-of-the-icon-used-for-database&quot;&gt;What is the origin / meaning of the icon used for &quot;database&quot;?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>想要及时编辑预览网页内容可以怎么做？</title><link>https://www.webdong.dev/zh-cn/shortpost/design-mode/#design-mode/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/design-mode/#design-mode/</guid><pubDate>Wed, 01 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;你可能会想到按下 F12 打开浏览器终端并选取对应的节点修改内文字，那还不够快！&lt;/p&gt;
&lt;p&gt;来试试看在浏览器终端输入： &lt;code&gt;document.designMode = &apos;on&apos;&lt;/code&gt; 就可以点选任意网页元素并编辑其内容了。这是各大浏览器皆有支持的属性，用于便利的编辑客户端网页。&lt;/p&gt;
&lt;p&gt;恭喜你获得了一个好像有用又偏门奇怪的网页知识 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Document/designMode&quot;&gt;designMode&lt;/a&gt; 。&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>資料庫圖示的來由</title><link>https://www.webdong.dev/zh-tw/shortpost/database-icon/#database-icon/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/database-icon/#database-icon/</guid><pubDate>Wed, 01 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;一直很好奇資料庫為什麼都是用圓柱圖示來表示，有人說是磁盤包、 Hard Disk Drive (HDD)或是光碟。記得小時候安裝遊戲要依序放入 5 張光碟片才能下載完成，不過這個經驗很快就淡出我的童年了。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/2822650/why-is-a-database-always-represented-with-a-cylinder&quot;&gt;Why is a database always represented with a cylinder? [closed]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ux.stackexchange.com/questions/31784/what-is-the-origin-meaning-of-the-icon-used-for-database&quot;&gt;What is the origin / meaning of the icon used for &quot;database&quot;?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>想要及時編輯預覽網頁內容可以怎麼做？</title><link>https://www.webdong.dev/zh-tw/shortpost/design-mode/#design-mode/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/design-mode/#design-mode/</guid><pubDate>Wed, 01 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;你可能會想到按下 F12 打開瀏覽器終端並選取對應的節點修改內文字，那還不夠快！&lt;/p&gt;
&lt;p&gt;來試試看在瀏覽器終端輸入： &lt;code&gt;document.designMode = &apos;on&apos;&lt;/code&gt; 就可以點選任意網頁元素並編輯其內容了。這是各大瀏覽器皆有支援的屬性，用於便利的編輯客戶端網頁。&lt;/p&gt;
&lt;p&gt;恭喜你獲得了一個好像有用又偏門奇怪的網頁知識 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Document/designMode&quot;&gt;designMode&lt;/a&gt; 。&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>Can you explain the difference between design systems and component libraries in the web domain?</title><link>https://www.webdong.dev/en/shortpost/design-system-and-component-library/#design-system-and-component-library/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/design-system-and-component-library/#design-system-and-component-library/</guid><pubDate>Wed, 24 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The intuitive thought is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🎨 Design System - The designer&apos;s thing, defining style and experience.&lt;/li&gt;
&lt;li&gt;🧱 Component Library - The developer&apos;s thing, defining user interface components.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🎨 A design system includes descriptions related to brand experience, such as colors, typography, accessibility rules, and tone of voice, similar to brand experience documentation. From the perspective of graphic design, it is similar to focusing on the visual identity (VI) part of a corporate identity system (CIS).&lt;/p&gt;
&lt;p&gt;🧱 A component library leans more towards practical aspects, collecting existing user interface patterns and defining them as components: how, why, and when to use or not use that component.&lt;/p&gt;
&lt;p&gt;In other words, they should not be distinguished by a specific professional field, but rather by the degree from concept to practical implementation. I also communicate with designers to maintain the overall component library to ensure consensus between both fields.&lt;/p&gt;
&lt;p&gt;Finally, what are the benefits of creating this large amount of &quot;documentation&quot;?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Consistency: A unified appearance and product experience, allowing for a common language across fields.&lt;/li&gt;
&lt;li&gt;Reducing repetitive work: Instead of planning a brand new user interface each time, breaking the interface down into reusable components increases efficiency. Not all products should spend time building a design system or component library, but when a product finds its market position and enters the maintenance phase, this infrastructure becomes quite important.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you want to learn about common user interface patterns or design systems, you can refer to: &lt;a href=&quot;https://component.gallery/&quot;&gt;Component Gallery&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>UI</category></item><item><title>你能说明设计系统与元件库在网页领域中的差异吗？</title><link>https://www.webdong.dev/zh-cn/shortpost/design-system-and-component-library/#design-system-and-component-library/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/design-system-and-component-library/#design-system-and-component-library/</guid><pubDate>Wed, 24 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;直觉的想法是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🎨 设计系统 - 设计者的东西，定义样式风格体验。&lt;/li&gt;
&lt;li&gt;🧱 组件库 - 开发者的东西，定义用户界面组件。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🎨 设计系统包含像是颜色、字体样式、无障碍规则、文案语气……等“代表品牌体验相关的描述”，类似品牌体验文件。从平面设计端的角度来说类似着重于企业识别系统 (CIS) 中视觉识别 (VI) 的部分。&lt;/p&gt;
&lt;p&gt;🧱 组件库更偏向实践层面，收集现有的用户界面模式并定义为组件：如何、为什么、什么时候应该或不应该去使用该组件。&lt;/p&gt;
&lt;p&gt;也就是说，其实并不应该通过某个专业领域去区分它们，而是从概念到落地实践的程度，我也会和设计者共同沟通维护整体组件库以确保双方领域达成共识。&lt;/p&gt;
&lt;p&gt;最后，建立这一大堆“文件”有什么好处？&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;一致性：统一外观与产品体验，使得横跨领域也能存在共通语言。&lt;/li&gt;
&lt;li&gt;减少重复工作：与其每次规划全新的用户界面，将界面分散为可复用的组件提高效率。并不是所有产品都应该花时间构建设计系统或组件库，但当产品找到市场定位进入维护期时，这些基础建设就相当重要。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;想要了解常见的用户界面模式或设计系统可以参考看看：&lt;a href=&quot;https://component.gallery/&quot;&gt;Component Gallery&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>UI</category></item><item><title>你能說明設計系統與元件庫在網頁領域中的差異嗎？</title><link>https://www.webdong.dev/zh-tw/shortpost/design-system-and-component-library/#design-system-and-component-library/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/design-system-and-component-library/#design-system-and-component-library/</guid><pubDate>Wed, 24 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;直覺的想法是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🎨 設計系統 - 設計者的東東，定義樣式風格體驗。&lt;/li&gt;
&lt;li&gt;🧱 元件庫 - 開發者的東東，定義使用者介面組件。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🎨 設計系統包含像是顏色、字體樣式、無障礙規則、文案語氣……等「代表品牌體驗相關的描述」，類似品牌體驗文件。從平面設計端的角度來說類似著重於企業識別系統 (CIS) 中視覺識別 (VI) 的部分。&lt;/p&gt;
&lt;p&gt;🧱 元件庫更偏向實踐層面，蒐集現有的使用者介面模式並定義為元件：如何、為什麼、什麼時候應該或不應該去使用該元件。&lt;/p&gt;
&lt;p&gt;也就是說，其實並不應該透過某個專業領域去區分它們，而是從概念到落地實踐的程度，我也會和設計者共同溝通維護整體元件庫以確保雙方領域達成共識。&lt;/p&gt;
&lt;p&gt;最後，建立這一大堆「文件」有什麼好處？&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;一致性：統一外觀與產品體驗，使得橫跨領域也能存在共通語言。&lt;/li&gt;
&lt;li&gt;減少重複工作：與其每次規劃全新的使用者介面，將介面分散為可復用的元件提高效率。並不是所有產品都應該花時間建構設計系統或元件庫，但當產品找到市場定位進入維護期時，這些基礎建設就相當重要。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;想要了解常見的使用者介面模式或設計系統可以參考看看：&lt;a href=&quot;https://component.gallery/&quot;&gt;Component Gallery&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>UI</category></item><item><title>Why are unstyled components so popular? Radix and Headless UI as examples</title><link>https://www.webdong.dev/en/shortpost/headless-ui/#headless-ui/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/headless-ui/#headless-ui/</guid><pubDate>Tue, 23 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;To avoid reinventing the wheel, using well-built UI to save development time and effort is quite normal. Typically, component libraries include considerations for style, logic, UX, usability, device compatibility, and more. We can easily use ready-made UI patterns and focus on solving the truly important business problems. Libraries like Bootstrap, Chakra, and MUI are well-known and established component libraries.&lt;/p&gt;
&lt;p&gt;So, if ordinary component libraries can meet the needs, what problems do unstyled components solve?&lt;/p&gt;
&lt;p&gt;Customization is the biggest issue. Ordinary component libraries come with a default style that is not easy to modify. While it is stable to hand over design choices to third parties, it also lacks flexibility. The emergence of unstyled components primarily addresses this problem. The interesting aspect of unstyled components like Radix and Headless UI is that they return the decision-making power of styles back to the developers while managing the issues that UI encounters beyond that.&lt;/p&gt;
&lt;p&gt;You can refer to &lt;a href=&quot;https://ui.shadcn.com/&quot;&gt;Shadcn&lt;/a&gt; for building component libraries based on various unstyled components.&lt;/p&gt;
&lt;p&gt;We often underestimate the details and effort required to create a UI. &lt;a href=&quot;https://www.youtube.com/watch?v=lY-RQjWeweo&quot;&gt;Next.js Conf 2021 Pedro Duarte&lt;/a&gt; mentioned that just the Dropdown Menu of Radix took an enormous amount of effort to create:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2000+ hours&lt;/li&gt;
&lt;li&gt;6 months&lt;/li&gt;
&lt;li&gt;50 reviews&lt;/li&gt;
&lt;li&gt;Over 1000 commits&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Frontend</category></item><item><title>举例 Radix、Headless UI，为什么无样式元件这么热门？</title><link>https://www.webdong.dev/zh-cn/shortpost/headless-ui/#headless-ui/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/headless-ui/#headless-ui/</guid><pubDate>Tue, 23 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;为了避免重复造轮子，使用包装好的 UI 来节省开发时间与精力是再正常不过的事，通常组件库包括了样式、逻辑、UX、适用性、设备兼容……等各方面的考量，我们可以很轻易地使用现成的 UI Pattern，专注于解决真正重要的商业问题，像是 Bootstrap、chakra、MUI 都是老牌常见的组件库。&lt;/p&gt;
&lt;p&gt;那么普通的组件库就能满足需求，无样式组件又在解决什么问题？&lt;/p&gt;
&lt;p&gt;客制化是最大的问题。普通组件库预设一定的风格样式，并且修改它们并不容易，近乎把设计抉择都交给第三方虽然很稳定但也缺少弹性，无样式组件出现便是主要于解决这个问题。Radix、Headless UI ……等无样式组件有趣的地方在于将样式的决定权归还给开发者，并打理在这之外 UI 会遇上的问题。&lt;/p&gt;
&lt;p&gt;在各种无样式组件上构建组件库可以参考看看 &lt;a href=&quot;https://ui.shadcn.com/&quot;&gt;Shadcn&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;我们常常低估一款 UI 制作所需要留意的细节与心力，&lt;a href=&quot;https://www.youtube.com/watch?v=lY-RQjWeweo&quot;&gt;Next.js Conf 2021 Pedro Duarte&lt;/a&gt; 提到光是 Radix 的 Dropdown Menu 就花费了极大的心力来制作：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2000+ 小时&lt;/li&gt;
&lt;li&gt;6 个月&lt;/li&gt;
&lt;li&gt;50 次审核&lt;/li&gt;
&lt;li&gt;1000 以上 commit&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Frontend</category></item><item><title>舉例 Radix、Headless UI，為什麼無樣式元件這麼熱門？</title><link>https://www.webdong.dev/zh-tw/shortpost/headless-ui/#headless-ui/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/headless-ui/#headless-ui/</guid><pubDate>Tue, 23 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;為了避免重複造輪子，使用包裝好 UI 來節省開發時間與精力是再正常不過的事，通常元件庫包括了樣式、邏輯、UX、適用性、裝置兼容……等各方面的考量，我們可以很輕易的使用現成的 UI Pattern ，專注於解決真正重要的商業問題，像是 Bootstrap、chakra、MUI 都是老牌常見的元件庫。&lt;/p&gt;
&lt;p&gt;那麼普通的元件庫就能滿足需求，無樣式元件又在解決什麼問題？&lt;/p&gt;
&lt;p&gt;客製化是最大的問題。普通元件庫預設一定的風格樣式，並且修改它們並不容易，近乎把設計抉擇都交給第三方雖然很穩定但也缺少彈性，無樣式元件出現便是主要於解決這個問題。Radix、Headless UI ……等無樣式元件有趣的地方在於將樣式的決定權歸還給開發者，並打理在這之外 UI 會遇上的問題。&lt;/p&gt;
&lt;p&gt;在各種無樣式元件上建構元件庫可以參考看看 &lt;a href=&quot;https://ui.shadcn.com/&quot;&gt;Shadcn&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;我們常常低估一款 UI 製作所需要留意的細節與心力，&lt;a href=&quot;https://www.youtube.com/watch?v=lY-RQjWeweo&quot;&gt;Next.js Conf 2021 Pedro Duarte&lt;/a&gt; 提到光是 Radix 的 Dropdown Menu 就花費了極大的心力來製作：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2000+ 小時&lt;/li&gt;
&lt;li&gt;6 個月&lt;/li&gt;
&lt;li&gt;50 次審核&lt;/li&gt;
&lt;li&gt;1000 以上 commit&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Frontend</category></item><item><title>About writing</title><link>https://www.webdong.dev/en/shortpost/about-writing/#about-writing/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/about-writing/#about-writing/</guid><pubDate>Mon, 22 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Recently, many feature-rich note-taking apps have emerged, and suddenly everyone is keen on building personal knowledge bases, constructing a &quot;second brain&quot; or a &quot;life operating system.&quot; I was also enthusiastic for a while but ended up either getting lost in tool settings or overcomplicating issues. In terms of running a blog, it was a failure, but personal growth was still greatly aided. As long as I know what I&apos;m doing, that&apos;s enough:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Buying a domain is a waste of money; after building the website, I didn&apos;t write any articles.&lt;/li&gt;
&lt;li&gt;Setting up a complete content management system (CMS) to manage content satisfies technical vanity, but I ended up paying for a server that I hardly use. Now, I’m taking a more relaxed writing approach. Writing should be done in an environment with minimal resistance. After a long day at work, having a mind full of stress makes it hard to write anything. I learned to let go and avoid premature optimization (Premature Optimization) and YAGNI (You aren&apos;t gonna need it!)!&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>关于写作</title><link>https://www.webdong.dev/zh-cn/shortpost/about-writing/#about-writing/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/about-writing/#about-writing/</guid><pubDate>Mon, 22 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;近期有许多功能齐全的笔记软件出现，突然间所有人也都热衷于打造个人知识库，构建「第二大脑」、「人生作业系统」。我也热衷一段时间过，结果不是迷失在工具设置上不然就是过度复杂化问题，就经营博客来说是失败的，但个人成长还是帮助很大，反正知道自己在做什么就好：&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;买网域浪费钱，网站建成也没在写文章&lt;/li&gt;
&lt;li&gt;建全套内容管理系统(CMS)管理内容，满足技术虚荣，白缴钱给没什么在用的服务器现在走开心就写作路线，写作要找个阻力最小的环境，都下班了还满脑压力是懒得写东西的。学会放手，避免未成熟最佳化(Premature Optimization)、YAGNI (You aren&apos;t gonna need it!)！&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>關於寫作</title><link>https://www.webdong.dev/zh-tw/shortpost/about-writing/#about-writing/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/about-writing/#about-writing/</guid><pubDate>Mon, 22 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;近期有許多功能齊全的筆記軟體出現，突然間所有人也都熱衷於打造個人知識庫，建構「第二大腦」、「人生作業系統」。我也熱衷一段時間過，結果不是迷失在工具設定上不然就是過度複雜化問題，就經營部落格來說是失敗的，但個人成長還是幫助很大，反正知道自己在做什麼就好：&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;買網域浪費錢，網站建成也沒在寫文章&lt;/li&gt;
&lt;li&gt;建全套內容管理系統(CMS)管理內容，滿足技術虛榮，白繳錢給沒什麼在用的伺服器現在走開心就寫作路線，寫作要找個阻力最小的環境，都下班了還滿腦壓力是懶得寫東西的。學會放手，避免未成熟最佳化(Premature Optimization)、YAGNI (You aren&apos;t gonna need it!)！&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>Building a Correct Web UI Should Not Be a Troublesome Issue</title><link>https://www.webdong.dev/en/shortpost/build-the-web/#build-the-web/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/build-the-web/#build-the-web/</guid><pubDate>Sun, 21 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;As a front-end engineer, my recent work has made me realize that many development challenges still revolve around the appearance and interactive behavior of the interface. It strikes me that the cost of developing and maintaining a customized UI is indeed too high for small teams.&lt;/p&gt;
&lt;p&gt;On one hand, there’s a desire to &quot;quickly launch products,&quot; while on the other, there’s a hope for &quot;high-quality outcomes.&quot; This has made it consistently difficult to do the right thing.&lt;/p&gt;
&lt;p&gt;Doing the right thing involves achieving performance, usability, maintainability, testability, search engine optimization, cross-platform compatibility, multilingual support, and more. I’ve identified some of the problems that existing teams encounter, as well as key conclusions on how to address these issues:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Keep the UI simple and straightforward.&lt;/li&gt;
&lt;li&gt;Adhere to browser standards.&lt;/li&gt;
&lt;li&gt;Make good use of existing packages, style libraries, and headless UI.&lt;/li&gt;
&lt;li&gt;Automate documentation development, and encourage designers to adapt to the ever-evolving web.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Frontend</category></item><item><title>建构正确的网页 UI 不应该是个麻烦的问题</title><link>https://www.webdong.dev/zh-cn/shortpost/build-the-web/#build-the-web/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/build-the-web/#build-the-web/</guid><pubDate>Sun, 21 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;身为前端工程近期工作的感悟是很多时候开发问题还是陷于界面的外观、行为互动层面上，不禁让我感叹客制化 UI 的开发与维护成本对小团队来说实在是太高了。&lt;/p&gt;
&lt;p&gt;一方面希望「快速推出产品」而另一方面又希望有「高质量的实践成果」，结果就是做正确的事一直都很困难。&lt;/p&gt;
&lt;p&gt;正确的事包含：性能、适用性、可维护性、可测试性、搜索引擎优化、跨平台兼容性、多语言……思考并列出了一些现有团队遇到的问题，并且最重要的可以怎么面对这些问题的结论：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;保持 UI 的单纯朴素&lt;/li&gt;
&lt;li&gt;尊重浏览器标准&lt;/li&gt;
&lt;li&gt;善用现成套件、样式库、无头 Headless UI&lt;/li&gt;
&lt;li&gt;自动化文件开发与设计者会需要适应一直都在变化的网页。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Frontend</category></item><item><title>建構正確的網頁 UI 不應該是個麻煩的問題</title><link>https://www.webdong.dev/zh-tw/shortpost/build-the-web/#build-the-web/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/build-the-web/#build-the-web/</guid><pubDate>Sun, 21 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;身為前端工程近期工作的感悟是很多時候開發問題還是陷於介面的外觀、行為互動層面上，不經讓我感嘆客製化 UI 的開發與維護成本對小團隊來說實在是太高了。&lt;/p&gt;
&lt;p&gt;一方面希望「快速推出產品」而另一方面又希望有「高品質的實踐成果」，結果就是做正確的事一直都很困難。&lt;/p&gt;
&lt;p&gt;正確的事包含：效能、適用性、可維護性、可測試性、搜尋引擎最佳化、跨平台相容性、多語系……思考並列出了一些現有團隊遇到的問題，並且最重要的可以怎麼面對這些問題的結論：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;保持 UI 的單純樸素&lt;/li&gt;
&lt;li&gt;尊重瀏覽器標準&lt;/li&gt;
&lt;li&gt;善用現成套件、樣式庫、無頭 Headless UI&lt;/li&gt;
&lt;li&gt;自動化文件開發與設計者會需要適應一直都在變化的網頁。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Frontend</category></item><item><title>The fear of being replaced by AI</title><link>https://www.webdong.dev/en/shortpost/ai-replace-huamn/#ai-replace-huamn/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/ai-replace-huamn/#ai-replace-huamn/</guid><pubDate>Sat, 20 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The fear of being replaced by AI stems from the fear that our own meaning will also be replaced, but as humans, creating meaning is an inherent gift. For example, one can carve wood into a spoon, giving the wood the meaning of &quot;a tool for convenient eating.&quot; The spoon has strong functionality, but it cannot assign meaning to itself or other things, just like today&apos;s AI.&lt;/p&gt;
&lt;p&gt;My thoughts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Learn with good tools.&lt;/li&gt;
&lt;li&gt;Actively seek different meanings.&lt;/li&gt;
&lt;li&gt;No one can predict the future; if perfect AI really appears, it is human, not a machine, similar to the sudden arrival of imaginative and intelligent aliens—let&apos;s deal with it when it happens.&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>AI 取代人类的恐惧</title><link>https://www.webdong.dev/zh-cn/shortpost/ai-replace-huamn/#ai-replace-huamn/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/ai-replace-huamn/#ai-replace-huamn/</guid><pubDate>Sat, 20 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;会害怕被 AI 取代原因是因为害怕自己的意义也会被取代，但作为人创造意义是天生赋予的。举例来说可以雕刻木头为汤匙，赋予木头「方便进食的工具」，汤匙有很强的功能性，但无法赋予自己或其他事情意义，就像现在的 AI 一样。&lt;/p&gt;
&lt;p&gt;我的想法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;有好工具就学。&lt;/li&gt;
&lt;li&gt;主动尝试寻找不同意义。&lt;/li&gt;
&lt;li&gt;没人能预测未来，如果真的出现完美 AI，那是人不是机器，想象和聪明外星人突然出现一样，遇到再说。&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>AI 取代人類的恐懼</title><link>https://www.webdong.dev/zh-tw/shortpost/ai-replace-huamn/#ai-replace-huamn/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/ai-replace-huamn/#ai-replace-huamn/</guid><pubDate>Sat, 20 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;會害怕被 AI 取代原因是因為害怕自己的意義也會被取代，但作為人創造意義是天生賦予的。舉例來說可以雕刻木頭為湯匙，賦予木頭「方便進食的工具」，湯匙有很強的功能性，但無法賦予自己或其他事情意義，就像現在的 AI 一樣。&lt;/p&gt;
&lt;p&gt;我的想法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;有好工具就學。&lt;/li&gt;
&lt;li&gt;主動嘗試尋找不同意義。&lt;/li&gt;
&lt;li&gt;沒人能預測未來，如果真的出現完美 AI，那是人不是機器，想像和聰明外星人突然出現一樣，遇到再說。&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>How can we validate the correctness of client-side data?</title><link>https://www.webdong.dev/en/shortpost/zod/#zod/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/zod/#zod/</guid><pubDate>Fri, 19 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Typically, data validation is done using JSDoc or TypeScript for type annotations. Although TypeScript helps us check the &quot;types before execution,&quot; there is still a possibility of runtime errors due to data not matching expectations after being compiled to JavaScript, usually stemming from external data (forms, URLs, LocalStorage, API responses).&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;At this point, it is recommended to use Zod for client-side data validation. Whether in Astro, tRPC, React Hook Form, or VeeValidate, Zod is utilized behind the scenes. It is a simple yet powerful library worth understanding. Recently, I had a strong experience rewriting a webpage that needed to determine its content through URL Query, and Zod made it easy and elegant to complete the validation logic.&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>如何验证客户端资料的正确性</title><link>https://www.webdong.dev/zh-cn/shortpost/zod/#zod/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/zod/#zod/</guid><pubDate>Fri, 19 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;验证客户端数据正确性可以怎么做？通常验证数据的正确性会使用 JSDoc 或是 TypeScript 用于标注类型，虽然 TypeScript 可以帮助我们检查程序「执行之前的类型」，但在编译成 JavaScript 后还是仍有可能会于执行时因为数据与预期不符而出错，通常源自外部的数据（表单、网址、LocalStorage、API 响应）。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;这时候就推荐使用 Zod 来进行客户端的数据验证，不管是在 Astro、tRPC、React Hook Form、VeeValidate 背后都有使用到 Zod，是个简单但充满威力的套件值得去了解。很有感的是近期重写一款需要通过 URL Query 来决定页面内容的网页，通过 Zod 很轻松优雅的就把验证的逻辑完成了。&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>如何驗證客戶端資料的正確性</title><link>https://www.webdong.dev/zh-tw/shortpost/zod/#zod/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/zod/#zod/</guid><pubDate>Fri, 19 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;驗證客戶端資料正確性可以怎麼做？通常驗證資料的正確性會使用 JSDoc 或是 TypeScript 用於標註型別，雖然 TypeScript 可以幫助我們檢查程式「執行之前的型別」，但在編譯成 JavaScript 後還是仍有可能會於執行時因為資料與預期不符而出錯，通常源自外部的資料（表單、網址、LocalStorage、API 回應）。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;這時候就推薦使用 Zod 來進行客戶端的資料驗證，不管是在 Astro、tRPC、React Hook Form、VeeValidate 背後都有使用到 Zod，是個簡單但充滿威力的套件值得去了解。很有感的是近期重寫一款需要透過 URL Query 來決定頁面內容的網頁，透過 Zod 很輕鬆優雅的就把驗證的邏輯完成了。&lt;/p&gt;
</content:encoded><category>Frontend</category></item><item><title>About Running a Blog</title><link>https://www.webdong.dev/en/shortpost/about-blogging/#about-blogging/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/about-blogging/#about-blogging/</guid><pubDate>Mon, 15 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Writing a blog quietly yields more than expected: &quot;I admire blogs that are well-structured, beautifully written, and authoritative, but I also have a soft spot for those that come with a humble attitude; it&apos;s okay to just write about what you know.&quot;&lt;/p&gt;
&lt;p&gt;Seeing my journey of stops and starts can remind anyone that we are all thinking about how to better solve problems.&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>How to add search functionality to a blog by using pagefind?</title><link>https://www.webdong.dev/en/shortpost/pagefind/#pagefind/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/pagefind/#pagefind/</guid><pubDate>Mon, 15 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If you need some search functionality you can checkout to the NPM package - pagefind.&lt;/p&gt;
&lt;p&gt;Pagefind is a search package written in Rust and implemented through WebAssembly. Its purpose has been clear from the beginning: &quot;to provide a ready-to-use search solution for any static webpage.&quot;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fast search&lt;/li&gt;
&lt;li&gt;Provides ready-made UI&lt;/li&gt;
&lt;li&gt;Supports search in Chinese and Japanese&lt;/li&gt;
&lt;li&gt;Supports search for any static files&lt;/li&gt;
&lt;li&gt;Supports categorization, sorting, custom search page meta data, and index importance adjustment&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Recently, I completely switched my blog from Fuse.js (a fuzzy search package) to pagefind. I recommend anyone writing a static blog to give it a try; pagefind has just released its official version 1.0.&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>关于经营博客</title><link>https://www.webdong.dev/zh-cn/shortpost/about-blogging/#about-blogging/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/about-blogging/#about-blogging/</guid><pubDate>Mon, 15 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;默默的写博客收益比想象中大：「我欣赏结构合理、撰写精妙、充满权威的博客，但也对那些带着谦卑姿态的博客情有独钟，就算只写出你所知道的也没关系。」&lt;/p&gt;
&lt;p&gt;看到自己走走停停的旅程可以提醒任何人我们都在思考如何更好的解决问题。&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>制作了博客想要额外添加文章搜索功能该怎么办？</title><link>https://www.webdong.dev/zh-cn/shortpost/pagefind/#pagefind/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/pagefind/#pagefind/</guid><pubDate>Mon, 15 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;所有使用静态生成的网站都可以参考看看 pagefind 这个 NPM 套件。&lt;/p&gt;
&lt;p&gt;pagefind 是一个以 Rust 编写并且通过执行 WebAssembly 来实现的搜索套件，它的诞生原因从一开始就非常明确：“替任何静态网页提供现成可用的搜索方案”&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;搜索快速&lt;/li&gt;
&lt;li&gt;提供现成 UI&lt;/li&gt;
&lt;li&gt;支持中日语系搜索&lt;/li&gt;
&lt;li&gt;支持任何静态文件搜索&lt;/li&gt;
&lt;li&gt;支持分类、排序、自定义搜索页面 Meta 资料、索引重要程度调整&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;近期我的博客也从 Fuse.js (模糊搜索套件) 整个换成 pagefind 啦，推荐任何写静态博客的人试试看，pagefind 刚出正式 1.0 版本。&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>關於經營部落格</title><link>https://www.webdong.dev/zh-tw/shortpost/about-blogging/#about-blogging/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/about-blogging/#about-blogging/</guid><pubDate>Mon, 15 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;默默的寫部落格收益比想像中大：「我欣賞結構合理、撰寫精妙、充滿權威的部落格，但也對那些帶著謙卑姿態的部落格情有獨鍾，就算只寫出你所知道的也沒關係。」&lt;/p&gt;
&lt;p&gt;看到自己走走停停的旅程可以提醒任何人我們都在思考如何更好的解決問題。&lt;/p&gt;
</content:encoded><category>Non-Technical Discussion</category></item><item><title>製作了部落格想要額外添加文章搜尋功能該怎麼辦？</title><link>https://www.webdong.dev/zh-tw/shortpost/pagefind/#pagefind/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/pagefind/#pagefind/</guid><pubDate>Mon, 15 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;所有使用靜態生成的網站都可以參考看看 pagefind 這個 NPM 套件。&lt;/p&gt;
&lt;p&gt;pagefind 是一個以 Rust 編寫並且透過執行 WebAssembly 來實現的搜尋套件，它的誕生原因從一開始就非常明確：「替任何靜態網頁提供現成可用的搜尋方案」&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;搜尋快速&lt;/li&gt;
&lt;li&gt;提供現成 UI&lt;/li&gt;
&lt;li&gt;支援中日語系搜尋&lt;/li&gt;
&lt;li&gt;支援任何靜態文件搜尋&lt;/li&gt;
&lt;li&gt;支援分類、排序、自定義搜尋頁面 Meta 資料、索引重要程度調整&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;近期我的部落格也從 Fuse.js (模糊搜索套件) 整個換成 pagefind 囉，推薦任何寫靜態部落格的人試試看，pagefind 剛出正式 1.0 版本。&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>Free Web Image Editors - Photopea</title><link>https://www.webdong.dev/en/shortpost/photopea/#photopea/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/photopea/#photopea/</guid><pubDate>Sun, 14 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If you are managing a website or self-media, editing images is a very common task. However, not everyone is a professional designer willing to subscribe to the fully-featured but expensive Adobe suite. Most of the time, the need is just to convert an image format, crop, or compress images. Therefore, I recommend trying Photopea (raster editing) or Vectorpea (vector editing). They are web-based tools that allow for quick editing in any environment as long as you open a browser.&lt;/p&gt;
&lt;p&gt;Currently, all the images on my blog are edited using &lt;a href=&quot;https://www.photopea.com/&quot;&gt;Photopea&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Free&lt;/li&gt;
&lt;li&gt;Available anytime, anywhere&lt;/li&gt;
&lt;li&gt;The interface and shortcuts are very similar to Photoshop&lt;/li&gt;
&lt;li&gt;Supports multiple image formats&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Share</category></item><item><title>推荐免费网页图片编辑器 —— Photopea</title><link>https://www.webdong.dev/zh-cn/shortpost/photopea/#photopea/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/photopea/#photopea/</guid><pubDate>Sun, 14 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;如果有在经营网站或经营自媒体那么编辑图片是非常常见的事，但不是每个人都是专职的设计者愿意去订阅功能齐全但昂贵的 Adobe 全家桶软件。大多数时候需求就是转个图片格式、裁切压缩图片，那么推荐试试看 Photopea (点阵编辑) 或 Vectorpea (向量编辑)，它们是基于网页的工具，在任何环境只要打开浏览器就可以迅速编辑。&lt;/p&gt;
&lt;p&gt;现在我的博客所有图片都是用 &lt;a href=&quot;https://www.photopea.com/&quot;&gt;Photopea&lt;/a&gt; 编辑的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;免费&lt;/li&gt;
&lt;li&gt;随时随地使用&lt;/li&gt;
&lt;li&gt;界面与快捷键都与 Photoshop 很像&lt;/li&gt;
&lt;li&gt;支持多种图片格式&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Share</category></item><item><title>推薦免費網頁圖片編輯器 —— Photopea</title><link>https://www.webdong.dev/zh-tw/shortpost/photopea/#photopea/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/photopea/#photopea/</guid><pubDate>Sun, 14 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;如果有在經營網站或經營自媒體那麼編輯圖片是非常常見的事，但不是每個人都是專職的設計者願意去訂閱功能齊全但昂貴的 Adobe 全家桶軟體。大多時候需求就是轉個圖片格式、裁切壓縮圖片，那麼推薦試試看 Photopea (點陣編輯) 或 Vectorpea (向量編輯)，它們是基於網頁的工具，在任何環境只要打開瀏覽器就可以迅速編輯。&lt;/p&gt;
&lt;p&gt;現在我的部落格所有圖片都是用 &lt;a href=&quot;https://www.photopea.com/&quot;&gt;Photopea&lt;/a&gt; 編輯的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;免費&lt;/li&gt;
&lt;li&gt;隨時隨地使用&lt;/li&gt;
&lt;li&gt;介面與快捷鍵都與 Photoshop 很像&lt;/li&gt;
&lt;li&gt;支援多種圖片格式&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Share</category></item><item><title>How long has it been since you upgraded the package versions of your project?</title><link>https://www.webdong.dev/en/shortpost/dependency-upgrade/#dependency-upgrade/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/dependency-upgrade/#dependency-upgrade/</guid><pubDate>Sat, 13 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Upgrading package versions is the most effective way to avoid vulnerabilities. Although it is very important, it is often difficult to face formally. Upgrading packages usually brings the following feelings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It feels like nothing meaningful has been produced.&lt;/li&gt;
&lt;li&gt;The painful process of reviewing documentation to understand the differences between old and new versions, and resolving issues caused by breaking changes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In my experience, due to years of neglecting updates on an old project, the entire project gradually became a chunk of code that was very difficult to upgrade, with too many things to change... maybe next time 😑. We should find ways to alleviate the pain points of version upgrades, such as if the code is hosted on GitHub and you don&apos;t mind using GitHub Actions, you can try &lt;a href=&quot;https://docs.github.com/en/code-security/getting-started/dependabot-quickstart-guide&quot;&gt;Dependabot&lt;/a&gt; for a painless introduction to automating the detection of package updates. I&apos;ve also seen some projects use &lt;a href=&quot;https://docs.renovatebot.com/&quot;&gt;Renovate&lt;/a&gt;, or tools like NX, which also provide commands for automated updates.&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>Chatting About TDD Concepts with Friends</title><link>https://www.webdong.dev/en/shortpost/tdd-talk/#tdd-talk/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/tdd-talk/#tdd-talk/</guid><pubDate>Sat, 13 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A snippet of a conversation with a friend: &quot;If we switch to TDD for product requirements, it means all those tests we wrote are wasted.&quot;&lt;/p&gt;
&lt;p&gt;My thought is this: &quot;Tests are a byproduct of TDD.&quot;&lt;/p&gt;
&lt;p&gt;Product behavior &amp;gt; Tests (automated documentation) &amp;gt; Practice (code). This means that when product behavior changes, the documentation will naturally change. The hassle of having to rewrite things comes from the fact that sometimes we don&apos;t even have good documentation and just dive into coding.&lt;/p&gt;
&lt;p&gt;Using TDD is simply a steady approach to simultaneously writing documentation and developing. Then BDD sees the value of tests as automated documentation, creating documents that both business and development sides can understand and maintain together.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TDD - Test-driven development&lt;/li&gt;
&lt;li&gt;BDD - Behavior-driven development&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>你有多久没有升级专案的套件版本了呢？</title><link>https://www.webdong.dev/zh-cn/shortpost/dependency-upgrade/#dependency-upgrade/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/dependency-upgrade/#dependency-upgrade/</guid><pubDate>Sat, 13 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;升级套件版本是避免漏洞最有效的手段，虽然是一件很重要的事但却很难被正式面对，升级套件通常带来这样的感受：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;好像没做出什么有意义的产出。&lt;/li&gt;
&lt;li&gt;痛苦的查阅文档了解新旧版本差异，解破坏性改动造成的问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我自己的经验是在旧项目上由于长年的疏于更新，慢慢的整个项目变成一坨很难升级的代码，要改的东西太多了……就下次吧 😑 应该找方法减轻版本升级的痛点，像是如果代码放在 GitHub 上并且不排斥使用 GitHub Action 的话可以尝试看看 &lt;a href=&quot;https://docs.github.com/en/code-security/getting-started/dependabot-quickstart-guide&quot;&gt;Dependabot&lt;/a&gt; 无痛的导入自动化侦测套件更新的流程，也有看过某些项目使用 &lt;a href=&quot;https://docs.renovatebot.com/&quot;&gt;Renovate&lt;/a&gt;，或者是 NX 这样的 Smart Build Tool 也提供自动化更新的指令。&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>与朋友的 TDD 观念闲谈</title><link>https://www.webdong.dev/zh-cn/shortpost/tdd-talk/#tdd-talk/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/tdd-talk/#tdd-talk/</guid><pubDate>Sat, 13 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;和朋友闲聊的对话片段：「如果现在工作改用 TDD 开发产品需求改变等于撰写那些测试都报废了」。&lt;/p&gt;
&lt;p&gt;我的想法是这样：「测试是 TDD 的副产品」&lt;/p&gt;
&lt;p&gt;产品行为 &amp;gt; 测试（自动化文件）&amp;gt; 实践（代码）也就是说当产品行为改变时文件理所当然会改，会觉得麻烦东西要重写是因为有时候我们甚至连良好的文件都不存在就直接实践下去。&lt;/p&gt;
&lt;p&gt;使用 TDD 只是稳扎稳打的在同时进行文件编写与开发而已。然后 BDD 就是看到测试作为自动化文件的价值，在这个基础上制作商业与开发端都能共同理解与维护的文件。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TDD - Test-driven development&lt;/li&gt;
&lt;li&gt;BDD - Behavior-driven development&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>你有多久沒有升級專案的套件版本了呢？</title><link>https://www.webdong.dev/zh-tw/shortpost/dependency-upgrade/#dependency-upgrade/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/dependency-upgrade/#dependency-upgrade/</guid><pubDate>Sat, 13 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;升級套件版本是避免漏洞最有效的手段，雖然是一件很重要的事但卻很難被正式面對，升級套件通常帶來這樣的感受：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;好像沒做出什麼有意義的產出。&lt;/li&gt;
&lt;li&gt;痛苦的查閱文檔了解新舊版本差異，解破壞性改動造成的問題。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我自己的經驗是在舊專案上由於長年的疏於更新，慢慢的整個專案變成一坨很難升級的代碼，要改的東西太多了……就下次吧 😑 應該找方法減輕版本升級的痛點，像是如果代碼放在 GitHub 上並且不排斥使用 GitHub Action 的話可以嘗試看看 &lt;a href=&quot;https://docs.github.com/en/code-security/getting-started/dependabot-quickstart-guide&quot;&gt;Dependabot&lt;/a&gt; 無痛的導入自動化偵測套件更新的流程，也有看過某些專案使用 &lt;a href=&quot;https://docs.renovatebot.com/&quot;&gt;Renovate&lt;/a&gt;，或者是 NX 這樣的 Smart Build Tool 也提供自動化更新的指令。&lt;/p&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>與朋友的 TDD 觀念閒談</title><link>https://www.webdong.dev/zh-tw/shortpost/tdd-talk/#tdd-talk/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/tdd-talk/#tdd-talk/</guid><pubDate>Sat, 13 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;和朋友閒聊的對話片段：「如果現在工作改用 TDD 開發產品需求改變等於撰寫那些測試都報廢了」。&lt;/p&gt;
&lt;p&gt;我的想法是這樣：「測試是 TDD 的副產品」&lt;/p&gt;
&lt;p&gt;產品行為 &amp;gt; 測試（自動化文件）&amp;gt; 實踐（代碼）也就是說當產品行為改變時文件理所當然會改，會覺得麻煩東西要重寫是因為有時候我們甚至連良好的文件都不存在就直接實踐下去。&lt;/p&gt;
&lt;p&gt;使用 TDD 只是穩扎穩打的在同時進行文件編寫與開發而已。然後 BDD 就是看到測試作為自動化文件的價值，在這個基礎上製作商業與開發端都能共同理解與維護的文件。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TDD - Test-driven development&lt;/li&gt;
&lt;li&gt;BDD - Behavior-driven development&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Technical Discussion</category></item><item><title>How would you solve this dropdown menu styling issue?</title><link>https://www.webdong.dev/en/shortpost/dropdown-style/#dropdown-style/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/dropdown-style/#dropdown-style/</guid><pubDate>Thu, 11 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today, I worked on maintaining an old component, which is a button, when clicked, it extends a mobile menu. Due to historical reasons, its width and height can only be fixed dimensions. The goal is to add a shadow when the menu expands. How would you do it?&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Here, I have listed the solutions I could think of along with their trade-offs:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create a list containing the button that covers the button.&lt;/li&gt;
&lt;li&gt;Calculate the width and height of the button + menu and create an empty element with a shadow hidden behind it.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ultimately, I chose option 1. I wrote all the factors that change the button into the list button as well... very un-DRY. Why not option 2? Because calculating styles with JS is a scary thing; it&apos;s best to avoid it.&lt;/p&gt;
&lt;p&gt;Thanks to my colleague for telling me about the super obscure property of CSS &lt;code&gt;isolation&lt;/code&gt; to achieve some element ordering needs.&lt;/p&gt;
</content:encoded><category>CSS</category></item><item><title>你会如何解这个下拉式选单样式问题呢？</title><link>https://www.webdong.dev/zh-cn/shortpost/dropdown-style/#dropdown-style/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/dropdown-style/#dropdown-style/</guid><pubDate>Thu, 11 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;今日工作维护到一个陈年组件，它是一个按钮并且点击后会延伸出一个行动清单，由于历史因素它的宽高只能是写死的尺寸，目标是替清单展开时加上阴影，你会怎么做？&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;这里我把我能想到的解决问题的方案与取舍列出来：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;制作一个含按钮的清单覆盖住按钮。&lt;/li&gt;
&lt;li&gt;计算按钮 +清单的宽高并制作一个空元素套上阴影藏在背后。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;最终选择 1，我把一切改变按钮的因素同样写在清单按钮中……很不 DRY，为什么不是 2？ 因为用 JS 去计算样式是很可怕的事，最好不要这样做。&lt;/p&gt;
&lt;p&gt;感谢同事告诉我有 CSS &lt;code&gt;isolation&lt;/code&gt; 这个超偏门的属性去达成一些元素排序的需求。&lt;/p&gt;
</content:encoded><category>CSS</category></item><item><title>你會如何解這個下拉式選單樣式問題呢？</title><link>https://www.webdong.dev/zh-tw/shortpost/dropdown-style/#dropdown-style/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/dropdown-style/#dropdown-style/</guid><pubDate>Thu, 11 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;今日工作維護到一個陳年元件，它是一個按鈕並且點擊後會延伸出一個行動清單，由於歷史因素它的寬高只能是寫死的尺寸，目標是替清單展開時加上陰影，你會怎麼做？&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;這裡我把我能想到的解決問題的方案與取捨列出來：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;製作一個含按鈕的清單覆蓋住按鈕。&lt;/li&gt;
&lt;li&gt;計算按鈕 +清單的寬高並製作一個空元素套上陰影藏在背後。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;最終選擇 1，我把一切改變按鈕的因素同樣寫在清單按鈕中……很不 DRY，為什麼不是 2？ 因為用 JS 去計算樣式是很可怕的事，最好不要這樣做。&lt;/p&gt;
&lt;p&gt;感謝同事告訴我有 CSS &lt;code&gt;isolation&lt;/code&gt; 這個超偏門的屬性去達成一些元素排序的需求。&lt;/p&gt;
</content:encoded><category>CSS</category></item><item><title>Add Various Icons to Web Pages Using Iconify</title><link>https://www.webdong.dev/en/shortpost/iconify/#iconify/</link><guid isPermaLink="true">https://www.webdong.dev/en/shortpost/iconify/#iconify/</guid><pubDate>Tue, 09 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I highly suggest using &lt;a href=&quot;https://iconify.design/&quot;&gt;Iconify&lt;/a&gt; (open source) to use any kind of icons on web pages.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;My company originally used FontAwesome, and for my blog, I would find icons, cut them in Figma, and compress them with SVGO. No matter which method, it was super troublesome! There were often issues with not being able to find the ideal icon, until I accidentally encountered Nuxt icon during a project structure upgrade, which allows importing Iconify datasets. I fell in love with this package; now I can use any icon I want, saving a lot of hassle.&lt;/p&gt;
&lt;p&gt;Today&apos;s blog update also replaces all articles with Iconify:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Inline SVG directly eliminates nearly a hundred image requests&lt;/li&gt;
&lt;li&gt;Article page size reduced from 170 kb to 93 kb. Even if you don&apos;t use it immediately, it&apos;s quite convenient to find various icons at &lt;a href=&quot;https://icones.js.org/&quot;&gt;Icônes&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Frontend</category></item><item><title>使用 Iconify 在网页中加入各式各样的图示</title><link>https://www.webdong.dev/zh-cn/shortpost/iconify/#iconify/</link><guid isPermaLink="true">https://www.webdong.dev/zh-cn/shortpost/iconify/#iconify/</guid><pubDate>Tue, 09 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;要在网页中使用任何种类的 Icon 强烈建议可以考虑使用 &lt;a href=&quot;https://iconify.design/&quot;&gt;Iconify&lt;/a&gt; (开源)。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;我自己公司原先是使用 FontAwesome，博客则是自己找 Icon 开 Figma 切好且用 SVGO 去压缩，不管哪种方式都超麻烦！还时常有找不到理想 Icon 的问题，直到项目架构升级无意间碰到 Nuxt icon 可以引入 Iconify 的数据集就爱上这个套件，现在想用哪款 Icon 就用，省了一堆麻烦问题。&lt;/p&gt;
&lt;p&gt;今日博客更新推出也是将所有文章换成用 Iconify：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Inline SVG 直接砍掉近百个图片请求&lt;/li&gt;
&lt;li&gt;文章页 170 kb -&amp;gt; 93 kb 就算不马上用，到 &lt;a href=&quot;https://icones.js.org/&quot;&gt;Icônes&lt;/a&gt; 找找各式 Icon 也是挺方便的。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Frontend</category></item><item><title>使用 Iconify 在網頁中加入各式各樣的圖示</title><link>https://www.webdong.dev/zh-tw/shortpost/iconify/#iconify/</link><guid isPermaLink="true">https://www.webdong.dev/zh-tw/shortpost/iconify/#iconify/</guid><pubDate>Tue, 09 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;要在網頁中使用任何種類的 Icon 強烈建議可以考慮使用 &lt;a href=&quot;https://iconify.design/&quot;&gt;Iconify&lt;/a&gt; (開源)。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;我自己公司原先是使用 FontAwesome，部落格則是自己找 Icon 開 Figma 切好且用 SVGO 去壓縮，不管哪種方式都超麻煩！還時常有找不到理想 Icon 的問題，直到專案架構升級無意間碰到 Nuxt icon 可以引入 Iconify 的資料集就愛上這個套件，現在想用哪款 Icon 就用，省了一堆麻煩問題。&lt;/p&gt;
&lt;p&gt;今日部落格更新推出也是將所有文章換成用 Iconify：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Inline SVG 直接砍掉近百個圖片請求&lt;/li&gt;
&lt;li&gt;文章頁 170 kb -&amp;gt; 93 kb 就算不馬上用，到 &lt;a href=&quot;https://icones.js.org/&quot;&gt;Icônes&lt;/a&gt; 找找各式 Icon 也是挺方便的。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>Frontend</category></item></channel></rss>