diff --git a/test/integration/module-id-strategies/components/CustomComponent.tsx b/test/integration/module-id-strategies/components/CustomComponent.tsx
new file mode 100644
index 00000000000000..279e4861a926db
--- /dev/null
+++ b/test/integration/module-id-strategies/components/CustomComponent.tsx
@@ -0,0 +1,11 @@
+import React from 'react'
+
+async function CustomComponent() {
+ return (
+
+
the content of a dynamic component
+
+ )
+}
+
+export default CustomComponent
diff --git a/test/integration/module-id-strategies/module-with-long-name.js b/test/integration/module-id-strategies/module-with-long-name.js
new file mode 100644
index 00000000000000..ece22b30c245a6
--- /dev/null
+++ b/test/integration/module-id-strategies/module-with-long-name.js
@@ -0,0 +1,3 @@
+module.exports = {
+ foo: 'the content of a module with a long name',
+}
diff --git a/test/integration/module-id-strategies/next.config.js b/test/integration/module-id-strategies/next.config.js
new file mode 100644
index 00000000000000..40c2e5b7e65a1c
--- /dev/null
+++ b/test/integration/module-id-strategies/next.config.js
@@ -0,0 +1,4 @@
+module.exports = {
+ bundlePagesRouterDependencies: true,
+ serverExternalPackages: ['opted-out-external-package'],
+}
diff --git a/test/integration/module-id-strategies/node_modules/external-module-with-long-name.js b/test/integration/module-id-strategies/node_modules/external-module-with-long-name.js
new file mode 100644
index 00000000000000..8bb699844c52a2
--- /dev/null
+++ b/test/integration/module-id-strategies/node_modules/external-module-with-long-name.js
@@ -0,0 +1,3 @@
+module.exports = {
+ bar: 'the content of an external module with a long name',
+}
diff --git a/test/integration/module-id-strategies/pages/index.js b/test/integration/module-id-strategies/pages/index.js
new file mode 100644
index 00000000000000..5764ac78f6744b
--- /dev/null
+++ b/test/integration/module-id-strategies/pages/index.js
@@ -0,0 +1,19 @@
+import { foo } from '../module-with-long-name'
+import { bar } from '../node_modules/external-module-with-long-name'
+import dynamic from 'next/dynamic'
+
+const DynamicCustomComponent = dynamic(
+ () => import('../components/CustomComponent'),
+ {
+ loading: () => Loading...
,
+ }
+)
+
+export default function Index() {
+ return (
+
+
+ {foo} {bar}
+
+ )
+}
diff --git a/test/integration/module-id-strategies/test/index.test.js b/test/integration/module-id-strategies/test/index.test.js
new file mode 100644
index 00000000000000..aaa758912f13fa
--- /dev/null
+++ b/test/integration/module-id-strategies/test/index.test.js
@@ -0,0 +1,93 @@
+/* eslint-env jest */
+
+import fs from 'fs-extra'
+import { join } from 'path'
+import {
+ killApp,
+ findPort,
+ launchApp,
+ nextBuild,
+ renderViaHTTP,
+} from 'next-test-utils'
+
+const appDir = join(__dirname, '../')
+
+let appPort
+let app
+
+describe('minified module ids', () => {
+ ;(!process.env.TURBOPACK || process.env.TURBOPACK_DEV
+ ? describe.skip
+ : describe)('production mode', () => {
+ let allBundles = ''
+
+ beforeAll(async () => {
+ await nextBuild(appDir, [])
+
+ const ssrPath = join(appDir, '.next/server/chunks/ssr')
+ const pageBundleBasenames = (await fs.readdir(ssrPath)).filter((p) =>
+ p.match(/\.js$/)
+ )
+ for (const basename of pageBundleBasenames) {
+ const output = await fs.readFile(join(ssrPath, basename), 'utf8')
+ allBundles += output
+ }
+ })
+
+ it('should have no long module ids for basic modules', async () => {
+ expect(allBundles).not.toContain('module-with-long-name')
+ expect(allBundles).toContain('the content of a module with a long name')
+ })
+
+ it('should have no long module ids for external modules', async () => {
+ expect(allBundles).not.toContain('external-module-with-long-name')
+ expect(allBundles).toContain(
+ 'the content of an external module with a long name'
+ )
+ })
+
+ it('should have no long module ids for async loader modules', async () => {
+ expect(allBundles).not.toContain('CustomComponent.tsx')
+ expect(allBundles).toContain('the content of a dynamic component')
+ })
+ })
+ ;(!process.env.TURBOPACK || process.env.TURBOPACK_BUILD
+ ? describe.skip
+ : describe)('development mode', () => {
+ let allBundles = ''
+
+ beforeAll(async () => {
+ appPort = await findPort()
+ app = await launchApp(appDir, appPort)
+
+ await renderViaHTTP(appPort, '/')
+
+ const ssrPath = join(appDir, '.next/server/chunks/ssr')
+ const pageBundleBasenames = (await fs.readdir(ssrPath)).filter((p) =>
+ p.match(/\.js$/)
+ )
+ for (const basename of pageBundleBasenames) {
+ const output = await fs.readFile(join(ssrPath, basename), 'utf8')
+ allBundles += output
+ }
+ })
+ afterAll(() => killApp(app))
+
+ it('should have long module ids for basic modules', async () => {
+ expect(allBundles).toContain('module-with-long-name')
+ expect(allBundles).toContain('the content of a module with a long name')
+ })
+
+ it('should have long module ids for external modules', async () => {
+ expect(allBundles).toContain('external-module-with-long-name')
+ expect(allBundles).toContain(
+ 'the content of an external module with a long name'
+ )
+ })
+
+ it('should have long module ids for async loader modules', async () => {
+ expect(allBundles).toContain('CustomComponent.tsx')
+ expect(allBundles).toContain('the content of a dynamic component')
+ })
+ })
+})