React-ace: рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рд▓реЛрдб рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 15 рдЕрдХреНрддреВре░ 2019  ┬╖  21рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: securingsincity/react-ace

рд╕рдВрдХрдЯ

рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рд▓реЛрдб рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛, JSON рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕рддреНрдпрд╛рдкрди рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ Could not load worker рдЪреЗрддрд╛рд╡рдиреА рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рдЬрд╕рди рдХрд░реНрдореА рдХреЛ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА

import "ace-builds/src-noconflict/worker-json";

рдФрд░ рддреНрд░реБрдЯрд┐ рдорд┐рд▓ рдЧрдИ

TypeError: Cannot read property 'window' of undefined

рдирдореВрдирд╛ рдХреЛрдб рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

import React from "react";
import ReactDOM from "react-dom";
import AceEditor from "react-ace";

import "ace-builds/src-noconflict/ace";
import "ace-builds/src-noconflict/mode-json";
import "ace-builds/src-noconflict/theme-github";

let text =
  '{\n  "id": 0,\n  ' +
  '"script": """\n   function add(x, y) {\n      return x + y;\n   }\n   add(1, 2);\n   """' +
  ',\n   "descr": "add two numbers"\n}';

function App() {
  return (
    <div className="App">
      <h1>Code Editor Demo</h1>
      <AceEditor
        mode="json"
        theme="github"
        onChange={(value, stat) => {
          console.log("onChange", value, stat);
        }}
        value={text}
        name="UNIQUE_ID_OF_DIV"
        editorProps={{ $blockScrolling: true }}
      />
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

рд╕рдВрджрд░реНрдн

рдХреЛрдбреИрдВрдбрдмреЙрдХреНрд╕ https://codesandbox.io/embed/ace-worker-3-vrr68

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЖрдкрдХреЛ рдпрд╛ рддреЛ рд╡реЗрдмрдкреИрдХ-рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛

import "ace-builds/webpack-resolver";

рдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдореЛрдб рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╕реЗ url рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ

import jsonWorkerUrl from "file-loader!ace-builds/src-noconflict/worker-json";
ace.config.setModuleUrl("ace/mode/json_worker", jsonWorkerUrl)
import cssWorkerUrl from "file-loader!ace-builds/src-noconflict/worker-css";
ace.config.setModuleUrl("ace/mode/css_worker", cssWorkerUrl)

рджреЛрдиреЛрдВ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП "рдлрд╛рдЗрд▓-рд▓реЛрдбрд░" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ

рдЕрдЧрд░ рдЗрдХреНрдХрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрдпрд╛рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдЗрдХреНрдХрд╛ рдмреНрд░реЗрд╕ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдРрд╕-рдмрд┐рд▓реНрдб рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдРрд╕ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛред

import "ace-builds";
import AceEditor from "react-ace";

рд╕рднреА 21 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореБрдЭреЗ CSS рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдорд╛рди рдЕрдиреБрднрд╡ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рд╣реЛ рд░рд╣реА рд╣реИ:

Uncaught DOMException: Failed to execute 'importScripts' on 'WorkerGlobalScope': The script at 'http://localhost:9000/settings/landing-page/worker-css.js' failed to load.

рдЬрдм рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЛ рд╕реАрдзреЗ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

import 'ace-builds/src-noconflict/worker-css';

рдореЗрд░рд╛ рдирд┐рд░реНрдорд╛рдг рд╡рд┐рдлрд▓ рд░рд╣рд╛:

ERROR in ../node_modules/ace-builds/src-noconflict/worker-css.js
Module not found: Error: Can't resolve 'ace/lib/es5-shim' in 'path/to/node_modules/ace-builds/src-noconflict'

рдЖрдкрдХреЛ рдпрд╛ рддреЛ рд╡реЗрдмрдкреИрдХ-рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛

import "ace-builds/webpack-resolver";

рдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдореЛрдб рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╕реЗ url рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ

import jsonWorkerUrl from "file-loader!ace-builds/src-noconflict/worker-json";
ace.config.setModuleUrl("ace/mode/json_worker", jsonWorkerUrl)
import cssWorkerUrl from "file-loader!ace-builds/src-noconflict/worker-css";
ace.config.setModuleUrl("ace/mode/css_worker", cssWorkerUrl)

рджреЛрдиреЛрдВ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП "рдлрд╛рдЗрд▓-рд▓реЛрдбрд░" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ

рдЕрдЧрд░ рдЗрдХреНрдХрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрдпрд╛рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдЗрдХреНрдХрд╛ рдмреНрд░реЗрд╕ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдРрд╕-рдмрд┐рд▓реНрдб рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдРрд╕ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛред

import "ace-builds";
import AceEditor from "react-ace";

@nightwing рдЬреЛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди ace-builds рдЖрдпрд╛рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ react-ace рдореЗрд░реЗ рд▓рд┐рдП рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред рдореБрдЭреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдкрдбрд╝рд╛:

import AceEditor from 'react-ace';
import 'ace-builds/webpack-resolver';
// then the mode, theme & extension
import 'ace-builds/src-noconflict/mode-json';
import 'ace-builds/src-noconflict/theme-tomorrow_night';
import 'ace-builds/src-noconflict/ext-searchbox';

рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдорд┐рд▓рд╛ред webpack-resolver рдЖрдпрд╛рдд рд▓рд╛рдЗрди рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ

TypeError: Cannot read property 'setModuleUrl' of undefined

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдореИрдВ рдХреБрдЫ рдХреЗ рд╕рд╛рде рдЗрдХреНрдХрд╛ рдХреА рддрд░рд╣ рдирдХрд▓реА рдХреА рдЬрд░реВрд░рдд рд╣реИ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд░рд╣рд╛ рд╣реВрдБ

global.ace = require('ace-builds/src-min-noconflict/ace');

рдХреНрдпрд╛ рдХрд┐рд╕реА рдиреЗ рдЗрд╕реЗ create-react-app рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛? рдЕрдЧрд░ рдореИрдВ рдЬреЛрдбрд╝ рджреВрдВ рддреЛ рдореЗрд░рд╛ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рди рдЕрдЯрдХ рдЬрд╛рддрд╛ рд╣реИ:

import 'ace-builds/webpack-resolver';

рдЕрдЧрд░ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕реАрдзреЗ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ useWorker: false рд╕реЗрдЯрдУрд╢рдВрд╕ рдореЗрдВ рдЬреЛрдбрд╝рдХрд░ рддрдп рдХрд┐рдпрд╛ред рдпрджрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ, рддреЛ README.md рдореВрд▓ рдЙрдкрдпреЛрдЧ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ рдореИрдВ рдХреБрдЫ рдпрд╛рдж рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

@khoomeister, рдЬрд┐рд╕рдиреЗ рд╕рднреА рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд▓рд┐рдпрд╛, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд╛рдлрд╝реА рдЦрд╝рд░рд╛рдм рд╣реЛ рдЧрдпрд╛ рд╣реИ (рдЬреЛ рдХрд┐ рдореЗрд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)?

(рдЯрд┐рдк btw рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!)

setOptions={{ useWorker: false }}

рдореЗрд░реЗ рд▓рд┐рдпреЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рд╕рд╛рднрд╛рд░ @khoomeister

рдпрд╣ рдореБрджреНрджрд╛ рдЕрднреА рднреА рдЪрд▓ рд░рд╣рд╛ рд╣реИред
"рдпреВрдЬрд╝рд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдХреЛрдИ рдбрд╛рдЙрдирд╕рд╛рдЗрдб рд╣реЛрддрд╛ рд╣реИ? рдЙрди рд╢реНрд░рдорд┐рдХреЛрдВ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ?"

рдореИрдВ рдПрдХ create-react-app рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдореБрдЭреЗ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдереА, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдЕрдкрдиреЗ App.tsx рдореЗрдВ рдЗрд╕реЗ рдЬреЛрдбрд╝рдирд╛ рд╣реИ:

import 'ace-builds/webpack-resolver'

рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЧрд▓рдд, рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдХрдо рд╕реЗ рдХрдо, рд╢рд╛рдпрдж рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рдореБрдЭреЗ рдЕрднреА рддрдХ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдКрдкрд░ рдЕрд░реНрдЬреБрди рдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЕрдЪреНрдЫрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рдореЗрд░реЗ рдмрдирд╛рдиреЗ-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдРрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╡реЗрдмрдкреИрдХ-рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рд╕рдВрдХрд▓рди рд╕рдордп рдореЗрдВ рднрд╛рд░реА рд╡реГрджреНрдзрд┐ рд╣реЛрддреА рд╣реИ, рдФрд░ рдмрд┐рд▓реНрдб рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕реИрдХрдбрд╝реЛрдВ рдлрд╛рдЗрд▓реЗрдВ рдЬреБрдбрд╝рддреА рд╣реИрдВ - рдореИрдВ рдЗрдХреНрдХрд╛-рдмрд┐рд▓реНрдб рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рди рд▓реЗрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдЬреЛ рдареАрдХ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЙрд╕рдХреЗ рд▓рд┐рдП url рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпрд╛ рдРрд╕-рдмрд┐рд▓реНрдб рдХреЗ рд╕рд╛рде рдПрдХ рдореБрджреНрджрд╛ рд╣реИ, рди рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдЗрдХреНрдХрд╛ред

рдЕрдм рддрдХ рдореИрдВ react-ace рдЦреБрд╢ рд╣реВрдВ, рд╕рднреА рдХрдбрд╝реА рдореЗрд╣рдирдд рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдореИрдВ рд╕рдВрд╕реНрдХрд░рдг 8 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рдерд╛ рд▓реЗрдХрд┐рди worker рдореБрджреНрджреЛрдВ рдХреЗ рдХрд╛рд░рдг рдореИрдВ рдЕрд╕рдлрд▓ рд░рд╣рд╛, рдЗрд╕рд▓рд┐рдП рдЕрдм рдореИрдВ 7 рдкрд░ рд░рд╣ рд░рд╣рд╛ рд╣реВрдВред

рдореИрдВ "react-scripts": "3.2.0" (React App рдмрдирд╛рдПрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ

рдореБрдЭреЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛, рдФрд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЧрдИрдВ:

03226918-0f44-4ac8-b073-1abc2ed64713:1 Refused to execute script from 'http://localhost:8000/worker-javascript.js' because its MIME type ('text/html') is not executable.
(anonymous) @ 03226918-0f44-4ac8-b073-1abc2ed64713:1
9297f3cf-c75b-4245-8c37-3ac2a7fed94d:1 Refused to execute script from 'http://localhost:8000/worker-javascript.js' because its MIME type ('text/html') is not executable.
(anonymous) @ 9297f3cf-c75b-4245-8c37-3ac2a7fed94d:1
03226918-0f44-4ac8-b073-1abc2ed64713:1 Uncaught DOMException: Failed to execute 'importScripts' on 'WorkerGlobalScope': The script at 'http://localhost:8000/worker-javascript.js' failed to load.
    at blob:http://localhost:8000/03226918-0f44-4ac8-b073-1abc2ed64713:1:1
(anonymous) @ 03226918-0f44-4ac8-b073-1abc2ed64713:1
9297f3cf-c75b-4245-8c37-3ac2a7fed94d:1 Uncaught DOMException: Failed to execute 'importScripts' on 'WorkerGlobalScope': The script at 'http://localhost:8000/worker-javascript.js' failed to load.
    at blob:http://localhost:8000/9297f3cf-c75b-4245-8c37-3ac2a7fed94d:1:1
(anonymous) @ 9297f3cf-c75b-4245-8c37-3ac2a7fed94d:1

рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ import 'ace-builds/webpack-resolver'; рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реЗрдмрдкреИрдХ-рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдРрдк рд╕рдВрдХрд▓рди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ - рд╕рдВрдХрд▓рди рдЕрдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд▓ рддрдХ рд▓рдЯрдХрд╛ рд╣реБрдЖ рдерд╛ред

рдореИрдВрдиреЗ file-loader рдФрд░ setModuleUrl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореБрдЭреЗ ace/lib/es5-shim рдЧрд╛рдпрдм рд╣реЛрдиреЗ рдХреА рддреНрд░реБрдЯрд┐ рдорд┐рд▓реАред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ # 733 # 755 рдФрд░ рдПрдЬреИрдХреНрд╕ / рдРрд╕-рдмрд┐рд▓реНрдб # 161 рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ

@ рдордЯреНрдЯрдЬрд╕реНрдЯрд╛рд░ рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

import 'ace-builds'
import 'ace-builds/webpack-resolver'

рдЗрд╕рд▓рд┐рдП рд░рд┐рд╕реЛрд▓реНрд╡рд░ рд╕реЗ рдкрд╣рд▓реЗ ace-builds рдЖрдпрд╛рдд рдХрд░реЗрдВ (AceEditor рд╕реЗ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдЪреАрдЬрд╝ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд)

рдКрдкрд░ @arjunu рдЙрддреНрддрд░ рджреЗрдЦреЗрдВред

рдореИрдВрдиреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ-рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо 3 рд▓рд╛рдЗрдиреЗрдВ рдЬреЛрдбрд╝реАрдВ:

import AceEditor from "react-ace";
import "ace-builds/src-min-noconflict/mode-javascript";
import "ace-builds/src-min-noconflict/theme-tomorrow_night_eighties";
import "ace-builds/src-min-noconflict/ext-language_tools";
import "ace-builds/src-min-noconflict/ext-spellcheck";
import "ace-builds/src-min-noconflict/snippets/javascript";
import 'ace-builds/src-min-noconflict/ext-searchbox';
const ace = require('ace-builds/src-noconflict/ace');
ace.config.set("basePath", "https://cdn.jsdelivr.net/npm/[email protected]/src-noconflict/");
ace.config.setModuleUrl('ace/mode/javascript_worker', "https://cdn.jsdelivr.net/npm/[email protected]/src-noconflict/worker-javascript.js");

рдпрджрд┐ рдЖрдк cdn.jsdelivr.net рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд░рд╣рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЕрдкрдиреЗ рд╕реНрдерд╛рдиреАрдп рдкрд░рд┐рд╡реЗрд╢ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛- javascript.js рдХреЛ рдХреЙрдкреА / рдкреЗрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдкрдХреЛ рдпрд╛ рддреЛ рд╡реЗрдмрдкреИрдХ-рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛

import "ace-builds/webpack-resolver";

рдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдореЛрдб рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╕реЗ url рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ

import jsonWorkerUrl from "file-loader!ace-builds/src-noconflict/worker-json";
ace.config.setModuleUrl("ace/mode/json_worker", jsonWorkerUrl)
import cssWorkerUrl from "file-loader!ace-builds/src-noconflict/worker-css";
ace.config.setModuleUrl("ace/mode/css_worker", cssWorkerUrl)

рджреЛрдиреЛрдВ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП "рдлрд╛рдЗрд▓-рд▓реЛрдбрд░" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ

рдЕрдЧрд░ рдЗрдХреНрдХрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрдпрд╛рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдЗрдХреНрдХрд╛ рдмреНрд░реЗрд╕ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдРрд╕-рдмрд┐рд▓реНрдб рдХреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдРрд╕ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛред

import "ace-builds";
import AceEditor from "react-ace";

рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рдореЛрдб рдпрд╛ рдереАрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ URL рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ

import "ace-builds"
import ACE from "react-ace/dist/react-ace.min";

import jsonWorkerUrl from "file-loader!ace-builds/src-noconflict/worker-json";
ace.config.setModuleUrl("ace/mode/json_worker", jsonWorkerUrl);
import xmlWorkerUrl from "file-loader!ace-builds/src-noconflict/worker-xml";
ace.config.setModuleUrl("ace/mode/xml_worker", xmlWorkerUrl);
import jsWorkerUrl from "file-loader!ace-builds/src-noconflict/worker-javascript";
ace.config.setModuleUrl("ace/mode/javascript_worker", jsWorkerUrl);

import "ace-builds/src-min-noconflict/mode-typescript";
import "ace-builds/src-min-noconflict/mode-javascript";
import "ace-builds/src-min-noconflict/mode-graphqlschema";
import "ace-builds/src-min-noconflict/mode-json";
import "ace-builds/src-min-noconflict/mode-xml";
import "ace-builds/src-min-noconflict/mode-markdown";
import "ace-builds/src-min-noconflict/mode-html";
import "ace-builds/src-min-noconflict/theme-github";
import "ace-builds/src-min-noconflict/theme-tomorrow";
import "ace-builds/src-min-noconflict/theme-kuroir";
import "ace-builds/src-min-noconflict/ext-searchbox";

рдпрд╣ рднреА рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ: setOptions={{ useWorker: false }}
https://github.com/securingsincity/react-ace/issues/725#issuecomment -541111118

рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдореИрдВ рдПрдХ рдХрд╕реНрдЯрдо рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ ace-builds/src-.../ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдирд╣реАрдВ рд╣реИ?
рдореБрдЭреЗ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП ANTLR рдкрд╛рд░реНрд╕рд░ рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореИрдВ рдкреВрд░реНрдг [email protected] рдПрдХреАрдХрд░рдг рдпрд╣рд╛рдВ рдЫреЛрдбрд╝рддрд╛ рд╣реВрдВред

import dynamic from "next/dynamic";

const AceEditor = dynamic(
  async () => {
    const reactAce = await import("react-ace");

    // prevent warning in console about misspelled props name.
    await import("ace-builds/src-min-noconflict/ext-language_tools");

    // import your theme/mode here. <AceEditor mode="javascript" theme="solarized_dark" />
    await import("ace-builds/src-min-noconflict/mode-javascript");
    await import("ace-builds/src-min-noconflict/theme-solarized_dark");

    // as <strong i="7">@Holgrabus</strong> commented you can paste these file into your /public folder.
    // You will have to set basePath and setModuleUrl accordingly.
    let ace = require("ace-builds/src-min-noconflict/ace");
    ace.config.set(
      "basePath",
      "https://cdn.jsdelivr.net/npm/[email protected]/src-noconflict/"
    );
    ace.config.setModuleUrl(
      "ace/mode/javascript_worker",
      "https://cdn.jsdelivr.net/npm/[email protected]/src-noconflict/worker-javascript.js"
    );

    return reactAce;
  },
  {
    ssr: false // react-ace doesn't support server side rendering as it uses the window object.
  }
);

export default () =>  <AceEditor mode="javascript" theme="solarized_dark" />

@ рдЬрд╛рди-рдСрд╢ рддреЛ рдЕрдЧрд░ рдореИрдВ рдЕрдкрдиреЗ "customWorker.js" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ ace.config.setModuleUrl("ace/mode/myWorker", "/customWorker.js") ? (/ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ customWorker.js рдбрд╛рд▓рдХрд░)

рдпрджрд┐ рдЖрдк рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрдХреНрдХрд╛ рд╡рд┐рдиреНрдпрд╛рд╕ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

import { config } from 'ace-builds';

config.set(
  "basePath",
  "https://cdn.jsdelivr.net/npm/[email protected]/src-noconflict/"
);
config.setModuleUrl(
   "ace/mode/javascript_worker",
   "https://cdn.jsdelivr.net/npm/[email protected]/src-noconflict/worker-javascript.js"
);

рдореИрдВрдиреЗ рдирд┐рдореНрди рдкрд░реАрдХреНрд╖рдг рдХреЛ рд╡реЗрдмрдкреИрдХ рдореЗрдВ рдЬреЛрдбрд╝рд╛

  module: {
    rules: [
      {
        test: /ace-builds.*\/worker-.*$/,
        loader: 'file-loader',
        options: {
          esModule: false,
          name: '[name].[hash:8].[ext]',
        },
      },
    ],
  },

рддрдм рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛

import ace from 'ace-builds/src-noconflict/ace';
import cssWorkerUrl from 'ace-builds/src-noconflict/worker-css';

ace.config.setModuleUrl('ace/mode/css_worker', cssWorkerUrl);

рдореИрдВ @pranavwani рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдП рдЕрдиреБрд╕рд╛рд░ рдЖрдпрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЕрдм рддреНрд░реБрдЯрд┐ рдореЗрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реВрдВ
Cannot read property 'Range' of undefined. "Error loading module." рдЬрдм ace.tsx рдЗрдХреНрдХрд╛ / рд░реЗрдВрдЬ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реЛ ред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ рд╣реИ рдХрд┐ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдХреЗ рдмрд╛рдж рд╕реЗ рд╣реИ рдХрд┐ window.ace рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдореИрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЗрдХреНрдХрд╛-рдмрдирд╛рддрд╛ рд╣реИ, рдЗрдХреНрдХрд╛ рдореЗрдВ ace.acequire рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдкрд░ рд╡рд╛рдкрд╕ рдЧрд┐рд░рдиреЗ рд░рд╣рддрд╛ editorOptions ред рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЛ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдЖрдпрд╛ рд╣реИ?

рдореИрдВрдиреЗ рдирд┐рдореНрди рдкрд░реАрдХреНрд╖рдг рдХреЛ рд╡реЗрдмрдкреИрдХ рдореЗрдВ рдЬреЛрдбрд╝рд╛

  module: {
    rules: [
      {
        test: /ace-builds.*\/worker-.*$/,
        loader: 'file-loader',
        options: {
          esModule: false,
          name: '[name].[hash:8].[ext]',
        },
      },
    ],
  },

рддрдм рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛

import ace from 'ace-builds/src-noconflict/ace';
import cssWorkerUrl from 'ace-builds/src-noconflict/worker-css';

ace.config.setModuleUrl('ace/mode/css_worker', cssWorkerUrl);

рдЖрдк рдпрд╣ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдмрд┐рдирд╛ рд╕рдВрд╢реЛрдзрд┐рдд рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдХреЗ

import ace from 'ace-builds/src-noconflict/ace';
/* eslint import/no-webpack-loader-syntax: off */
import cssWorkerUrl from 'ace-builds/src-noconflict/worker-css';

ace.config.setModuleUrl('ace/mode/css_worker', cssWorkerUrl);
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

dmavrin picture dmavrin  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

levi0913 picture levi0913  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

BenBrewerBowman picture BenBrewerBowman  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Yuanye picture Yuanye  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

kolbinski picture kolbinski  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ