Menu

turbopack

turbopack 选项允许你自定义 Turbopack 以转换不同的文件并更改模块的解析方式。

值得注意的是:在 Next.js 13.0.0 到 15.2.x 版本中,turbopack 选项以前被命名为 experimental.turboexperimental.turbo 选项将在 Next.js 16 中移除。

如果你使用的是较旧版本的 Next.js,请运行 npx @next/codemod@latest next-experimental-turbo-to-turbopack . 来自动迁移你的配置。

next.config.ts
TypeScript
import type { NextConfig } from 'next'
 
const nextConfig: NextConfig = {
  turbopack: {
    // ...
  },
}
 
export default nextConfig

值得注意的是

  • Next.js 的 Turbopack 不需要加载器或加载器配置即可实现内置功能。Turbopack 内置了对 CSS 和编译现代 JavaScript 的支持,因此如果你使用 @babel/preset-env,则不需要 css-loaderpostcss-loaderbabel-loader

参考

选项

turbopack 配置可使用以下选项:

选项描述
root设置应用程序根目录。应该是绝对路径。
rules在使用 Turbopack 运行时要应用的受支持 webpack 加载器列表。
resolveAlias将别名导入映射到要加载的模块。
resolveExtensions导入文件时要解析的扩展名列表。
debugIds在 JavaScript 包和 source map 中启用 debug ID 的生成。

支持的加载器

以下加载器已经过测试,可以与 Turbopack 的 webpack 加载器实现配合使用,但许多其他 webpack 加载器也应该可以正常工作,即使未在此处列出:

缺失的 Webpack 加载器特性

Turbopack 使用 loader-runner 库来执行 webpack 加载器,它提供了大部分标准加载器 API。但是,一些特性不受支持:

模块加载:

文件系统和输出:

  • fs - 部分支持:目前仅实现了 fs.readFile
  • emitFile - 不支持

上下文属性:

工具:

如果你有一个严重依赖于这些特性之一的加载器,请提交问题。

示例

根目录

Turbopack 使用根目录来解析模块。项目根目录之外的文件不会被解析。

Next.js 会自动检测你的项目的根目录。它通过查找以下文件之一来实现:

  • pnpm-lock.yaml
  • package-lock.json
  • yarn.lock
  • bun.lock
  • bun.lockb

如果你有不同的项目结构,例如你不使用工作区,你可以手动设置 root 选项:

next.config.js
const path = require('path')
module.exports = {
  turbopack: {
    root: path.join(__dirname, '..'),
  },
}

配置 webpack 加载器

如果你需要的加载器支持超出了内置功能,许多 webpack 加载器已经可以与 Turbopack 配合使用。目前存在一些限制:

  • 仅实现了 webpack 加载器 API 的核心子集。目前,对于一些流行的加载器来说有足够的覆盖范围,我们将在未来扩展我们的 API 支持。
  • 仅支持返回 JavaScript 代码的加载器。转换样式表或图像等文件的加载器目前不受支持。
  • 传递给 webpack 加载器的选项必须是纯 JavaScript 原始值、对象和数组。例如,不可能将 require() 插件模块作为选项值传递。

要配置加载器,请在 next.config.js 中添加你已安装的加载器的名称和任何选项,将文件扩展名映射到加载器列表。规则按顺序评估。

下面是一个使用 @svgr/webpack 加载器的示例,它允许导入 .svg 文件并将它们渲染为 React 组件。

next.config.js
module.exports = {
  turbopack: {
    rules: {
      '*.svg': {
        loaders: ['@svgr/webpack'],
        as: '*.js',
      },
    },
  },
}

值得注意的是rules 对象中使用的 glob 基于文件名进行匹配,除非 glob 包含 / 字符,这将导致它基于完整的项目相对文件路径进行匹配。Windows 文件路径被规范化为使用 unix 风格的 / 路径分隔符。

Turbopack 使用 Rust globset的修改版本。

对于需要配置选项的加载器,你可以使用对象格式而不是字符串:

next.config.js
module.exports = {
  turbopack: {
    rules: {
      '*.svg': {
        loaders: [
          {
            loader: '@svgr/webpack',
            options: {
              icon: true,
            },
          },
        ],
        as: '*.js',
      },
    },
  },
}

值得注意的是:在 Next.js 13.4.4 版本之前,turbopack.rules 被命名为 turbo.loaders,并且只接受像 .mdx 这样的文件扩展名,而不是 *.mdx

高级 webpack 加载器条件

你可以使用高级 condition 语法进一步限制加载器运行的位置:

next.config.js
module.exports = {
  turbopack: {
    rules: {
      // '*' 将匹配所有文件路径,但我们使用条件限制规则运行的位置。
      '*': {
        condition: {
          all: [
            // 'foreign' 是一个内置条件。
            { not: 'foreign' },
            // 'path' 可以是 RegExp 或 glob 字符串。RegExp 匹配
            // 完整项目相对文件路径中的任何位置。
            { path: /^img\/[0-9]{3}\// },
            {
              any: [
                { path: '*.svg' },
                // 'content' 始终是 RegExp,可以匹配
                // 文件中的任何位置。
                { content: /\<svg\W/ },
              ],
            },
          ],
        },
        loaders: ['@svgr/webpack'],
        as: '*.js',
      },
    },
  },
}
  • 支持的布尔运算符是 {all: [...]}{any: [...]}{not: ...}
  • 支持的可自定义运算符是 {path: string | RegExp}{content: RegExp}。如果在同一个对象中指定了 pathcontent,它将作为隐式 and

此外,还支持许多内置条件:

  • browser:匹配将在客户端执行的代码。服务器代码可以使用 {not: 'browser'} 匹配。
  • foreign:匹配 node_modules 中的代码,以及一些 Next.js 内部代码。通常你会希望将加载器限制为 {not: 'foreign'}。这可以通过减少调用加载器的文件数量来提高性能。
  • development:匹配使用 next dev 时。
  • production:匹配使用 next build 时。
  • node:匹配将在默认 Node.js 运行时上运行的代码。
  • edge-light:匹配将在 Edge 运行时上运行的代码。

规则可以是对象或对象数组。数组通常对于建模不相交条件很有用:

next.config.js
module.exports = {
  turbopack: {
    rules: {
      '*.svg': [
        {
          condition: 'browser',
          loaders: ['@svgr/webpack'],
          as: '*.js',
        },
        {
          condition: { not: 'browser' },
          loaders: [require.resolve('./custom-svg-loader.js')],
          as: '*.js',
        },
      ],
    },
  },
}

值得注意的是:所有匹配的规则都按顺序执行。

解析别名

可以配置 Turbopack 通过别名修改模块解析,类似于 webpack 的 resolve.alias 配置。

要配置解析别名,请在 next.config.js 中将导入的模式映射到它们的新目标:

next.config.js
module.exports = {
  turbopack: {
    resolveAlias: {
      underscore: 'lodash',
      mocha: { browser: 'mocha/browser-entry.js' },
    },
  },
}

这会将 underscore 包的导入别名为 lodash 包。换句话说,import underscore from 'underscore' 将加载 lodash 模块而不是 underscore

Turbopack 还通过此字段支持条件别名,类似于 Node.js 的条件导出。目前仅支持 browser 条件。在上面的情况下,当 Turbopack 针对浏览器环境时,mocha 模块的导入将被别名为 mocha/browser-entry.js

解析自定义扩展名

可以配置 Turbopack 解析具有自定义扩展名的模块,类似于 webpack 的 resolve.extensions 配置。

要配置解析扩展名,请在 next.config.js 中使用 resolveExtensions 字段:

next.config.js
module.exports = {
  turbopack: {
    resolveExtensions: ['.mdx', '.tsx', '.ts', '.jsx', '.js', '.mjs', '.json'],
  },
}

这会用提供的列表覆盖原始解析扩展名。确保包含默认扩展名。

有关如何将你的应用从 webpack 迁移到 Turbopack 的更多信息和指导,请参阅 Turbopack 关于 webpack 兼容性的文档

Debug ID

可以配置 Turbopack 在 JavaScript 包和 source map 中生成 debug ID

要配置 debug ID,请在 next.config.js 中使用 debugIds 字段:

next.config.js
module.exports = {
  turbopack: {
    debugIds: true,
  },
}

该选项会自动将 debug ID 的 polyfill 添加到 JavaScript 包中以确保兼容性。debug ID 在 globalThis._debugIds 全局变量中可用。

版本历史

版本变更
16.0.0引入 turbopack.debugIds
16.0.0引入 turbopack.rules.*.condition
15.3.0experimental.turbo 更改为 turbopack
13.0.0引入 experimental.turbo