跳到內容
返回部落格

2024 年 10 月 21 日,星期一

Next.js 15

發布者

Next.js 15 已正式穩定發布,可供生產環境使用。此版本建立在 RC1RC2 的更新基礎之上。我們著重於穩定性,同時加入了一些令人興奮的更新,相信您會喜歡。立即試用 Next.js 15

終端機
# Use the new automated upgrade CLI
npx @next/codemod@canary upgrade latest
 
# ...or upgrade manually
npm install next@latest react@rc react-dom@rc

我們也很高興分享更多關於即將在本週四 10 月 24 日舉行的 Next.js Conf 的資訊。

以下是 Next.js 15 的新功能

使用 @next/codemod CLI 順利升級

我們在每個主要的 Next.js 版本中都包含了 codemod(自動化程式碼轉換),以協助自動化升級重大變更。

為了讓升級更加順利,我們發布了增強型的 codemod CLI

終端機
npx @next/codemod@canary upgrade latest

此工具可協助您將程式碼庫升級至最新的穩定版或預發布版本。CLI 將更新您的依賴項、顯示可用的 codemod,並引導您應用它們。

canary 標籤使用 codemod 的最新版本,而 latest 則指定 Next.js 版本。我們建議您使用 codemod 的 canary 版本,即使您要升級到最新的 Next.js 版本,因為我們計劃根據您的回饋持續改進此工具。

深入了解 Next.js codemod CLI

非同步請求 API(重大變更)

在傳統的伺服器端渲染中,伺服器會等待請求後才渲染任何內容。但是,並非所有組件都依賴於特定於請求的資料,因此無需等待請求來渲染它們。理想情況下,伺服器會在請求到達之前盡可能做好準備。為了實現這一點,並為未來的最佳化奠定基礎,我們需要知道何時等待請求。

因此,我們正在將依賴於特定於請求的資料的 API(例如 headerscookiesparamssearchParams)轉換為非同步

import { cookies } from 'next/headers';
 
export async function AdminPanel() {
  const cookieStore = await cookies();
  const token = cookieStore.get('token');
 
  // ...
}

這是一個重大變更,會影響以下 API

  • cookies
  • headers
  • draftMode
  • layout.jspage.jsroute.jsdefault.jsgenerateMetadatagenerateViewport 中的 params
  • page.js 中的 searchParams

為了更容易遷移,這些 API 可以暫時同步存取,但在下一個主要版本之前,會在開發和生產環境中顯示警告。有一個 codemod 可用於自動化遷移

終端機
npx @next/codemod@canary next-async-request-api .

對於 codemod 無法完全遷移您的程式碼的情況,請閱讀升級指南。我們也提供了一個 範例,說明如何將 Next.js 應用程式遷移到新的 API。

快取語意

Next.js App Router 推出了獨特的預設快取設定。這些設定旨在提供預設情況下效能最佳的選項,並在需要時能夠選擇退出。

根據您的回饋,我們重新評估了我們的 快取啟發法,以及它們將如何與 Partial Prerendering (PPR) 等專案以及使用 fetch 的第三方函式庫互動。

在 Next.js 15 中,我們將 GET 路由處理器和客戶端路由器快取的預設快取設定從預設快取變更為預設不快取。如果您想保留先前的行為,您可以繼續選擇加入快取。

我們將在未來幾個月內繼續改進 Next.js 中的快取,並將很快分享更多詳細資訊。

GET 路由處理器不再預設快取

在 Next 14 中,使用 GET HTTP 方法的路由處理器預設會被快取,除非它們使用了動態函式或動態配置選項。在 Next.js 15 中,GET 函式預設不快取

您仍然可以使用靜態路由配置選項(例如 export dynamic = 'force-static')選擇加入快取。

特殊的路由處理器(例如 sitemap.tsopengraph-image.tsxicon.tsx)以及其他 metadata 檔案 預設仍為靜態,除非它們使用動態函式或動態配置選項。

客戶端路由器快取不再預設快取頁面組件

在 Next.js 14.2.0 中,我們引入了一個實驗性的 staleTimes 標誌,以允許自訂配置 路由器快取

在 Next.js 15 中,此標誌仍然可以存取,但我們正在變更預設行為,將頁面區段的 staleTime 設定為 0。這表示當您在應用程式中導航時,客戶端將始終反映頁面組件的最新資料,這些組件會在導航過程中變為活動狀態。但是,仍然有一些重要的行為保持不變

  • 共享佈局資料不會從伺服器重新提取,以繼續支援 部分渲染
  • 返回/前進導航仍將從快取還原,以確保瀏覽器可以還原捲動位置。
  • loading.js 將保持快取 5 分鐘(或 staleTimes.static 配置的值)。

您可以透過設定以下配置選擇加入先前的客戶端路由器快取行為

next.config.ts
const nextConfig = {
  experimental: {
    staleTimes: {
      dynamic: 30,
    },
  },
};
 
export default nextConfig;

React 19

作為 Next.js 15 版本的一部分,我們決定與即將發布的 React 19 保持一致。

在版本 15 中,App Router 使用 React 19 RC,並且根據社群回饋,我們還為 Pages Router 引入了 React 18 的向後相容性。如果您正在使用 Pages Router,這讓您可以在準備就緒時升級到 React 19。

儘管 React 19 仍處於 RC 階段,但我們在真實世界應用程式中進行了廣泛的測試,並且與 React 團隊密切合作,讓我們對其穩定性充滿信心。核心重大變更已經過充分測試,不會影響現有的 App Router 使用者。因此,我們決定立即發布 Next.js 15 穩定版,以便您的專案為 React 19 GA 做好充分準備。

為了確保轉換盡可能順利,我們提供了 codemod 和自動化工具,以協助簡化遷移過程。

閱讀 Next.js 15 升級指南React 19 升級指南,並觀看 React Conf Keynote 以了解更多資訊。

React 18 上的 Pages Router

Next.js 15 維持了 Pages Router 與 React 18 的向後相容性,讓使用者可以繼續使用 React 18,同時受益於 Next.js 15 的改進。

自第一個候選版本 (RC1) 以來,我們已根據社群回饋將重點轉移到包含對 React 18 的支援。這種彈性讓您可以在使用 React 18 的 Pages Router 時採用 Next.js 15,讓您可以更好地控制升級路徑。

注意: 雖然可以在同一個應用程式中在 React 18 上執行 Pages Router,在 React 19 上執行 App Router,但我們不建議這種設定。這樣做可能會導致不可預測的行為和類型不一致,因為兩個版本之間的底層 API 和渲染邏輯可能無法完全對齊。

React Compiler(實驗性)

React Compiler 是 Meta 的 React 團隊建立的新實驗性編譯器。編譯器透過理解純 JavaScript 語意和 React 規則,從深層次理解您的程式碼,這讓它可以為您的程式碼新增自動最佳化。編譯器減少了開發人員必須透過 useMemouseCallback 等 API 進行的手動記憶化量,從而使程式碼更簡單、更易於維護且更不易出錯。

在 Next.js 15 中,我們新增了對 React Compiler 的支援。深入了解 React Compiler 和 可用的 Next.js 配置選項

注意: React Compiler 目前僅作為 Babel 外掛程式提供,這將導致較慢的開發和建置時間。

Hydration 錯誤改進

Next.js 14.1 改進了 錯誤訊息和 hydration 錯誤。Next.js 15 透過新增改進的 hydration 錯誤視圖,在此基礎上繼續構建。Hydration 錯誤現在會顯示錯誤的原始程式碼,並提供有關如何解決問題的建議。

例如,這是 Next.js 14.1 中先前的 hydration 錯誤訊息

Hydration error message in Next.js 14.1

Next.js 15 已將其改進為

Hydration error message improved in Next.js 15

Turbopack Dev

我們很高興宣布 next dev --turbo 現在穩定且已準備就緒,可以加速您的開發體驗。我們一直在使用它來迭代 vercel.comnextjs.orgv0 以及我們所有其他應用程式,並取得了出色的成果。

例如,對於大型 Next.js 應用程式 vercel.com,我們看到了

  • 本地伺服器啟動速度最多快 76.7%
  • 使用快速重新整理,程式碼更新速度最多快 96.3%
  • 在沒有快取的情況下,初始路由編譯速度最多快 45.8%(Turbopack 尚無磁碟快取)。

您可以在我們新的部落格文章中深入了解 Turbopack Dev。

靜態路由指示器

Next.js 現在在開發期間顯示靜態路由指示器,以協助您識別哪些路由是靜態或動態的。這種視覺提示讓您更容易透過了解頁面的渲染方式來最佳化效能。

您也可以使用 next build 輸出,以檢視所有路由的渲染策略。

此更新是我們持續努力增強 Next.js 可觀察性的一部分,讓開發人員更容易監控、偵錯和最佳化其應用程式。我們也正在開發專用的開發人員工具,更多詳細資訊即將發布。

深入了解可以停用的靜態路由指示器

使用 unstable_after(實驗性)在回應後執行程式碼

在處理使用者請求時,伺服器通常會執行與計算回應直接相關的任務。但是,您可能需要執行記錄、分析和其他外部系統同步等任務。

由於這些任務與回應沒有直接關係,因此使用者不應等待它們完成。在回應使用者後延遲工作會帶來挑戰,因為無伺服器函式會在回應關閉後立即停止計算。

after() 是一個新的實驗性 API,透過允許您排程在回應完成串流後處理的工作來解決此問題,使輔助任務能夠在不阻止主要回應的情況下執行。

若要使用它,請將 experimental.after 新增至 next.config.js

next.config.ts
const nextConfig = {
  experimental: {
    after: true,
  },
};
 
export default nextConfig;

然後,在伺服器組件、伺服器動作、路由處理器或中介軟體中匯入該函式。

import { unstable_after as after } from 'next/server';
import { log } from '@/app/utils';
 
export default function Layout({ children }) {
  // Secondary task
  after(() => {
    log();
  });
 
  // Primary task
  return <>{children}</>;
}

深入了解 unstable_after

instrumentation.js(穩定版)

具有 register() API 的 instrumentation 檔案允許使用者利用 Next.js 伺服器生命週期來監控效能、追蹤錯誤來源,並與 OpenTelemetry 等可觀察性函式庫深度整合。

此功能現在穩定,可以移除 experimental.instrumentationHook 配置選項。

此外,我們已與 Sentry 合作設計了一個新的 onRequestError hook,可用於

  • 捕獲伺服器上拋出的所有錯誤的重要上下文,包括
    • 路由器:Pages Router 或 App Router
    • 伺服器上下文:伺服器組件、伺服器動作、路由處理器或中介軟體
  • 向您最喜歡的可觀察性提供商報告錯誤。
export async function onRequestError(err, request, context) {
  await fetch('https://...', {
    method: 'POST',
    body: JSON.stringify({ message: err.message, request, context }),
    headers: { 'Content-Type': 'application/json' },
  });
}
 
export async function register() {
  // init your favorite observability provider SDK
}

深入了解 onRequestError 函式

<Form> 組件

新的 <Form> 組件使用 預先載入客戶端導航 和漸進式增強,擴展了 HTML <form> 元素。

它適用於導航到新頁面的表單,例如導向結果頁面的搜尋表單。

app/page.jsx
import Form from 'next/form';
 
export default function Page() {
  return (
    <Form action="/search">
      <input name="query" />
      <button type="submit">Submit</button>
    </Form>
  );
}

<Form> 組件隨附

  • 預先載入:當表單在視圖中時,佈局載入 UI 會預先載入,從而加快導航速度。
  • 客戶端導航: 提交時,將保留共享佈局和客戶端狀態。
  • 漸進式增強:如果 JavaScript 尚未載入,表單仍然可以透過完整頁面導航運作。

以前,實現這些功能需要大量手動樣板程式碼。例如

範例
// Note: This is abbreviated for demonstration purposes.
// Not recommended for use in production code.
 
'use client'
 
import { useEffect } from 'react'
import { useRouter } from 'next/navigation'
 
export default function Form(props) {
  const action = props.action
  const router = useRouter()
 
  useEffect(() => {
    // if form target is a URL, prefetch it
    if (typeof action === 'string') {
      router.prefetch(action)
    }
  }, [action, router])
 
  function onSubmit(event) {
    event.preventDefault()
 
    // grab all of the form fields and trigger a `router.push` with the data URL encoded
    const formData = new FormData(event.currentTarget)
    const data = new URLSearchParams()
 
    for (const [name, value] of formData) {
      data.append(name, value as string)
    }
 
    router.push(`${action}?${data.toString()}`)
  }
 
  if (typeof action === 'string') {
    return <form onSubmit={onSubmit} {...props} />
  }
 
  return <form {...props} />
}

深入了解 <Form> 組件

支援 next.config.ts

Next.js 現在支援 TypeScript next.config.ts 檔案類型,並提供 NextConfig 類型以用於自動完成和類型安全選項

next.config.ts
import type { NextConfig } from 'next';
 
const nextConfig: NextConfig = {
  /* config options here */
};
 
export default nextConfig;

深入了解 Next.js 中的 TypeScript 支援

Self-hosting 改善

當 self-hosting 應用程式時,您可能需要更精細地控制 Cache-Control 指令。

一個常見的情況是控制為 ISR 頁面發送的 stale-while-revalidate 期間。我們實作了兩項改進:

  1. 您現在可以在 next.config 中設定 expireTime 值。這先前是 experimental.swrDelta 選項。
  2. 已將預設值更新為一年,確保大多數 CDN 可以完全應用 stale-while-revalidate 語意,以達到預期效果。

我們也不再使用預設值覆寫自訂的 Cache-Control 值,允許完全控制並確保與任何 CDN 設定的相容性。

最後,我們改善了 self-hosting 時的圖片最佳化。先前,我們建議您安裝 sharp 以在您的 Next.js 伺服器上最佳化圖片。這個建議有時會被忽略。在 Next.js 15 中,您不再需要手動安裝 sharp — 當使用 next start 或以 獨立輸出模式 執行時,Next.js 將自動使用 sharp

若要深入了解,請參閱我們關於 self-hosting Next.js 的全新示範與教學影片

Server Actions 的安全性增強

Server Actions 是伺服器端函式,可以從用戶端呼叫。它們透過在檔案頂部加入 'use server' 指令並匯出一個 async 函式來定義。

即使 Server Action 或工具函式未在程式碼的其他地方匯入,它仍然是一個公開可存取的 HTTP 端點。雖然這種行為在技術上是正確的,但可能會導致此類函式意外曝光。

為了提高安全性,我們導入了以下增強功能:

  • Dead code elimination(死碼消除): 未使用的 Server Action 不會將其 ID 暴露給用戶端 JavaScript 套件,從而減少套件大小並提高效能。
  • Secure action IDs(安全 Action ID): Next.js 現在建立難以猜測、非決定性的 ID,以允許用戶端參考和呼叫 Server Action。這些 ID 會在組建之間定期重新計算,以增強安全性。
// app/actions.js
'use server';
 
// This action **is** used in our application, so Next.js
// will create a secure ID to allow the client to reference
// and call the Server Action.
export async function updateUserAction(formData) {}
 
// This action **is not** used in our application, so Next.js
// will automatically remove this code during `next build`
// and will not create a public endpoint.
export async function deleteUserAction(formData) {}

您仍然應該將 Server Action 視為公開的 HTTP 端點。深入了解保護 Server Actions 的安全

最佳化外部套件的捆綁(穩定版本)

捆綁外部套件可以改善應用程式的冷啟動效能。在 App Router 中,外部套件預設會捆綁,您可以使用新的 serverExternalPackages 設定選項選擇不捆綁特定套件。

Pages Router 中,外部套件預設不會捆綁,但您可以使用現有的 transpilePackages 選項提供要捆綁的套件清單。使用此設定選項,您需要指定每個套件。

為了統一 App Router 和 Pages Router 之間的設定,我們導入了一個新選項 bundlePagesRouterDependencies,以符合 App Router 的預設自動捆綁。然後,您可以根據需要使用 serverExternalPackages 選擇不捆綁特定套件。

next.config.ts
const nextConfig = {
  // Automatically bundle external packages in the Pages Router:
  bundlePagesRouterDependencies: true,
  // Opt specific packages out of bundling for both App and Pages Router:
  serverExternalPackages: ['package-name'],
};
 
export default nextConfig;

深入了解最佳化外部套件

ESLint 9 支援

Next.js 15 也導入了對 ESLint 9 的支援,ESLint 8 已於 2024 年 10 月 5 日終止生命週期。

為了確保順利過渡,Next.js 保持向後相容性,這表示您可以繼續使用 ESLint 8 或 9。

如果您升級到 ESLint 9,且我們偵測到您尚未採用新的設定格式,Next.js 將自動套用 ESLINT_USE_FLAT_CONFIG=false 應急措施,以簡化遷移。

此外,執行 next lint 時,將移除已棄用的選項,例如 —ext—ignore-path。請注意,ESLint 最終將在 ESLint 10 中禁止這些較舊的設定,因此我們建議您盡快開始遷移。

如需這些變更的更多詳細資訊,請查看遷移指南

作為此更新的一部分,我們也將 eslint-plugin-react-hooks 升級到 v5.0.0,其中引入了 React Hooks 用法的新規則。您可以在 eslint-plugin-react-hooks@5.0.0 的變更日誌 中查看所有變更。

開發與組建改善

Server Components HMR

在開發期間,儲存時會重新執行 Server components。這表示也會呼叫對您的 API 端點或第三方服務的任何 fetch 請求。

為了改善本機開發效能並降低計費 API 呼叫的潛在成本,我們現在確保 Hot Module Replacement (HMR) 可以重複使用先前渲染的 fetch 回應。

深入了解 Server Components HMR 快取

App Router 更快的靜態產生

我們已最佳化靜態產生,以改善組建時間,特別是對於具有慢速網路請求的頁面。

先前,我們的靜態最佳化程序會渲染頁面兩次 — 一次產生用於用戶端導航的資料,第二次渲染用於初始頁面訪問的 HTML。現在,我們重複使用第一次渲染,省略第二次傳遞,減少工作負載和組建時間。

此外,靜態產生工作程序現在跨頁面共用 fetch 快取。如果 fetch 呼叫未選擇退出快取,則其結果將由同一工作程序處理的其他頁面重複使用。這減少了對相同資料的請求次數。

進階靜態產生控制(實驗性)

我們為更精細地控制靜態產生過程增加了實驗性支援,適用於希望從更佳控制中受益的進階使用案例。

我們建議您堅持目前的預設值,除非您有特定需求,因為這些選項可能會由於並行性增加而導致資源使用量增加和潛在的記憶體不足錯誤。

next.config.ts
const nextConfig = {
  experimental: {
    // how many times Next.js will retry failed page generation attempts
    // before failing the build
    staticGenerationRetryCount: 1
    // how many pages will be processed per worker
    staticGenerationMaxConcurrency: 8
    // the minimum number of pages before spinning up a new export worker
    staticGenerationMinPagesPerWorker: 25
  },
}
 
export default nextConfig;

深入了解靜態產生選項

其他變更

  • [重大變更] next/image:移除 squoosh,改用 sharp 作為選用相依性 (PR)
  • [重大變更] next/image:將預設 Content-Disposition 變更為 attachment (PR)
  • [重大變更] next/image:當 src 具有開頭或結尾空格時會發生錯誤 (PR)
  • [重大變更] Middleware:套用 react-server 條件以限制不建議使用的 React API 匯入 (PR)
  • [重大變更] next/font:移除對外部 @next/font 套件的支援 (PR)
  • [重大變更] next/font:移除 font-family 雜湊 (PR)
  • [重大變更] 快取:force-dynamic 現在會將 no-store 預設設定為 fetch 快取 (PR)
  • [重大變更] Config:預設啟用 swcMinify (PR)、missingSuspenseWithCSRBailout (PR) 和 outputFileTracing (PR) 行為,並移除已棄用的選項
  • [重大變更] 移除 Speed Insights 的自動檢測 (現在必須使用專用的 @vercel/speed-insights 套件) (PR)
  • [重大變更] 移除動態站點地圖路由的 .xml 副檔名,並對齊開發和生產環境之間的站點地圖 URL (PR)
  • [重大變更] 我們已棄用在 App Router 中匯出 export const runtime = "experimental-edge"。使用者現在應切換至 export const runtime = "edge"。我們新增了一個 codemod 來執行此操作 (PR)
  • [重大變更] 在渲染期間呼叫 revalidateTagrevalidatePath 現在會擲回錯誤 (PR)
  • [重大變更] instrumentation.jsmiddleware.js 檔案現在將使用供應商提供的 React 套件 (PR)
  • [重大變更] 最低要求的 Node.js 版本已更新為 18.18.0 (PR)
  • [重大變更] next/dynamic:已移除已棄用的 suspense prop,且當元件在 App Router 中使用時,它將不再插入空的 Suspense 邊界 (PR)
  • [重大變更] 在 Edge Runtime 上解析模組時,將不會套用 worker 模組條件 (PR)
  • [重大變更] 禁止在 Server Components 中使用 next/dynamicssr: false 選項 (PR)
  • [改善] Metadata:更新在 Vercel 上託管時 metadataBase 的環境變數後備方案 (PR)
  • [改善] 修復來自 optimizePackageImports 的混合命名空間和命名匯入的 tree-shaking (PR)
  • [改善] Parallel Routes:為所有已知的參數提供不匹配的 catch-all 路由 (PR)
  • [改善] Config bundlePagesExternals 現在已穩定,並重新命名為 bundlePagesRouterDependencies
  • [改善] Config serverComponentsExternalPackages 現在已穩定,並重新命名為 serverExternalPackages
  • [改善] create-next-app:新的專案預設會忽略所有 .env 檔案 (PR)
  • [改善] outputFileTracingRootoutputFileTracingIncludesoutputFileTracingExcludes 已從實驗性升級,現在已穩定 (PR)
  • [改善] 避免將全域 CSS 檔案與樹狀結構中更深層的 CSS 模組檔案合併 (PR)
  • [改善] 快取處理程式可以透過 NEXT_CACHE_HANDLER_PATH 環境變數指定 (PR)
  • [改善] Pages Router 現在同時支援 React 18 和 React 19 (PR)
  • [改善] 如果已啟用 inspector,Error Overlay 現在會顯示一個按鈕,以複製 Node.js Inspector URL (PR)
  • [改善] App Router 上的用戶端預先擷取現在使用 priority 屬性 (PR)
  • [改善] Next.js 現在提供 unstable_rethrow 函式,以在 App Router 中重新擲回 Next.js 內部錯誤 (PR)
  • [改善] unstable_after 現在可以在靜態頁面中使用 (PR)
  • [改善] 如果在 SSR 期間使用 next/dynamic 元件,將會預先擷取 chunk (PR)
  • [改善] App Router 現在支援 esmExternals 選項 (PR)
  • [改善] experimental.allowDevelopmentBuild 選項可用於允許 NODE_ENV=developmentnext build 搭配使用,以進行偵錯 (PR)
  • [改善] Server Action 轉換現在在 Pages Router 中已停用 (PR)
  • [改善] 組建工作程序現在將在它們退出時停止組建掛起 (PR)
  • [改進] 從伺服器動作重新導向時,重新驗證現在將正確應用 (PR)
  • [改進] 動態參數現在在 Edge Runtime 上針對平行路由正確處理 (PR)
  • [改進] 靜態頁面在初始載入後現在將遵循 staleTime (PR)
  • [改進] vercel/og 已更新,包含記憶體洩漏修復 (PR)
  • [改進] 修補程式計時已更新,允許使用類似 msw 的套件來模擬 API (PR)
  • [改進] 預先渲染頁面應使用靜態 staleTime (PR)

若要了解更多資訊,請查看升級指南

貢獻者

Next.js 是超過 3,000 位獨立開發者、Google 和 Meta 等產業夥伴,以及我們 Vercel 核心團隊共同努力的成果。本次發布由以下團隊為您帶來:

衷心感謝 @AbhiShake1、@Aerilym、@AhmedBaset、@AnaTofuZ、@Arindam200、@Arinji2、@ArnaudFavier、@ArnoldVanN、@Auxdible、@B33fb0n3、@Bhavya031、@Bjornnyborg、@BunsDev、@CannonLock、@CrutchTheClutch、@DeepakBalaraman、@DerTimonius、@Develliot、@EffectDoplera、@Ehren12、@Ethan-Arrowood、@FluxCapacitor2、@ForsakenHarmony、@Francoscopic、@Gomah、@GyoHeon、@Hemanshu-Upadhyay、@HristovCodes、@HughHzyb、@IAmKushagraSharma、@IDNK2203、@IGassmann、@ImDR、@IncognitoTGT、@Jaaneek、@JamBalaya56562、@Jeffrey-Zutt、@JohnGemstone、@JoshuaKGoldberg、@Julian-Louis、@Juneezee、@KagamiChan、@Kahitar、@KeisukeNagakawa、@KentoMoriwaki、@Kikobeats、@KonkenBonken、@Kuboczoch、@Lada496、@LichuAcu、@LorisSigrist、@Lsnsh、@Luk-z、@Luluno01、@M-YasirGhaffar、@Maaz-Ahmed007、@Manoj-M-S、@ManuLpz4、@Marukome0743、@MaxLeiter、@MehfoozurRehman、@MildTomato、@MonstraG、@N2D4、@NavidNourani、@Nayeem-XTREME、@Netail、@NilsJacobsen、@Ocheretovich、@OlyaPolya、@PapatMayuri、@PaulAsjes、@PlagueFPS、@ProchaLu、@Pyr33x、@QiuranHu、@RiskyMH、@Sam-Phillemon9493、@Sayakie、@Shruthireddy04、@SouthLink、@Strift、@SukkaW、@Teddir、@Tim-Zj、@TrevorSayre、@Unsleeping、@Willem-Jaap、@a89529294、@abdull-haseeb、@abhi12299、@acdlite、@actopas、@adcichowski、@adiguno、@agadzik、@ah100101、@akazwz、@aktoriukas、@aldosch、@alessiomaffeis、@allanchau、@alpedia0、@amannn、@amikofalvy、@anatoliik-lyft、@anay-208、@andrii-bodnar、@anku255、@ankur-dwivedi、@aralroca、@archanaagivale30、@arlyon、@atik-persei、@avdeev、@baeharam、@balazsorban44、@bangseongbeom、@begalinsaf、@bennettdams、@bewinsnw、@bgw、@blvdmitry、@bobaaaaa、@boris-szl、@bosconian-dynamics、@brekk、@brianshano、@cfrank、@chandanpasunoori、@chentsulin、@chogyejin、@chrisjstott、@christian-bromann、@codeSTACKr、@coderfin、@coltonehrman、@controversial、@coopbri、@creativoma、@crebelskydico、@crutchcorn、@darthmaim、@datner、@davidsa03、@delbaoliveira、@devjiwonchoi、@devnyxie、@dhruv-kaushik、@dineshh-m、@diogocapela、@dnhn、@domdomegg、@domin-mnd、@dvoytenko、@ebCrypto、@ekremkenter、@emmerich、@flybayer、@floriangosse、@forsakenharmony、@francoscopic、@frys、@gabrielrolfsen、@gaojude、@gdborton、@greatvivek11、@gnoff、@guisehn、@GyoHeon、@hamirmahal、@hiro0218、@hirotomoyamada、@housseindjirdeh、@hungdoansy、@huozhi、@hwangstar156、@iampoul、@ianmacartney、@icyJoseph、@ijjk、@imddc、@imranolas、@iscekic、@jantimon、@jaredhan418、@jeanmax1me、@jericopulvera、@jjm2317、@jlbovenzo、@joelhooks、@joeshub、@jonathan-ingram、@jonluca、@jontewks、@joostmeijles、@jophy-ye、@jordienr、@jordyfontoura、@kahlstrm、@karlhorky、@karlkeefer、@kartheesan05、@kdy1、@kenji-webdev、@kevva、@khawajaJunaid、@kidonng、@kiner-tang、@kippmr、@kjac、@kjugi、@kshehadeh、@kutsan、@kwonoj、@kxlow、@leerob、@lforst、@li-jia-nan、@liby、@lonr、@lorensr、@lovell、@lubieowoce、@luciancah、@luismiramirez、@lukahartwig、@lumirlumir、@luojiyin1987、@mamuso、@manovotny、@marlier、@mauroaccornero、@maxhaomh、@mayank1513、@mcnaveen、@md-rejoyan-islam、@mehmetozguldev、@mert-duzgun、@mirasayon、@mischnic、@mknichel、@mobeigi、@molebox、@mratlamwala、@mud-ali、@n-ii-ma、@n1ckoates、@nattui、@nauvalazhar、@neila-a、@neoFinch、@niketchandivade、@nisabmohd、@none23、@notomo、@notrab、@nsams、@nurullah、@okoyecharles、@omahs、@paarthmadan、@pathliving、@pavelglac、@penicillin0、@phryneas、@pkiv、@pnutmath、@qqww08、@r34son、@raeyoung-kim、@remcohaszing、@remorses、@rezamauliadi、@rishabhpoddar、@ronanru、@royalfig、@rubyisrust、@ryan-nauman、@ryohidaka、@ryota-murakami、@s-ekai、@saltcod、@samcx、@samijaber、@sean-rallycry、@sebmarkbage、@shubh73、@shuding、@sirTangale、@sleevezip、@slimbde、@soedirgo、@sokra、@sommeeeer、@sopranopillow、@souporserious、@srkirkland、@steadily-worked、@steveluscher、@stipsan、@styfle、@stylessh、@syi0808、@symant233、@tariknh、@theoludwig、@timfish、@timfuhrmann、@timneutkens、@tknickman、@todor0v、@tokkiyaa、@torresgol10、@tranvanhieu01012002、@txxxxc、@typeofweb、@unflxw、@unstubbable、@versecafe、@vicb、@vkryachko、@wbinnssmith、@webtinax、@weicheng95、@wesbos、@whatisagi、@wiesson、@woutvanderploeg、@wyattjoh、@xiaohanyu、@xixixao、@xugetsu、@yosefbeder、@ypessoa、@ytori、@yunsii、@yurivangeffen、@z0n、@zce、@zhawtof、@zsh77 和 @ztanner 的協助!