@@ -13,7 +13,6 @@ import { Worker } from 'node:worker_threads';
1313import { isAbsolute , resolve } from 'node:path' ;
1414import { ensureDir } from './node-system' ;
1515import { normalizePath } from '../../utils/fs' ;
16- import { createSingleThreadWorker } from '../worker-thread' ;
1716
1817export async function createNodeMainProcess ( sys : System , opts : StaticGenerateOptions ) {
1918 const ssgWorkers : StaticGeneratorWorker [ ] = [ ] ;
@@ -50,34 +49,14 @@ export async function createNodeMainProcess(sys: System, opts: StaticGenerateOpt
5049 sitemapOutFile = resolve ( outDir , sitemapOutFile ) ;
5150 }
5251 }
53-
54- const singleThreadWorker = await createSingleThreadWorker ( sys ) ;
55-
56- const createWorker = ( workerIndex : number ) => {
57- if ( workerIndex === 0 ) {
58- // same thread worker, don't start a new process
59- const ssgSameThreadWorker : StaticGeneratorWorker = {
60- activeTasks : 0 ,
61- totalTasks : 0 ,
62-
63- render : async ( staticRoute ) => {
64- ssgSameThreadWorker . activeTasks ++ ;
65- ssgSameThreadWorker . totalTasks ++ ;
66- const result = await singleThreadWorker ( staticRoute ) ;
67- ssgSameThreadWorker . activeTasks -- ;
68- return result ;
69- } ,
70-
71- terminate : async ( ) => { } ,
72- } ;
73- return ssgSameThreadWorker ;
74- }
75-
52+ const createWorker = ( ) => {
7653 let terminateResolve : ( ( ) => void ) | null = null ;
7754 const mainTasks = new Map < string , WorkerMainTask > ( ) ;
7855
7956 let workerFilePath : string | URL ;
57+ let terminateTimeout : number | null = null ;
8058
59+ // Launch the worker using the package's index module, which bootstraps the worker thread.
8160 if ( typeof __filename === 'string' ) {
8261 workerFilePath = __filename ;
8362 } else {
@@ -89,6 +68,7 @@ export async function createNodeMainProcess(sys: System, opts: StaticGenerateOpt
8968 }
9069
9170 const nodeWorker = new Worker ( workerFilePath , { workerData : opts } ) ;
71+ nodeWorker . unref ( ) ;
9272
9373 const ssgWorker : StaticGeneratorWorker = {
9474 activeTasks : 0 ,
@@ -116,7 +96,9 @@ export async function createNodeMainProcess(sys: System, opts: StaticGenerateOpt
11696 terminateResolve = resolve ;
11797 nodeWorker . postMessage ( msg ) ;
11898 } ) ;
119- await nodeWorker . terminate ( ) ;
99+ terminateTimeout = setTimeout ( async ( ) => {
100+ await nodeWorker . terminate ( ) ;
101+ } , 1000 ) as unknown as number ;
120102 } ,
121103 } ;
122104
@@ -146,7 +128,11 @@ export async function createNodeMainProcess(sys: System, opts: StaticGenerateOpt
146128 } ) ;
147129
148130 nodeWorker . on ( 'exit' , ( code ) => {
149- if ( code !== 1 ) {
131+ if ( terminateTimeout ) {
132+ clearTimeout ( terminateTimeout ) ;
133+ terminateTimeout = null ;
134+ }
135+ if ( code !== 0 ) {
150136 console . error ( `worker exit ${ code } ` ) ;
151137 }
152138 } ) ;
@@ -200,9 +186,15 @@ export async function createNodeMainProcess(sys: System, opts: StaticGenerateOpt
200186 console . error ( e ) ;
201187 }
202188 }
203- ssgWorkers . length = 0 ;
204189
205190 await Promise . all ( promises ) ;
191+ ssgWorkers . length = 0 ;
192+
193+ // On Windows, give extra time for all workers to fully exit
194+ // This prevents resource conflicts in back-to-back builds
195+ if ( process . platform === 'win32' ) {
196+ await new Promise ( ( resolve ) => setTimeout ( resolve , 300 ) ) ;
197+ }
206198 } ;
207199
208200 if ( sitemapOutFile ) {
@@ -214,7 +206,11 @@ export async function createNodeMainProcess(sys: System, opts: StaticGenerateOpt
214206 }
215207
216208 for ( let i = 0 ; i < maxWorkers ; i ++ ) {
217- ssgWorkers . push ( createWorker ( i ) ) ;
209+ ssgWorkers . push ( createWorker ( ) ) ;
210+ // On Windows, add delay between worker creation to avoid resource contention
211+ if ( process . platform === 'win32' && i < maxWorkers - 1 ) {
212+ await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
213+ }
218214 }
219215
220216 const mainCtx : MainContext = {
0 commit comments