<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>效能 on Kaisekukun</title><link>https://netguide.jp/zh-tw/tags/%E6%95%88%E8%83%BD/</link><description>Recent content in 效能 on Kaisekukun</description><generator>Hugo -- gohugo.io</generator><language>zh-tw</language><copyright>Kaisekukun</copyright><lastBuildDate>Sat, 27 Jun 2026 15:00:00 +0900</lastBuildDate><atom:link href="https://netguide.jp/zh-tw/tags/%E6%95%88%E8%83%BD/index.xml" rel="self" type="application/rss+xml"/><item><title>SEO 和核心網路生命線：揭秘和改進 INP</title><link>https://netguide.jp/zh-tw/web/seo-core-web-vitals-inp/</link><pubDate>Tue, 05 May 2026 12:00:00 +0900</pubDate><guid>https://netguide.jp/zh-tw/web/seo-core-web-vitals-inp/</guid><description>&lt;img src="https://netguide.jp/img/thumbnail/seo-core-web-vitals-inp-zh-tw.png" alt="Featured image of post SEO 和核心網路生命線：揭秘和改進 INP" /&gt;&lt;p&gt;INP（與下一個繪製的互動）衡量網頁對使用者互動的回應能力。本文揭開了 Google 的 Core Web Vitals 指標的神秘面紗，探討了它與已棄用的 FID 指標的不同之處，並概述瞭如何優化 JavaScript 執行路徑以獲得「良好」分數。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1什麼是與下一個繪畫的互動inp"&gt;1.什麼是與下一個繪畫的互動（INP）？
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;INP&lt;/strong&gt; 追蹤使用者造訪頁面期間所有使用者互動（點擊、敲擊和鍵盤輸入）的延遲。它測量使用者啟動操作和瀏覽器繪製顯示視覺更新的下一幀之間的持續時間。&lt;/p&gt;
&lt;h3 id="它與-fid首次輸入延遲有何不同"&gt;它與 FID（首次輸入延遲）有何不同
&lt;/h3&gt;&lt;p&gt;FID 是 Google 之前的回應指標，但它有一些局限性，很容易被繞過：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;首次互動偏差&lt;/strong&gt;：FID 僅監控第一次使用者互動。由導航選單或點擊過濾器引起的任何後續延遲都將被忽略。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;忽略腳本執行&lt;/strong&gt;：FID 僅計算輸入延遲（瀏覽器接收事件所需的時間）。它忽略了執行實際 JavaScript 事件處理程序和繪製更新的 UI 所需的時間。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;INP 透過追蹤會話整個生命週期中的所有交互作用、報告表現最差的交互作用（排除異常值）來解決這些限制。&lt;/p&gt;
&lt;h3 id="inp-評分閾值"&gt;INP 評分閾值
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;良好（通過）&lt;/strong&gt;：200 毫秒或更短&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;需要改進&lt;/strong&gt;：200ms 至 500ms&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;差&lt;/strong&gt;：超過 500 毫秒&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="2-inp成績不佳的主要原因"&gt;2. INP成績不佳的主要原因
&lt;/h2&gt;&lt;p&gt;INP 分數低的核心罪魁禍首是&lt;strong&gt;主線程阻塞&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;由於瀏覽器在單一主執行緒上處理 UI 渲染和 JavaScript 執行，因此啟動複雜的腳本邏輯會立即阻止瀏覽器更新視窗。如果按一下觸發需要 300 毫秒的任務，則螢幕會在該視窗期間凍結，從而提高您的 INP 分數。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="3-優化-inp-的技術"&gt;3. 優化 INP 的技術
&lt;/h2&gt;&lt;h3 id="1任務產出分解長任務"&gt;1）任務產出（分解長任務）
&lt;/h3&gt;&lt;p&gt;任何運行時間超過 50 毫秒的 JavaScript 函數都會被標記為「長任務」。若要解決此問題，請將長時間運行的任務分解為模組化步驟，並將主執行緒傳回瀏覽器以處理 UI 框架。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// ✕ Bad: Continuous loop blocking the main thread
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;processArray&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;items&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;item&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;of&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;items&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;calculateComplexResult&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;item&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// Freezes the browser
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// ◯ Good: Yielding control periodically using async timeouts
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;processArrayOptimized&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;items&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;items&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;calculateComplexResult&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;items&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Yield every 50 items to let the browser paint
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;50&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;yieldToMainThread&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;yieldToMainThread&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Use scheduler.yield if supported, otherwise fallback to setTimeout
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#e6db74"&gt;&amp;#39;scheduler&amp;#39;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; window &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;yield&amp;#39;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; window.&lt;span style="color:#a6e22e"&gt;scheduler&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; window.&lt;span style="color:#a6e22e"&gt;scheduler&lt;/span&gt;.&lt;span style="color:#66d9ef"&gt;yield&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Promise(&lt;span style="color:#a6e22e"&gt;resolve&lt;/span&gt; =&amp;gt; &lt;span style="color:#a6e22e"&gt;setTimeout&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;resolve&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2優化使用者回饋循環"&gt;2）優化使用者回饋循環
&lt;/h3&gt;&lt;p&gt;如果您必須執行繁重的邏輯，請確保在繁重的處理腳本開始之前**使用「載入微調器」或活動按鈕狀態更新 UI。&lt;/p&gt;</description></item><item><title>面向 Web 開發人員的 PostgreSQL 效能調優</title><link>https://netguide.jp/zh-tw/software/postgres-performance-tuning/</link><pubDate>Mon, 20 Apr 2026 12:00:00 +0900</pubDate><guid>https://netguide.jp/zh-tw/software/postgres-performance-tuning/</guid><description>&lt;img src="https://netguide.jp/img/thumbnail/postgres-performance-tuning-zh-tw.png" alt="Featured image of post 面向 Web 開發人員的 PostgreSQL 效能調優" /&gt;&lt;p&gt;透過使用 EXPLAIN 分析 PostgreSQL 中的資料庫查詢來優化效能緩慢的應用程式。緩慢的查詢是大多數 Web 應用程式中最大的瓶頸。本指南將引導您了解基本的索引優化指南、如何閱讀執行計劃以及自託管或託管資料庫的關鍵配置參數調整。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-設計有效的指標"&gt;1. 設計有效的指標
&lt;/h2&gt;&lt;p&gt;現代資料庫的主要瓶頸是磁碟 I/O（從儲存中讀取區塊檔案）。新增索引可以讓PostgreSQL直接查詢資料記錄，而不是掃描整個表。&lt;/p&gt;
&lt;h3 id="1b樹索引預設值"&gt;1）B樹索引預設值
&lt;/h3&gt;&lt;p&gt;標準 B 樹索引支援多種運算符類別：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;直接匹配和範圍（&lt;code&gt;=&lt;/code&gt;、&lt;code&gt;&amp;lt;&lt;/code&gt;、&lt;code&gt;&amp;gt;&lt;/code&gt;、&lt;code&gt;BETWEEN&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;連接條件 (&lt;code&gt;JOIN ON ...&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;排序操作 (&lt;code&gt;ORDER BY&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2複合索引的列順序規則"&gt;2）複合索引的列順序規則
&lt;/h3&gt;&lt;p&gt;建立複合索引（組合多個欄位）時，PostgreSQL 從左到右解析列。訂單事宜：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Create a composite index
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;CREATE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;INDEX&lt;/span&gt; idx_users_status_created &lt;span style="color:#66d9ef"&gt;ON&lt;/span&gt; users (status, created_at);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- ◯ Index will be used (leftmost column &amp;#34;status&amp;#34; is present in the query)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; users &lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; status &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;active&amp;#39;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;AND&lt;/span&gt; created_at &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;2026-01-01&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; users &lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; status &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;active&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- ✕ Index will NOT be used efficiently (leftmost column &amp;#34;status&amp;#34; is missing)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; users &lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; created_at &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;2026-01-01&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="2-使用-explain-analyze-分析執行計劃"&gt;2. 使用 &lt;code&gt;EXPLAIN ANALYZE&lt;/code&gt; 分析執行計劃
&lt;/h2&gt;&lt;p&gt;若要診斷慢速查詢，請將 &lt;code&gt;EXPLAIN ANALYZE&lt;/code&gt; 新增至您的 SQL 語句中並在控制台中執行它：&lt;/p&gt;</description></item><item><title>必備 Vite Config for Faster Builds</title><link>https://netguide.jp/zh-tw/software/vite-fast-build-tips/</link><pubDate>Tue, 24 Feb 2026 15:00:00 +0900</pubDate><guid>https://netguide.jp/zh-tw/software/vite-fast-build-tips/</guid><description>&lt;img src="https://netguide.jp/img/thumbnail/vite-fast-build-tips-zh-tw.png" alt="Featured image of post 必備 Vite Config for Faster Builds" /&gt;&lt;p&gt;Vite has earned its reputation as a fast frontend build tool, especially when it comes to dev server startup. This article breaks down why Vite is fast and explores configuration tweaks to push build performance even further.&lt;/p&gt;
&lt;h2 id="why-vite-is-fast"&gt;Why Vite Is Fast
&lt;/h2&gt;&lt;p&gt;The key difference between Vite and traditional bundlers like Webpack is that Vite uses different strategies for development and production.&lt;/p&gt;
&lt;h3 id="dev-native-es-module-serving"&gt;Dev: Native ES Module Serving
&lt;/h3&gt;&lt;p&gt;During development, Vite skips bundling entirely. It leverages the browser&amp;rsquo;s native ES Module 支援, transforming and serving only the files that are requested. This means dev server startup remains instant no matter how large your project grows.&lt;/p&gt;</description></item></channel></rss>