Webpack говорит: «Вам может понадобиться дополнительный загрузчик» в проекте React.js

Я создал проект React с двумя рабочими пространствами: «веб-почта» и «компонент». Я поместил небольшой файл tsx в «компонент» и хочу использовать его в «веб-почте». Это package.json компонента:

{
  "name": "@monorepo/component",
  "version": "0.1.0",
  "description": "Creating a component module project",
  "main": "src/index.tsx",
  "scripts": {
    "dev": "webpack serve",
    "build": "webpack"
  },
  "keywords": [
    "react",
    "component",
    "npm"
  ],
  "author": "Christine",
  "license": "MIT",
  "peerDependencies": {
    "react": "^18.2.0",
    "react-dom": "^18.2.0"
  },
  "devDependencies": {
    "@babel/core": "^7.24.0",
    "@babel/preset-env": "^7.12.11",
    "@babel/preset-react": "^7.18.6",
    "@babel/register": "^7.12.10",
    "babel-loader": "^9.1.3",
    "html-webpack-plugin": "^5.6.0",
    "webpack": "^5.90.3",
    "webpack-cli": "^5.1.4"
  },
  "dependencies": {
    "react": "^18.2.0",
    "react-dom": "^18.2.0"
  }
}

Это компонент webpack.config.js

const path = require('path');

module.exports = {
    entry: {
        index: { import: "./src/index.tsx" }
    },
    output: {
        path: path.resolve(__dirname, "dist"),
    },
    mode: "production",
    module: {
        rules: [
            {
                test: /\.tsx?$/,
                exclude: /node_modules/,
                use: {
                    loader: "babel-loader",
                    options: {
                        presets: [
                            '@babel/preset-env',
                            '@babel/preset-react'
                        ]
                    }
                }
            }
        ]
    },
}

Это «МойКомпонент»:

import React from "react-dom";

interface ComponentProps {
   label: string
}

export const MyComponent=({label, ...props}: ComponentProps)=> {

    return (
        <div>
            <button>{label}</button>
        </div>
    );
}

Это файл tsx, который использует MyComponent:

import './css/App.css';
import React from 'react'
import { MyComponent } from "@monorepo/component"
function App() {

   return (
        <div className = "flex flex-col h-screen w-screen">
            <nav className = "nav">
                <div className='flex-wrap flex justify-between w-4/6'>
                    <div className='flex-wrap flex '>
              <MyComponent label='my button'/>

                    </div>
                   
                </div>
            </nav>
         </div>
    );
}

export default App;

Происходит следующее: приложение веб-почты запускается, а затем жалуется на

ERROR in ../component/src/index.tsx 4:0
Module parse failed: The keyword 'interface' is reserved (4:0)
File was processed with these loaders:
 * ../node_modules/@pmmmwh/react-refresh-webpack-plugin/loader/index.js
You may need an additional loader to handle the result of these loaders.
| 
| import React from "react-dom";
> interface ComponentProps {
|    label: string
| }

Редактировать: Если я удалю «интерфейс» в коде компонента, я получу ошибку:

Module parse failed: Unexpected token (9:8)
File was processed with these loaders:
 * ../node_modules/@pmmmwh/react-refresh-webpack-plugin/loader/index.js
You may need an additional loader to handle the result of these loaders.
| 
|     return (
>         <div>
|             <button>{label}</button>
|         </div>
ERROR in ../component/src/index.tsx 9:8

Если я изменю index.tsx в компоненте на index.js, я получу

Add @babel/preset-react (https://github.com/babel/babel/tree/main/packages/babel-preset-react) to the 'presets' section of your Babel config to enable transformation.
If you want to leave it as-is, add @babel/plugin-syntax-jsx (https://github.com/babel/babel/tree/main/packages/babel-plugin-syntax-jsx) to the 'plugins' section to enable parsing.

Я думаю, почему-то предустановка реакции для Babel не выбрана. Я попытался поместить предустановленную строку в package.json, в webpack.config.json или в Babelrc.json. Что-то не так в моих конфигах?

Решение

Я использовал это в качестве примера для своего проекта. Теперь я воссоздал этот пример локально, он дал мне ту же ошибку, что и для компонента tsx. После того как поставил это

{
  "compilerOptions": {
    "target": "ES6",
    "module": "ES2015",
    "outDir": "dist",
    "allowSyntheticDefaultImports": true,
    "jsx": "react"
  },
  "include": [
    "src/**/*.tsx"
  ],
  "exclude": [
    "node_modules"
  ]
}

в tsconfig.js и добавив строку Preset-Typescript, предложенную в двух ответах, проблема была решена, по крайней мере, на данный момент так кажется.

Недавно я обновил свой проект до webpack 5 и обнаружил, что (в отличие от webpack 4) ts-loader по умолчанию, поставляемый с webpack, проще в использовании и правильной настройке, чем попытка использовать Babel для машинописного текста (но сохранил Babel для транспиляции до es5). яваскрипт). Обратите внимание, что interface — это функция машинописного языка, а не функция React.

Ryan Pierce Williams 19.03.2024 17:43

У меня возникла аналогичная ошибка без интерфейса, касающаяся html-элементов в исходном файле. Я использую вебпак 5.

Christine 19.03.2024 18:05

Оставьте все свои реализации, начните с NextJs.

AmerllicA 22.03.2024 12:25

Это не ответ на мой вопрос, не так ли, Америка?

Christine 22.03.2024 13:07
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
4
858
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

У меня была такая же проблема, которую я исправил вот так.

npm install ts-loader typescript --save-dev

конфигурация веб-пакета:

const path = require('path');

module.exports = {
    entry: {
        index: "./src/index.tsx"
    },
    output: {
        path: path.resolve(__dirname, "dist"),
        filename: "[name].js"
    },
    mode: "production",
    resolve: {
        extensions: ['.tsx', '.ts', '.js']
    },
    module: {
        rules: [
            {
                test: /\.tsx?$/,
                exclude: /node_modules/,
                use: 'ts-loader'
            },
            {
                test: /\.css$/,
                use: ['style-loader', 'css-loader']
            }
        ]
    },
};

Для файла .babelrc:

{
  "presets": ["@babel/preset-env", "@babel/preset-react"]
}

Я уже пробовал, у меня такая же ошибка....

Christine 22.03.2024 13:06
stackoverflow.com/questions/66127456/… Возможно, это поможет.
Emre 22.03.2024 13:10
Ответ принят как подходящий

Я вижу две очевидные проблемы, обе из которых связаны с рабочей областью вашего компонента.

  1. Добавьте @babel/preset-typescript в конфигурацию вашего веб-пакета, чтобы удалить синтаксис TypeScript.

    npm i @babel/preset-typescript --save-dev
    
    use: {
      loader: "babel-loader",
      options: {
        presets: [
          '@babel/preset-env',
          '@babel/preset-react',
          '@babel/preset-typescript' // <--- add this
        ]
      }
    }
    
  2. Обновите поле main в package.json, чтобы оно указывало на расположение output сборки веб-пакета.

    "main": "dist/index.js"
    

Теперь убедитесь, что вы создали рабочую область компонента, прежде чем запускать рабочую область веб-почты.

Возможно, вам понадобится разместить предустановленные конфигурации внутри файла Babel.config.json:

{
  "presets": [
    "@babel/preset-env",
    "@babel/preset-typescript",
    "@babel/preset-react"
  ]
}

Могут возникнуть и другие проблемы с тем, как вы пытаетесь создать и запустить рабочее пространство веб-почты, но трудно сказать, не имея дополнительной информации о том, как оно настроено и как вы используете это рабочее пространство.

Другие вопросы по теме