Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 1 addition & 4 deletions packages/next/src/bin/next.ts
Original file line number Diff line number Diff line change
Expand Up @@ -126,10 +126,7 @@ async function main() {
const currentArgsSpec = commandArgs[command]()
const validatedArgs = getValidatedArgs(currentArgsSpec, forwardedArgs)

if (
(command === 'start' || command === 'dev') &&
!process.env.NEXT_PRIVATE_WORKER
) {
if (command === 'dev') {
const dir = getProjectDir(
process.env.NEXT_PRIVATE_DEV_DIR || validatedArgs._[0]
)
Expand Down
10 changes: 2 additions & 8 deletions packages/next/src/build/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -147,10 +147,9 @@ import { startTypeChecking } from './type-check'
import { generateInterceptionRoutesRewrites } from '../lib/generate-interception-routes-rewrites'

import { buildDataRoute } from '../server/lib/router-utils/build-data-route'
import { defaultOverrides } from '../server/import-overrides'
import { defaultOverrides } from '../server/require-hook'
import { initialize as initializeIncrementalCache } from '../server/lib/incremental-cache-server'
import { nodeFs } from '../server/lib/node-fs-methods'
import { getEsmLoaderPath } from '../server/lib/get-esm-loader-path'

export type SsgRoute = {
initialRevalidateSeconds: number | false
Expand Down Expand Up @@ -1251,11 +1250,6 @@ export default async function build(
},
numWorkers,
forkOptions: {
execArgv: [
'--experimental-loader',
getEsmLoaderPath(),
'--no-warnings',
],
env: {
...process.env,
__NEXT_INCREMENTAL_CACHE_IPC_PORT: incrementalCacheIpcPort + '',
Expand Down Expand Up @@ -2136,7 +2130,7 @@ export default async function build(
require.resolve('next/dist/server/lib/start-server'),
require.resolve('next/dist/server/next'),
require.resolve('next/dist/esm/server/esm-loader.mjs'),
require.resolve('next/dist/server/import-overrides'),
require.resolve('next/dist/server/require-hook'),
]
: []),
require.resolve('next/dist/server/next-server'),
Expand Down
2 changes: 1 addition & 1 deletion packages/next/src/build/webpack-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ import { NextFontManifestPlugin } from './webpack/plugins/next-font-manifest-plu
import { getSupportedBrowsers } from './utils'
import { MemoryWithGcCachePlugin } from './webpack/plugins/memory-with-gc-cache-plugin'
import { getBabelConfigFile } from './get-babel-config-file'
import { defaultOverrides } from '../server/import-overrides'
import { defaultOverrides } from '../server/require-hook'

type ExcludesFalse = <T>(x: T | false) => x is T
type ClientEntries = {
Expand Down
41 changes: 38 additions & 3 deletions packages/next/src/cli/next-dev.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,15 @@ import { fileExists, FileType } from '../lib/file-exists'
import { getNpxCommand } from '../lib/helpers/get-npx-command'
import { createSelfSignedCertificate } from '../lib/mkcert'
import uploadTrace from '../trace/upload-trace'
import { startServer } from '../server/lib/start-server'
import { loadEnvConfig } from '@next/env'
import { initialEnv, loadEnvConfig } from '@next/env'
import { trace } from '../trace'
import { validateTurboNextConfig } from '../lib/turbopack-warning'
import { fork } from 'child_process'
import { RESTART_EXIT_CODE } from '../server/lib/setup-server-worker'
import {
getReservedPortExplanation,
isPortIsReserved,
} from '../lib/helpers/get-reserved-port'
import { validateTurboNextConfig } from '../lib/turbopack-warning'

let dir: string
let config: NextConfigComplete
Expand Down Expand Up @@ -231,6 +232,40 @@ const nextDev: CliCommand = async (args) => {
setGlobal('phase', PHASE_DEVELOPMENT_SERVER)
setGlobal('distDir', distDir)

const startServerPath = require.resolve('../server/lib/start-server')

async function startServer(options: StartServerOptions) {
return new Promise<void>((resolve) => {
let resolved = false

const child = fork(startServerPath, {
stdio: 'inherit',
env: {
...((initialEnv || process.env) as typeof process.env),
NEXT_PRIVATE_WORKER: '1',
},
})

child.on('message', (msg: any) => {
if (msg && typeof msg === 'object') {
if (msg.nextWorkerReady) {
child.send({ nextWorkerOptions: options })
} else if (msg.nextServerReady && !resolved) {
resolved = true
resolve()
}
}
})

child.on('exit', async (code) => {
if (code === RESTART_EXIT_CODE) {
return startServer(options)
}
await handleSessionStop()
})
})
}

const runDevServer = async (reboot: boolean) => {
try {
if (!!args['--experimental-https']) {
Expand Down
2 changes: 1 addition & 1 deletion packages/next/src/server/config-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export function loadWebpackHook() {

// hook the Node.js require so that webpack requires are
// routed to the bundled and now initialized webpack version
require('../server/import-overrides').addHookAliases(
require('../server/require-hook').addHookAliases(
[
['webpack', 'next/dist/compiled/webpack/webpack-lib'],
['webpack/package', 'next/dist/compiled/webpack/package'],
Expand Down
24 changes: 0 additions & 24 deletions packages/next/src/server/esm-loader.mts

This file was deleted.

35 changes: 0 additions & 35 deletions packages/next/src/server/import-overrides.ts

This file was deleted.

30 changes: 0 additions & 30 deletions packages/next/src/server/lib/get-esm-loader-path.ts

This file was deleted.

10 changes: 10 additions & 0 deletions packages/next/src/server/lib/start-server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -358,3 +358,13 @@ export async function startServer({
})
}
}

if (process.env.NEXT_PRIVATE_WORKER && process.send) {
process.addListener('message', async (msg: any) => {
if (msg && typeof msg && msg.nextWorkerOptions && process.send) {
await startServer(msg.nextWorkerOptions)
process.send({ nextServerReady: true })
}
})
process.send({ nextWorkerReady: true })
}
46 changes: 0 additions & 46 deletions packages/next/src/server/next.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,57 +4,11 @@ import type { UrlWithParsedQuery } from 'url'
import type { NextConfigComplete } from './config-shared'
import type { IncomingMessage, ServerResponse } from 'http'
import type { NextUrlWithParsedQuery } from './request-meta'
import { spawnSync } from 'child_process'
import { getEsmLoaderPath } from './lib/get-esm-loader-path'
import {
RESTART_EXIT_CODE,
WorkerRequestHandler,
WorkerUpgradeHandler,
} from './lib/setup-server-worker'

// if we are not inside of the esm loader enabled
// worker we need to re-spawn with correct args
// we can't do this if imported in jest test file otherwise
// it duplicates tests
if (
typeof jest === 'undefined' &&
!process.env.NEXT_PRIVATE_WORKER &&
(process.env.__NEXT_PRIVATE_PREBUNDLED_REACT ||
process.env.NODE_ENV === 'development')
) {
const nodePath = process.argv0

const newArgs = [
'--experimental-loader',
getEsmLoaderPath(),
'--no-warnings',
...process.argv.splice(1),
]
function startWorker() {
try {
const result = spawnSync(nodePath, newArgs, {
stdio: 'inherit',
env: {
...process.env,
NEXT_PRIVATE_WORKER: '1',
},
})

if (
result.status === RESTART_EXIT_CODE &&
process.env.NODE_ENV === 'development'
) {
startWorker()
}
process.exit(0)
} catch (err) {
console.error(err)
process.exit(1)
}
}
startWorker()
}

import './require-hook'
import './node-polyfill-fetch'
import './node-polyfill-crypto'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,43 @@ const mod = require('module')
const originalRequire = mod.prototype.require
const resolveFilename = mod._resolveFilename

const { hookPropertyMap } = require('./import-overrides')
const { PHASE_PRODUCTION_BUILD } = require('../shared/lib/constants')

let resolve: typeof require.resolve = process.env.NEXT_MINIMAL
? // @ts-ignore
__non_webpack_require__.resolve
: require.resolve

export const hookPropertyMap = new Map()

export const defaultOverrides = {
'styled-jsx': path.dirname(resolve('styled-jsx/package.json')),
'styled-jsx/style': resolve('styled-jsx/style'),
}

const toResolveMap = (map: Record<string, string>): [string, string][] =>
Object.entries(map).map(([key, value]) => [key, resolve(value)])

export function addHookAliases(aliases: [string, string][] = []) {
for (const [key, value] of aliases) {
hookPropertyMap.set(key, value)
}
}

addHookAliases(toResolveMap(defaultOverrides))

mod._resolveFilename = function (
originalResolveFilename,
requestMap,
request,
parent,
isMain,
options
originalResolveFilename: (
request: string,
parent: string,
isMain: boolean,
opts: any
) => string,
requestMap: Map<string, string>,
request: string,
parent: string,
isMain: boolean,
options: any
) {
const hookResolved = requestMap.get(request)
if (hookResolved) request = hookResolved
Expand All @@ -30,7 +57,7 @@ mod._resolveFilename = function (
// This is a hack to make sure that if a user requires a Next.js module that wasn't bundled
// that needs to point to the rendering runtime version, it will point to the correct one.
// This can happen on `pages` when a user requires a dependency that uses next/image for example.
mod.prototype.require = function (request) {
mod.prototype.require = function (request: string) {
if (
(process.env.NEXT_PHASE !== PHASE_PRODUCTION_BUILD ||
process.env.NEXT_IS_EXPORT_WORKER) &&
Expand Down