2024年10月21日,星期一
Next.js 15
釋出者Next.js 15 已正式穩定釋出並可投入生產使用。此版本基於 RC1 和 RC2 的更新構建。我們著重關注穩定性,同時添加了一些您會喜歡的新功能。立即嘗試 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/codemodCLI: 輕鬆升級到最新的 Next.js 和 React 版本。- 非同步請求 API(重大更改): 朝著簡化的渲染和快取模型邁出的增量一步。
- 快取語義(重大更改):
fetch請求、GET路由處理程式和客戶端導航預設不再快取。 - 支援 React 19: 支援 React 19、React 編譯器(實驗性)和水合錯誤改進。
- Turbopack Dev(穩定版): 效能和穩定性改進。
- 靜態路由指示器: 新的視覺指示器在開發過程中顯示靜態路由。
unstable_afterAPI(實驗性): 在響應流結束後執行程式碼。instrumentation.jsAPI(穩定版): 用於伺服器生命週期可觀測性的新 API。- 增強表單(
next/form): 使用客戶端導航增強 HTML 表單。 next.config: 支援next.config.ts的 TypeScript。- 自託管改進: 對
Cache-Control標頭有更多控制。 - 伺服器操作安全性: 不可猜測的端點和刪除未使用的操作。
- 捆綁外部包(穩定版): App 和 Pages 路由的新配置選項。
- 支援 ESLint 9: 增加了對 ESLint 9 的支援。
- 開發和構建效能: 改進了構建時間,並加快了 Fast Refresh 的速度。
使用 @next/codemod CLI 平滑升級
我們為每個主要 Next.js 版本都提供了 codemods(自動化程式碼轉換),以幫助自動化升級重大更改。
為了使升級更加順暢,我們釋出了一個增強的 codemod CLI。
npx @next/codemod@canary upgrade latest此工具可幫助您將程式碼庫升級到最新的穩定版或預釋出版本。CLI 將更新您的依賴項,顯示可用的 codemods,並引導您應用它們。
canary 標籤使用最新版本的 codemod,而 latest 則指定 Next.js 版本。我們建議即使您要升級到最新的 Next.js 版本,也使用 canary 版本的 codemod,因為我們計劃根據您的反饋繼續改進該工具。
瞭解更多關於 Next.js codemod CLI 的資訊。
非同步請求 API(重大更改)
在傳統的伺服器端渲染中,伺服器會等待請求後才渲染任何內容。然而,並非所有元件都依賴於特定請求的資料,因此無需等待請求來渲染它們。理想情況下,伺服器會在請求到達之前儘可能多地進行準備。為了實現這一點,併為未來的最佳化奠定基礎,我們需要知道何時等待請求。
因此,我們正在將依賴於請求特定資料(例如 headers、cookies、params 和 searchParams)的 API 轉換為非同步。
import { cookies } from 'next/headers';
export async function AdminPanel() {
const cookieStore = await cookies();
const token = cookieStore.get('token');
// ...
}這是一項重大更改,影響以下 API:
cookiesheadersdraftModelayout.js、page.js、route.js、default.js、generateMetadata和generateViewport中的paramspage.js中的searchParams
為了更輕鬆的遷移,這些 API 可以暫時同步訪問,但在下一個主要版本之前,開發和生產環境中會顯示警告。提供了 codemod 以自動化遷移。
npx @next/codemod@canary next-async-request-api .對於 codemod 無法完全遷移您程式碼的情況,請閱讀升級指南。我們還提供了一個將 Next.js 應用程式遷移到新 API 的示例。
快取語義
Next.js App Router 推出了有主見的快取預設設定。這些設定旨在預設提供最高效能的選項,並可在需要時選擇退出。
根據您的反饋,我們重新評估了我們的快取啟發式演算法以及它們如何與部分預渲染(PPR)等專案以及使用 fetch 的第三方庫進行互動。
在 Next.js 15 中,我們將 GET 路由處理程式和客戶端路由快取的預設快取行為從預設快取更改為預設不快取。如果您想保留以前的行為,可以繼續選擇啟用快取。
我們將在未來幾個月內繼續改進 Next.js 中的快取,並很快分享更多詳細資訊。
GET 路由處理程式預設不再快取
在 Next 14 中,使用 GET HTTP 方法的路由處理程式預設會被快取,除非它們使用了動態函式或動態配置選項。在 Next.js 15 中,GET 函式預設不快取。
您仍然可以使用靜態路由配置選項(例如 export dynamic = 'force-static')選擇啟用快取。
像 sitemap.ts、opengraph-image.tsx 和 icon.tsx 等特殊路由處理程式以及其他元資料檔案預設保持靜態,除非它們使用了動態函式或動態配置選項。
客戶端路由快取預設不再快取頁面元件
在 Next.js 14.2.0 中,我們引入了一個實驗性的 staleTimes 標誌,允許自定義配置路由快取。
在 Next.js 15 中,此標誌仍然可用,但我們正在將頁面片段的預設行為更改為 staleTime 為 0。這意味著,當您在應用程式中導航時,客戶端將始終反映導航時變為活動狀態的頁面元件的最新資料。但是,仍有一些重要行為保持不變:
- 共享佈局資料不會從伺服器重新獲取,以繼續支援部分渲染。
- 前進/後退導航仍將從快取中恢復,以確保瀏覽器可以恢復滾動位置。
loading.js將繼續快取 5 分鐘(或staleTimes.static配置的值)。
您可以透過設定以下配置選擇啟用以前的客戶端路由快取行為:
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 做好充分準備。
為了確保過渡儘可能順利,我們提供了 codemods 和自動化工具來幫助簡化遷移過程。
閱讀Next.js 15 升級指南、React 19 升級指南,並觀看React Conf 主題演講以瞭解更多資訊。
在 React 18 上使用 Pages Router
Next.js 15 保持了 Pages Router 對 React 18 的向後相容性,允許使用者在受益於 Next.js 15 的改進的同時繼續使用 React 18。
自第一個釋出候選版本 (RC1) 以來,我們已根據社群反饋將重點轉移到支援 React 18。這種靈活性使您能夠在使用 Pages Router 和 React 18 的同時採用 Next.js 15,從而更好地控制您的升級路徑。
注意:雖然可以在同一個應用程式中同時執行基於 React 18 的 Pages Router 和基於 React 19 的 App Router,但我們不推薦這種設定。這樣做可能導致不可預測的行為和型別不一致,因為這兩個版本之間的底層 API 和渲染邏輯可能無法完全對齊。
React 編譯器(實驗性)
React 編譯器是 Meta 的 React 團隊建立的一個新的實驗性編譯器。該編譯器透過理解純 JavaScript 語義和React 規則,深入理解您的程式碼,從而可以為您的程式碼新增自動最佳化。該編譯器減少了開發人員透過 useMemo 和 useCallback 等 API 進行手動 memoization 的工作量,使程式碼更簡單、更易於維護且不易出錯。
在 Next.js 15 中,我們添加了對React 編譯器的支援。瞭解更多關於 React 編譯器以及可用的 Next.js 配置選項。
注意:React 編譯器目前僅作為 Babel 外掛提供,這將導致開發和構建時間變慢。
水合錯誤改進
Next.js 14.1 改進了錯誤訊息和水合錯誤。Next.js 15 透過新增改進的水合錯誤檢視繼續在此基礎上構建。水合錯誤現在顯示帶有解決問題建議的錯誤原始碼。
例如,這是 Next.js 14.1 中以前的水合錯誤訊息:

Next.js 15 已將其改進為:

Turbopack 開發版
我們很高興地宣佈 next dev --turbo 現已穩定並準備就緒,可以加快您的開發體驗。我們一直在使用它來迭代 vercel.com、nextjs.org、v0 以及所有其他應用程式,並取得了顯著成果。
例如,對於大型 Next.js 應用程式 vercel.com,我們觀察到:
- 本地伺服器啟動速度提升高達 76.7%。
- 使用 Fast Refresh 的程式碼更新速度提升高達 96.3%。
- 在沒有快取的情況下,初始路由編譯速度提升高達 45.8%(Turbopack 尚未支援磁碟快取)。
您可以在我們新的部落格文章中瞭解更多關於 Turbopack Dev 的資訊。
靜態路由指示器
Next.js 現在在開發過程中顯示一個靜態路由指示器,以幫助您識別哪些路由是靜態的或動態的。這個視覺提示通過了解您的頁面如何渲染,使其更容易最佳化效能。

您還可以使用 next build 輸出檢視所有路由的渲染策略。
此更新是我們不斷努力增強 Next.js 可觀察性的一部分,使開發人員更容易監控、除錯和最佳化其應用程式。我們還在開發專用開發工具,更多詳細資訊即將釋出。
瞭解更多關於靜態路由指示器的資訊,它可以被停用。
使用 unstable_after 在響應後執行程式碼(實驗性)
在處理使用者請求時,伺服器通常會執行與計算響應直接相關的任務。但是,您可能需要執行諸如日誌記錄、分析和其他外部系統同步等任務。
由於這些任務與響應不直接相關,因此使用者不應該等待它們完成。在響應使用者後推遲工作會帶來挑戰,因為無伺服器函式在響應關閉後會立即停止計算。
after() 是一個新的實驗性 API,它透過允許您安排在響應流完成後處理的工作來解決此問題,從而使輔助任務在不阻塞主響應的情況下執行。
要使用它,請將 experimental.after 新增到 next.config.js 中。
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 (穩定版)
instrumentation 檔案,以及 register() API,允許使用者利用 Next.js 伺服器生命週期來監控效能、跟蹤錯誤來源,並與 OpenTelemetry 等可觀測性庫深度整合。
此功能現已穩定,並且可以移除 experimental.instrumentationHook 配置選項。
此外,我們與 Sentry 合作設計了一個新的 onRequestError 鉤子,可用於:
- 捕獲伺服器上丟擲的所有錯誤的重要上下文,包括:
- 路由: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> 元素,支援預取、客戶端導航和漸進式增強。
它適用於導航到新頁面的表單,例如導致結果頁面的搜尋表單。
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 型別以實現自動補全和型別安全的選項:
import type { NextConfig } from 'next';
const nextConfig: NextConfig = {
/* config options here */
};
export default nextConfig;瞭解更多關於 Next.js 中 TypeScript 支援的資訊。
自託管改進
自託管應用程式時,您可能需要對 Cache-Control 指令有更多控制。
一個常見的例子是控制為 ISR 頁面傳送的 stale-while-revalidate 週期。我們實施了兩項改進:
- 您現在可以在
next.config中配置expireTime值。這以前是experimental.swrDelta選項。 - 將預設值更新為一年,確保大多數 CDN 可以完全應用預期的
stale-while-revalidate語義。
我們也不再用預設值覆蓋自定義 Cache-Control 值,從而允許完全控制並確保與任何 CDN 設定的相容性。
最後,我們改進了自託管時的影像最佳化。以前,我們建議您為 Next.js 伺服器安裝 sharp 以最佳化影像。此建議有時會被忽略。在 Next.js 15 中,您不再需要手動安裝 sharp — Next.js 將在使用 next start 或以獨立輸出模式執行時自動使用 sharp。
要了解更多資訊,請觀看我們新的關於自託管 Next.js 的演示和教程影片。
增強伺服器操作的安全性
伺服器操作是伺服器端函式,可以從客戶端呼叫。它們透過在檔案頂部新增 'use server' 指令並匯出非同步函式來定義。
即使伺服器操作或實用函式未在程式碼的其他地方匯入,它仍然是一個公共可訪問的 HTTP 端點。雖然這種行為在技術上是正確的,但它可能導致此類函式意外暴露。
為了提高安全性,我們引入了以下增強功能:
- 死程式碼消除:未使用的伺服器操作不會將其 ID 暴露給客戶端 JavaScript 包,從而減小包大小並提高效能。
- 安全操作 ID:Next.js 現在建立無法猜測、非確定性的 ID,以允許客戶端引用和呼叫伺服器操作。這些 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) {}您仍然應該將伺服器操作視為公共 HTTP 端點。瞭解更多關於保護伺服器操作的資訊。
最佳化外部包的捆綁(穩定版)
捆綁外部包可以提高應用程式的冷啟動效能。在 App Router 中,外部包預設捆綁,您可以使用新的 serverExternalPackages 配置選項選擇退出特定包。
在 Pages Router 中,外部包預設不捆綁,但您可以使用現有的 transpilePackages 選項提供要捆綁的包列表。使用此配置選項,您需要指定每個包。
為了統一 App Router 和 Pages Router 之間的配置,我們引入了一個新選項 bundlePagesRouterDependencies,以匹配 App Router 的預設自動捆綁行為。然後,您可以根據需要使用 serverExternalPackages 來選擇退出特定的包。
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 的更新日誌 中檢視所有更改。
開發和構建改進
伺服器元件 HMR
在開發過程中,伺服器元件在儲存時會重新執行。這意味著,對您的 API 端點或第三方服務的任何 fetch 請求也會被呼叫。
為了提高本地開發效能並降低計費 API 呼叫的潛在成本,我們現在確保熱模組替換 (HMR) 可以重用以前渲染的 fetch 響應。
瞭解更多關於伺服器元件 HMR 快取的資訊。
App Router 更快的靜態生成
我們優化了靜態生成,以縮短構建時間,特別是對於網路請求較慢的頁面。
以前,我們的靜態最佳化過程會渲染頁面兩次——一次用於生成客戶端導航資料,第二次用於渲染初始頁面訪問的 HTML。現在,我們重用第一次渲染,省去了第二次渲染,從而減少了工作量和構建時間。
此外,靜態生成 worker 現在在頁面之間共享 fetch 快取。如果 fetch 呼叫沒有選擇退出快取,其結果將由同一 worker 處理的其他頁面重用。這減少了對相同資料的請求數量。
高階靜態生成控制(實驗性)
我們為需要更精細控制的高階用例添加了對靜態生成過程的實驗性支援。
除非您有特定要求,否則我們建議您堅持使用當前預設值,因為這些選項可能由於併發性增加而導致資源使用量增加和潛在的記憶體不足錯誤。
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) - [重大更改] 中介軟體:應用
react-server條件以限制不推薦的 React API 匯入(PR) - [重大更改] next/font: 移除對外部
@next/font包的支援 (PR) - [重大更改] next/font: 移除
font-family雜湊 (PR) - [重大更改] 快取:
force-dynamic現在將為 fetch 快取設定no-store預設值(PR) - [重大更改] 配置:預設啟用
swcMinify(PR)、missingSuspenseWithCSRBailout(PR) 和outputFileTracing(PR) 行為,並移除已棄用選項 - [重大更改] 移除 Speed Insights 的自動檢測(現在必須使用專用的 @vercel/speed-insights 包)(PR)
- [重大更改] 移除動態 sitemap 路由的
.xml副檔名,並統一開發和生產環境中的 sitemap URL(PR) - [重大更改] 我們已棄用在 App Router 中匯出
export const runtime = "experimental-edge"。使用者現在應切換到export const runtime = "edge"。我們已新增 codemod 來執行此操作(PR) - [重大更改] 在渲染期間呼叫
revalidateTag和revalidatePath現在將丟擲錯誤(PR) - [重大更改]
instrumentation.js和middleware.js檔案現在將使用廠商提供的 React 包(PR) - [重大更改] 最低要求的 Node.js 版本已更新為 18.18.0(PR)
- [重大更改]
next/dynamic:已移除已棄用的suspense屬性,當元件在 App Router 中使用時,它將不再插入空的 Suspense 邊界(PR) - [重大更改] 在 Edge Runtime 上解析模組時,將不應用
worker模組條件(PR) - [重大更改] 禁止在伺服器元件中將
ssr: false選項與next/dynamic一起使用(PR) - [改進] 元資料:Vercel 上託管時,
metadataBase的環境變量回退已更新(PR) - [改進] 修復
optimizePackageImports混合名稱空間和命名匯入時的 tree-shaking 問題(PR) - [改進] 並行路由:為不匹配的 catch-all 路由提供所有已知引數(PR)
- [改進] 配置
bundlePagesExternals現已穩定並重命名為bundlePagesRouterDependencies - [改進] 配置
serverComponentsExternalPackages現已穩定並重命名為serverExternalPackages - [改進] create-next-app: 新專案預設忽略所有
.env檔案(PR) - [改進]
outputFileTracingRoot、outputFileTracingIncludes和outputFileTracingExcludes已從實驗性升級為穩定版(PR) - [改進] 避免將全域性 CSS 檔案與樹中更深層的 CSS 模組檔案合併(PR)
- [改進] 快取處理程式可透過
NEXT_CACHE_HANDLER_PATH環境變數指定(PR) - [改進] Pages Router 現在支援 React 18 和 React 19(PR)
- [改進] 錯誤覆蓋層現在會顯示一個按鈕,如果啟用了 Node.js Inspector,則可以複製 Node.js Inspector URL(PR)
- [改進] App Router 上的客戶端預取現在使用
priority屬性(PR) - [改進] Next.js 現在提供了一個
unstable_rethrow函式,用於在 App Router 中重新丟擲 Next.js 內部錯誤(PR) - [改進]
unstable_after現在可以在靜態頁面中使用(PR) - [改進] 如果在 SSR 期間使用
next/dynamic元件,則會預取該塊(PR) - [改進]
esmExternals選項現在在 App Router 上受支援(PR) - [改進]
experimental.allowDevelopmentBuild選項可用於允許NODE_ENV=development與next build一起用於除錯目的(PR) - [改進] 伺服器操作轉換現在在 Pages Router 中停用(PR)
- [改進] 構建 worker 現在將在退出時阻止構建掛起(PR)
- [改進] 從伺服器操作重定向時,重新驗證現在將正確應用(PR)
- [改進] Edge Runtime 上的並行路由現在可以正確處理動態引數(PR)
- [改進] 靜態頁面現在將在初始載入後遵循 staleTime(PR)
- [改進]
vercel/og已更新,修復了記憶體洩漏問題(PR) - [改進] 補丁時間已更新,以允許使用
msw等包進行 API 模擬(PR) - [改進] 預渲染頁面應使用靜態 staleTime(PR)
要了解更多資訊,請檢視升級指南。
貢獻者
Next.js 是由 3000 多名獨立開發者、Google 和 Meta 等行業合作伙伴以及 Vercel 核心團隊共同努力的成果。本次釋出由以下人員貢獻:
- Next.js 團隊:Andrew、Hendrik、Janka、Jiachi、Jimmy、Jiwon、JJ、Josh、Sam、Sebastian、Sebbie、Shu、Wyatt 和 Zack。
- Turbopack 團隊: Alex、 Benjamin、 Donny、 Maia、 Niklas、 Tim、 Tobias 和 Will。
- Next.js Docs 團隊: Delba、 Rich、 Ismael 和 Lee。
非常感謝 @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 的幫助!


