javascript - Ufanget TypeError: Klarte ikke å løse modulspesifikatoren "react-dom/client". --- Bruker Express-server og TypeScript-klient
Full feil:
Ser denne feilen på klientsiden, i nettleserkonsollen, når jeg prøver å importere react-modulene fra serverens node_modules-mappe.
Uncaught TypeError: Failed to resolve module specifier "react-dom/client". Relative references must start with either "/", "./", or "../".
Rediger: Jeg ser denne feilen i klienten/i nettleserkonsollen, når jeg prøver å importere en modul fra node_modules-mappen min på serveren, ved å bruke en ikke-relativ sti. Mesteparten av React-eksemplene jeg har sett bruker denne ikke-relative referansen, så jeg forstår ikke hvorfor det ikke fungerer for meg siden jeg trodde React er ment å kjøre på klienten for klient-side rendering, så jeg antar at dette er et vanlig brukstilfelle.
Jeg lager mitt første nettsted for å lære ulike webteknologier, og nå lærer jeg React. Jeg vil legge til React i mitt eksisterende prosjekt ved å lage noen komponenter som kan brukes på sidene mine. Derfor har jeg ikke brukt "Create React App" siden jeg vil legge det til i min eksisterende oppsett.
Jeg har:
- En Express-server skrevet i JavaScript/NodeJS
- Klient-side kode er skrevet i TypeScript
- Jeg bruker Pug for å generere HTML på serveren, men det er sannsynligvis ikke relevant.
- Jeg bruker npm for å administrere react-, express- osv. pakker
- Jeg bruker ingenting til sammenkobling
Jeg har sett mange lignende spørsmål, men kan ikke finne løsninger som hjelper meg. Folk ser ut til å bruke webpack eller snakker om bundling, noe jeg har ignorert så langt siden jeg ikke har hatt behov for det.
Jeg har laget en enkel side i prosjektet mitt som etterligner oppsettet mitt for å forenkle undersøkelsen - en statisk HTML-fil, som inkluderer en .ts-fil som et modul, som importerer en .tsx-fil. Jeg får fortsatt feilen her.
Mappestruktur:
BudgetV1
|- node_modules
| |- @types
| | |- react
| | |- react-dom
| |- react
| |- react-dom
|
|- public
| |- reactPractice.html
|
|- scripts
| |- practicingReact.ts
| |- helpInsertReact.tsx
|
|- app.js
|- package.json
|- tsconfig.json
package.json
{
"name": "budgetv1pug",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "node ./bin/www",
"devstart": "nodemon ./bin/www",
"serverstart": "SET DEBUG=budgetv1pug:* & npm run devstart"
},
"dependencies": {
"async": "^3.2.4",
"cookie-parser": "~1.4.4",
"debug": "~2.6.9",
"express": "~4.16.1",
"express-validator": "^6.14.2",
"http-errors": "~1.6.3",
"mongoose": "^6.6.2",
"morgan": "~1.9.1",
"pug": "2.0.0-beta11",
"react": "^18.2.0",
"react-dom": "^18.2.0"
},
"devDependencies": {
"@types/react": "^18.0.28",
"@types/react-dom": "^18.0.11",
"nodemon": "^2.0.20"
}
}
tsconfig.json
{
"compilerOptions": {
"target": "ES2015",
"allowJs": true,
"sourceMap": true,
"outDir": "./public/out",
"forceConsistentCasingInFileNames": true,
"strict": true,
"skipLibCheck": true,
"watch": true,
"jsx": "react-jsx",
"moduleResolution": "node",
"noEmitOnError": true,
"allowSyntheticDefaultImports": true,
},
"include": ["./scripts/*"]
}
app.js
const express = require('express');
const path = require('path');
const app = express();
// Set up mongoose connection
.....
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'node_modules'))); // Tried adding this but didn't help.
app.use('/', catalogRouter)
// ...
// More unrelated app.use() setup calls
// ...
module.exports = app;
reactØvelse.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>React</title>
</head>
<body>
<h1>Hi</h1>
<script src="./out/practicingReact.js" type="module"></script>
<div id="root"></div>
</body>
</html>
practicingReact.ts
import insertReact from "./reactComponents/helpInsertReact.js";
window.addEventListener("DOMContentLoaded", function (e) {
console.log("DOMContentLoaded");
insertReact();
});
helpInsertReact.tsx
import React, { StrictMode } from "react";
import { createRoot } from "react-dom/client"; // Problem line
export default function insertReact() {
console.log("insertReact");
let rootDiv: HTMLElement = document.getElementById("root")!;
const root = createRoot(rootDiv);
}
Og til slutt i nettleserens utviklerverktøy Console, feilen ved innlasting av siden:
Uncaught TypeError: Failed to resolve module specifier "react-dom/client". Relative references must start with either "/", "./", or "../".
i reactPractice.html:1
Merk at hvis jeg legger til en linje i helpInsertReact.tsx som bruker noe fra "react", får jeg en lignende feil for 'modulspesifikator "react"'.
Jeg kan se GET-forespørselen for helpInsertReact.js komme inn på serveren min, men jeg kan ikke se filen i Kilder-fanen i nettleserens utviklerverktøy. Jeg antar at den ikke engang begynner å kjøre på grunn av 'klarte ikke å løse...' feilen