@@ -25,6 +25,212 @@ const GIT_BRANCH =
25
25
return cmd . output
26
26
} ) ( ) )
27
27
28
+ const nextBuildWorkflow =
29
+ ( benchmarkName , pages ) =>
30
+ async ( { turbopack, page } ) => {
31
+ const pageConfig =
32
+ typeof pages [ page ] === 'string' ? { url : pages [ page ] } : pages [ page ]
33
+ const cleanupTasks = [ ]
34
+ try {
35
+ const env = {
36
+ PATH : process . env . PATH ,
37
+ NODE : process . env . NODE ,
38
+ HOSTNAME : process . env . HOSTNAME ,
39
+ PWD : process . env . PWD ,
40
+ // Disable otel initialization to prevent pending / hanging request to otel collector
41
+ OTEL_SDK_DISABLED : 'true' ,
42
+ NEXT_PUBLIC_OTEL_SENTRY : 'true' ,
43
+ NEXT_PUBLIC_OTEL_DEV_DISABLED : 'true' ,
44
+ NEXT_TRACE_UPLOAD_DISABLED : 'true' ,
45
+ // Enable next.js test mode to get HMR events
46
+ __NEXT_TEST_MODE : '1' ,
47
+ }
48
+
49
+ const benchmarkDir = resolve ( REPO_ROOT , 'bench' , benchmarkName )
50
+
51
+ // cleanup .next directory to remove persistent cache
52
+ await retry ( ( ) =>
53
+ rm ( join ( benchmarkDir , '.next' ) , { recursive : true , force : true } )
54
+ )
55
+
56
+ await measureTime ( 'cleanup' , {
57
+ scenario : benchmarkName ,
58
+ props : { turbopack, page } ,
59
+ } )
60
+
61
+ const buildArgs = [ turbopack ? 'build-turbopack' : 'build-webpack' ]
62
+ let buildShell = command ( 'pnpm' , buildArgs , {
63
+ cwd : benchmarkDir ,
64
+ env,
65
+ } )
66
+ await buildShell . ok ( )
67
+
68
+ await measureTime ( 'build' , {
69
+ scenario : benchmarkName ,
70
+ props : { turbopack, page } ,
71
+ } )
72
+
73
+ // startup browser
74
+ let session = await newBrowserSession ( { } )
75
+ const closeSession = async ( ) => {
76
+ if ( session ) {
77
+ await session . close ( )
78
+ session = null
79
+ }
80
+ }
81
+ cleanupTasks . push ( closeSession )
82
+ await measureTime ( 'browser startup' , {
83
+ props : { turbopack, page } ,
84
+ } )
85
+
86
+ // run command to start dev server
87
+ const startArgs = [ turbopack ? 'start-turbopack' : 'start-webpack' ]
88
+ let shell = command ( 'pnpm' , startArgs , {
89
+ cwd : benchmarkDir ,
90
+ env,
91
+ } )
92
+ const killShell = async ( ) => {
93
+ if ( shell ) {
94
+ await shell . kill ( )
95
+ shell = null
96
+ }
97
+ }
98
+ cleanupTasks . push ( killShell )
99
+
100
+ // wait for server to be ready
101
+ const START_SERVER_REGEXP = / L o c a l : \s + (?< url > .+ ) \n /
102
+ const {
103
+ groups : { url } ,
104
+ } = await shell . waitForOutput ( START_SERVER_REGEXP )
105
+ await measureTime ( 'server startup' , { props : { turbopack, page } } )
106
+ await shell . reportMemUsage ( 'mem usage after startup' , {
107
+ props : { turbopack, page } ,
108
+ } )
109
+
110
+ // open page
111
+ const pageInstance = await session . hardNavigation (
112
+ 'open page' ,
113
+ url + pageConfig . url
114
+ )
115
+ await shell . reportMemUsage ( 'mem usage after open page' )
116
+
117
+ let status = 0
118
+ try {
119
+ if (
120
+ await pageInstance . evaluate (
121
+ '!next.appDir && __NEXT_DATA__.page === "/404"'
122
+ )
123
+ ) {
124
+ status = 2
125
+ }
126
+ } catch ( e ) {
127
+ status = 2
128
+ }
129
+
130
+ try {
131
+ if (
132
+ ! ( await pageInstance . evaluate (
133
+ 'next.appDir || __NEXT_DATA__.page && !__NEXT_DATA__.err'
134
+ ) )
135
+ ) {
136
+ status = 1
137
+ }
138
+ } catch ( e ) {
139
+ status = 1
140
+ }
141
+
142
+ await reportMeasurement ( 'page status' , status , 'status code' )
143
+
144
+ // reload page
145
+ await session . reload ( 'reload page' )
146
+
147
+ await reportMeasurement (
148
+ 'console output' ,
149
+ shell . output . split ( / \n / ) . length ,
150
+ 'lines'
151
+ )
152
+
153
+ if ( turbopack ) {
154
+ // close dev server and browser
155
+ await killShell ( )
156
+ await closeSession ( )
157
+ } else {
158
+ // wait for persistent cache to be written
159
+ const waitPromise = new Promise ( ( resolve ) => {
160
+ setTimeout ( resolve , 5000 )
161
+ } )
162
+ const cacheLocation = join (
163
+ benchmarkDir ,
164
+ '.next' ,
165
+ 'cache' ,
166
+ 'webpack' ,
167
+ 'client-development'
168
+ )
169
+ await Promise . race ( [
170
+ waitForFile ( join ( cacheLocation , 'index.pack' ) ) ,
171
+ waitForFile ( join ( cacheLocation , 'index.pack.gz' ) ) ,
172
+ ] )
173
+ await measureTime ( 'cache created' )
174
+ await waitPromise
175
+ await measureTime ( 'waiting' )
176
+
177
+ // close dev server and browser
178
+ await killShell ( )
179
+ await closeSession ( )
180
+ }
181
+
182
+ buildShell = command ( 'pnpm' , buildArgs , {
183
+ cwd : benchmarkDir ,
184
+ env,
185
+ } )
186
+ await buildShell . ok ( )
187
+
188
+ await measureTime ( 'build with cache' , {
189
+ scenario : benchmarkName ,
190
+ props : { turbopack, page } ,
191
+ } )
192
+
193
+ // startup new browser
194
+ session = await newBrowserSession ( { } )
195
+ await measureTime ( 'browser startup' , {
196
+ props : { turbopack, page } ,
197
+ } )
198
+
199
+ // run command to start dev server
200
+ shell = command ( 'pnpm' , startArgs , {
201
+ cwd : benchmarkDir ,
202
+ env,
203
+ } )
204
+
205
+ // wait for server to be ready
206
+ const {
207
+ groups : { url : url2 } ,
208
+ } = await shell . waitForOutput ( START_SERVER_REGEXP )
209
+ await shell . reportMemUsage ( 'mem usage after startup with cache' )
210
+
211
+ // open page
212
+ await session . hardNavigation (
213
+ 'open page with cache' ,
214
+ url2 + pageConfig . url
215
+ )
216
+
217
+ await reportMeasurement (
218
+ 'console output with cache' ,
219
+ shell . output . split ( / \n / ) . length ,
220
+ 'lines'
221
+ )
222
+ await shell . reportMemUsage ( 'mem usage after open page with cache' )
223
+ } catch ( e ) {
224
+ console . log ( 'CAUGHT' , e )
225
+ throw e
226
+ } finally {
227
+ // This must run in order
228
+ // eslint-disable-next-line no-await-in-loop
229
+ for ( const task of cleanupTasks . reverse ( ) ) await task ( )
230
+ await measureTime ( 'shutdown' )
231
+ }
232
+ }
233
+
28
234
const nextDevWorkflow =
29
235
( benchmarkName , pages ) =>
30
236
async ( { turbopack, page } ) => {
@@ -41,7 +247,7 @@ const nextDevWorkflow =
41
247
42
248
await measureTime ( 'cleanup' , {
43
249
scenario : benchmarkName ,
44
- props : { turbopack : null , page : null } ,
250
+ props : { turbopack, page } ,
45
251
} )
46
252
47
253
// startup browser
@@ -54,15 +260,14 @@ const nextDevWorkflow =
54
260
}
55
261
cleanupTasks . push ( closeSession )
56
262
await measureTime ( 'browser startup' , {
57
- props : { turbopack : null , page : null } ,
263
+ props : { turbopack, page } ,
58
264
} )
59
265
60
266
const env = {
61
267
PATH : process . env . PATH ,
62
268
NODE : process . env . NODE ,
63
269
HOSTNAME : process . env . HOSTNAME ,
64
270
PWD : process . env . PWD ,
65
- NODE_ENV : 'development' ,
66
271
// Disable otel initialization to prevent pending / hanging request to otel collector
67
272
OTEL_SDK_DISABLED : 'true' ,
68
273
NEXT_PUBLIC_OTEL_SENTRY : 'true' ,
@@ -91,9 +296,9 @@ const nextDevWorkflow =
91
296
const {
92
297
groups : { url } ,
93
298
} = await shell . waitForOutput ( START_SERVER_REGEXP )
94
- await measureTime ( 'server startup' , { props : { page : null } } )
299
+ await measureTime ( 'server startup' , { props : { turbopack , page } } )
95
300
await shell . reportMemUsage ( 'mem usage after startup' , {
96
- props : { page : null } ,
301
+ props : { turbopack , page } ,
97
302
} )
98
303
99
304
// open page
@@ -304,7 +509,7 @@ const nextDevWorkflow =
304
509
// startup new browser
305
510
session = await newBrowserSession ( { } )
306
511
await measureTime ( 'browser startup' , {
307
- props : { turbopack : null , page : null } ,
512
+ props : { turbopack, page } ,
308
513
} )
309
514
310
515
// run command to start dev server
@@ -353,14 +558,25 @@ const pages = {
353
558
}
354
559
355
560
describe (
356
- 'heavy-npm-deps dev test ' ,
561
+ 'heavy-npm-deps- dev' ,
357
562
{
358
563
turbopack : true ,
564
+ mode : 'dev' ,
359
565
page : Object . keys ( pages ) ,
360
566
} ,
361
567
nextDevWorkflow ( 'heavy-npm-deps' , pages )
362
568
)
363
569
570
+ describe (
571
+ 'heavy-npm-deps-build' ,
572
+ {
573
+ turbopack : true ,
574
+ mode : 'build' ,
575
+ page : Object . keys ( pages ) ,
576
+ } ,
577
+ nextBuildWorkflow ( 'heavy-npm-deps' , pages )
578
+ )
579
+
364
580
async function retry ( fn ) {
365
581
let lastError
366
582
for ( let i = 100 ; i < 2000 ; i += 100 ) {
0 commit comments