rsnext/packages/next/build/webpack/require-hook.ts
Jiachi Liu bc335d7ef7
Prebundle react for appDir (#41337)
Inline a react and react-dom for app dir, when `appDir` flag is enabled
opt into the built-in version for all.

For server layer react, use the react share subset for server
components.
For all server side of react-dom usage, use the server-rendering-stub.

Co-authored-by: Shu Ding <g@shud.in>
Co-authored-by: JJ Kasper <jj@jjsweb.site>
2022-10-18 16:32:23 -07:00

75 lines
2.1 KiB
TypeScript

// sync injects a hook for webpack and webpack/... requires to use the internal ncc webpack version
// this is in order for userland plugins to attach to the same webpack instance as next.js
// the individual compiled modules are as defined for the compilation in bundles/webpack/packages/*
const hookPropertyMap = new Map()
let initialized = false
function setupResolve() {
if (initialized) {
return
}
initialized = true
const mod = require('module')
const resolveFilename = mod._resolveFilename
mod._resolveFilename = function (
request: string,
parent: any,
isMain: boolean,
options: any
) {
const hookResolved = hookPropertyMap.get(request)
if (hookResolved) request = hookResolved
return resolveFilename.call(mod, request, parent, isMain, options)
}
}
export function setRequireOverrides(aliases: [string, string][]) {
for (const [key, value] of aliases) {
hookPropertyMap.set(key, value)
}
}
export function loadRequireHook(aliases: [string, string][] = []) {
const defaultAliases = [
...aliases,
// Use `require.resolve` explicitly to make them statically analyzable
['styled-jsx', require.resolve('styled-jsx')],
['styled-jsx/style', require.resolve('styled-jsx/style')],
['styled-jsx/style', require.resolve('styled-jsx/style')],
] as [string, string][]
setRequireOverrides(defaultAliases)
setupResolve()
}
export function overrideBuiltInReactPackages() {
setRequireOverrides([
['react', require.resolve('next/dist/compiled/react')],
[
'react/jsx-runtime',
require.resolve('next/dist/compiled/react/jsx-runtime'),
],
[
'react/jsx-dev-runtime',
require.resolve('next/dist/compiled/react/jsx-dev-runtime'),
],
[
'react-dom',
require.resolve('next/dist/compiled/react-dom/server-rendering-stub'),
],
[
'react-dom/client',
require.resolve('next/dist/compiled/react-dom/client'),
],
[
'react-dom/server',
require.resolve('next/dist/compiled/react-dom/server'),
],
[
'react-dom/server.browser',
require.resolve('next/dist/compiled/react-dom/server.browser'),
],
])
}