synckit
使用worker_threads
在Node.js中同步执行异步工作,并提供一流的TypeScript和Yarn P'n'P支持。
目录
使用方法
安装
# yarn
yarn add synckit
# npm
npm i synckit
API
// runner.js
import { createSyncFn } from 'synckit'
// worker路径必须是绝对路径
const syncFn = createSyncFn(require.resolve('./worker'), {
tsRunner: 'tsx', // 可选,可以是 `'ts-node' | 'esbuild-register' | 'esbuild-runner' | 'tsx'`
})
// 你可以做任何你想做的事,你会同步获得结果!
const result = syncFn(...args)
// worker.js
import { runAsWorker } from 'synckit'
runAsWorker(async (...args) => {
// 执行耗时的工作
return result
})
你必须确保result
可以通过结构化克隆算法
进行序列化。
类型
export interface GlobalShim {
moduleName: string
/**
* `undefined` 表示仅有副作用
*/
globalName?: string
/**
* 1. `undefined` 或空字符串表示 `default`,例如:
* ```js
* import globalName from 'module-name'
* ```
*
* 2. `null` 表示命名空间,例如:
* ```js
* import * as globalName from 'module-name'
* ```
*
*/
named?: string | null
/**
* 如果不是 `false`,仅当原始 `globalName` 不可用时才应用该 shim,
* 例如,你可能只想在原生 `globalThis.fetch` 不可用时进行 polyfill:
* ```js
* import fetch from 'node-fetch'
*
* if (!globalThis.fetch) {
* globalThis.fetch = fetch
* }
* ```
*/
conditional?: boolean
}
选项
execArgv
与环境变量SYNCKIT_EXEC_ARGV
相同globalShims
: 类似于环境变量SYNCKIT_GLOBAL_SHIMS
,但更加灵活,可以是GlobalShim
数组,详见GlobalShim
的定义timeout
与环境变量SYNCKIT_TIMEOUT
相同transferList
: 请参阅 Node.jsworker_threads
文档tsRunner
与环境变量SYNCKIT_TS_RUNNER
相同
环境变量
SYNCKIT_EXEC_ARGV
: 传递给 worker 的 node CLI 选项列表,用逗号,
分隔。(默认为[]
),另见node
文档SYNCKIT_GLOBAL_SHIMS
: 是否启用默认的DEFAULT_GLOBAL_SHIMS_PRESET
作为globalShims
SYNCKIT_TIMEOUT
: 执行异步任务的timeout
(无默认值)SYNCKIT_TS_RUNNER
: 使用哪种 TypeScript 运行器,对开发很有用,可以是'ts-node' | 'esbuild-register' | 'esbuild-runner' | 'swc' | 'tsx'
,默认使用'ts-node'
,请确保已安装相应的包
TypeScript
ts-node
如果你想在 worker 文件(.ts
文件)中使用 ts-node
,它是开箱即用的!
如果你想使用自定义的 tsconfig 作为项目配置,而不是默认的 tsconfig.json
,请使用 TS_NODE_PROJECT
环境变量。更多详情请查看 ts-node。
如果你想与 tsconfig-paths 集成,请查看 ts-node 获取更多详情。
esbuild-register
请查看 esbuild-register
文档
esbuild-runner
请查看 esbuild-runner
文档
swc
请查看 @swc-node/register
文档
tsx
请查看 tsx
文档
性能基准
在运行时读取文件内容 1000 次,它比 sync-threads
快约 50 倍,但比原生方法慢 10 倍。在我的个人 MacBook Pro(64G M1 Max)上,总时间比 sync-threads
快 40 倍,但比原生方法慢 10 倍。
它比 deasync
快近 5 倍,且不需要原生绑定或 node-gyp
。
更多详情请查看 benchmark.cjs 和 benchmark.esm。
你可以通过运行 yarn benchmark
自行尝试。这里是基准测试的源代码。
赞助商
支持者
更新日志
每个版本的详细更改记录在 CHANGELOG.md 中。