turbopack
turbopack 选项允许你自定义 Turbopack 以转换不同的文件并更改模块的解析方式。
值得注意的是:在 Next.js 13.0.0 到 15.2.x 版本中,
turbopack选项以前被命名为experimental.turbo。experimental.turbo选项将在 Next.js 16 中移除。如果你使用的是较旧版本的 Next.js,请运行
npx @next/codemod@latest next-experimental-turbo-to-turbopack .来自动迁移你的配置。
import type { NextConfig } from 'next'
const nextConfig: NextConfig = {
turbopack: {
// ...
},
}
export default nextConfig值得注意的是:
- Next.js 的 Turbopack 不需要加载器或加载器配置即可实现内置功能。Turbopack 内置了对 CSS 和编译现代 JavaScript 的支持,因此如果你使用
@babel/preset-env,则不需要css-loader、postcss-loader或babel-loader。
参考
选项
turbopack 配置可使用以下选项:
| 选项 | 描述 |
|---|---|
root | 设置应用程序根目录。应该是绝对路径。 |
rules | 在使用 Turbopack 运行时要应用的受支持 webpack 加载器列表。 |
resolveAlias | 将别名导入映射到要加载的模块。 |
resolveExtensions | 导入文件时要解析的扩展名列表。 |
debugIds | 在 JavaScript 包和 source map 中启用 debug ID 的生成。 |
支持的加载器
以下加载器已经过测试,可以与 Turbopack 的 webpack 加载器实现配合使用,但许多其他 webpack 加载器也应该可以正常工作,即使未在此处列出:
babel-loader(如果找到 Babel 配置文件,则自动配置)@svgr/webpacksvg-inline-loaderyaml-loaderstring-replace-loaderraw-loadersass-loader(自动配置)graphql-tag/loader
缺失的 Webpack 加载器特性
Turbopack 使用 loader-runner 库来执行 webpack 加载器,它提供了大部分标准加载器 API。但是,一些特性不受支持:
模块加载:
importModule- 不支持loadModule- 不支持
文件系统和输出:
上下文属性:
工具:
utils- 不支持resolve- 不支持(请改用getResolve)
如果你有一个严重依赖于这些特性之一的加载器,请提交问题。
示例
根目录
Turbopack 使用根目录来解析模块。项目根目录之外的文件不会被解析。
Next.js 会自动检测你的项目的根目录。它通过查找以下文件之一来实现:
pnpm-lock.yamlpackage-lock.jsonyarn.lockbun.lockbun.lockb
如果你有不同的项目结构,例如你不使用工作区,你可以手动设置 root 选项:
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 组件。
module.exports = {
turbopack: {
rules: {
'*.svg': {
loaders: ['@svgr/webpack'],
as: '*.js',
},
},
},
}值得注意的是:
rules对象中使用的 glob 基于文件名进行匹配,除非 glob 包含/字符,这将导致它基于完整的项目相对文件路径进行匹配。Windows 文件路径被规范化为使用 unix 风格的/路径分隔符。Turbopack 使用 Rust
globset库的修改版本。
对于需要配置选项的加载器,你可以使用对象格式而不是字符串:
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 语法进一步限制加载器运行的位置:
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}。如果在同一个对象中指定了path和content,它将作为隐式and。
此外,还支持许多内置条件:
browser:匹配将在客户端执行的代码。服务器代码可以使用{not: 'browser'}匹配。foreign:匹配node_modules中的代码,以及一些 Next.js 内部代码。通常你会希望将加载器限制为{not: 'foreign'}。这可以通过减少调用加载器的文件数量来提高性能。development:匹配使用next dev时。production:匹配使用next build时。node:匹配将在默认 Node.js 运行时上运行的代码。edge-light:匹配将在 Edge 运行时上运行的代码。
规则可以是对象或对象数组。数组通常对于建模不相交条件很有用:
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 中将导入的模式映射到它们的新目标:
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 字段:
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 字段:
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.0 | experimental.turbo 更改为 turbopack。 |
13.0.0 | 引入 experimental.turbo。 |