React-ace: ์ž‘์—…์ž๋ฅผ๋กœ๋“œ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2019๋…„ 10์›” 15์ผ  ยท  21์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: securingsincity/react-ace

๋ฌธ์ œ

์ž‘์—…์ž๋ฅผ๋กœ๋“œ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. JSON ๊ตฌ๋ฌธ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†”์— Could not load worker ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ json ์›Œ์ปค ๊ฐ€์ ธ ์˜ค๊ธฐ๋ฅผ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

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);

์ฐธ๊ณ  ๋ฌธํ—Œ

Codesandbox https://codesandbox.io/embed/ace-worker-3-vrr68

bug help wanted

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

webpack-resolver๋ฅผ ํฌํ•จํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

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)

๋‘ ๋ฐฉ๋ฒ• ๋ชจ๋‘ "ํŒŒ์ผ ๋กœ๋”"๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ react-ace๋Š” ace๊ฐ€ ์•„์ง ์ž„ํฌํŠธ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ brace๋ฅผ๋กœ๋“œํ•˜๋ ค๊ณ ํ•˜๋ฏ€๋กœ react-ace ์ „์— ace-build๋ฅผ ์ž„ํฌํŠธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

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'

webpack-resolver๋ฅผ ํฌํ•จํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

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)

๋‘ ๋ฐฉ๋ฒ• ๋ชจ๋‘ "ํŒŒ์ผ ๋กœ๋”"๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ react-ace๋Š” ace๊ฐ€ ์•„์ง ์ž„ํฌํŠธ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ brace๋ฅผ๋กœ๋“œํ•˜๋ ค๊ณ ํ•˜๋ฏ€๋กœ react-ace ์ „์— ace-build๋ฅผ ์ž„ํฌํŠธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

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 ๋ฅผ setOptions์— ์ถ”๊ฐ€ํ•˜์—ฌ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์ด๋ผ๋ฉด ๋ญ”๊ฐ€ ๋น ์ง„ ๊ฒƒ์ด ์—†๋‹ค๋ฉด README.md ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•์„ ์—…๋ฐ์ดํŠธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@khoomeister ๋Š” ๋ชจ๋“  ๊ฒฝ๊ณ ๋ฅผ ์ œ๊ฑฐํ–ˆ์ง€๋งŒ ์„ฑ๋Šฅ์ด ๋ˆˆ์— ๋„๊ฒŒ ๋‚˜๋น ์กŒ์Šต๋‹ˆ๊นŒ (๊ทธ๋ƒฅ ๋‚ด ๊ตฌํ˜„ ์ผ ์ˆ˜ ์žˆ์Œ)?

(ํŒ btw์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!)

setOptions={{ useWorker: false }}

๋‚˜๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @khoomeister

๋˜ํ•œ ์—ฌ์ „ํžˆ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
"useWorker๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ ์ž‘์—…์ž๋“ค์€ ์ •ํ™•ํžˆ ๋ฌด์—‡์„ํ•ฉ๋‹ˆ๊นŒ?

create-react-app ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ํ•ด์•ผ ํ•  ์œ ์ผํ•œ ์ผ์€ ๋‚ด App.tsx์— ์ด๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

import 'ace-builds/webpack-resolver'

useWorker๋ฅผ false๋กœ ์„ค์ •ํ•˜๋ฉด ์ ์–ด๋„ ๋‹ค๋ฅธ ๊ฒƒ๋“ค์€ ๊ตฌ๋ฌธ ๊ฒ€์‚ฌ๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋˜๋ฏ€๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์œ„์˜ arjunu์˜ ์˜๊ฒฌ์— ๋”ฐ๋ผ ํ…Œ์ŠคํŠธ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ์ด๊ฒƒ์ด ์ถฉ๋ถ„ํžˆ ์ข‹์€์ง€ ์•„์ง ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚ด create-react-app ํ”„๋กœ์ ํŠธ์— webpack-resolver๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ์—„์ฒญ๋‚˜๊ฒŒ ์ฆ๊ฐ€ํ•˜๊ณ  ๋นŒ๋“œ ๋””๋ ‰ํ† ๋ฆฌ์— ์ˆ˜๋ฐฑ ๊ฐœ์˜ ํŒŒ์ผ์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๊ตฌ์„ฑํ•˜๋Š” ace-build์˜ ๊ฐ ๋ชจ๋“ˆ์— ๋Œ€ํ•ด ํ•˜๋‚˜์”ฉ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ํ•„์š”ํ•œ ๋ชจ๋“ˆ์— ๋Œ€ํ•œ URL ๊ตฌ์„ฑ์€ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ react-ace๊ฐ€ ์•„๋‹Œ react-scripts ๋˜๋Š” ace-builds์˜ ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ react-ace ์— ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค. ์—ด์‹ฌํžˆ ์ผํ•ด ์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

๋ฒ„์ „ 8๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ ค๊ณ ํ–ˆ์ง€๋งŒ worker ๋ฌธ์ œ๋กœ ์ธํ•ด ์‹คํŒจ ํ–ˆ์œผ๋ฏ€๋กœ ์ง€๊ธˆ์€ 7์— ๋จธ๋ฌผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

"react-scripts": "3.2.0" (๋ฆฌ ์•กํŠธ ์•ฑ ๋งŒ๋“ค๊ธฐ)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ž‘์—…์ž๋ฅผ๋กœ๋“œ ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์ฝ˜์†”์— ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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'; ์‚ฌ์šฉํ•˜์—ฌ webpack-resolver๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ ํ–ˆ์ง€๋งŒ ์•ฑ์ด ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ์ด ๋ฌด๊ธฐํ•œ ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ file-loader ๋ฐ setModuleUrl ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ace/lib/es5-shim ๋ˆ„๋ฝ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” # 733 # 755 ๋ฐ ajaxorg / ace-builds # 161๊ณผ ๊ด€๋ จ๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

@mattjstar ํ•จ๊ป˜ ์ž‘์—…ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

๋”ฐ๋ผ์„œ ๋ฆฌ์กธ๋ฒ„ ์ „์— ace-builds ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค (AceEditor์™€ ๊ด€๋ จ๋œ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ).

์œ„์˜ @arjunu ๋‹ต๋ณ€์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

javascript-worker๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ๋งˆ์ง€๋ง‰ 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์— ์˜์กดํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ worker-javascript.js ํŒŒ์ผ์„ ๋ณต์‚ฌ / ๋ถ™์—ฌ ๋„ฃ๊ธฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

webpack-resolver๋ฅผ ํฌํ•จํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

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)

๋‘ ๋ฐฉ๋ฒ• ๋ชจ๋‘ "ํŒŒ์ผ ๋กœ๋”"๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ react-ace๋Š” ace๊ฐ€ ์•„์ง ์ž„ํฌํŠธ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ brace๋ฅผ๋กœ๋“œํ•˜๋ ค๊ณ ํ•˜๋ฏ€๋กœ react-ace ์ „์— ace-build๋ฅผ ์ž„ํฌํŠธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

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 -546711308

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" />

@ jan-osch ์˜ˆ๋ฅผ ๋“ค์–ด "customWorker.js"๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ace.config.setModuleUrl("ace/mode/myWorker", "/customWorker.js") ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? (/ public ํด๋”์— customWorker.js ๋„ฃ๊ธฐ)

Typescript์—์„œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ace ๊ตฌ์„ฑ์„ ์„ค์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

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"
);

Webpack์— ๋‹ค์Œ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

  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 ๊ฐ€ ace / range๋ฅผ ๊ฐ€์ ธ ์˜ค๋ ค๊ณ  ํ•  ๋•Œ Cannot read property 'Range' of undefined. "Error loading module." .

๋ฌธ์ œ๋Š” window.ace ๊ฐ€ ์ •์˜ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ace-builds๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€๋งŒ ace๊ฐ€ editorOptions์˜ ace.acequire ๊ตฌ๋ฌธ์„ ๊ณ„์† ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์€ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

Webpack์— ๋‹ค์Œ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

  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);

webpack ๊ตฌ์„ฑ์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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 ๋“ฑ๊ธ‰