Turbopack

Turbopack 是一个专为 JavaScript 和 TypeScript 优化的 增量式打包工具,采用 Rust 编写,并内置于 Next.js。您可以在页面路由和应用路由器中使用 Turbopack,以获得 更快速 的本地开发体验。

为什么选择 Turbopack?

我们开发 Turbopack 是为了提升 Next.js 的性能,包括:

  • 统一依赖图:Next.js 支持多种输出环境(如客户端和服务器)。管理多个编译器并拼接打包结果可能很繁琐。Turbopack 为所有环境使用 单一的统一依赖图
  • 打包 vs 原生 ESM:有些工具在开发时跳过打包,依赖浏览器的原生 ESM。这对于小型应用效果良好,但对于大型应用可能会因过多的网络请求而变慢。Turbopack 在开发时进行 打包,但采用优化方式以保持大型应用的快速性。
  • 增量计算:Turbopack 将工作并行化到多个核心,并将结果 缓存 到函数级别。一旦完成某项工作,Turbopack 不会重复执行。
  • 惰性打包:Turbopack 仅打包开发服务器实际请求的内容。这种惰性方法可以减少初始编译时间和内存使用。

快速开始

要在您的 Next.js 项目中启用 Turbopack,请在 package.json 文件的 devbuild 脚本中添加 --turbopack 标志:

package.json
{
  "scripts": {
    "dev": "next dev --turbopack",
    "build": "next build --turbopack",
    "start": "next start"
  }
}

目前,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 应用路由器。Turbopack 确保正确的服务器/客户端打包。
根布局创建不支持应用路由器中自动创建根布局不受支持。Turbopack 会指导您手动创建。

CSS 和样式

功能状态备注
全局 CSS支持直接在应用中导入 .css 文件。
CSS 模块支持.module.css 文件原生支持(使用 Lightning CSS)。
CSS 嵌套支持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 的命名或默认导入支持。

模块解析

功能状态备注
路径别名支持读取 tsconfig.jsonpathsbaseUrl,与 Next.js 行为一致。
手动别名支持next.config.js 中配置 resolveAlias(类似于 webpack.resolve.alias)。
自定义扩展名支持next.config.js 中配置 resolveExtensions
AMD部分支持基本转换有效;高级 AMD 使用受限。

性能和快速刷新

功能状态备注
快速刷新支持无需完全刷新即可更新 JavaScript、TypeScript 和 CSS。
增量打包支持Turbopack 惰性地仅构建开发服务器请求的内容,加速大型应用。

不支持和不计划支持的功能

某些功能尚未实现或不计划支持:

  • 遗留 CSS 模块功能
    • 独立的 :local:global 伪类(仅支持函数变体 :global(...))。
    • @value 规则(由 CSS 变量取代)。
    • :import:export ICSS 规则。
    • .module.css 中的 composes 组合 .css 文件。在 webpack 中会将 .css 文件视为 CSS 模块,而 Turbopack 始终将 .css 文件视为全局。这意味着如果要在 CSS 模块中使用 composes,需要将 .css 文件改为 .module.css 文件。
    • CSS 模块中的 @import 导入 .css 作为 CSS 模块。在 webpack 中会将 .css 文件视为 CSS 模块,而 Turbopack 始终将 .css 文件视为全局。这意味着如果要在 CSS 模块中使用 @import,需要将 .css 文件改为 .module.css 文件。
  • next.config.js 中的 webpack() 配置 Turbopack 替代了 webpack,因此不识别 webpack() 配置。改用 turbopack 配置
  • AMP Next.js 中不计划支持 Turbopack。
  • Yarn PnP Next.js 中不计划支持 Turbopack。
  • experimental.urlImports 不计划支持 Turbopack。
  • 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 的内存限制(以字节为单位)。
next.config.js
module.exports = {
  turbopack: {
    // 示例:添加别名和自定义文件扩展名
    resolveAlias: {
      underscore: 'lodash',
    },
    resolveExtensions: ['.mdx', '.tsx', '.ts', '.jsx', '.js', '.json'],
  },
}

有关更深入的配置示例,请参阅 Turbopack 配置文档

生成性能调试跟踪文件

如果遇到性能或内存问题,并希望帮助 Next.js 团队诊断,您可以通过在开发命令后附加 NEXT_TURBOPACK_TRACING=1 来生成跟踪文件:

NEXT_TURBOPACK_TRACING=1 next dev --turbopack

这将生成 .next/trace-turbopack 文件。在 Next.js 仓库 创建 GitHub 问题时包含该文件,以帮助我们调查。

总结

Turbopack 是一个基于 Rust增量式 打包工具,旨在使本地开发和构建更快——特别是对于大型应用。它集成到 Next.js 中,提供零配置的 CSS、React 和 TypeScript 支持。

随着我们继续改进 Turbopack 并添加生产构建支持,请关注更多更新。同时,尝试使用 next dev --turbopack 并告诉我们您的反馈。

版本变更

版本变更
v15.3.0build 的实验性支持
v15.0.0dev 的 Turbopack 稳定