[Node] TypeScript 项目使用 worker-farm 指南

背景

worker-farm 是一个很常用的 Node.js 多进程计算库,uglifyjs-webpack-plugin 使用它压缩代码。
在 ts 中使用时需要一点点小技巧。

1. child 模块的写法

worker-farm 需要传入 child_process 文件的绝对地址,
而 .ts 文件最终会编译到 .js 文件的,可能不在同一个目录。
因此,最好用以下方法提供 child.ts 文件。

// child.ts

// 本文件将在 child_process 中执行
const child = async (request, callback) => {
  try {
    ...
    callback(null, ...);
  } catch (err) {
    callback(err);
  }
};

// 用于获取当前文件地址
child.filePath = __filename;

// 会转译成 module.exports = child;(worker-farm 要求这样写)
// 不要改成 export default child;
export = child;

其中有几个关键点:
(1)child 模块应导出这样一个函数 (request,callback) => void
(2)此函数在 TypeScript 中,应使用 export = 导出,而不是 export default
(3)我给 child.filePath 设置成了 __filename,运行时它的值为 .js 文件(不是 .ts)的地址。

2. 调用位置写法

import * as workerFarm from 'worker-farm';
import * as child from './child';

...
const worker = workerFarm(child.filePath);
worker(request, (err, response) => {
    ...
}));
...
workerFarm.end(worker);

几个注意的点:
(1)导入方式为 import * as child from './child'; 不能使用默认导入 import child from './child';
(2)child.filePath 是 child 模块运行时绝对地址,也就是 child.ts 编译后的 child.js 文件地址
(3)workerrequestresponse 是 json 格式的对象
(4)workerFarm.end(worker); 别忘了调用,否则 worker 不会释放


参考

https://www.npmjs.com/package/worker-farm

你可能感兴趣的:([Node] TypeScript 项目使用 worker-farm 指南)