From 81bbfe0c9a9fea27d110cc13f499c282a2673643 Mon Sep 17 00:00:00 2001 From: Vincent Voyer Date: Fri, 13 Mar 2020 10:07:37 +0100 Subject: [PATCH 1/2] fix(debugging): do not pass NODE_OPTIONS='--inspect' to subprocesses fixes #11030 --- packages/next/server/next-dev-server.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/next/server/next-dev-server.ts b/packages/next/server/next-dev-server.ts index a8450ca036891..ff97701a1f611 100644 --- a/packages/next/server/next-dev-server.ts +++ b/packages/next/server/next-dev-server.ts @@ -85,6 +85,16 @@ export default class DevServer extends Server { { maxRetries: 0, numWorkers: this.nextConfig.experimental.cpus, + forkOptions: { + env: { + ...process.env, + // discard --inspect/--inspect-brk flags from process.env.NODE_OPTIONS. Otherwise multiple Node.js debuggers + // would be started if user launch Next.js in debugging mode. The number of debuggers is linked to + // the number of workers Next.js tries to launch. The only worker users are interested in debugging + // is the main Next.js one + NODE_OPTIONS: getNodeOptionsWithoutInspect(), + }, + }, } ) as Worker & { loadStaticPaths: typeof import('./static-paths-worker').loadStaticPaths From eaed6aba507edeb058124261ad7697b088375db4 Mon Sep 17 00:00:00 2001 From: Alec Larson Date: Sun, 15 Mar 2020 16:07:39 -0400 Subject: [PATCH 2/2] fix(debugger): use a regex to remove bad NODE_OPTIONS flags --- packages/next/server/lib/utils.ts | 5 +++++ packages/next/server/next-dev-server.ts | 1 + test/integration/cli/test/index.test.js | 10 ++++++++++ 3 files changed, 16 insertions(+) diff --git a/packages/next/server/lib/utils.ts b/packages/next/server/lib/utils.ts index f8f4ae1303496..e8830a9576610 100644 --- a/packages/next/server/lib/utils.ts +++ b/packages/next/server/lib/utils.ts @@ -8,3 +8,8 @@ export function printAndExit(message: string, code = 1) { process.exit(code) } + +export function getNodeOptionsWithoutInspect() { + const NODE_INSPECT_RE = /--inspect(-brk)?(=\S+)? ?/ + return (process.env.NODE_OPTIONS || '').replace(NODE_INSPECT_RE, '') +} diff --git a/packages/next/server/next-dev-server.ts b/packages/next/server/next-dev-server.ts index ff97701a1f611..82c9dbeebfb7a 100644 --- a/packages/next/server/next-dev-server.ts +++ b/packages/next/server/next-dev-server.ts @@ -31,6 +31,7 @@ import ErrorDebug from './error-debug' import HotReloader from './hot-reloader' import { findPageFile } from './lib/find-page-file' import Worker from 'jest-worker' +import { getNodeOptionsWithoutInspect } from './lib/utils' if (typeof React.Suspense === 'undefined') { throw new Error( diff --git a/test/integration/cli/test/index.test.js b/test/integration/cli/test/index.test.js index 9014b11b7911e..1265a915c58df 100644 --- a/test/integration/cli/test/index.test.js +++ b/test/integration/cli/test/index.test.js @@ -88,6 +88,16 @@ describe('CLI Usage', () => { expect(output).toMatch(new RegExp(`http://localhost:${port}`)) }) + test("NODE_OPTIONS='--inspect'", async () => { + // this test checks that --inspect works by launching a single debugger for the main Next.js process, + // not for its subprocesses + const port = await findPort() + const output = await runNextCommandDev([dir, '--port', port], true, { + env: { NODE_OPTIONS: '--inspect' }, + }) + expect(output).toMatch(new RegExp(`ready on http://localhost:${port}`)) + }) + test('-p', async () => { const port = await findPort() const output = await runNextCommandDev([dir, '-p', port], true)