Turbopack
Turbopack 是一个采用 Rust 编写的增量式打包工具,专为 JavaScript 和 TypeScript 优化,并内置于 Next.js 中。您可以在 Pages Router 和 App Router 中使用 Turbopack,以获得更快速的本地开发体验。
为什么选择 Turbopack?
我们开发 Turbopack 是为了提升 Next.js 的性能,包括:
- 统一依赖图:Next.js 支持多种输出环境(如客户端和服务器端)。管理多个编译器并拼接打包结果可能很繁琐。Turbopack 为所有环境使用单一的统一依赖图。
- 打包 vs 原生 ESM:一些工具在开发时跳过打包,依赖浏览器的原生 ESM。这对小型应用效果良好,但对大型应用可能因过多的网络请求而变慢。Turbopack 在开发时仍进行打包,但采用优化方式以保持大型应用的速度。
- 增量计算:Turbopack 将工作并行分配到多个核心,并将结果缓存到函数级别。一旦某项工作完成,Turbopack 不会重复执行。
- 惰性打包:Turbopack 仅打包开发服务器实际请求的内容。这种惰性方法可以减少初始编译时间和内存使用。
快速开始
要在 Next.js 项目中启用 Turbopack,请在 package.json
文件的 dev
和 build
脚本中添加 --turbopack
标志:
目前,Turbopack 的 dev
功能已稳定,而 build
功能处于 alpha 阶段。我们正在积极开发生产环境支持,以推动 Turbopack 迈向稳定。
支持的功能
Next.js 中的 Turbopack 对常见用例提供零配置支持。以下是开箱即用功能的概览,以及如何按需进一步配置 Turbopack 的参考。
语言特性
功能 | 状态 | 备注 |
---|---|---|
JavaScript & TypeScript | 支持 | 底层使用 SWC。类型检查不由 Turbopack 完成(需运行 tsc --watch 或依赖 IDE 进行类型检查)。 |
ECMAScript (ESNext) | 支持 | Turbopack 支持最新的 ECMAScript 特性,覆盖范围与 SWC 一致。 |
CommonJS | 支持 | require() 语法开箱即用。 |
ESM | 支持 | 静态和动态 import 均完全支持。 |
Babel | 部分不支持 | Turbopack 默认不包含 Babel。但您可以通过 Turbopack 配置配置 babel-loader 。 |
框架和 React 特性
功能 | 状态 | 备注 |
---|---|---|
JSX / TSX | 支持 | 由 SWC 处理 JSX/TSX 编译。 |
快速刷新 (Fast Refresh) | 支持 | 无需配置。 |
React 服务端组件 (RSC) | 支持 | 适用于 Next.js App Router。Turbopack 确保正确的服务端/客户端打包。 |
根布局创建 | 不支持 | App Router 中自动创建根布局的功能不受支持。Turbopack 会提示您手动创建。 |
CSS 和样式
功能 | 状态 | 备注 |
---|---|---|
全局 CSS | 支持 | 直接在应用中导入 .css 文件。 |
CSS 模块 (CSS Modules) | 支持 | .module.css 文件原生支持(使用 Lightning CSS)。 |
CSS 嵌套 (CSS Nesting) | 支持 | Lightning CSS 支持 现代 CSS 嵌套。 |
@import 语法 | 支持 | 合并多个 CSS 文件。 |
PostCSS | 支持 | 自动在 Node.js 工作线程池中处理 postcss.config.js 。适用于 Tailwind、Autoprefixer 等。 |
Sass / SCSS | 支持 (Next.js) | 在 Next.js 中,Sass 开箱即用。未来,Turbopack 独立使用时可能需要配置加载器。 |
Less | 计划通过插件支持 | 目前默认不支持。自定义加载器稳定后可能需要配置加载器。 |
Lightning CSS | 使用中 | 处理 CSS 转换。某些低使用率的 CSS 模块功能(如独立的 :local/:global 伪类)暂不支持。详见下文 |
资源
功能 | 状态 | 备注 |
---|---|---|
静态资源 (图片、字体) | 支持 | 导入 import img from './img.png' 开箱即用。在 Next.js 中,返回 <Image /> 组件的对象。 |
JSON 导入 | 支持 | 支持从 .json 文件进行命名或默认导入。 |
模块解析
功能 | 状态 | 备注 |
---|---|---|
路径别名 (Path Aliases) | 支持 | 读取 tsconfig.json 的 paths 和 baseUrl ,匹配 Next.js 行为。 |
手动别名 (Manual Aliases) | 支持 | 在 next.config.js 中配置 resolveAlias (类似 webpack.resolve.alias )。 |
自定义扩展名 (Custom Extensions) | 支持 | 在 next.config.js 中配置 resolveExtensions 。 |
AMD | 部分支持 | 基本转换可用;高级 AMD 用法受限。 |
性能和快速刷新
功能 | 状态 | 备注 |
---|---|---|
快速刷新 (Fast Refresh) | 支持 | 无需完全刷新即可更新 JavaScript、TypeScript 和 CSS。 |
增量打包 (Incremental Bundling) | 支持 | Turbopack 惰性打包仅开发服务器请求的内容,加速大型应用。 |
不支持及未计划的功能
以下功能暂未实现或未计划支持:
- 传统 CSS 模块功能
- 独立的
:local
和:global
伪类(仅支持函数形式:global(...)
)。 @value
规则(由 CSS 变量取代)。:import
和:export
ICSS 规则。
- 独立的
webpack()
配置 在next.config.js
中 Turbopack 替代了 webpack,因此webpack()
配置不被识别。请改用turbopack
配置。- AMP Next.js 中不计划支持 Turbopack。
- Yarn PnP Next.js 中不计划支持 Turbopack。
experimental.urlImports
不计划支持。experimental.esmExternals
不计划支持。Turbopack 不支持 Next.js 中的传统esmExternals
配置。- 部分 Next.js 实验性标志
experimental.typedRoutes
experimental.nextScriptWorkers
experimental.sri.algorithm
experimental.fallbackNodePolyfills
我们计划未来实现这些功能。
完整的功能标志状态详情,请参阅 Turbopack API 参考。
配置
Turbopack 可通过 next.config.js
(或 next.config.ts
)中的 turbopack
键进行配置。配置选项包括:
rules
定义额外的 webpack 加载器 以进行文件转换。resolveAlias
创建手动别名(类似 webpack 的resolve.alias
)。resolveExtensions
更改或扩展模块解析的文件扩展名。moduleIds
设置模块 ID 的生成方式('named'
或'deterministic'
)。treeShaking
在开发和未来的生产构建中启用或禁用摇树优化。memoryLimit
设置 Turbopack 的内存限制(字节)。
更多配置示例,请参阅 Turbopack 配置文档。
生成性能调试跟踪文件
如果您遇到性能或内存问题并希望帮助 Next.js 团队诊断,可以在开发命令后追加 NEXT_TURBOPACK_TRACING=1
来生成跟踪文件:
这将生成 .next/trace-turbopack
文件。在 Next.js 仓库 创建 GitHub 问题时包含该文件,以帮助我们调查。
总结
Turbopack 是一个基于 Rust 的增量式打包工具,旨在加速本地开发和构建——特别是大型应用。它集成于 Next.js 中,提供零配置的 CSS、React 和 TypeScript 支持。
随着我们持续改进 Turbopack 并增加生产构建支持,请关注更多更新。现在,您可以通过 next dev --turbopack
尝试它,并告诉我们您的反馈。
版本变更
版本 | 变更 |
---|---|
v15.3.0 | 实验性支持 build |
v15.0.0 | dev 功能稳定 |