Xterm.js: ๊ธฐ๋Šฅ ์š”์ฒญ: React ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ณด๋‚ด๊ธฐ

์— ๋งŒ๋“  2016๋…„ 09์›” 02์ผ  ยท  15์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: xtermjs/xterm.js

xterm.js๊ฐ€ React ์•ฑ์— ์‰ฝ๊ฒŒ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋„๋ก React ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋‚ด๋ณด๋‚ด๋ฉด ์ •๋ง ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๋‘˜๋Ÿฌ์‹ผ ๋‹จ์ˆœํ•œ ๋ž˜ํผ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

typenhancement

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

์ด๊ฒƒ์€ ์ •๋ง ์ •๋ง ํฅ๋ฏธ๋กœ์šด ์‹œ๋‚˜๋ฆฌ์˜ค์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” xterm.js๊ฐ€ ์ด๋ฏธ ์ถฉ๋ถ„ํ•œ ๊ธฐ๋Šฅ๊ณผ ๋ณต์žก์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•œ ํ•œ ๋…๋ฆฝ์ ์ด๊ณ  ๊ฐ€๋ฒผ์šด ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

xtermjs/xterm-react ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์™€ xterm-react npm ๋ชจ๋“ˆ ๋ชจ์ž๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด React ๊ตฌ์„ฑ ์š”์†Œ์—์„œ xterm.js๋ฅผ ๋ž˜ํ•‘ํ•˜๋ฉด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๋“ค๋ฆฌ๋‚˜์š”?

๋ชจ๋“  15 ๋Œ“๊ธ€

์ด๊ฒƒ์€ ์ •๋ง ์ •๋ง ํฅ๋ฏธ๋กœ์šด ์‹œ๋‚˜๋ฆฌ์˜ค์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” xterm.js๊ฐ€ ์ด๋ฏธ ์ถฉ๋ถ„ํ•œ ๊ธฐ๋Šฅ๊ณผ ๋ณต์žก์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•œ ํ•œ ๋…๋ฆฝ์ ์ด๊ณ  ๊ฐ€๋ฒผ์šด ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

xtermjs/xterm-react ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์™€ xterm-react npm ๋ชจ๋“ˆ ๋ชจ์ž๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด React ๊ตฌ์„ฑ ์š”์†Œ์—์„œ xterm.js๋ฅผ ๋ž˜ํ•‘ํ•˜๋ฉด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๋“ค๋ฆฌ๋‚˜์š”?

๊ทธ๊ฒƒ์€ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค :)

๋‚˜๋Š” ์ •๋ง๋กœ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ž‘์—…ํ•˜๊ณ  ์‹ถ์ง€๋งŒ ๋„ˆ๋ฌด ํŒจ์น˜๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ์ฝ”๋“œ๋ฅผ ์กฐ์ •ํ•˜๋Š” ๋ฐ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” xtem.js๊ฐ€ DOM๊ณผ์˜ ์ƒํ˜ธ ์ž‘์šฉ์— ํฌ๊ฒŒ ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ทฐ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋ Œ๋”๋ง์„ ์ธ๊ณ„๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋กœ์ง๊ณผ DOM ์ฒ˜๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์š”์ฒญํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” DOM์— ์ด๋ฒคํŠธ๋ฅผ ์ฒจ๋ถ€ํ•˜๊ณ , ์š”์†Œ๋ฅผ ์ƒ์„ฑ ๋ฐ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋“ฑ์˜ ์ฑ…์ž„์ด ์žˆ๋Š” ํ„ฐ๋ฏธ๋„์—์„œ Terminal.UI๋ฅผ ์ถ”์ถœํ•˜๋Š” ๋ผ์ธ์—์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ํ„ฐ๋ฏธ๋„์€ Terminal.UI๊ฐ€ ํ‚ค ๋ˆ„๋ฅด๊ธฐ ๋ฐ ์Šคํฌ๋กค๊ณผ ๊ฐ™์€ ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ๋ Œ๋”๋ง์—์„œ ์™„์ „ํžˆ ๋ถ„๋ฆฌ๋˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋ทฐํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์™„์ „ํ•œ ๋ถ„๋ฆฌ๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์ง„ํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์ƒ๊ฐ์„ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ด€๋ จ์„ฑ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋Š” ๊ฒฝ์šฐ ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” ์ด ํ”„๋กœ์ ํŠธ์˜ ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„์˜ ๊ด€์‹ฌ ๋ถ„๋ฆฌ๊ฐ€ ํ–ฅํ›„ ๊ฐœ๋ฐœ ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌ์— ์‹ค์ œ๋กœ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ฏฟ์œผ๋ฉฐ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์˜ ์—ด๋ ฌํ•œ ํŒฌ์ž…๋‹ˆ๋‹ค.

@iMoses ์šฐ๋ฆฌ๋Š” ์ฒœ์ฒœํžˆ ์ฝ”๋“œ๋ฅผ ๋ชจ๋“ˆํ™”ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•ด ์™”์œผ๋ฉฐ, ๊ธฐ๋ณธ ํŒŒ์ผ์—์„œ ๋ชจ๋“ˆ์„ ์ด๋™ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๋ฐฉ๊ธˆ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ด๋Ÿฌํ•œ ๋ถ„๋ฆฌ๋ฅผ ์š”๊ตฌํ•˜๋Š” ๊ด€๋ จ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. https://github.com/sourcelair/xterm.js/issues/266

๋‹ค์–‘ํ•œ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•œ ์‚ฌ์šด๋“œ๋ฅผ ์ข‹๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ทฐํฌํŠธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ‘

๋” ์ ํ•ฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ #285๋ถ€ํ„ฐ ๋…ผ์˜๋ฅผ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค.

@iMoses ํ•ต์‹ฌ ๋ชจ๋“ˆ์˜ ์–ด๋–ค ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฐ˜์‘ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์•„๋งˆ๋„ ๊ฐ€์žฅ ์ข‹์€ ๊ฒƒ์€ ์ž์ฒด ๋ชจ๋“ˆ์—์„œ ์ด๋“ค๋งŒ ๋ถ„๊ธฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๋ชฉ๋ก์— ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์ž‘์—…ํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด open ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜์ง€ ์•Š์ง€๋งŒ ์—ฌ์ „ํžˆ ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋กœ ๋ถ„๋ฆฌ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๋‚˜์—ดํ•  ๋Œ€๋ถ€๋ถ„์˜ ๋‚ด์šฉ์€ Interface.js ํŒŒ์ผ์˜ pull-request์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Viewport ๋ฐ CompositionHelper์˜ ๋ชจ๋“  ๊ฒƒ์ด์ง€๋งŒ ๊ทธ๊ฑด ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. :)

xterm.js ํŒŒ์ผ์—์„œ ๋ถ„๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์ฃผ์š” ๋ฉ”์†Œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
ํ๋ฆผ, ์ดˆ์ , ๋ฐ”์ธ๋“œ*, initGlobal, prepareCopiedTextForClipboard, insertRow, ์—ด๊ธฐ, loadAddon, ํŒŒ๊ดด, ์ƒˆ๋กœ ๊ณ ์นจ, attachCustomKeydownHandler, keyDown, ํ‰๊ฐ€ํ‚คEscapeSequence, keyPress, ๋ฒจ, ์ทจ์†Œ.

'bell' ๋ฐ 'application-mode'๋Š” UI ๋กœ์ง๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋Œ€์‹  ์ด๋ฒคํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋Œ€๋ถ€๋ถ„์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ฝ”๋“œ์—์„œ UI ์š”์†Œ์˜ ์‚ฌ์šฉ์„ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: this.viewport ๋ฐ this.element๋Š” ์ฝ”์–ด ๋ชจ๋“ˆ์—์„œ ์ง์ ‘ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ถ”์‹ 
์ œ๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ์ €๋Š” ํ˜„์žฌ Reach XTerm.js ์˜ˆ์ œ๋ฅผ ์ž‘์—… ์ค‘์ด๋ฉฐ xterm ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ•„์š”ํ•œ ํ•„์ˆ˜ ์š”์†Œ๋กœ๋งŒ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. 1์ฃผ์ผ ์ด๋‚ด์— ์™„๋ฃŒํ•˜๊ณ  ๊ฒ€ํ† ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‚ด ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
ํ˜„์žฌ ๋‚ด ์ปดํ“จํ„ฐ์—์„œ ํ›Œ๋ฅญํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ˆ์™ธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ง ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ๋ฅผ ์ฒจ๋ถ€ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์‚ฌ์†Œํ•œ ๋ Œ๋”๋ง ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค refresh React๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์•„๋‹Œ ๋ Œ๋”๋ง ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์ „์— https://github.com/sourcelair/xterm.js/issues/266 ์„ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ฝ”์–ด ๋กœ์ง๊ณผ UI ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๋ฉด dom์— ๋Œ€ํ•œ ๊ฑฑ์ • ์—†์ด ์ฝ”์–ด๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๊ณ  ํ•„์š”ํ•  ๋•Œ๋งŒ ๋ทฐ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์—ฌ ์ž‘์—…ํ•  ํ„ฐ๋ฏธ๋„ ์ฝ”์–ด ์ธ์Šคํ„ด์Šค๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์•„๋ฌด ๊ฒƒ๋„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์˜ˆ๋ฅผ ๋“ค์–ด ๋งˆ์šฐ์Šค ์ด๋™์„ ํฌํ•จํ•˜๋Š” ์™„์ „ํ•œ ๋งˆ์šฐ์Šค ์ง€์›์ด ์žˆ๋Š” ํ„ฐ๋ฏธ๋„ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฌด์—‡์— ๋Œ€ํ•ด ํ…Œ์ŠคํŠธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์‹ค์ œ๋กœ react-xterm ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ npm ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
๊ฑฐ๊ธฐ์—์„œ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์›ํ•œ๋‹ค๋ฉด github ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋ฅผ ์ „์†กํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/farfromrefug/react-xterm

@farfromrefug ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! "tabula rasa"๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ข‹์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๋” ์ž˜ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ ์ˆ˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋‹ซ๊ณ  ์žˆ์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด๊ฒƒ์„ ํ•จ๊ป˜ ๊ตฌ์„ฑํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋‹ซํžŒ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋…ผํ‰ํ•˜๋Š” ๊ฒƒ์— ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ €๋Š” xtermjs์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ React ๋ Œ๋”๋Ÿฌ๋ฅผ ์ž‘์—…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ„ฐ๋ฏธ๋„ ์ถœ๋ ฅ์— ์“ฐ๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ์š”์†Œ(์˜ˆ: <text> , <line> , <br> )๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํŒจํ‚ค์ง€๋Š” ์ œ๊ณต๋œ DOM ์š”์†Œ์— ํ„ฐ๋ฏธ๋„์„ ๋ Œ๋”๋งํ•˜๋Š” render(element, HTMLElement) ๋ฉ”์„œ๋“œ๋ฅผ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ธฐ์กด ๊ตฌ์„ฑ ์š”์†Œ render ๋ฉ”์„œ๋“œ์— ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š” <Terminal> ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๊ธฐ์กด React-DOM ํ”„๋กœ์ ํŠธ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๋กœ ๋ฌด์—‡์„ ํ•˜๊ณ  ์‹ถ์€์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์—ฌ์ „ํžˆ ๋ฐ˜์‘ ํ†ตํ•ฉ์„ ์›ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ์—ฌ๊ธฐ์—์„œ ๊ฐ•์กฐ ํ‘œ์‹œํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
https://github.com/alex-saunders/xterm-react-renderer

(์—ฌ์ „ํžˆ WIP์ด์ง€๋งŒ ํ˜„์žฌ๋กœ์„œ๋Š” ๊ฐœ๋… ์ฆ๋ช…์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.)

@alex-saunders ๋ถˆ๋Ÿฌ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ์ฐพ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋งํฌ๊ฐ€ ์žˆ์œผ๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค. ๐Ÿ‘Œ

์•ˆ๋…•. ์ฝ”๋“œ๊ฐ€ ๊ฑฐ์˜ ์—†๊ณ  "์ƒˆ๋กœ์šด" ํ›„ํฌ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ˜์‘ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ „์ž ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด node-pty์™€ ๋‹ค์†Œ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ์‡„๋œ ๋‚ด๋ถ€ ํ”„๋กœ์ ํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ์€ ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์—†์ง€๋งŒ ํ›„ํฌ ๊ธฐ๋ฐ˜ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ƒˆ๋กœ์šด ์‹œ๊ฐ์„ ๊ฐ–๋„๋ก ๋ชจ๋“  ์‚ฌ๋žŒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰