next.js
next.js copied to clipboard
Replace server chunk handling in outputPath with chunkFilename
Fixes #29485 #29362
The problem
Using chunks in the output.path directory and then using ../ to recurse up a directory for ordinary files breaks webassemblyModuleFilename, as it outputs into the chunks directory but then looks for the webpack module at the root of server. This renders it unable to find the file.
The fix
Use the chunkFilename to handle the chunks subdirectory instead, and replace the relative path handlers introduced with what they had before
Caveats
I'm new to contributing to Next.js and the implementation of handling chunks in this way seemed pretty comprehensive, so I assume there was a reason it was done this way (that I'm not seeing). My apologies if this is the case, I was unsure of another way to resolve this issue
Failing test suites
Commit: b417ded4f12464e70dfbd4b1899677963ad7618a
test/e2e/prerender.test.ts
- Prerender > should output traces
Expand output
● Prerender › should output traces
expect(received).toBe(expected) // Object.is equality
Expected: true
Received: false
1380 | routeKeys: {
1381 | lang: 'lang',
> 1382 | },
| ^
1383 | },
1384 | {
1385 | namedDataRouteRegex: `^/_next/data/${escapeRegex(
at Object.<anonymous> (e2e/prerender.test.ts:1382:24)
test/integration/gssp-ssr-change-reloading/test/index.test.js
- GS(S)P Server-Side Change Reloading > should not reload page when client-side is changed too GSSP
- GS(S)P Server-Side Change Reloading > should update page when getServerSideProps is changed only
Expand output
● GS(S)P Server-Side Change Reloading › should not reload page when client-side is changed too GSSP
Failed to replace content.
Pattern: change me
Content: export default function Gssp(props) {
return (
<>
<p id="change">changed</p>
<p id="props">{JSON.stringify(props)}</p>
</>
)
}
export const getServerSideProps = ({ params }) => {
const count = 2
return {
props: {
count,
params,
random: Math.random(),
},
}
}
467 | } else if (typeof pattern === 'string') {
468 | if (!currentContent.includes(pattern)) {
> 469 | throw new Error(
| ^
470 | `Failed to replace content.\n\nPattern: ${pattern}\n\nContent: ${currentContent}`
471 | )
472 | }
at File.replace (lib/next-test-utils.js:469:15)
at Object.<anonymous> (integration/gssp-ssr-change-reloading/test/index.test.js:163:63)
at runMicrotasks (<anonymous>)
● GS(S)P Server-Side Change Reloading › should update page when getServerSideProps is changed only
expect(received).toBe(expected) // Object.is equality
Expected: 1
Received: 2
185 | async () =>
186 | JSON.parse(await browser.elementByCss('#props').text()).count + '',
> 187 | '1'
| ^
188 | )
189 | })
190 | })
at Object.<anonymous> (integration/gssp-ssr-change-reloading/test/index.test.js:187:10)
✓ stest/integration/production/test/index.test.js
- Production Usage > should output traces
Expand output
● Production Usage › should output traces
expect(received).toBe(expected) // Object.is equality
Expected: true
Received: false
156 | expect(
157 | check.tests.every((item) => files.some((file) => item.test(file)))
> 158 | ).toBe(true)
| ^
159 |
160 | if (sep === '/') {
161 | expect(
at Object.<anonymous> (integration/production/test/index.test.js:158:11)
Stats from current PR
Default Build (Decrease detected ✓)
General Overall decrease ✓
| vercel/next.js canary | sam3d/next.js wasm-chunks-fix | Change | |
|---|---|---|---|
| buildDuration | 14.8s | 15s | ⚠️ +227ms |
| buildDurationCached | 3.8s | 3.7s | -50ms |
| nodeModulesSize | 183 MB | 183 MB | -739 B |
Page Load Tests Overall decrease ⚠️
| vercel/next.js canary | sam3d/next.js wasm-chunks-fix | Change | |
|---|---|---|---|
| / failed reqs | 0 | 0 | ✓ |
| / total time (seconds) | 3.33 | 3.259 | -0.07 |
| / avg req/sec | 750.74 | 767.08 | +16.34 |
| /error-in-render failed reqs | 0 | 0 | ✓ |
| /error-in-render total time (seconds) | 1.552 | 1.586 | ⚠️ +0.03 |
| /error-in-render avg req/sec | 1610.72 | 1576.1 | ⚠️ -34.62 |
Client Bundles (main, webpack, commons)
| vercel/next.js canary | sam3d/next.js wasm-chunks-fix | Change | |
|---|---|---|---|
| 779.HASH.js gzip | 179 B | 179 B | ✓ |
| framework-HASH.js gzip | 42.2 kB | 42.2 kB | ✓ |
| main-HASH.js gzip | 26.9 kB | 26.9 kB | ✓ |
| webpack-HASH.js gzip | 1.45 kB | 1.45 kB | ✓ |
| Overall change | 70.8 kB | 70.8 kB | ✓ |
Legacy Client Bundles (polyfills)
| vercel/next.js canary | sam3d/next.js wasm-chunks-fix | Change | |
|---|---|---|---|
| polyfills-a4..dd70.js gzip | 31 kB | 31 kB | ✓ |
| Overall change | 31 kB | 31 kB | ✓ |
Client Pages
| vercel/next.js canary | sam3d/next.js wasm-chunks-fix | Change | |
|---|---|---|---|
| _app-HASH.js gzip | 977 B | 977 B | ✓ |
| _error-HASH.js gzip | 194 B | 194 B | ✓ |
| amp-HASH.js gzip | 311 B | 311 B | ✓ |
| css-HASH.js gzip | 328 B | 328 B | ✓ |
| dynamic-HASH.js gzip | 2.67 kB | 2.67 kB | ✓ |
| head-HASH.js gzip | 351 B | 351 B | ✓ |
| hooks-HASH.js gzip | 918 B | 918 B | ✓ |
| image-HASH.js gzip | 4.15 kB | 4.15 kB | ✓ |
| index-HASH.js gzip | 260 B | 260 B | ✓ |
| link-HASH.js gzip | 1.66 kB | 1.66 kB | ✓ |
| routerDirect..HASH.js gzip | 320 B | 320 B | ✓ |
| script-HASH.js gzip | 386 B | 386 B | ✓ |
| withRouter-HASH.js gzip | 319 B | 319 B | ✓ |
| bb14e60e810b..30f.css gzip | 125 B | 125 B | ✓ |
| Overall change | 13 kB | 13 kB | ✓ |
Client Build Manifests
| vercel/next.js canary | sam3d/next.js wasm-chunks-fix | Change | |
|---|---|---|---|
| _buildManifest.js gzip | 494 B | 494 B | ✓ |
| Overall change | 494 B | 494 B | ✓ |
Rendered Page Sizes
| vercel/next.js canary | sam3d/next.js wasm-chunks-fix | Change | |
|---|---|---|---|
| index.html gzip | 539 B | 539 B | ✓ |
| link.html gzip | 551 B | 551 B | ✓ |
| withRouter.html gzip | 533 B | 533 B | ✓ |
| Overall change | 1.62 kB | 1.62 kB | ✓ |
Default Build with SWC (Decrease detected ✓)
General Overall decrease ✓
| vercel/next.js canary | sam3d/next.js wasm-chunks-fix | Change | |
|---|---|---|---|
| buildDuration | 7.8s | 7.7s | -84ms |
| buildDurationCached | 3.9s | 3.7s | -145ms |
| nodeModulesSize | 183 MB | 183 MB | -739 B |
Page Load Tests Overall decrease ⚠️
| vercel/next.js canary | sam3d/next.js wasm-chunks-fix | Change | |
|---|---|---|---|
| / failed reqs | 0 | 0 | ✓ |
| / total time (seconds) | 3.165 | 3.261 | ⚠️ +0.1 |
| / avg req/sec | 789.96 | 766.61 | ⚠️ -23.35 |
| /error-in-render failed reqs | 0 | 0 | ✓ |
| /error-in-render total time (seconds) | 1.471 | 1.552 | ⚠️ +0.08 |
| /error-in-render avg req/sec | 1699.07 | 1610.57 | ⚠️ -88.5 |
Client Bundles (main, webpack, commons)
| vercel/next.js canary | sam3d/next.js wasm-chunks-fix | Change | |
|---|---|---|---|
| 675-HASH.js gzip | 13.8 kB | 13.8 kB | ✓ |
| 770.HASH.js gzip | 178 B | 178 B | ✓ |
| framework-HASH.js gzip | 50.7 kB | 50.7 kB | ✓ |
| main-HASH.js gzip | 34.9 kB | 34.9 kB | ✓ |
| webpack-HASH.js gzip | 1.64 kB | 1.64 kB | ✓ |
| Overall change | 101 kB | 101 kB | ✓ |
Legacy Client Bundles (polyfills)
| vercel/next.js canary | sam3d/next.js wasm-chunks-fix | Change | |
|---|---|---|---|
| polyfills-a4..dd70.js gzip | 31 kB | 31 kB | ✓ |
| Overall change | 31 kB | 31 kB | ✓ |
Client Pages
| vercel/next.js canary | sam3d/next.js wasm-chunks-fix | Change | |
|---|---|---|---|
| _app-HASH.js gzip | 1.33 kB | 1.33 kB | ✓ |
| _error-HASH.js gzip | 180 B | 180 B | ✓ |
| amp-HASH.js gzip | 315 B | 315 B | ✓ |
| css-HASH.js gzip | 331 B | 331 B | ✓ |
| dynamic-HASH.js gzip | 2.79 kB | 2.79 kB | ✓ |
| head-HASH.js gzip | 356 B | 356 B | ✓ |
| hooks-HASH.js gzip | 637 B | 637 B | ✓ |
| image-HASH.js gzip | 573 B | 573 B | ✓ |
| index-HASH.js gzip | 262 B | 262 B | ✓ |
| link-HASH.js gzip | 2.2 kB | 2.2 kB | ✓ |
| routerDirect..HASH.js gzip | 326 B | 326 B | ✓ |
| script-HASH.js gzip | 393 B | 393 B | ✓ |
| withRouter-HASH.js gzip | 322 B | 322 B | ✓ |
| bb14e60e810b..30f.css gzip | 125 B | 125 B | ✓ |
| Overall change | 10.1 kB | 10.1 kB | ✓ |
Client Build Manifests
| vercel/next.js canary | sam3d/next.js wasm-chunks-fix | Change | |
|---|---|---|---|
| _buildManifest.js gzip | 511 B | 511 B | ✓ |
| Overall change | 511 B | 511 B | ✓ |
Rendered Page Sizes
| vercel/next.js canary | sam3d/next.js wasm-chunks-fix | Change | |
|---|---|---|---|
| index.html gzip | 539 B | 539 B | ✓ |
| link.html gzip | 551 B | 551 B | ✓ |
| withRouter.html gzip | 532 B | 532 B | ✓ |
| Overall change | 1.62 kB | 1.62 kB | ✓ |
@sokra I believe you originally made the change for this in 445dba12b4e3fa063bb862aae1f4fefa8f4f466a, is it expected that the webassemblyModuleFilename will no longer pull from the real directory?
The ../ is a workaround for node-file-trace to only include files in the chunks directory. There work towards improving that by moving node-file-trace into next.js, which would make that workaround unnecessary. Maybe we can disable the workaround when the experimental flag is enabled? cc @ijjk
@ijjk considering that #43677 has been merged, is there anything further we can do here?