Electron: DOM์—์„œ ์ œ๊ฑฐ๋œ ์ž…๋ ฅ ์š”์†Œ๋Š” ์‹คํ–‰ ์ทจ์†Œ ์Šคํƒ์ด ๋น„์–ด ์žˆ์„ ๋•Œ๊นŒ์ง€ ^Z๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2015๋…„ 12์›” 03์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: electron/electron

์ตœ์†Œํ•œ์˜ ์žฌํ˜„: https://gist.github.com/DanielDignam/b49084941a2f731501d5

Windows 10์—์„œ ๋…ธ๋“œ 4.1.1, Chrome 45.0.2454.85 ๋ฐ Electron 0.35.2๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒจ๋ถ€๋œ ์•ฑ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ^Z๋Š” ์ฝ˜์†”์— ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์ž…๋ ฅ ์ƒ์ž์— ๋ฌด์–ธ๊ฐ€๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ DOM์—์„œ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ^Z๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋ณด๊ณ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ^Z๋ฅผ ๋‹ค์‹œ ๋ˆ„๋ฅด๊ณ  ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๋‹ค์‹œ ์‹คํ–‰ํ•˜์—ฌ ํ…์ŠคํŠธ ์ƒ์ž์— N ๋ฒˆ ๋ถ™์—ฌ๋„ฃ์œผ๋ฉด ๋ณด๊ณ ๋˜๊ธฐ ์ „์— ^Z์˜ ์ˆ˜๊ฐ€ N+1์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Š” ์ž…๋ ฅ ์ƒ์ž๊ฐ€ ๋” ์ด์ƒ DOM์— ์—†๋”๋ผ๋„ ์—ฌ์ „ํžˆ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์œผ๋ฉฐ Undo ์Šคํƒ์„ ๋น„์šธ ๋•Œ๊นŒ์ง€ ^Z๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ž…๋ ฅ ํ•„๋“œ๊ฐ€ ์‚ฌ์šฉ๋œ ๋‹ค์Œ DOM์—์„œ ์ œ๊ฑฐ๋œ ๊ฒฝ์šฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ทจ์†Œ ์ž‘์—…์ด ^Z์—์„œ ๋ณต์›๋˜์ง€ ์•Š๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‹คํ–‰ ์ทจ์†Œ๋ฅผ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.

์–‘์‹/์ž…๋ ฅ์ด ์—†์„ ๋•Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋‹ค๋ฅธ ์ƒํƒœ๋ฅผ ์ทจ์†Œํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

<!DOCTYPE html>
<html>
<head>
    <title>Hello World!</title>
</head>
<body id='body'>
<h1>Hello World!</h1>
We are using node <script>document.write(process.versions.node)</script>,
Chrome <script>document.write(process.versions.chrome)</script>,
and Electron <script>document.write(process.versions.electron)</script>.
<script>
    function removeInput(event) {
        var i = document.getElementById("foo");
        var b = document.getElementById("body");
        b.removeChild(i);
    }
    const remote = require('electron').remote;
    const Menu = remote.Menu;
    const MenuItem = remote.MenuItem;
    var template = [
        {
            label: 'Edit',
            submenu: [
                {
                    label: 'Undo',
                    accelerator: 'CmdOrCtrl+Z',
                    click: function () {
                        console.log('Undo called');
                    },
                    enabled: true
                }
            ]
        }];
    menu = Menu.buildFromTemplate(template);
    Menu.setApplicationMenu(menu);
</script>
<input id='foo' type='text'/>
<input type='button' onclick='removeInput()'/>
</body>
</html>

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

์ด๊ฒƒ์€ DOM ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ Chromium์˜ ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋ฉ”๋‰ด์˜ ๊ฐ€์†๊ธฐ์— ์˜์กดํ•˜๋Š” ๋Œ€์‹  DOM ์ด๋ฒคํŠธ๋กœ ์ž…๋ ฅ์„ ์ˆ˜๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด Chromium์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํŒŒํ—ค์ณ์•ผ ํ•˜์ง€๋งŒ ๋„ˆ๋ฌด ๋งŽ์€ ์ž‘์—…์ž…๋‹ˆ๋‹ค. Chromium์— ๋ณด๊ณ ํ•˜๋Š” ๊ฒƒ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์žฌ์ƒ์‚ฐํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”๋‰ด ํ•ญ๋ชฉ์„ Chrome์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์•„๋งˆ ์•„๋ฌด๋„ ์กฐ์‚ฌํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์ •๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ฉฐ DOM์˜ ์ฃผ์š” ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋‹ซ์Šต๋‹ˆ๋‹ค.

๋‚˜์ฒ˜๋Ÿผ ์ด ๋ฌธ์ œ๋ฅผ ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌํ•œ ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด: ์—ฌ๊ธฐ ์— Chromium ๋ฒ„๊ทธ ์ถ”์ ๊ธฐ์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์ž‘์„ฑ ๋‹น์‹œ์—๋„ ์—ฌ์ „ํžˆ ์ˆ˜์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ฐ€์†๊ธฐ ์—†์ด ๋ฉ”๋‰ด ํ•ญ๋ชฉ์„ ๋งŒ๋“ค๊ณ  ๋ Œ๋”๋Ÿฌ์—์„œ Ctrl+Z ํ‚ค ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ ๋ฉ”๋‰ด์˜ "์‹คํ–‰ ์ทจ์†Œ" ์˜†์— "Ctrl+Z" ๋‹จ์ถ•ํ‚ค๋ฅผ ํ‘œ์‹œํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

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