Node.js Cluster模块能否无需引用worker.js文件直接传入执行代码片段
可以实现,无需依赖外部worker.js文件,常用有两种实现方案:
方案1:单入口分支判断(最推荐)
将主进程和worker进程的逻辑写在同一个入口文件中,通过cluster.isPrimary判断当前运行环境,不需要额外配置exec参数:
import cluster from 'cluster'; import process from 'process'; if (cluster.isPrimary) { // 主进程逻辑,通过环境变量传递不同worker的配置 cluster.fork({ USE_PROTO: 'https' }); cluster.fork({ USE_PROTO: 'http' }); } else { // 原worker.js的逻辑直接写在这个分支内即可 const proto = process.env.USE_PROTO; if (proto === 'https') { // 此处写https服务的对应逻辑 } else if (proto === 'http') { // 此处写http服务的对应逻辑 } }
所有代码都打包在同一个入口文件中,不会产生额外依赖,维护成本更低。
方案2:动态代码片段执行
如果需要完全拆分不同worker的逻辑,可以通过node的-e/--eval参数直接传入要执行的代码片段,无需读取外部js文件:
import cluster from 'cluster'; cluster.setupPrimary({ // exec指定为当前执行程序路径,打包后就是生成的exe本身 exec: process.execPath, // args里通过-e参数传入worker的完整代码 args: ['-e', ` const proto = 'https'; // 此处写https worker的全部逻辑 console.log('https worker启动成功'); `], silent: true }); cluster.fork(); cluster.setupPrimary({ exec: process.execPath, args: ['-e', ` const proto = 'http'; // 此处写http worker的全部逻辑 console.log('http worker启动成功'); `] }); cluster.fork();
注意事项
- 方案1是首推方案,不存在代码转义问题,可维护性更高
- 采用方案2时,如果代码内包含反引号、特殊转义字符,需要提前做转义处理,避免执行时报错
- 如果需要兼容Node v16以下版本,可以把
cluster.isPrimary替换为cluster.isMaster,功能完全一致 - 两种方案打包后都可实现单二进制文件分发,不需要额外附带js文件
内容的提问来源于stack exchange,提问作者sjsam
相关产品推荐
相关产品推荐

