使用Vite打包Node.js JS文件时出现window未定义错误求助
解决Vite打包Node.js脚本时出现
ReferenceError: window is not defined的问题 问题原因
你遇到的问题是因为Vite的lib模式默认偏向浏览器环境构建,即使配置了target: 'node18',也不会自动切换到Node环境的模块解析逻辑。axios的浏览器版本代码中引用了window对象,而Node环境不存在这个全局变量,因此运行时抛出错误。
解决方案
方案1:将axios标记为外部依赖(推荐)
这种方式不把axios打包进产物,而是让运行时直接从node_modules中加载Node版本的axios,避免环境不兼容问题。
修改vite.config.js:
import { resolve } from 'path' import { defineConfig } from 'vite' export default defineConfig({ build: { target: 'node18', lib: { entry: resolve(__dirname, 'index.js'), fileName: 'index', formats: ['cjs'], }, rollupOptions: { // 标记axios为外部依赖,不参与打包 external: ['axios'], }, }, })
执行打包命令后,运行node dist/index.js即可正常执行,前提是你已经通过npm install axios安装了依赖。
方案2:强制使用axios的Node版本
如果你需要将axios打包进产物,可以通过别名配置强制Vite使用axios的Node适配版本:
修改vite.config.js:
import { resolve } from 'path' import { defineConfig } from 'vite' export default defineConfig({ resolve: { alias: { // 指定使用axios的Node环境版本 axios: resolve(__dirname, 'node_modules/axios/dist/node/axios.cjs'), }, }, build: { target: 'node18', lib: { entry: resolve(__dirname, 'index.js'), fileName: 'index', formats: ['cjs'], }, }, })
方案3:启用Vite的SSR模式
Vite的SSR模式专门针对服务端(Node)环境优化构建逻辑,开启后会自动适配Node环境的模块解析:
修改vite.config.js:
import { resolve } from 'path' import { defineConfig } from 'vite' export default defineConfig({ ssr: { target: 'node', }, build: { target: 'node18', lib: { entry: resolve(__dirname, 'index.js'), fileName: 'index', formats: ['cjs'], }, }, })
验证
完成配置修改后,重新执行:
npx vite build node dist/index.js
此时应该能正常输出HTTP状态码(如200)。
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

