Description
What is the problem this feature will solve?
Following the implementation of #52706 in Node.js version 22.2, workers can no longer specify custom ESM loader hooks. In the Angular CLI, we utilized this feature as part of our prerendering (SSG) pipeline.
Here’s a summary of our build pipeline and process: In the main process, the application is transpiled and bundled, generating all files in memory. The main process then spawns multiple thread workers (using Piscina) with a customized loader hook to intercept imports and redirect them to the in-memory files when present. As of version 22.2 this is no longer possible.
It's worth noting that in our scenario, multiple threads (e.g., Thread A and Thread B) may be initialized, resulting in varying module resolutions and ESM module hooks across these threads.
In the following example, the workerData
contains the files and modules utilized by the ESM loader hooks:
const { Worker } = require("worker_threads");
const filesInMemoryInItalian = {
'main.mjs': 'export const hello = "ciao"';
};
const filesInMemoryInEnglish = {
'main.mjs': 'export const hello = "hello"';
};
const workerA = new Worker("./lib/child.js", {
workerData: { files: filesInMemoryInItalian },
execArgv: ["--import", "./lib/register.js"],
});
const workerB = new Worker("./lib/child.js", {
workerData: { files: filesInMemoryInEnglish },
execArgv: ["--import", "./lib/register.js"],
});
What is the feature you are proposing to solve the problem?
Thread workers should be permitted to specify custom ESM loader hooks.
What alternatives have you considered?
An alternative approach is to spawn a forked process from the main process, specifying the custom loader hook in the forked process. This forked process then spawns the worker threads. As demonstrated in angular/angular-cli#27721.
However, It is important to note that this approach is not backward compatible. In previous versions, the ESM loader specified on the main thread did not propagate to child workers. Consequently, from a maintenance perspective, tools now need two methods to use ESM custom loaders with thread workers and need to support Node.js LTS and Active versions.
Metadata
Metadata
Assignees
Labels
Type
Projects
Status