如何在Nuxt.js + Vite环境中配置多后端入口点
原架构情况
之前用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子进程:
- 安装依赖:
npm install ts-node --save-dev - 修改
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

