8.8 KiB
synckit
Perform async work synchronously in Node.js using worker_threads
with first-class TypeScript and Yarn P'n'P support.
TOC
Usage
Install
# yarn
yarn add synckit
# npm
npm i synckit
API
// runner.js
import { createSyncFn } from 'synckit'
// the worker path must be absolute
const syncFn = createSyncFn(require.resolve('./worker'), {
tsRunner: 'tsx', // optional, can be `'ts-node' | 'esbuild-register' | 'esbuild-runner' | 'tsx'`
})
// do whatever you want, you will get the result synchronously!
const result = syncFn(...args)
// worker.js
import { runAsWorker } from 'synckit'
runAsWorker(async (...args) => {
// do expensive work
return result
})
You must make sure, the result
is serializable by Structured Clone Algorithm
Types
export interface GlobalShim {
moduleName: string
/**
* `undefined` means side effect only
*/
globalName?: string
/**
* 1. `undefined` or empty string means `default`, for example:
* ```js
* import globalName from 'module-name'
* ```
*
* 2. `null` means namespaced, for example:
* ```js
* import * as globalName from 'module-name'
* ```
*
*/
named?: string | null
/**
* If not `false`, the shim will only be applied when the original `globalName` unavailable,
* for example you may only want polyfill `globalThis.fetch` when it's unavailable natively:
* ```js
* import fetch from 'node-fetch'
*
* if (!globalThis.fetch) {
* globalThis.fetch = fetch
* }
* ```
*/
conditional?: boolean
}
Options
execArgv
same as envSYNCKIT_EXEC_ARGV
globalShims
: Similar like envSYNCKIT_GLOBAL_SHIMS
but much more flexible which can be aGlobalShim
Array
, seeGlobalShim
's definition for more detailstimeout
same as envSYNCKIT_TIMEOUT
transferList
: Please refer Node.jsworker_threads
documentationtsRunner
same as envSYNCKIT_TS_RUNNER
Envs
SYNCKIT_EXEC_ARGV
: List of node CLI options passed to the worker, split with comma,
. (default as[]
), see alsonode
docsSYNCKIT_GLOBAL_SHIMS
: Whether to enable the defaultDEFAULT_GLOBAL_SHIMS_PRESET
asglobalShims
SYNCKIT_TIMEOUT
:timeout
for performing the async job (no default)SYNCKIT_TS_RUNNER
: Which TypeScript runner to be used, it could be very useful for development, could be'ts-node' | 'esbuild-register' | 'esbuild-runner' | 'swc' | 'tsx'
,'ts-node'
is used by default, make sure you have installed them already
TypeScript
ts-node
If you want to use ts-node
for worker file (a .ts
file), it is supported out of box!
If you want to use a custom tsconfig as project instead of default tsconfig.json
, use TS_NODE_PROJECT
env. Please view ts-node for more details.
If you want to integrate with tsconfig-paths, please view ts-node for more details.
esbuild-register
Please view esbuild-register
for its document
esbuild-runner
Please view esbuild-runner
for its document
swc
Please view @swc-node/register
for its document
tsx
Please view tsx
for its document
Benchmark
It is about 50x faster than sync-threads
but 10x slower than native for reading the file content itself 1000 times during runtime, and 40x faster than sync-threads
but 10x slower than native for total time on my personal MacBook Pro with 64G M1 Max.
And it's almost 5x faster than deasync
but requires no native bindings or node-gyp
.
See benchmark.cjs and benchmark.esm for more details.
You can try it with running yarn benchmark
by yourself. Here is the benchmark source code.
Sponsors
1stG | RxTS | UnTS |
---|---|---|
Backers
1stG | RxTS | UnTS |
---|---|---|
Changelog
Detailed changes for each release are documented in CHANGELOG.md.