Я создал проект 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, предложенную в двух ответах, проблема была решена, по крайней мере, на данный момент так кажется.
У меня возникла аналогичная ошибка без интерфейса, касающаяся html-элементов в исходном файле. Я использую вебпак 5.
Оставьте все свои реализации, начните с NextJs.
Это не ответ на мой вопрос, не так ли, Америка?





У меня была такая же проблема, которую я исправил вот так.
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"]
}
Я уже пробовал, у меня такая же ошибка....
Я вижу две очевидные проблемы, обе из которых связаны с рабочей областью вашего компонента.
Добавьте @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
]
}
}
Обновите поле main в package.json, чтобы оно указывало на расположение output сборки веб-пакета.
"main": "dist/index.js"
Теперь убедитесь, что вы создали рабочую область компонента, прежде чем запускать рабочую область веб-почты.
Возможно, вам понадобится разместить предустановленные конфигурации внутри файла Babel.config.json:
{
"presets": [
"@babel/preset-env",
"@babel/preset-typescript",
"@babel/preset-react"
]
}
Могут возникнуть и другие проблемы с тем, как вы пытаетесь создать и запустить рабочее пространство веб-почты, но трудно сказать, не имея дополнительной информации о том, как оно настроено и как вы используете это рабочее пространство.
Недавно я обновил свой проект до webpack 5 и обнаружил, что (в отличие от webpack 4) ts-loader по умолчанию, поставляемый с webpack, проще в использовании и правильной настройке, чем попытка использовать Babel для машинописного текста (но сохранил Babel для транспиляции до es5). яваскрипт). Обратите внимание, что
interface— это функция машинописного языка, а не функция React.