无需NPM构建脚本导入TypeScript模块的报错问题
问题与解决方案:ts-node导入依赖时的模块语法错误
问题场景
我需要导入一个依赖包,其package.json配置如下:
{ "name": "com.matheusdiasdesouzads.js.language-objects", "main": "src/index.ts" }
在外部包my-outer-package/src/index.ts中,我通过以下方式导入该包:
import {Language} from 'com.matheusdiasdesouzads.js.language-objects';
执行ts-node src/index.ts时出现错误:
> ts-node src/index.ts # my-outer-package < my-outer-package\node_modules\com.matheusdiasdesouzads.js.language-objects\src\index.ts:1 import Language, {Direction} from './language'; ^^^^^^ SyntaxError: Cannot use import statement outside a module
但直接运行ts-node com.matheusdiasdesouzads.js.language-objects/src/index.ts则没有模块相关错误。我尝试了常见方案(设置compilerOptions.module为"CommonJS"、target为"ES2017"、esModuleInterop为true,以及在package.json中加type: "module"),但都无效,想知道能否保持当前依赖配置不变让命令正常运行。
可行解决方案(无需修改依赖包配置)
方案1:让ts-node处理依赖中的TS文件
ts-node默认会跳过node_modules目录下的文件转译,直接把依赖的TS文件当作JS执行,导致ES模块语法报错。可以通过配置tsconfig.json指定需要处理的依赖路径:
在my-outer-package的tsconfig.json中添加:
{ "ts-node": { "include": ["node_modules/com.matheusdiasdesouzads.js.language-objects/**/*.ts"] }, "compilerOptions": { // 保留你已有的配置,比如module: "CommonJS"等 } }
配置完成后直接运行ts-node src/index.ts即可。
方案2:用路径映射绕开node_modules默认逻辑
在my-outer-package的tsconfig.json中配置路径映射,将包名直接指向其TS源码:
{ "compilerOptions": { "baseUrl": ".", "paths": { "com.matheusdiasdesouzads.js.language-objects": ["node_modules/com.matheusdiasdesouzads.js.language-objects/src/index.ts"] } }, "ts-node": { "require": ["tsconfig-paths/register"] } }
先安装依赖:
npm install tsconfig-paths --save-dev
之后正常运行ts-node src/index.ts即可。
方案3:命令行参数强制转译
执行命令时添加参数,强制ts-node转译目标文件及依赖:
ts-node --transpile-only --module CommonJS src/index.ts
内容的提问来源于stack exchange,提问作者Hydroper
相关产品推荐
相关产品推荐

