Skip to content

Commit df38b10

Browse files
mischnichuozhi
authored andcommitted
Turbopack: disable tree shaking for tracing (#85722)
We had tree shaking enabled for NFT. That is incorrect however, as even unused imports (if you don't use any of the imported bindings, and the file is marked as `sideEffects: false`) are still needed at runtime, since Node.js will execute everything anyway. - I made the `treeShakingMode: None` explicit now (though that was already the `Default::default` anyway) - The real problem was that we still dropped side-effect free `ModulePart::Evaluation` references even when tree shaking was disabled. Closes #85172 Fixes PACK-5756
1 parent 4ea8096 commit df38b10

File tree

15 files changed

+119
-14
lines changed

15 files changed

+119
-14
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
export default function Root({ children }) {
2+
return (
3+
<html>
4+
<head></head>
5+
<body>{children}</body>
6+
</html>
7+
)
8+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import getValue from 'foo'
2+
3+
export default function Page() {
4+
return <p>{getValue()}</p>
5+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import value from './value.js'
2+
import './side-effect.js'
3+
4+
export default function getValue() {
5+
return value
6+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"name": "foo",
3+
"type": "module",
4+
"version": "0.0.0",
5+
"sideEffects": false
6+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
// some noop, should still resolve and not crash though
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default 123
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/**
2+
* @type {import('next').NextConfig}
3+
*/
4+
const nextConfig = {
5+
serverExternalPackages: ['foo'],
6+
}
7+
8+
module.exports = nextConfig
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"dependencies": {
3+
"foo": "file:./foo"
4+
}
5+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { nextTestSetup } from 'e2e-utils'
2+
3+
describe('standalone mode - tracing-side-effects-false', () => {
4+
const dependencies = require('./package.json').dependencies
5+
6+
const { next, skipped } = nextTestSetup({
7+
files: __dirname,
8+
dependencies,
9+
skipDeployment: true,
10+
skipStart: true,
11+
})
12+
13+
if (skipped) {
14+
return
15+
}
16+
17+
it('should trace sideeffect imports even when sideEffects is false', async () => {
18+
let { exitCode } = await next.build()
19+
expect(exitCode).toBe(0)
20+
21+
let trace = await next.readJSON('.next/server/app/page.js.nft.json')
22+
23+
expect(trace.files).toContainEqual(
24+
expect.stringMatching(/node_modules\/foo\/index\.js$/)
25+
)
26+
expect(trace.files).toContainEqual(
27+
expect.stringMatching(/node_modules\/foo\/package\.json$/)
28+
)
29+
expect(trace.files).toContainEqual(
30+
expect.stringMatching(/node_modules\/foo\/side-effect\.js$/)
31+
)
32+
expect(trace.files).toContainEqual(
33+
expect.stringMatching(/node_modules\/foo\/value\.js$/)
34+
)
35+
})
36+
})

turbopack/crates/turbopack-ecmascript/benches/references.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,11 @@ async fn setup(
8686
ResolvedVc::upcast(module_asset_context),
8787
EcmascriptInputTransforms::empty().to_resolved().await?,
8888
EcmascriptOptions {
89-
tree_shaking_mode: Some(TreeShakingMode::ReexportsOnly),
89+
tree_shaking_mode: if analyze_mode == AnalyzeMode::Tracing {
90+
None
91+
} else {
92+
Some(TreeShakingMode::ReexportsOnly)
93+
},
9094
analyze_mode,
9195
..Default::default()
9296
}

0 commit comments

Comments
 (0)