<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Husky on Commentary of Takao</title><link>https://takao.blog/zh-tw/tags/husky/</link><description>Recent content in Husky on Commentary of Takao</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Commentary of Takao</copyright><lastBuildDate>Sun, 20 Apr 2025 00:00:00 +0900</lastBuildDate><atom:link href="https://takao.blog/zh-tw/tags/husky/index.xml" rel="self" type="application/rss+xml"/><item><title>使用 Husky 和 ​​Git Hooks 自動進行預提交檢查</title><link>https://takao.blog/zh-tw/web/git-hooks-husky-prevent-bugs/</link><pubDate>Sun, 20 Apr 2025 00:00:00 +0900</pubDate><guid>https://takao.blog/zh-tw/web/git-hooks-husky-prevent-bugs/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/git-hooks-husky-prevent-bugs-zh-tw.png" alt="Featured image of post 使用 Husky 和 ​​Git Hooks 自動進行預提交檢查" /&gt;&lt;h2 id="介紹"&gt;介紹
&lt;/h2&gt;&lt;p&gt;在團隊開發中，提交具有語法錯誤或格式錯誤的程式碼等簡單錯誤很常見。這些問題可能會破壞 CI 建置或在程式碼審查期間導致混亂的格式衝突。&lt;/p&gt;
&lt;p&gt;您可以自動執行這些檢查，而不是依賴開發人員的警覺性來執行準則。&lt;/p&gt;
&lt;p&gt;透過將 &lt;strong&gt;Git Hooks&lt;/strong&gt; 與 &lt;strong&gt;Husky&lt;/strong&gt; 結合，您可以在任何提交或推送完成之前自動觸發 linter (ESLint)、格式化程式 (Prettier) 和單元測試 (Jest)。本指南將引導您完成此工作流程的設定。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-什麼是-git-hooks-和-husky"&gt;1. 什麼是 Git Hooks 和 Husky？
&lt;/h2&gt;&lt;p&gt;Git Hook 是每當 Git 儲存庫中發生關鍵事件（例如 &lt;code&gt;commit&lt;/code&gt;、&lt;code&gt;push&lt;/code&gt; 或 &lt;code&gt;merge&lt;/code&gt;）時自動執行的腳本。&lt;/p&gt;
&lt;p&gt;預設情況下，這些腳本位於 &lt;code&gt;.git/hooks/&lt;/code&gt; 目錄中。但是，由於 &lt;code&gt;.git/&lt;/code&gt; 資料夾被排除在版本控制 (&lt;code&gt;.gitignore&lt;/code&gt;) 之外，因此在團隊中共享這些掛鉤歷來都很困難。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Husky&lt;/strong&gt; 透過將 Git Hooks 暴露到專案層級資料夾（例如 &lt;code&gt;.husky/&lt;/code&gt;）來解決這個問題。這允許團隊成員檢查 Git 中的鉤子並透過 npm 套件自動同步配置。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="2-哈士奇基本設定步驟"&gt;2. 哈士奇基本設定步驟
&lt;/h2&gt;&lt;p&gt;在專案儲存庫中執行以下命令：&lt;/p&gt;
&lt;h3 id="第-1-步安裝並初始化"&gt;第 1 步：安裝並初始化
&lt;/h3&gt;&lt;p&gt;使用 &lt;code&gt;husky-init&lt;/code&gt; CLI 工具安裝 Husky 並設定初始目錄：&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Initialize Husky configurations&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npx husky-init &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;該命令做了三處修改：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;將 &lt;code&gt;husky&lt;/code&gt; 加入 &lt;code&gt;package.json&lt;/code&gt; 中的 &lt;code&gt;devDependencies&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;將 &lt;code&gt;&amp;quot;prepare&amp;quot;: &amp;quot;husky&amp;quot;&lt;/code&gt; 腳本新增至 &lt;code&gt;package.json&lt;/code&gt; （在 &lt;code&gt;npm install&lt;/code&gt; 期間自動在其他電腦上安裝掛鉤）。&lt;/li&gt;
&lt;li&gt;在專案根目錄產生 &lt;code&gt;.husky/&lt;/code&gt; 目錄以及預設的 &lt;code&gt;pre-commit&lt;/code&gt; 掛鉤檔案。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="第-2-步配置預提交掛鉤"&gt;第 2 步：配置預提交掛鉤
&lt;/h3&gt;&lt;p&gt;開啟產生的 &lt;code&gt;.husky/pre-commit&lt;/code&gt; 腳本。預設情況下，它運行 &lt;code&gt;npm test&lt;/code&gt;。更新此命令以運行 linter：&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-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/usr/bin/env sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;. &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;dirname -- &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$0&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/_/husky.sh&amp;#34;&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;# Run linter and abort commit if it returns an error code&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm run lint
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;現在，每當您執行 &lt;code&gt;git commit&lt;/code&gt; 時，Husky 都會執行 &lt;code&gt;npm run lint&lt;/code&gt;。如果 ESLint 偵測到錯誤，提交程序將中止，將損壞的程式碼排除在儲存庫之外。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="3-使用-lint-staged-優化速度"&gt;3. 使用 lint-staged 優化速度
&lt;/h2&gt;&lt;p&gt;預設情況下，在每次提交期間在整個專案上執行 linter 可能會隨著程式碼庫的成長而導致進程變慢。&lt;/p&gt;
&lt;p&gt;若要最佳化效能，請使用 &lt;strong&gt;&lt;code&gt;lint-staged&lt;/code&gt;&lt;/strong&gt;。
此工具隔離檢查，以便它們&lt;strong&gt;僅在目前暫存在 Git 中的檔案&lt;/strong&gt;（您修改的檔案）上執行。&lt;/p&gt;
&lt;h3 id="安裝和設定"&gt;安裝和設定
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;安裝套件：&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&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-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; npm install --save-dev lint-staged
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;&lt;strong&gt;將配置新增至 &lt;code&gt;package.json&lt;/code&gt;:&lt;/strong&gt;
定義要定位的檔案以及要執行的命令：&lt;/li&gt;
&lt;/ol&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-json" data-lang="json"&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:#f92672"&gt;&amp;#34;lint-staged&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;*.{js,ts,jsx,tsx}&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;eslint --fix&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;prettier --write&amp;#34;&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:#f92672"&gt;&amp;#34;*.css&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;stylelint --fix&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;prettier --write&amp;#34;&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;
&lt;li&gt;&lt;strong&gt;更新預提交掛鉤：&lt;/strong&gt;
修改&lt;code&gt;.husky/pre-commit&lt;/code&gt;以觸發&lt;code&gt;lint-staged&lt;/code&gt;：&lt;/li&gt;
&lt;/ol&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-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#!/usr/bin/env sh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; . &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;dirname -- &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$0&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/_/husky.sh&amp;#34;&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; npx lint-staged
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用此配置，只有您修改的檔案才會被格式化和檢查。這可以保持快速的預提交檢查，同時確保提交的程式碼保持乾淨。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="結論"&gt;結論
&lt;/h2&gt;&lt;p&gt;將 Husky 與 lint-staged 結合可以自動執行程式碼品質檢查，從而節省程式碼審查時間並防止建置損壞。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;**使用 Husky 在專案層級管理 Git Hook。 **&lt;/li&gt;
&lt;li&gt;**透過套件生命週期腳本 (&lt;code&gt;prepare&lt;/code&gt;) 自動配置掛鉤安裝。 **&lt;/li&gt;
&lt;li&gt;**透過僅使用 &lt;code&gt;lint-staged&lt;/code&gt; 目標掃描暫存檔案來保持快速檢查。 **&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在專案的早期引入 Husky 以保持程式碼庫的一致性和整潔。&lt;/p&gt;</description></item></channel></rss>