TypeScript项目使用hapi-router出现导入语句报错如何解决?
报错根因
你遇到的报错是hapi-router的默认加载逻辑和TypeScript运行规则不兼容导致的:hapi-router会直接用Node.js原生require加载你指定的路由文件,你配置的匹配路径是.ts后缀的TS源文件,Node.js无法直接识别TS文件里的ESModule import语法,就会抛出"Can not use import statement outside a module"错误。
解决方法
场景1:先编译TS为JS再运行(生产环境)
修改插件注册时的路由匹配路径,指向编译后输出目录(通常为dist)的JS文件即可:
await server.register( { plugin: HapiRouter, options: { routes: "./dist/api/**/routes.js", }, }, { routes: { prefix: "/api/v1" } } );
同时确保你的tsconfig.json中compilerOptions.module配置为CommonJS,保证编译后的JS使用Node.js兼容的模块语法。
场景2:用ts-node直接运行TS代码(开发环境)
- 启动项目时添加ts-node注册器,让Node.js可以直接处理TS文件:
node -r ts-node/register src/入口文件.ts
- 确保
tsconfig.json有以下配置:
{ "compilerOptions": { "module": "CommonJS", "esModuleInterop": true } }
如果修改后还是报错,可以把路由文件的export default改为module.exports =,TS原生支持该写法,适配CommonJS加载逻辑。
兜底方案
如果两种方案都不适用,你可以手动实现路由自动加载逻辑:自己写遍历代码读取指定目录的路由文件,导入后手动调用server.route()批量注册,完全自主控制加载逻辑,避免第三方插件的兼容问题。
内容的提问来源于stack exchange,提问作者Tanjir Antu
相关产品推荐
相关产品推荐

