在Namecheap共享主机用cPanel部署Nuxt项目遇Unexpected token export错误
报错根本原因
你现在碰到的SyntaxError: Unexpected token export,是模块加载规范不匹配导致的:
- Namecheap cPanel上的Passenger Node管理器,默认通过CommonJS规范的
require()方法加载入口文件,这种方式只支持module.exports格式的导出语法 - 你的
nuxt.config.js写的是ES模块的export default语法,Node运行时没有开启ES模块解析支持,碰到这个语法就直接抛错中断启动 - 从报错堆栈的文件路径
internal/modules/cjs/loader.js也能验证,当前环境完全走的是CommonJS加载逻辑,不会主动解析ES模块语法
对应修复步骤
1. 修正nuxt.config.js的导出语法
把文件最开头的ES导出语句换成CommonJS兼容写法,其他所有配置内容完全不需要改动:
// 删掉原来的 export default { // 替换成下面的写法 module.exports = { // 你原有的mode、head、plugins、modules等全部配置原样保留即可 mode: 'universal', target: 'server', // ... 其余配置一字不动 }
2. 调整app.js逻辑,适配共享主机资源限制
你当前写的app.js里集成了Builder.build()逻辑,意味着每次应用启动都会在线上跑一遍Nuxt打包流程——共享主机的CPU、内存配额很低,跑打包流程大概率会因为资源超限被系统强制杀掉,建议改成加载本地预先构建好的Nuxt产物:
- 先在本地开发环境完成所有代码调试,执行
npx nuxt build生成线上运行的打包产物 - 把生成的
.nuxt目录、static目录、修正后的nuxt.config.js、package.json全部上传到服务器的应用目录下 - 把原来的
app.js替换成去掉线上构建逻辑的简化版本:
const { Nuxt } = require('nuxt'); const express = require('express'); const app = express(); // cPanel注入的端口环境变量是大写的PORT,不要用小写的port const port = process.env.PORT || 3000; // 加载Nuxt配置,强制关闭开发模式 const nuxtConfig = require('./nuxt.config.js'); nuxtConfig.dev = false; // 初始化Nuxt实例,直接加载本地构建产物 const nuxt = new Nuxt(nuxtConfig); nuxt.ready().then(() => { app.use(nuxt.render); app.listen(port, () => { console.log(`Nuxt应用已在端口 ${port} 正常启动`); }); }).catch(error => { console.error('Nuxt启动失败,错误信息:', error); process.exit(1); });
3. 核对cPanel Node应用的环境配置
在cPanel的「设置Node.js应用」后台逐一检查配置:
- 选择的Node.js版本要和你本地开发的Nuxt版本兼容(Nuxt2项目推荐选择14.x/16.x的LTS版本,不要选10.x及以下的老旧版本,否则就算改了导出语法也会出现依赖兼容问题)
- 应用的启动文件路径要准确指向你编写的
app.js,不要默认指向Nuxt自带的启动入口 - 安装依赖时,进入应用的虚拟终端执行
npm install --production,只安装线上运行必需的依赖,不要把devDependencies全量安装到服务器,浪费磁盘和内存资源
关于Laravel API子目录的配置
你现有的axios、proxy配置不需要改动,只要保证:
- Laravel项目部署在
public_html/sub/目录下,能通过对应域名的/sub/路径正常访问 - 前端请求
/api路径时,会自动通过Nuxt代理转发到Laravel接口地址,不会出现跨域问题
内容的提问来源于stack exchange,提问作者Kousar Rahman
相关产品推荐
相关产品推荐

