diff --git a/packages/next/build/webpack-config.ts b/packages/next/build/webpack-config.ts index 194eb7c0a260..7d96cf39aad0 100644 --- a/packages/next/build/webpack-config.ts +++ b/packages/next/build/webpack-config.ts @@ -630,6 +630,12 @@ export default async function getBaseWebpackConfig( const reactDir = dirname(require.resolve('react/package.json')) const reactDomDir = dirname(require.resolve('react-dom/package.json')) + const mainFieldsPerCompiler: Record = { + server: ['main', 'module'], + client: ['browser', 'module', 'main'], + 'edge-server': ['browser', 'module', 'main'], + } + const resolveConfig = { // Disable .mjs for node_modules bundling extensions: isNodeServer @@ -700,11 +706,7 @@ export default async function getBaseWebpackConfig( }, } : undefined), - mainFields: isClient - ? ['browser', 'module', 'main'] - : isEdgeServer - ? ['module', 'main'] - : ['main', 'module'], + mainFields: mainFieldsPerCompiler[compilerType], plugins: [], } diff --git a/test/e2e/edge-compiler-module-exports-preference/index.test.ts b/test/e2e/edge-compiler-module-exports-preference/index.test.ts new file mode 100644 index 000000000000..fe9a0e9478cd --- /dev/null +++ b/test/e2e/edge-compiler-module-exports-preference/index.test.ts @@ -0,0 +1,48 @@ +import { createNext } from 'e2e-utils' +import { NextInstance } from 'test/lib/next-modes/base' +import { fetchViaHTTP } from 'next-test-utils' + +describe('Edge compiler module exports preference', () => { + let next: NextInstance + + beforeAll(async () => { + next = await createNext({ + files: { + 'pages/index.js': ` + export default function Page() { + return

hello world

+ } + `, + 'middleware.js': ` + import { NextResponse } from 'next/server'; + import lib from 'my-lib'; + + export default (req) => { + return NextResponse.next({ + headers: { + 'x-imported': lib + } + }) + } + `, + 'node_modules/my-lib/package.json': JSON.stringify({ + name: 'my-lib', + version: '1.0.0', + main: 'index.js', + browser: 'browser.js', + }), + 'node_modules/my-lib/index.js': `module.exports = "Node.js"`, + 'node_modules/my-lib/browser.js': `module.exports = "Browser"`, + }, + dependencies: {}, + }) + }) + afterAll(() => next.destroy()) + + it('favors the browser export', async () => { + const response = await fetchViaHTTP(next.url, '/') + expect(Object.fromEntries(response.headers)).toMatchObject({ + 'x-imported': 'Browser', + }) + }) +})