使用InertiaJS运行SSR服务器时遇模块兼容错误求助
Inertia SSR 搭建失败问题
按照步骤搭建Inertia SSR应用但未成功,相关配置、代码及错误信息如下:
配置文件 config/inertia.ts
export const inertia: InertiaConfig = { view: 'app', ssr: { enabled: true, autoreload: process.env.NODE_ENV === 'development' }, };
资源文件 resources/js/ssr.js
import { createSSRApp, h } from 'vue'; import { renderToString } from '@vue/server-renderer'; import {createInertiaApp, Link} from '@inertiajs/vue3'; export default function render(page) { return createInertiaApp({ page, render: renderToString, resolve: (name) => require(`./Pages/${name}`), setup({ app, props, plugin }) { return createSSRApp({ render: () => h(app, props), }).use(plugin).component('inertia-link', Link); }, }); }
执行命令
node ace serve --watch node ace ssr:watch
错误信息
require() 无法加载 ES Module 文件 C:\Users\Projeto\node_modules@inertiajs\vue3\dist\index.js(来自 C:\Users\Projeto\inertia\ssr\ssr.js)。该 index.js 被识别为 ES Module,因为它所在目录的最近 package.json 中包含 "type": "module",这会将该包范围内的所有 .js 文件都视为 ES Module。
可选解决方向:
- 将 index.js 重命名为 .cjs 后缀
- 修改调用代码,使用动态 import()(所有 CommonJS 模块都支持该方式)
- 将 C:\Users\Projeto\node_modules@inertiajs\vue3\package.json 中的 "type": "module" 改为 "type": "commonjs",将所有 .js 文件视为 CommonJS(同时用 .mjs 后缀标识 ES Module)
修复方案
优先推荐:替换同步 require 为动态 import
修改 resources/js/ssr.js 里的 resolve 函数,把同步的 require 换成 ES Module 支持的动态 import:
resolve: (name) => import(`./Pages/${name}`),
注意 createInertiaApp 会返回 Promise,确保渲染逻辑能正确处理异步流程。
不推荐修改第三方依赖
不要直接修改 node_modules 内的第三方包配置,依赖更新后修改会被覆盖,维护成本高。
调整项目模块类型(备选)
如果项目整体基于 CommonJS,可在项目根目录的 package.json 中设置 "type": "commonjs",但这种方式可能影响其他 ES Module 类型的依赖,需谨慎测试。
内容的提问来源于stack exchange,提问作者marcelo.delta
相关产品推荐
相关产品推荐

