使用 TypeScript 的 React 中的摩纳哥编辑器 -> 找不到模块 'monaco-editor'

monaco-editor in React using TypeScript -> cannot find module '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"
  }

start 脚本正在使用 webpack-dev-server 并且服务器正在使用 ts-node 到 运行 我的 server.tsx 文件。

monaco-editor 在 React 组件 .tsx 文件中导入为 import * as monaco from 'monaco-editor';

当我 运行 这个命令:npm run start 使用 webpack-dev-server 一切都很好,我可以在浏览器。

但是,当我 运行 这个命令时: npm run server 使用 ts-node 来执行 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.log(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.log(`Server started on port: ${port}`));

我的计划是使用正确的自定义服务器动态呈现我的组件,而不是在客户端这样做。

Monaco-editor 不支持服务器端渲染。它无法重新绑定到现有的 DOM 节点。不幸的是,它必须在客户端完成。并且,目前没有实现服务器端渲染功能的计划。

但是,对于那些有同样顾虑的人,如果您使用 Webpack 进行捆绑,请确保将最小化选项设置为 'true'。这样,您捆绑的 JS 文件就会小得多。此外,还有一个 'min' 版本的 monaco-editor 可用于生产;但它基于 AMD.