Monaco-editor в React с использованием TypeScript -> не может найти модуль «monaco-editor»

Я пытался интегрировать monaco-editor в приложение React. Я добился успеха, но все еще сталкиваюсь с проблемами. Ниже я предоставил подробную информацию о моей настройке разработки.

У меня есть файл tsconfig.json, настроенный следующим образом:

{
  "compilerOptions": {
    "target": "ES6",
    "module": "CommonJS",
    "lib": ["dom", "es5", "es2015.collection", "es2015.promise", "dom.iterable"],
    "jsx": "react",
    "sourceMap": true,
    "checkJs": false,
    "outDir": "./dist",
    "strict": true,
    "moduleResolution": "node",
    "baseUrl": "./node_modules",
    "typeRoots": ["node_modules/@types"],
    "allowJs": true,
    
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true,

    "preserveConstEnums": true,    
    "isolatedModules": true
  },

  "include": ["./src/**/*"],
  "exclude": ["node_modules"]  
}

И в моем package.json скрипты настроены следующим образом:

"scripts": {
    "test": "jest",
    "start": "webpack serve",
    "server": "nodemon --exec ts-node server.tsx",
    "build": "webpack -w --mode=development"
  }

Сценарий запуска использует webpack-dev-server, а сервер использует ts-node для запуска моего файла server.tsx.

Редактор monaco импортируется в файл .tsx компонента React как import * as monaco from 'monaco-editor';

Когда я запускаю эту команду: npm run start которая использует webpack-dev-server, все сделано хорошо, и я могу видеть свое приложение в браузере.

Однако, когда я запускаю эту команду: npm run server, которая использует ts-узел для выполнения файла server.tsx, я получаю эту ошибку:

Error: Cannot find module 'monaco-editor'
Require stack:
- D:\Development\Workstation\VividCodes.UI_OLD\src\components\TestMonaco.tsx
- D:\Development\Workstation\VividCodes.UI_OLD\src\components\App.tsx       
- D:\Development\Workstation\VividCodes.UI_OLD\server.tsx
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
    at Function.Module._load (internal/modules/cjs/loader.js:725:27)
    at Module.require (internal/modules/cjs/loader.js:952:19)
    at require (internal/modules/cjs/helpers.js:88:18)

Это копия содержимого файла server.tsx:

import express from 'express';
import * as React from 'react';
import ReactDOMServer from 'react-dom/server';

import App from './src/components/App';

const webpack = require('webpack');
const webpackDevMiddleware = require('webpack-dev-middleware');
const config = require('./webpack.config.js');

const webpackHotMiddleware = require('webpack-hot-middleware');

const server = express();
const compiler = webpack(config);
const port = 3000;

server.use(
  webpackDevMiddleware(compiler, {
    publicPath: config.output.publicPath,
  })
);

server.use(webpackHotMiddleware(compiler));

server.get('/', (req: any, res: any) => {
  const initialMarkup = ReactDOMServer.renderToString(<App />);  
  console.info(initialMarkup);

  res.send(`
    <html>
      <head>
        <title>Monaco_Editor</title>
      </head>
      <body>
        <div id = "mountNode">${initialMarkup}</div>
        <script src = "/app.bundle.js"></script>
        <script src = "/editor.worker.bundle.js"></script>
        <script src = "/json.worker.bundle.js"></script>
        <script src = "/css.worker.bundle.js"></script>
        <script src = "/html.worker.bundle.js"></script>
        <script src = "/ts.worker.bundle.js"></script>
      </body>
    </html>
  `)
});

server.listen(port, () => console.info(`Server started on port: ${port}`));

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

Я думаю, вам нужно установить типы для Monaco-editor. Попробуйте установить react-monitor-editor, у него свои объявления типов

Hamza Khattabi 25.12.2020 16:55

Спасибо за ваш комментарий. Неохота использовать другую стороннюю библиотеку. react-monaco-editor выглядит как чей-то личный проект, и я не уверен, что это хорошая идея для производства.

xerxes 25.12.2020 17:29

Как установить типы для monaco-editor, не используя чужую библиотеку?

xerxes 25.12.2020 17:38

Таким образом, вы можете установить определение типов из Microsoft, но замечено, что редактор react-monaco имеет собственное объявление типа. Смотрите там: npmjs.com/package/@types/react-monaco-editor

Hamza Khattabi 25.12.2020 18:10

Да, я знаю, что у react-monaco-editor есть собственное объявление типа, согласно вашему совету. Честно говоря, я не фанат этой библиотеки. Мне нужно выяснить, как я могу решить проблему, связанную с «типами», которую вы посоветовали ранее, без использования каких-либо других библиотек. Полагаться на личные проекты для производства — не лучшая практика.

xerxes 25.12.2020 23:47

Я не думаю, что дело в файле типизации, ведь он хорошо работает с npm run start. Я подозреваю, что зависимость monaco-editor не упакована для использования с npm run server (как это сделал бы webpack).

Mike Lischke 26.12.2020 11:04

Спасибо за ваш комментарий, Майк, я потратил некоторое время, пытаясь понять это. Да, это не связано с типизацией, вместо этого он не все правильно отображает/упаковывает. Чего-то не хватает

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

Ответы 1

Ответ принят как подходящий

Monaco-editor не поддерживает рендеринг на стороне сервера. Он не может выполнить повторную привязку к существующему узлу DOM. К сожалению, это должно быть сделано на стороне клиента. И в настоящее время нет планов по реализации функций рендеринга на стороне сервера.

Тем не менее, для тех, у кого такая же проблема, если Webpack — это то, что вы используете для объединения, убедитесь, что вы установили для параметра минимизации значение «true». Таким образом, ваши связанные файлы JS будут намного меньше. Кроме того, существует минимальная версия monaco-editor, которую можно использовать для производства; но он основан на AMD.

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