gpt4 book ai didi

javascript - 如何解决我的 TypeScript/ESLint/Webpack 转译问题

转载 作者:行者123 更新时间:2023-12-01 21:49:31 25 4
gpt4 key购买 nike

我检查其他线程已经好几天了;我在网上发现了几次相同的错误,但无法复制已发布的解决方案。为每个不同的版本编写 babel/webpack 配置的方法有很多种,这一事实并没有太大帮助。我正在运行 Webpack、TS 和 ESLint。我能够得到的“最佳情况”错误如下。我真的很想得到一些帮助! :[ 在很多事情中,我尝试过将 tsx 转换为 jsx,并使用 jsx preserve 而不是 react。

终端编译错误:

ERROR in ./src/index.tsx
Module build failed (from ./node_modules/babel-loader/lib/index.js):
SyntaxError: C:\Users\Milo\Desktop\Programacion\zekeapp\src\index.tsx: Unexpected token (12:2)

10 |
11 | ReactDOM.render(
> 12 | <Provider store={store}>
| ^
13 | <Router>
14 | <Main />
15 | </Router>

index.tsx

import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import { ThemeProvider } from 'styled-components';
import { BrowserRouter as Router, Route } from 'react-router-dom';

import store from './store';
import Main from './containers/Main';
import { lightTheme } from './templates/theme';

ReactDOM.render(
<Provider store={store}>
<Router>
<Main />
</Router>
</Provider>,
document.getElementById('root')
);

webpack.config.tsx

import * as path from 'path';

module.exports = {
entry: path.join(__dirname, './src/index.tsx'),
mode: 'production',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, './dist/scripts')
},

resolve: {
extensions: ['.ts', '.tsx', '.js', '.jsx', '.json']
},

module: {
rules: [
{
test: /\.(js|jsx|tsx|ts)$/,
exclude: /node_modules/,
loader: 'babel-loader'
}
]
}
};

tsconfig.json

{
"compilerOptions": {
"target": "ES2018" /* Specify ECMAScript target version: "ES3" (default), "ES5", "ES2015", "ES2016", "ES2017", "ES2018", "ES2019" or "ESNEXT". */,
"module": "commonjs" /* Specify module code generation: "none", "commonjs", "amd", "system", "umd", "es2015", or "ESNext". */,
"jsx": "preserve" /* Specify JSX code generation: "preserve", "react-native", or "react". */,
"strict": true /* Enable all strict type-checking options. */,
"noImplicitAny": false /* Raise error on expressions and declarations with an implied "any" type. */,
"moduleResolution": "node" /* Specify module resolution strategy: "node" (Node.js) or "classic" (TypeScript pre-1.6). */,
"baseUrl": "./" /* Base directory to resolve non-absolute module names. */,
"paths": {
"#server/*": ["./server/*"],
"#src/*": ["./src/*"]
},
"experimentalDecorators": true /* Enables experimental support for ES7 decorators. */,
"emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */,
"forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
}
}

最佳答案

我按照官方 React & Webpack 得到了一个示例项目。文档。

进行这些更改:

  1. webpack.config.tsx 重命名为 webpack.config.js(它由节点而非 TypeScript 运行)

  2. 安装 ts-loader 以转译 .ts/.tsx 文件:npm install --save-dev ts-loader

    <
  3. 编辑webpack.config.js并配置ts-loader

这个例子也包括 babel-loader

注意 exclude:/node_modules/,configFile: path.resolve('./tsconfig.json'), 行,它们很重要并且需要工作正确(有关详细信息,请参阅下面的故障排除部分)

    // webpack.config.js
{
//...
module: {
rules: [
{
test: /\.(js|jsx|tsx|ts)$/,
exclude: /node_modules/,
use: [
{
loader: 'babel-loader',
},
{
loader: 'ts-loader',
options: {
configFile: path.resolve('./tsconfig.json'),
},
},
],
}
]
}
}
  1. 编辑 tsconfig.json 并添加这些设置:
    // tsconfig.json
{
"compilerOptions": {
//...

// Can use to "react" if you aren't using `babel-loader` and `@babel/preset-react` to handle jsx
"jsx": "react" /* Specify JSX code generation: "preserve", "react-native", or "react". */,

// Include these so the `react` imports work nicely:
"esModuleInterop": true,
"allowSyntheticDefaultImports": true
}
}
  1. 此时您应该能够构建项目:npx webpack
    $ npx webpack
Hash: 184cde71516bcbc08144
Version: webpack 4.41.5
Time: 2558ms
Built at: 01/13/2020 2:34:08 PM
Asset Size Chunks Chunk Names
bundle.js 128 KiB 0 [emitted] main
Entrypoint main = bundle.js
[2] ./src/index.tsx 498 bytes {0} [built]
[8] ./src/Main.tsx 385 bytes {0} [built]
+ 7 hidden modules

2。示例文件

以下是我的测试项目的文件内容:

package.json

{
"devDependencies": {
"@babel/core": "^7.8.0",
"babel-loader": "^8.0.6",
"ts-loader": "^6.2.1",
"typescript": "^3.7.4",
"webpack": "^4.41.5",
"webpack-cli": "^3.3.10"
},
"dependencies": {
"@types/react": "^16.9.17",
"@types/react-dom": "^16.9.4",
"react": "^16.12.0",
"react-dom": "^16.12.0"
}
}

tsconfig.json

{
"compilerOptions": {
"target": "ES2018" /* Specify ECMAScript target version: "ES3" (default), "ES5", "ES2015", "ES2016", "ES2017", "ES2018", "ES2019" or "ESNEXT". */,
"module": "commonjs" /* Specify module code generation: "none", "commonjs", "amd", "system", "umd", "es2015", or "ESNext". */,
"strict": true /* Enable all strict type-checking options. */,
"noImplicitAny": false /* Raise error on expressions and declarations with an implied "any" type. */,
"moduleResolution": "node" /* Specify module resolution strategy: "node" (Node.js) or "classic" (TypeScript pre-1.6). */,
"baseUrl": "./" /* Base directory to resolve non-absolute module names. */,
"experimentalDecorators": true /* Enables experimental support for ES7 decorators. */,
"emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */,
"forceConsistentCasingInFileNames": true, /* Disallow inconsistently-cased references to the same file. */
"jsx": "react" /* Specify JSX code generation: "preserve", "react-native", or "react". */,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true
}
}

webpack.config.json

const path = require('path');

module.exports = {
entry: path.join(__dirname, './src/index.tsx'),
mode: 'production',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, './dist/scripts')
},
resolve: {
extensions: ['.ts', '.tsx', '.js', '.jsx', '.json']
},
module: {
rules: [
{
test: /\.(js|jsx|tsx|ts)$/,
exclude: /node_modules/,
use: [
{
loader: 'babel-loader',
},
{
loader: 'ts-loader',
options: {
configFile: path.resolve('./tsconfig.json'),
},
},
],
}
]
}
};

src/index.tsx

import React from 'react';
import ReactDOM from 'react-dom';

import Main from './Main';

ReactDOM.render( <Main />, document.getElementById('root') );

src/Main.tsx

import React from 'react';
import ReactDOM from 'react-dom';

export default function Main(){
return (<h1>This is Main</h1>);
}

3。故障排除

我在设置时遇到了这些问题 - 以下是我找到的解决方案。

错误:您收到如下错误:配置文件“tsconfig.json”中的"file"列表为空。

例如

ERROR in [tsl] ERROR
TS18002: The 'files' list in config file 'tsconfig.json' is empty.

ERROR in ./src/index.tsx
Module build failed (from ./node_modules/ts-loader/index.js):
Error: error while parsing tsconfig.json

解决方案:解析完整的tsconfig.json路径

// webpack.config.js
{
loader: 'ts-loader',
options: {
// configFile: './tsconfig.json', // !! WRONG
configFile: path.resolve('./tsconfig.json'), // CORRECT
},
}

错误:您会收到如下错误:找不到模块:错误:无法解析“path-to-project/node_modules/react”中的“...”

例如

ERROR in ./node_modules/react/index.js
Module not found: Error: Can't resolve './Main' in 'C:\webpack-typescript\node_modules\react'
@ ./node_modules/react/index.js 15:31-48
@ ./src/index.tsx

解决方案:确保从 ts-loader 规则中排除 node_modules

// webpack.config.js
{
module: {
rules: [
{
test: /\.(js|jsx|tsx|ts)$/,
exclude: /node_modules/, // <--- make sure this is here!
// ...
}
]
}
}

关于javascript - 如何解决我的 TypeScript/ESLint/Webpack 转译问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59709252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com