You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Nuxt.js + Vite环境中配置多后端入口点

在Nuxt.js + Vite环境中复现Node多进程(child_process.fork)功能

原架构情况

之前用Webpack+TypeScript+Node搭建的后端,包含1个主进程+3个子进程(共4个),通过Node的child_process.fork实现并发运行。Webpack的后端打包配置如下:

webpack.config.server.dev.js

module.exports = {
  mode: 'development',
  devtool: 'inline-source-map',
  target: 'node',
  externals: [nodeExternals()],
  entry: {
    main: ['./src/server/app.ts'],
    process1: ['./src/server/process1.ts'],
    process2: ['./src/server/process2.ts'],
  },
  output: {
    path: path.resolve(__dirname, "../../dist/"),
    filename: "[name].js",
  },
  resolve: {
    extensions: ['.ts', '.tsx', '.js'],
  }
}

主进程app.ts通过以下方式调用子进程:

// 导入语句
// 变量与业务逻辑

const process1 = cp.fork(
    path.resolve(__dirname, "process1"),
    [],
    {}
);

const process2 = cp.fork(
    path.resolve(__dirname, "process2"),
    [],
    {}
);

process1.ts和process2.ts为独立运行模块,Webpack通过多入口打包成JS文件,供cp.fork调用。

迁移后遇到的问题

目前已通过nuxt.config.ts的listen钩子启动后端服务:

import startServer from "./server";

export default defineNuxtConfig({
  // 其他配置项
  hooks: { listen: (server) => startServer(server) },
  // 其他配置项
}

server/index.ts调用app.ts的代码:

import { Server as NuxtServer } from 'node:http';

export default (nuxtServer: NuxtServer) => {
  console.info("CREATING SOCKET...");

  let appts = require("./app.ts");
  appts();
};

此时app.ts可正常运行,但调用子进程时出现以下问题:

  • 使用path.resolve(__dirname, "process1")无法识别模块
  • 改为path.resolve(__dirname, "process1.ts")则报错cannot use import statement outside a module

尝试过Vite多入口配置方案,但均针对前端HTML页面,不适用于后端TS文件。手动放入原Webpack编译的process1.js并修改路径为path.resolve(__dirname, "process1.tjs")可正常运行,现寻求适配Nuxt.js+Vite的原生解决方案。

可行解决方案

方案1:用Vite单独编译后端子进程

给子进程单独创建Vite配置文件(如vite.server-processes.config.ts):

import { defineConfig } from 'vite'
import { resolve } from 'path'

export default defineConfig({
  build: {
    outDir: resolve(__dirname, 'dist/server-processes'),
    lib: {
      entry: {
        process1: resolve(__dirname, 'server/process1.ts'),
        process2: resolve(__dirname, 'server/process2.ts')
      },
      formats: ['cjs'], // 输出CommonJS格式适配Node环境
      fileName: '[name]'
    },
    rollupOptions: {
      // 排除Node内置模块与项目依赖,避免冗余打包
      external: ['node:*', ...Object.keys(require('./package.json').dependencies)],
    }
  },
  resolve: {
    extensions: ['.ts', '.js']
  }
})

在package.json中添加编译脚本:

{
  "scripts": {
    "build:processes": "vite build --config vite.server-processes.config.ts",
    "dev:processes": "vite build --config vite.server-processes.config.ts --watch"
  }
}

开发环境下,启动Nuxt的同时运行npm run dev:processes,即可监听子进程文件变化自动重新编译。最后修改主进程的fork路径:

const process1 = cp.fork(
    path.resolve(__dirname, "../dist/server-processes/process1"),
    [],
    {}
);

方案2:用ts-node直接运行TS子进程(适合开发环境)

无需额外编译,直接用ts-node执行TS子进程:

  1. 安装依赖:npm install ts-node --save-dev
  2. 修改app.ts中的fork调用:
const process1 = cp.fork(
    path.resolve(__dirname, "process1.ts"),
    [],
    {
      execPath: 'ts-node',
      execArgv: process.execArgv.concat(['--transpile-only']) // 加快编译速度
    }
);

该方案适合开发场景,生产环境建议提前编译为JS文件以避免运行时编译开销。

方案3:利用Nuxt的serverAssets配置编译子进程

通过Nuxt的serverAssets配置将子进程文件整合到Nuxt编译流程中,修改nuxt.config.ts:

export default defineNuxtConfig({
  serverAssets: [
    {
      path: './server',
      baseName: 'server-processes',
      // 仅打包子进程文件,排除主进程
      filter: (file) => file.endsWith('process1.ts') || file.endsWith('process2.ts')
    }
  ],
  vite: {
    build: {
      ssr: true,
      rollupOptions: {
        output: {
          format: 'cjs' // 指定输出CommonJS格式
        }
      }
    }
  }
})

主进程中调用编译后的子进程:

const process1 = cp.fork(
    path.resolve(__dirname, "../.nuxt/server-assets/server-processes/process1.js"),
    [],
    {}
);

内容的提问来源于stack exchange,提问作者Khaelem Watt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 14:00:00