<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>套件｜林鼎淵 Dean Lin</title>
    <link>https://deanlin.net/tags/%E5%A5%97%E4%BB%B6/</link>
    <image><url>https://deanlin.net/images/author_hu_aa256fc934e9a932.jpg</url><title>套件｜林鼎淵 Dean Lin</title><link>https://deanlin.net/tags/%E5%A5%97%E4%BB%B6/</link><width>144</width><height>144</height></image>
    <description>林鼎淵（Dean Lin）的部落格：生成式 AI 企業內訓講師、外商資安公司軟體專家、7 本書作者。400 多篇文章用白話分享生成式 AI 實戰、Claude Code 與 Vibe Coding 教學、團隊合作與職場成長。</description>
    <generator>Hugo</generator>
    <language>zh-tw</language>
    <copyright>© 2020–2026 林鼎淵 Dean Lin</copyright>
    <lastBuildDate>Mon, 26 Sep 2022 10:10:00 +0800</lastBuildDate>
    <atom:link href="https://deanlin.net/tags/%E5%A5%97%E4%BB%B6/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>不知如何選套件？教你 4 招來避雷！（下）</title>
      <link>https://deanlin.net/blog/202209/choosing-packages-2/</link>
      <pubDate>Mon, 26 Sep 2022 10:10:00 +0800</pubDate>
      <guid>https://deanlin.net/blog/202209/choosing-packages-2/</guid>
      <dc:creator>林鼎淵</dc:creator>
      <category>技術教學</category>
      <description>接下來讓我們依照上篇文章提供的 4 個方法，透過實戰了解如何選出合適的套件吧！</description>
      <media:content url="https://deanlin.net/blog/202209/choosing-packages-2/images/cover_hu_f1e80b151e7bbffb.jpg" medium="image" type="image/jpeg" width="1200" height="675" />
      <content:encoded><![CDATA[<blockquote>
<p>紙上得來終覺淺，絕知此事要躬行。</p>
<p><em>陸游</em></p>
</blockquote>
<p>接下來讓我們<a href="https://deanlin.net/blog/202209/choosing-packages-1/">依照上篇文章提供的 4 個方法</a>，透過實戰了解如何選出合適的套件吧！</p>
<h2 id="目標需要一個能取得專案環境變數的套件">目標：需要一個能取得專案環境變數的套件<a class="h-anchor" href="#%e7%9b%ae%e6%a8%99%e9%9c%80%e8%a6%81%e4%b8%80%e5%80%8b%e8%83%bd%e5%8f%96%e5%be%97%e5%b0%88%e6%a1%88%e7%92%b0%e5%a2%83%e8%ae%8a%e6%95%b8%e7%9a%84%e5%a5%97%e4%bb%b6" aria-label="這個段落的連結"></a></h2>
<p>以軟體開發來說，我們會把散佈在各個檔案，且在不同環境需要調整或是保密的參數，集合到一個檔案裡面，這樣專案就能在不同的環境中快速遷移（ex：資料庫帳密、ip、網址…）。</p>
<p>這個檔案我們稱它為環境檔（.env），以 Node.js 專案來說，可以透過套件讀取環境檔的參數。</p>
<p>如果我們在 <a href="https://www.npmjs.com/">npm 網站</a> 上，以「env」為搜尋條件會得到如下結果：</p>
<p><img src="https://deanlin.net/blog/202209/choosing-packages-2/images/choosing-packages-2-01.webp" width="1400" height="526" alt="▋目標：需要一個能取得專案環境變數的套件（圖 1）" fetchpriority="high" decoding="async"></p>
<p>從左上角我們可以看到總共找到了 20 個套件，但哪個才符合我們需求呢？</p>
<h2 id="從活躍度來判斷">從活躍度來判斷<a class="h-anchor" href="#%e5%be%9e%e6%b4%bb%e8%ba%8d%e5%ba%a6%e4%be%86%e5%88%a4%e6%96%b7" aria-label="這個段落的連結"></a></h2>
<p>我們需要的功能會往往有很多的套件可以完成，但儘管搜尋到的套件很多，但通常符合需求的都在前幾個；這裡我們將前兩個套件（<a href="https://www.npmjs.com/package/env">env</a>、<a href="https://www.npmjs.com/package/dotenv">dotenv</a>）用活躍度來比較。</p>
<table>
  <thead>
      <tr>
          <th>套件</th>
          <th>env</th>
          <th>dotenv</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>最後發布時間（Last publish）</td>
          <td>11 years ago<br></td>
          <td>16 days ago</td>
      </tr>
      <tr>
          <td>每週下載次數（Weekly Downloads）</td>
          <td>5,362</td>
          <td>28,017,205</td>
      </tr>
      <tr>
          <td>版本（Version）</td>
          <td>0.0.2</td>
          <td>16.0.2</td>
      </tr>
  </tbody>
</table>
<p>透過上表我們可以得知「dotenv」是更有保障的套件。</p>
<h2 id="確認-issues-狀況">確認 Issues 狀況<a class="h-anchor" href="#%e7%a2%ba%e8%aa%8d-issues-%e7%8b%80%e6%b3%81" aria-label="這個段落的連結"></a></h2>
<p>既然「dotenv」獲得壓倒性優勢，我們就來看看他的「Issues」的狀況。</p>
<p><img src="https://deanlin.net/blog/202209/choosing-packages-2/images/choosing-packages-2-02.webp" width="1348" height="833" alt="▋確認 Issues 狀況（圖 2）" loading="lazy" decoding="async"></p>
<p>點進去後，我們可以看到他「Open issues 與 Closed issues 的比例」低於 10%，算是相當穩定的套件；且右上角的 Star 數量高達 16k，有人氣的套件也是一種品質保證。</p>
<p><img src="https://deanlin.net/blog/202209/choosing-packages-2/images/choosing-packages-2-03.webp" width="1400" height="602" alt="▋確認 Issues 狀況（圖 3）" loading="lazy" decoding="async"></p>
<h2 id="閱讀文件">閱讀文件<a class="h-anchor" href="#%e9%96%b1%e8%ae%80%e6%96%87%e4%bb%b6" aria-label="這個段落的連結"></a></h2>
<p>在「dotenv」的 README 文件上，它明確說明自己有讀取「.env」檔案的功能，並給出詳細的使用範例。</p>
<p><img src="https://deanlin.net/blog/202209/choosing-packages-2/images/choosing-packages-2-04.webp" width="875" height="516" alt="▋閱讀文件（圖 4）" loading="lazy" decoding="async"></p>
<h2 id="試用範例程式碼">試用範例程式碼<a class="h-anchor" href="#%e8%a9%a6%e7%94%a8%e7%af%84%e4%be%8b%e7%a8%8b%e5%bc%8f%e7%a2%bc" aria-label="這個段落的連結"></a></h2>
<p>在試用 Sample Code 前筆者再提醒一下，如果使用上遇到問題，可以到 Issues 的地方看看；過去我就曾遇過同一款套件，在不同框架下的使用方式略有不同，最後在 Issues 裡面參考他人的方案才順利解決。</p>
<p><img src="https://deanlin.net/blog/202209/choosing-packages-2/images/choosing-packages-2-05.webp" width="875" height="623" alt="▋試用範例程式碼（圖 5）" loading="lazy" decoding="async"></p>
<p>筆者這邊也依照文件試用給大家看。</p>
<p><img src="https://deanlin.net/blog/202209/choosing-packages-2/images/choosing-packages-2-06.webp" width="1400" height="464" alt="▋試用範例程式碼（圖 6）" loading="lazy" decoding="async"></p>
<p>從上圖中，可以看到套件確實有印出我們需要的環境變數，可以初步判定它是一個合格的套件！</p>
<p>關於如何選出合適套件的系列文到這邊就告個段落嚕～希望大家日後在開發上都可以找到合適的套件。</p>
]]></content:encoded>
    </item>
    <item>
      <title>不知如何選套件？教你 4 招來避雷！（上）</title>
      <link>https://deanlin.net/blog/202209/choosing-packages-1/</link>
      <pubDate>Wed, 21 Sep 2022 10:30:00 +0800</pubDate>
      <guid>https://deanlin.net/blog/202209/choosing-packages-1/</guid>
      <dc:creator>林鼎淵</dc:creator>
      <category>技術教學</category>
      <description>我們身處在一個開源工具大爆炸的時代，每天都有許多套件發布到平台上供大家使用；但正因為開源工具爆炸，我們要面對的不是沒有工具，而是工具太多不知道怎麼選，所以在了解套件的重要性後，更重要的是要知道如何選出適合的套件。</description>
      <media:content url="https://deanlin.net/blog/202209/choosing-packages-1/images/cover_hu_137e46c9770308c4.jpg" medium="image" type="image/jpeg" width="1200" height="675" />
      <content:encoded><![CDATA[<p>我們身處在一個開源工具大爆炸的時代，每天都有許多套件發布到平台上供大家使用；但正因為開源工具爆炸，我們要面對的不是沒有工具，而是工具太多不知道怎麼選，所以在了解套件的重要性後，更重要的是要知道如何選出適合的套件。</p>
<blockquote>
<p>如果你還不清楚套件對工程師的重要性，可以先參考<a href="https://deanlin.net/blog/202209/why-engineers-use-packages/">這篇文章</a>。</p>
</blockquote>
<p>套件之所以會有這麼多，是因為不管大神還是新手都可以發布套件，這造成套件本身的良莠不齊，不過我們可以透過文中提供的「方法」，初步判斷套件是否符合需求，以及品質是否穩定。</p>
<blockquote>
<p>本篇文章以<a href="https://www.npmjs.com/">npm 套件</a>舉例。</p>
</blockquote>
<h2 id="套件活躍度">套件活躍度<a class="h-anchor" href="#%e5%a5%97%e4%bb%b6%e6%b4%bb%e8%ba%8d%e5%ba%a6" aria-label="這個段落的連結"></a></h2>
<p>筆者會從 3 個面向綜合考量套件活躍度：</p>
<ol>
<li><strong>套件最後發布時間( Last publish)</strong>：太久沒更新的套件請謹慎選用。</li>
<li><strong>每週下載次數(Weekly Downloads)</strong>：下載人數多的套件穩定性通常較高，至少遇到問題時比較有人一起討論。</li>
<li><strong>版本(Version)</strong>：一般來說 1.0.0 以前的版本會有穩定性上的疑慮，盡可能避免使用。</li>
</ol>
<h2 id="套件-issues-處理狀況">套件 Issues 處理狀況<a class="h-anchor" href="#%e5%a5%97%e4%bb%b6-issues-%e8%99%95%e7%90%86%e7%8b%80%e6%b3%81" aria-label="這個段落的連結"></a></h2>
<p>除了活躍度外，該套件「open issues 與 closed issues 的比例」也是重要指標；<strong>如果 open issues 的比例超過 20%，筆者良心建議你要點進去看看別人遇到了哪些問題</strong>。</p>
<blockquote>
<p>太新的套件可能不穩定、太舊的套件可能沒人維護。</p>
</blockquote>
<h2 id="閱讀文件確認是否符合需求">閱讀文件確認是否符合需求<a class="h-anchor" href="#%e9%96%b1%e8%ae%80%e6%96%87%e4%bb%b6%e7%a2%ba%e8%aa%8d%e6%98%af%e5%90%a6%e7%ac%a6%e5%90%88%e9%9c%80%e6%b1%82" aria-label="這個段落的連結"></a></h2>
<p>有些套件光看名稱好像是自己想要的，實際用下來卻發現缺東缺西，為了避免這類的問題發生，導入套件前請先詳閱文件。</p>
<blockquote>
<p>盡量不要選文件讓人難以理解的套件。</p>
</blockquote>
<h2 id="先試用範例程式碼sample-code">先試用範例程式碼（sample code）<a class="h-anchor" href="#%e5%85%88%e8%a9%a6%e7%94%a8%e7%af%84%e4%be%8b%e7%a8%8b%e5%bc%8f%e7%a2%bcsample-code" aria-label="這個段落的連結"></a></h2>
<p>有些簡介把套件的功能吹捧的超強，但這個套件到底能否導入專案，要先試用範例程式才知道。常見問題如下：</p>
<ul>
<li><strong>與專案的 Node.js 版本不合</strong>：因為 Node.js 版本更新速度極快，而有些套件的功能是相依於 Node.js 版本的；如果專案有歷史背景難以升級，就只能先去看套件的 release note，祈禱套件過去有發佈與專案 Node.js 相合的版本。與此同時，也一同評估將專案 Node.js 升版的必要性。</li>
<li><strong>說明文件根本是錯的</strong>：因為套件通常是開源免費的，所以提供的文件不一定都是對的，如果你一直執行失敗，可以先到 open issues 看看有沒有難兄難弟。</li>
</ul>
<p>相信文中所提到的 4 個方法，可以很大程度幫大家避雷了，如果您有其他選套件的好方法，也歡迎留言分享。</p>
<p><a href="https://deanlin.net/blog/202209/choosing-packages-2/">在下篇文章中</a>，筆者會舉出實際案例，幫助大家學以致用。</p>
]]></content:encoded>
    </item>
    <item>
      <title>工程師為什麼需要套件？它能帶來哪些幫助？</title>
      <link>https://deanlin.net/blog/202209/why-engineers-use-packages/</link>
      <pubDate>Mon, 19 Sep 2022 10:10:00 +0800</pubDate>
      <guid>https://deanlin.net/blog/202209/why-engineers-use-packages/</guid>
      <dc:creator>林鼎淵</dc:creator>
      <category>技術教學</category>
      <description>如果屠龍刀是系統贈送的武器，那為什麼要自己打造一把破鐵刀？</description>
      <media:content url="https://deanlin.net/blog/202209/why-engineers-use-packages/images/cover_hu_c33e8652f0d3e522.jpg" medium="image" type="image/jpeg" width="1200" height="675" />
      <content:encoded><![CDATA[<p><strong>如果屠龍刀是系統贈送的武器，那為什麼要自己打造一把破鐵刀？</strong></p>
<p>有些人在面對需求時，不喜歡直接使用市面上功能完善的套件，反而執著於每個功能都要從零開始手工打造；如果手工打造的品質穩定也就算了，但通常最後寫出來的 Bug 比市面上套件還要多很多⋯</p>
<blockquote>
<p>人類的進步，大部分是繼承前人的知識繼續發展，就像是你需要了解怎麼使用電腦，但不需要自己買材料親手做出一台電腦。</p>
</blockquote>
<p>就拿前端來舉例，假使今天要開發一個後台管理系統，如果堅持不使用框架，選擇用最純粹的 HTML、JavaScript、CSS 來開發，不但要花更多時間，最後做出來的成品還可能比用框架速成的結果更差。</p>
<blockquote>
<p>你可以把框架想像成，由各種常見＆穩定套件組合起來的大禮包，使用者依照框架的規範進行開發。</p>
</blockquote>
<p>那套件具體有哪些優點呢？以下是筆者感受最深的幾點：</p>
<ol>
<li>能夠快速評估專案功能的可行性。</li>
<li>可以更準確預估每個功能完成的時間。</li>
<li>節省大量重頭開始寫功能的時間。</li>
<li>可以專心撰寫自己的程式邏輯。</li>
<li>因為部分功能透過套件處理，所以需要維護的程式也減少了。</li>
</ol>
<p>在了解套件對我們工作的幫助後，接下來要思考的問題是「如何評估＆導入套件」。</p>
<p>以筆者過去的經驗來說，有 95% 以上的套件，我只會看它的官方文檔來了解如何使用，基本上不太會去看這份套件的原始碼，<strong>會去看它怎麼寫的套件通常不是因為它寫的太好，而是因為它寫的太爛</strong>，因為 Bug 影響到功能，導致開發人員需要去修正，甚至去評估是否有其他替代方案。</p>
<p>我們導入框架＆套件是為了節省開發時間，但如果為了解決它的 Bug 反而花了更多時間（甚至無法解決），那就真的得不償失了。</p>
<p>為了減少這樣的悲劇發生，在後續的文章中，筆者會分享幾個<a href="https://deanlin.net/blog/202209/choosing-packages-1/">選擇套件時要注意的重點</a>，並搭配<a href="https://deanlin.net/blog/202209/choosing-packages-2/">實戰案例</a>，讓大家在開發的道路上盡可能不要踩雷。</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
