背景
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)worker
的 request
和 response
是 json 格式的对象
(4)workerFarm.end(worker);
别忘了调用,否则 worker 不会释放