SvelteKit部署Ubuntu VPS遇ES模块加载错误求助
问题场景
使用Skeleton UI开发的SvelteKit应用,本地执行npm run build生成build文件夹后,运行服务可正常访问,但在全新Ubuntu 22.04 VPS(Node.js 22.10.0)中运行node index.js时出现以下错误:
(node:33314) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
/www/test/index.js:1
import { handler } from './handler.js';
^^^^^^
SyntaxError: Cannot use import statement outside a module
...(错误栈省略)
项目根目录package.json已配置"type": "module",且使用@sveltejs/adapter-node适配器。
核心原因
Node.js判断文件是否为ES模块,优先读取当前工作目录下package.json的type字段。如果直接进入build目录执行node index.js,当前目录无包含"type": "module"的package.json,Node会默认将文件当作CommonJS模块处理,从而抛出import语句的语法错误。
本地运行正常是因为通常在项目根目录执行node build/index.js,此时Node会读取根目录的package.json,正确识别ES模块。
解决方案
方案1:从项目根目录启动服务
回到包含package.json的项目根目录,执行以下命令启动:
node build/index.js
方案2:在build目录添加package.json
若需在build目录内启动,可在build文件夹中创建一个简单的package.json,添加type字段:
{ "type": "module" }
之后直接在build目录执行node index.js即可。
方案3:修改入口文件后缀(不推荐)
将build目录下的index.js重命名为index.mjs,Node会自动识别为ES模块。此方法需同步修改相关引用,维护成本较高,优先推荐前两种方案。
内容的提问来源于stack exchange,提问作者Shark00n

