微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

React 中使用 TypeScript 的 monaco-editor -> 找不到模块“monaco-editor”

如何解决React 中使用 TypeScript 的 monaco-editor -> 找不到模块“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 运行我的 服务器。 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。