From 328cb9a386c032416b7afb5722f6c71a05160856 Mon Sep 17 00:00:00 2001 From: fisker Date: Thu, 27 Mar 2025 18:47:06 +0800 Subject: [PATCH] worker: add ESM version examples to worker docs --- doc/api/worker_threads.md | 398 ++++++++++++++++++++++++++++++++++---- 1 file changed, 360 insertions(+), 38 deletions(-) diff --git a/doc/api/worker_threads.md b/doc/api/worker_threads.md index e9219bbea0d6e5..1306ca3ad7595b 100644 --- a/doc/api/worker_threads.md +++ b/doc/api/worker_threads.md @@ -9,7 +9,13 @@ The `node:worker_threads` module enables the use of threads that execute JavaScript in parallel. To access it: -```js +```mjs +import worker from 'node:worker_threads'; +``` + +```cjs +'use strict'; + const worker = require('node:worker_threads'); ``` @@ -21,9 +27,43 @@ Unlike `child_process` or `cluster`, `worker_threads` can share memory. They do so by transferring `ArrayBuffer` instances or sharing `SharedArrayBuffer` instances. -```js +```mjs +import { + Worker, + isMainThread, + parentPort, + workerData, +} from 'node:worker_threads'; + +if (!isMainThread) { + const { parse } = await import('some-js-parsing-library'); + const script = workerData; + parentPort.postMessage(parse(script)); +} + +export default function parseJSAsync(script) { + return new Promise((resolve, reject) => { + const worker = new Worker(new URL(import.meta.url), { + workerData: script, + }); + worker.on('message', resolve); + worker.on('error', reject); + worker.on('exit', (code) => { + if (code !== 0) + reject(new Error(`Worker stopped with exit code ${code}`)); + }); + }); +}; +``` + +```cjs +'use strict'; + const { - Worker, isMainThread, parentPort, workerData, + Worker, + isMainThread, + parentPort, + workerData, } = require('node:worker_threads'); if (isMainThread) { @@ -84,7 +124,25 @@ of data passed to the spawning thread's `worker.setEnvironmentData()`. Every new `Worker` receives its own copy of the environment data automatically. -```js +```mjs +import { + Worker, + isMainThread, + setEnvironmentData, + getEnvironmentData, +} from 'node:worker_threads'; + +if (isMainThread) { + setEnvironmentData('Hello', 'World!'); + const worker = new Worker(new URL(import.meta.url)); +} else { + console.log(getEnvironmentData('Hello')); // Prints 'World!'. +} +``` + +```cjs +'use strict'; + const { Worker, isMainThread, @@ -116,12 +174,6 @@ Is `true` if this code is running inside of an internal [`Worker`][] thread (e.g node --experimental-loader ./loader.js main.js ``` -```cjs -// loader.js -const { isInternalThread } = require('node:worker_threads'); -console.log(isInternalThread); // true -``` - ```mjs // loader.js import { isInternalThread } from 'node:worker_threads'; @@ -129,9 +181,11 @@ console.log(isInternalThread); // true ``` ```cjs -// main.js +// loader.js +'use strict'; + const { isInternalThread } = require('node:worker_threads'); -console.log(isInternalThread); // false +console.log(isInternalThread); // true ``` ```mjs @@ -140,6 +194,14 @@ import { isInternalThread } from 'node:worker_threads'; console.log(isInternalThread); // false ``` +```cjs +// main.js +'use strict'; + +const { isInternalThread } = require('node:worker_threads'); +console.log(isInternalThread); // false +``` + ## `worker.isMainThread`