我有一个Typescript模块,需要在node和浏览器中工作。我在整个过程中使用import myModule from './myModule'
,当我在create-react-app
中导入模块时,我得到以下错误:
‘重大变化:无法解析请求“./myModule”,因为它已被解析为“完全指定”。
是否有一个Typescript设置能够在编译过程中将我的“未完全指定”转换为“完全指定”?
下面是我的tsconfig.json:
{
"extends": "@tsconfig/recommended/tsconfig.json",
"include": ["./src"],
"compilerOptions": {
"module": "ES2020",
"declaration": true,
"moduleResolution": "Node",
"outDir": "./dist",
"jsx": "react"
},
"exclude": ["**/*.spec.ts"]
}
1条答案
按热度按时间hkmswyz61#
答案晚了,但我这些天偶然发现了同样的问题。问题是ES模块需要完全指定的相对导入和导出。他们不会接受这样的东西:
它们必须有一个扩展名,
.js
或.mjs
或.cjs
,正如typescript reference page shows所解释的那样。问题是,tsc,Typescript编译器,不会将我们的导入转换为完全指定的导入。如果我们像这样完全指定我们的导入
import x from "./mymodule.ts"
,tsc将在编译后的文件导入时保留.ts
扩展名,但./mymodule
文件将已经转换为./mymodule.js
扩展名为.js
。在GitHub #27481和#11901上为tsc团队打开的相关问题请求中存在众所周知的辩论,但没有解决方案。
因此,我所做的是使用ShellJS sed构建一个名为fix-tsc-es-imports的脚本,将tsconfig.json文件的outDir中的所有相对导入和导出转换为完全指定的。它可以在tsc之后集成到构建过程中。
还有其他可能的解决方案,例如添加一个规则,这样Prettier就不会抱怨完全指定的扩展,并将所有的相对导入和导出更改为
.js
扩展。但我认为这太过分了。另一种解决方案是手动使用VS Code正则表达式替换,但这可能会导致错误,因为该过程不会自动化,并且每次触发tsc编译时都需要填充正则表达式。