Vite构建SolidJS SPA时生成独立测试脚本遇ES模块问题
解决Vite打包Node可执行独立脚本的问题
你的问题出在未针对Node环境配置Rollup的打包格式,默认打包的ES模块无法被Node直接识别(即使修改package.json或扩展名,也可能因为Solid插件的前端转换规则导致冲突)。要生成能直接用Node运行的独立脚本,需要调整Rollup的多输出配置,区分浏览器入口和Node入口:
修改vite.config.ts配置
import { defineConfig } from 'vite' import solidPlugin from 'vite-plugin-solid' export default defineConfig({ plugins: [ solidPlugin({ // 若test.ts是纯Node脚本(无需Solid前端转换),排除该文件 exclude: /test\.ts$/ }) ], server: { port: 3000, }, build: { target: 'esnext', outDir: '../htdocs', rollupOptions: { input: { index: "./index.html", dev: "./dev.html", test: "./test.ts", }, // 多输出配置:分别处理浏览器和Node入口 output: [ // 浏览器入口配置(保持原有逻辑) { entryFileNames: `assets/[name].js`, chunkFileNames: `assets/[name].js`, assetFileNames: `assets/[name].[ext]`, format: 'esm', dir: '../htdocs' }, // Node入口配置(test.ts专属) { entryFileNames: `assets/test.js`, format: 'cjs', // 打包为CommonJS格式,Node可直接运行 dir: '../htdocs', external: [], // 强制打包所有依赖,生成独立可执行文件 preserveModules: false // 合并为单个文件 } ], preserveEntrySignatures: 'allow-extension' }, }, });
关键配置说明
- 多输出格式区分:通过
output数组分别配置浏览器(ES模块)和Node(CommonJS)的打包规则,避免环境冲突。 - Solid插件排除:如果
test.ts是纯Node脚本,无需Solid的前端编译,用exclude跳过转换,减少不必要的代码处理。 - 强制打包所有依赖:设置
external: []让Rollup把所有依赖(包括node_modules)都打包进test.js,生成完全独立的可执行文件。 - CommonJS格式:用
format: 'cjs'打包,Node无需额外配置(如type:module)即可直接运行。
验证
执行vite build后,运行node ../htdocs/assets/test.js,脚本会直接执行,若运行失败可直接阻断部署流程。
如果你的test.ts需要引用SolidJS代码,只需移除solidPlugin中的exclude配置,Rollup会自动将Solid的代码打包为Node兼容的格式。
内容的提问来源于stack exchange,提问作者Brent Larsen
相关产品推荐
相关产品推荐

