使用Typescript将节点模块分辨率转换为“完全指定”

egdjgwm8  于 2023-03-31  发布在  TypeScript
关注(0)|答案(1)|浏览(115)

我有一个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"]
}
hkmswyz6

hkmswyz61#

答案晚了,但我这些天偶然发现了同样的问题。问题是ES模块需要完全指定的相对导入和导出。他们不会接受这样的东西:

import x from "./mymodule"

它们必须有一个扩展名,.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编译时都需要填充正则表达式。

相关问题