运行 在 nodejs 上使用 typescript (ts-node) 的线程工作者

Running thread workers with typescript (ts-node) on nodejs

使用节点 v14,带有 ts-node v10.0.0 的打字稿

这里我要将一些工作交给工人。

const { Worker } = require('worker_threads')

console.log(process.pid)

function offloadToThread(workerData) {
  return new Promise((resolve, reject) => {
    const worker = new Worker('./fib.ts', { workerData });
    worker.on('message', resolve);
    worker.on('error', reject);
    worker.on('exit', (code) => {
      if (code !== 0)
        reject(new Error(
          `Stopped the Worker Thread with the exit code: ${code}`));
    })
  })
}

async function run() {
  // trying to create 1000 threads
  for (let i = 1; i <= 20; i++) {
    // find fibonacci from 1-20 and then repeat the process.
    offloadToThread(i % 20).then(r => { console.log(r, i) });
  }
}

run().catch(e => console.error(e))

这里,编译后,代码无法选择正确的js文件名,显然是硬编码的。

我想知道为什么 nodejs 团队没有研究这个并让它像我们用来导入模块一样处理文件

require('/my-modules/1')  // does not require js at the end

但下面的代码需要一个有效的 .js 文件

const worker = new Worker('./fib.js', { workerData }); // needs .js extension

在 typescript 编译为 js 后,有什么方法可以解析文件名?

在 ts-node 版本 10.0.0 上测试

如果文件名在 ts-node

下 运行,则此方法将解析文件名
let fileResolver = function(filename:string){
  // @ts-ignore // check if code is not running under ts-node
  if (!process[Symbol.for("ts-node.register.instance")]) {
    return filename.replace('.ts','.js');
  }

  return filename;
}


在问题中找到这个 https://github.com/TypeStrong/ts-node/issues/846