e0cc9cd44f
This PR adds a new `experimental.enableUndici` option to let the developer switch from `next-fetch` to `undici` as the underlying polyfill for `fetch` in Node.js. In the current implementation, Next.js makes sure that `fetch` is always available by using `node-fetch`. However, we do not polyfill in Node.js 18+, since those versions come with their own `fetch` implementation already, built-in. Node.js 18+ uses `undici` under the hood, so letting the developer use `undici` earlier could make the migration easier later on. Eventually, we hope to be able to stop polyfilling `fetch` in an upcoming major version of Next.js, shipping less code. ## Bug - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Errors have helpful link attached, see `contributing.md` ## Feature - [ ] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR. - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Documentation added - [ ] Telemetry added. In case of a feature if it's used or not. - [ ] Errors have helpful link attached, see `contributing.md` ## Documentation / Examples - [ ] Make sure the linting passes by running `pnpm lint` - [ ] The examples guidelines are followed from [our contributing doc](https://github.com/vercel/next.js/blob/canary/contributing.md#adding-examples) Co-authored-by: Balázs Orbán <info@balazsorban.com> Co-authored-by: Sukka <isukkaw@gmail.com> Co-authored-by: JJ Kasper <jj@jjsweb.site> Co-authored-by: Steven <steven@ceriously.com>
148 lines
5 KiB
TypeScript
148 lines
5 KiB
TypeScript
import { init as initWebpack } from 'next/dist/compiled/webpack/webpack'
|
|
|
|
let installed: boolean = false
|
|
|
|
export function loadWebpackHook() {
|
|
if (installed) {
|
|
return
|
|
}
|
|
installed = true
|
|
|
|
initWebpack()
|
|
|
|
// hook the Node.js require so that webpack requires are
|
|
// routed to the bundled and now initialized webpack version
|
|
require('../build/webpack/require-hook').default(
|
|
[
|
|
['webpack', 'next/dist/compiled/webpack/webpack-lib'],
|
|
['webpack/package', 'next/dist/compiled/webpack/package'],
|
|
['webpack/package.json', 'next/dist/compiled/webpack/package'],
|
|
['webpack/lib/webpack', 'next/dist/compiled/webpack/webpack-lib'],
|
|
['webpack/lib/webpack.js', 'next/dist/compiled/webpack/webpack-lib'],
|
|
[
|
|
'webpack/lib/node/NodeEnvironmentPlugin',
|
|
'next/dist/compiled/webpack/NodeEnvironmentPlugin',
|
|
],
|
|
[
|
|
'webpack/lib/node/NodeEnvironmentPlugin.js',
|
|
'next/dist/compiled/webpack/NodeEnvironmentPlugin',
|
|
],
|
|
[
|
|
'webpack/lib/BasicEvaluatedExpression',
|
|
'next/dist/compiled/webpack/BasicEvaluatedExpression',
|
|
],
|
|
[
|
|
'webpack/lib/BasicEvaluatedExpression.js',
|
|
'next/dist/compiled/webpack/BasicEvaluatedExpression',
|
|
],
|
|
[
|
|
'webpack/lib/node/NodeTargetPlugin',
|
|
'next/dist/compiled/webpack/NodeTargetPlugin',
|
|
],
|
|
[
|
|
'webpack/lib/node/NodeTargetPlugin.js',
|
|
'next/dist/compiled/webpack/NodeTargetPlugin',
|
|
],
|
|
[
|
|
'webpack/lib/node/NodeTemplatePlugin',
|
|
'next/dist/compiled/webpack/NodeTemplatePlugin',
|
|
],
|
|
[
|
|
'webpack/lib/node/NodeTemplatePlugin.js',
|
|
'next/dist/compiled/webpack/NodeTemplatePlugin',
|
|
],
|
|
[
|
|
'webpack/lib/LibraryTemplatePlugin',
|
|
'next/dist/compiled/webpack/LibraryTemplatePlugin',
|
|
],
|
|
[
|
|
'webpack/lib/LibraryTemplatePlugin.js',
|
|
'next/dist/compiled/webpack/LibraryTemplatePlugin',
|
|
],
|
|
[
|
|
'webpack/lib/SingleEntryPlugin',
|
|
'next/dist/compiled/webpack/SingleEntryPlugin',
|
|
],
|
|
[
|
|
'webpack/lib/SingleEntryPlugin.js',
|
|
'next/dist/compiled/webpack/SingleEntryPlugin',
|
|
],
|
|
[
|
|
'webpack/lib/optimize/LimitChunkCountPlugin',
|
|
'next/dist/compiled/webpack/LimitChunkCountPlugin',
|
|
],
|
|
[
|
|
'webpack/lib/optimize/LimitChunkCountPlugin.js',
|
|
'next/dist/compiled/webpack/LimitChunkCountPlugin',
|
|
],
|
|
[
|
|
'webpack/lib/webworker/WebWorkerTemplatePlugin',
|
|
'next/dist/compiled/webpack/WebWorkerTemplatePlugin',
|
|
],
|
|
[
|
|
'webpack/lib/webworker/WebWorkerTemplatePlugin.js',
|
|
'next/dist/compiled/webpack/WebWorkerTemplatePlugin',
|
|
],
|
|
[
|
|
'webpack/lib/ExternalsPlugin',
|
|
'next/dist/compiled/webpack/ExternalsPlugin',
|
|
],
|
|
[
|
|
'webpack/lib/ExternalsPlugin.js',
|
|
'next/dist/compiled/webpack/ExternalsPlugin',
|
|
],
|
|
[
|
|
'webpack/lib/web/FetchCompileWasmTemplatePlugin',
|
|
'next/dist/compiled/webpack/FetchCompileWasmTemplatePlugin',
|
|
],
|
|
[
|
|
'webpack/lib/web/FetchCompileWasmTemplatePlugin.js',
|
|
'next/dist/compiled/webpack/FetchCompileWasmTemplatePlugin',
|
|
],
|
|
[
|
|
'webpack/lib/web/FetchCompileWasmPlugin',
|
|
'next/dist/compiled/webpack/FetchCompileWasmPlugin',
|
|
],
|
|
[
|
|
'webpack/lib/web/FetchCompileWasmPlugin.js',
|
|
'next/dist/compiled/webpack/FetchCompileWasmPlugin',
|
|
],
|
|
[
|
|
'webpack/lib/web/FetchCompileAsyncWasmPlugin',
|
|
'next/dist/compiled/webpack/FetchCompileAsyncWasmPlugin',
|
|
],
|
|
[
|
|
'webpack/lib/web/FetchCompileAsyncWasmPlugin.js',
|
|
'next/dist/compiled/webpack/FetchCompileAsyncWasmPlugin',
|
|
],
|
|
[
|
|
'webpack/lib/ModuleFilenameHelpers',
|
|
'next/dist/compiled/webpack/ModuleFilenameHelpers',
|
|
],
|
|
[
|
|
'webpack/lib/ModuleFilenameHelpers.js',
|
|
'next/dist/compiled/webpack/ModuleFilenameHelpers',
|
|
],
|
|
['webpack/lib/GraphHelpers', 'next/dist/compiled/webpack/GraphHelpers'],
|
|
[
|
|
'webpack/lib/GraphHelpers.js',
|
|
'next/dist/compiled/webpack/GraphHelpers',
|
|
],
|
|
['webpack/lib/NormalModule', 'next/dist/compiled/webpack/NormalModule'],
|
|
['webpack-sources', 'next/dist/compiled/webpack/sources'],
|
|
['webpack-sources/lib', 'next/dist/compiled/webpack/sources'],
|
|
['webpack-sources/lib/index', 'next/dist/compiled/webpack/sources'],
|
|
['webpack-sources/lib/index.js', 'next/dist/compiled/webpack/sources'],
|
|
['@babel/runtime', 'next/dist/compiled/@babel/runtime/package.json'],
|
|
[
|
|
'@babel/runtime/package.json',
|
|
'next/dist/compiled/@babel/runtime/package.json',
|
|
],
|
|
['node-fetch', 'next/dist/compiled/node-fetch'],
|
|
['undici', 'next/dist/compiled/undici'],
|
|
].map(
|
|
// Use dynamic require.resolve to avoid statically analyzable since they're only for build time
|
|
([request, replacement]) => [request, require.resolve(replacement)]
|
|
)
|
|
)
|
|
}
|