xterm.js๊ฐ React ์ฑ์ ์ฝ๊ฒ ํฌํจํ ์ ์๋๋ก React ๊ตฌ์ฑ ์์๋ฅผ ๋ด๋ณด๋ด๋ฉด ์ ๋ง ์ ์ฉํ ๊ฒ์ ๋๋ค. ๊ธฐ์กด ์ฝ๋๋ฅผ ๋๋ฌ์ผ ๋จ์ํ ๋ํผ์ผ ์ ์์ต๋๋ค.
์ด๊ฒ์ ์ ๋ง ์ ๋ง ํฅ๋ฏธ๋ก์ด ์๋๋ฆฌ์ค์ ๋๋ค. ์ฐ๋ฆฌ๋ 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์ ๋ค์ ๋ฐ์ ํ๊ฒ ๊ฒฐํฉ๋์ด ์์ต๋๋ค. ํ์๋ ๋ด๋ถ ํ๋ก์ ํธ์ด๊ธฐ ๋๋ฌธ์ ์ง๊ธ์ ์ฝ๋๋ฅผ ๊ณต์ ํ ์ ์์ง๋ง ํํฌ ๊ธฐ๋ฐ ์๋ฃจ์ ์ ์ฌ์ฉํ์ฌ ๋ฌธ์ ์ ๋ํด ์๋ก์ด ์๊ฐ์ ๊ฐ๋๋ก ๋ชจ๋ ์ฌ๋์ ๊ถ์ฅํฉ๋๋ค. ๊ทธ๋งํ ๊ฐ์น๊ฐ ์์ต๋๋ค!
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด๊ฒ์ ์ ๋ง ์ ๋ง ํฅ๋ฏธ๋ก์ด ์๋๋ฆฌ์ค์ ๋๋ค. ์ฐ๋ฆฌ๋ xterm.js๊ฐ ์ด๋ฏธ ์ถฉ๋ถํ ๊ธฐ๋ฅ๊ณผ ๋ณต์ก์ฑ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ ํ ๋ ๋ฆฝ์ ์ด๊ณ ๊ฐ๋ฒผ์ด ์ํ๋ก ์ ์งํ๋ ค๊ณ ๋ ธ๋ ฅํฉ๋๋ค.
xtermjs/xterm-react ๋ฆฌํฌ์งํ ๋ฆฌ์ xterm-react npm ๋ชจ๋ ๋ชจ์๋ฅผ ๋ง๋๋ ๊ฒ์ด React ๊ตฌ์ฑ ์์์์ xterm.js๋ฅผ ๋ํํ๋ฉด ์์ ์ ์ํํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ป๊ฒ ๋ค๋ฆฌ๋์?