【发布时间】:2020-05-02 12:28:01
【问题描述】:
我有一系列已转换为 typescript 的 react 项目。其中一些使用 webpack,其中一些只使用 babel,因为它们是其他(webpack)项目/实际应用程序使用的库。
我已经将所有内容都转换为 typescript 没有问题,除了在一个非 webpack 项目中,我收到错误“导入路径不能以 .tsx 扩展名结尾”,例如在
import LoadingLogo from '../ui/LoadingLogo.tsx';
我可以通过省略扩展或使用 // @ts-ignore 来解决这个问题,但这些都不是最佳解决方案,因为项目将在重构时混合 jsx 和 tsx,我会希望能够一目了然地看到导入中使用的文件类型。
我将项目转换为打字稿所采取的步骤是
- 安装打字稿
- 安装@babel/preset-typescript
- 添加
presets: [ @babel/preset-typescript ]
到我的 babel.config.js
为了让事情变得更加混乱,在其他(非 webpack)应用程序之一中,我运行了相同的 babel 设置,但我没有看到这个问题。我有什么明显的遗漏吗?作为参考,我在有问题的项目中的 babel.config 看起来像这样
module.exports = function(api) {
api.cache(true);
return {
ignore: ['node_modules/**/*'],
presets: [
['@babel/preset-typescript'],
[
'@babel/preset-env',
{
loose: true,
targets: {
node: 'current'
}
}
],
'@babel/preset-react'
],
env: {
translations: {
plugins: [
'syntax-async-functions',
'@babel/plugin-syntax-dynamic-import',
'dynamic-import-node',
[
'react-intl',
{
messagesDir: './messages',
enforceDescriptions: false
}
]
]
},
production: {
plugins: [
'jsx-strip-ext',
[
'babel-plugin-styled-components',
{
ssr: true
}
],
'syntax-async-functions',
'@babel/plugin-syntax-dynamic-import',
'dynamic-import-node'
]
},
development: {
plugins: [
[
'babel-plugin-styled-components',
{
ssr: true
}
],
'syntax-async-functions',
'@babel/plugin-syntax-dynamic-import',
'dynamic-import-node'
]
}
},
plugins: [
'@babel/plugin-transform-runtime',
'@babel/plugin-syntax-dynamic-import',
'@babel/plugin-syntax-import-meta',
'@babel/plugin-proposal-class-properties',
'@babel/plugin-proposal-json-strings',
'@babel/plugin-transform-classes'
]
};
};
我在非 webpack 项目中的 babel 配置没有问题看起来像这样
module.exports = function(api) {
api.cache(true);
return {
presets: ['@babel/preset-typescript'],
ignore: ['node_modules/**/*'],
extends: 'myProject/babel.config.js',
env: {
production: {
plugins: [
[
'module-resolver',
{
alias: {
'^myProject/src/(.+)': 'myProject/lib/\\1'
},
extensions: ['.js', '.jsx'],
stripExtensions: ['.js', '.jsx']
}
],
[
'babel-plugin-styled-components',
{
ssr: true
}
],
'syntax-async-functions',
'@babel/plugin-syntax-dynamic-import',
'dynamic-import-node'
]
},
development: {
plugins: [
[
'babel-plugin-styled-components',
{
ssr: true
}
],
'syntax-async-functions',
'@babel/plugin-syntax-dynamic-import',
'dynamic-import-node'
]
}
}
};
};
两个项目的 tsconfig.json 看起来像这样
{
"compilerOptions": {
"module": "esnext",
"outDir": "dist/",
"noImplicitAny": true,
"removeComments": true,
"preserveConstEnums": true,
"sourceMap": true,
"target": "ESNext",
"allowJs": true,
"checkJs": false,
"jsx": "react",
"pretty": true,
"skipLibCheck": true,
"strict": true,
"moduleResolution": "node",
"esModuleInterop": true,
"lib": ["dom", "dom.iterable", "ESNext"],
"allowSyntheticDefaultImports": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"isolatedModules": true
},
"include": ["src"],
"exclude": ["node_modules", "**/*.spec.ts"]
}
我的第一直觉是查看模块解析器插件,但这似乎没有任何区别。我有什么明显的遗漏吗?
【问题讨论】:
-
仅供参考,我已经创建了一张与这张类似的票,但具体到我所面临的伤害:stackoverflow.com/questions/62437380/…
标签: reactjs typescript visual-studio-code babeljs