美文网首页Node.js
[Node] TypeScript 项目使用 worker-fa

[Node] TypeScript 项目使用 worker-fa

作者: 何幻 | 来源:发表于2020-12-23 11:27 被阅读0次

    背景

    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-fa

        本文链接:https://www.haomeiwen.com/subject/ngyynktx.html