Electron: ํ…Œ์ŠคํŠธ์šฉ ํ—ค๋“œ๋ฆฌ์Šค ๋ฒ„์ „

์— ๋งŒ๋“  2014๋…„ 04์›” 09์ผ  ยท  82์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: electron/electron

@zcbenz phantomjs์˜ ๋Œ€์ฒดํ’ˆ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ—ค๋“œ๋ฆฌ์Šค ๋ฒ„์ „์˜ atom-shell์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ž‘์—…์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐ ํ•˜์‹ญ๋‹ˆ๊นŒ ?

phantomjs๋Š” ์˜ค๋Š˜๋‚  ์‹ค์ œ ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ ์  ๋” ๋’ค์ณ์ง€๊ณ  ์žˆ์œผ๋ฉฐ ํ—ค๋“œ๋ฆฌ์Šค ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์‹  ๋ฒ„์ „์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

enhancement

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

NightmareJS ๊ด€๋ จ: ์šฐ๋ฆฌ๋Š” ํ˜„์žฌ AWS Lambda์™€ ๊ฐ™์€ ์„œ๋ฒ„๋ฆฌ์Šค ํ™˜๊ฒฝ์—์„œ๋„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ—ค๋“œ๋ฆฌ์Šค Chrome ๊ธฐ๋ฐ˜์˜ Nightmare ๋ฒ„์ „์„ ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค. ๊ณง @graphcool์—์„œ ์†Œ์Šค๋ฅผ ๊ณต๊ฐœํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ๐Ÿš€

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

์ˆจ๊ฒจ์ง„ ๋ธŒ๋ผ์šฐ์ € ์ฐฝ์„ ์‚ฌ์šฉํ•˜์—ฌ atom-shell์€ ์‹ค์ œ๋กœ phantomjs๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ phantomjs ํ™ˆํŽ˜์ด์ง€์˜ ์˜ˆ์ œ๋Š” atom-shell๋กœ ๋ฒˆ์—ญ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

BrowserWindow = require('browser-window');

console.log('Loading a web page');
var page = new BrowserWindow({show: false});
var url = 'http://www.phantomjs.org/';
page.on('loading-state-changed', (event, isLoading) {
  if (!isLoading)
    //Page is loaded!
    require('app').exit();
});
page.loadUrl(url);

๋ฌผ๋ก  ์ž๋™ํ™” ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด API๋ฅผ ๋” ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ ์ผํ•œ ๋ฌธ์ œ๋Š” ๊ฐ€์ƒ ๋ฒ„ํผ์— ๊ทธ๋ฆฌ๋Š” ๋Œ€์‹  atom-shell์ด โ€‹โ€‹์‹ค์ œ๋กœ ํŽ˜์ด์ง€๋ฅผ ์‹ค์ œ ์ฐฝ์— ๊ทธ๋ฆฌ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๊ทธ๋ž˜ํ”ฝ ํ™˜๊ฒฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Window ๋ฐ OS X์—์„œ๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์ง€๋งŒ Linux์—์„œ๋Š” xvfb ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ

๋‚˜๋Š” ์ตœ๊ทผ์— ์ด๊ฒƒ์œผ๋กœ ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค(Ubuntu ์„œ๋ฒ„์—์„œ Xvfb ์‚ฌ์šฉ). ๋‚ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ํ…œํ”Œ๋ฆฟ ํŽ˜์ด์ง€์˜ ์Šคํฌ๋ฆฐ์ƒท์„ ์บก์ฒ˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ๋‚˜๋Š” ์„œ๋ฒ„(m3-large)์—์„œ Xvfb๋ฅผ ํ†ตํ•œ atom-shell์ด โ€‹โ€‹๋‚ด ๋กœ์ปฌ Macbook pro๋ณด๋‹ค ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ๊ฐ–๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด osx์—์„œ๋„ Xvfb๋ฅผ ํ†ตํ•ด ์ž‘๋™ํ•˜๋Š” atom-shell์ด โ€‹โ€‹ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

osx๋Š” Xvfb์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ๋ถ€๋ถ„์€ ์‰ฝ์Šต๋‹ˆ๋‹ค. osx์—์„œ Xvfb ๋””์Šคํ”Œ๋ ˆ์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด atom-shell์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? Linux์—์„œ์™€ ๊ฐ™์ด ํ‘œ์ค€ DISPLAY env ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ libchromiumcontent๋Š” Darwin์—์„œ ์‹คํ–‰ํ•  ๋•Œ X11์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅผ ๊ฒƒ์ž…๋‹ˆ๊นŒ?

Xvfb๋Š” X11 ํ™˜๊ฒฝ์šฉ์œผ๋กœ ์ž‘์„ฑ๋œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. OS X์—์„œ atom-shell์€ ํ‘œ์‹œ๋ฅผ ์œ„ํ•ด Cocoa๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Xvfb์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜, ์ข€ ๊ฐ™์ด ๋„ฃ์–ด. ์•„๋งˆ๋„ ๋Œ€์‹  X11์šฉ ์†Œ์Šค์—์„œ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์•„๋‹ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@zcbenz new BrowserWindow({show: false}); ๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ OS X์˜ ํ˜„์žฌ ํ•ด์ƒ๋„๋ณด๋‹ค ํฐ BrowserWindow ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ํ˜„์žฌ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

@FWeinb ์œ„์˜ ํŠน์ • ํ‹ฐ์ผ“์„ ๋ณ„๋„๋กœ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋งŒ๋“  #475

์‹ค์ œ๋กœ Chromium์—์„œ ๊ธฐ๋ณธ ์œ„์ ฏ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ ๋Š” ํŽ˜์ด์ง€๋ฅผ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ธ€์„ ๋‹ซ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ €๋Š” ๊ทธ๋“ค์ด ๊ทธ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ž๋™ ํ…Œ์ŠคํŠธ์˜ ๊ฒฝ์šฐ Selenium์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

CEF ํ”„๋กœ์ ํŠธ๋Š” ์˜คํ”„์Šคํฌ๋ฆฐ ๋ Œ๋”๋ง์„ ์ง€์›ํ•˜๋ฏ€๋กœ ์ฐฝ ๋Œ€์‹  ๋ฒ„ํผ์— ํ™”๋ฉด์„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Linux์šฉ X ์„œ๋ฒ„์™€ ๊ด€๋ จํ•˜์—ฌ Ozone์ด๋ผ๋Š” ๋Œ€์ƒ์„ ์ถ”๊ฐ€ํ•˜์—ฌ X ์„œ๋ฒ„ ์—†์ด๋„ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค( ์—ฌ๊ธฐ์—์„œ ๋…ผ์˜

@etiktin ์ •๋ณด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๊ฒƒ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ธฐ์กด ๊ตฌํ˜„์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋‹ค์‹œ ์—ฝ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด์— ๋Œ€ํ•œ ์ง€์›์„ ์ •๋ง๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ตœ๊ทผ์— Nightmare ์—์„œ Phantom์„ Electron์œผ๋กœ ๊ต์ฒดํ–ˆ๊ณ  ์ง€๊ธˆ๊นŒ์ง€ ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€๋งŒ Linux์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ž‘๋™ํ•˜๋ ค๋ฉด ์ง€๊ธˆ ํ•ด์•ผ ํ•  ์ผ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://github.com/segmentio/nightmare/issues/224#issuecomment -141575361

๋…๋ฆฝ ์‹คํ–‰ํ˜• ๋ฐ์Šคํฌํ†ฑ Electron ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋ณ€ํ™˜๋  ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ค‘ ํ•˜๋‚˜์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ํ–‰๋™์„ ์ž๋™ํ™”ํ•˜๋Š” ์ž‘์—…์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ํšŒ์‚ฌ๊ฐ€ ์ด๋Ÿฌํ•œ ์ด๋™์„ ๊ฒฐ์ •ํ•˜๊ธฐ ์ „์— ํฌ๋กฌ ์›น ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€ ๊ฐœ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  CSS ์„ ํƒ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ„ํŠผ/๋“œ๋กญ๋‹ค์šด/ํ…์ŠคํŠธ ์ƒ์ž๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์›น ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. Electron ์…ธ๋กœ ๋ž˜ํ•‘๋œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ? ํšŒ์‚ฌ๋Š” ํŠน์ • ๊ธฐ๋Šฅ์„ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”๋‰ด ๋ชจ์Œ ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ๊ณ„ํš์ด๋ฉฐ JavaScript ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ/ํŽธ์ง‘/๋„์›€๋ง๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธ ๋ฉ”๋‰ด ๋ชจ์Œ ์˜ต์…˜์— ์•ก์„ธ์Šคํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์˜ˆ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

https://github.com/segmentio/nightmare/issues/224#issuecomment -141575361๋Š” @matthewmueller์˜ Linux์—์„œ ์ž‘ํ’ˆ์„ ๋‹ˆํŽซ์„ ๋ณด์ธ๋‹ค : +1 :

SuSE์—์„œ ํ—ค๋“œ๋ฆฌ์Šค ํ…Œ์ŠคํŠธ๋ฅผ ๋ฐ›์€ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ํŠนํžˆ SLES?

@fritx SlimerJS์— ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜์ง€๋งŒ ํ—ค๋“œ๋ฆฌ์Šค ๋ชจ๋“œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

@fritx ๊ทธ๊ฒƒ์ด @zcbenz ๊ฐ€ ๋งํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Xvfb๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. CEF3์™€ Chromium Content Shell์€ ํ˜„์žฌ Xlib์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜ค์กด ์™„๋ฃŒ์™€ ํ•จ๊ป˜: https://www.chromium.org/developers/design-documents/ozone
๋‚ฎ์€ ์ˆ˜์ค€์˜ I/O๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ Chromium ์ž์ฒด์— ๋งˆ์Šคํ„ฐ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. https://code.google.com/p/chromium/issues/detail?id=546953

์ด๊ฑด ์žฌ๋ฏธ ์žˆ๋„ค:

๋‚ ์งœ: 2015๋…„ 12์›” 2์ผ ์ˆ˜์š”์ผ 15:35:21

[headless] headless/public/์˜ ์ดˆ๊ธฐ ์Šค์ผˆ๋ ˆํ†ค

ํ–ฅํ›„ Headless API์˜ ๊ฐœ์š”๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

ChromeDriver๋Š” ์ „์ž์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

xvfb๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ํ—ค๋“œ๋ฆฌ์Šค ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” AWS Lambda ์™€ ๊ฐ™์€ ์ƒˆ๋กœ์šด ํ™˜๊ฒฝ์„ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์ž…ํ•˜์‹ญ์‹œ์˜ค!

@Vanuan ๋‚˜์ดํŠธ๋ฉ”์–ด ๋ผ๊ณ  ๋“ค์–ด๋ณด์…จ๋‚˜์š”? ChromeDriver์—์„œ ํŠน๋ณ„ํžˆ ํ•„์š”ํ•œ ๊ฒƒ์ด ์—†๋Š” ๊ฒฝ์šฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Capybara/Selenium ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

+1

์กฐ๊ธˆ ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ํ—ค๋“œ๋ฆฌ์Šค ๋ชจ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? BrowserWindow({show: false})๋กœ ์ด๊ฒƒ์„ ํšจ๊ณผ์ ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋งค์šฐ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์„œ๋ฒ„ ์ธก ์›น ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž‘๋™์‹œํ‚ค๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค: https://github.com/scramjs/scram-markup-engine

์ฃผ์œ„๋ฅผ ๋‘˜๋Ÿฌ๋ณด๋ฉด์„œ ๋‚ด ์ž์‹ ์˜ ์งˆ๋ฌธ์— ๋‹ตํ•œ ๊ฒƒ ๊ฐ™์•„์š”. Electron์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ •๊ตํ•œ ํ—ค๋“œ๋ฆฌ์Šค ๋ชจ๋“œ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Nightmare๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด์ง€๋งŒ ๊ทธ๋ž˜ํ”ฝ ํ™˜๊ฒฝ์ด ์—†๋Š” ํŠน์ • ์‹œ์Šคํ…œ์—์„œ ์ž‘๋™ํ•˜๋ ค๋ฉด ์ผ๋ถ€ ๊ตฌ์„ฑ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Electron์€ BrowserWindow({show: false})๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ—ค๋“œ๋ฆฌ์Šค Linux ์‹œ์Šคํ…œ์—์„œ ๊ทธ๋ž˜ํ”ฝ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๋ ค๋ฉด xvfb๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์‹ค์ œ๋กœ ๊ทธ๋ ‡๊ฒŒ ๋‚˜์˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค). ๋‚ด๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ์ •์ •ํ•˜๊ณ  ์ด ๊ธฐ๋Šฅ์— +1ํ•˜์‹ญ์‹œ์˜ค.

์ƒˆ๋กœ์šด ํฌ๋กฌ ํ—ค๋“œ๋ฆฌ์Šค ํ”„๋กœ์ ํŠธ[1]๋กœ xvfb๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ „์ž ํ—ค๋“œ๋ฆฌ์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ• ๊นŒ์š”?

ํ˜„์žฌ ์ œํ•œ ์‚ฌํ•ญ์ด libchromium์— ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ? ํฌ๋กฌ ์นœ๊ตฌ๋“ค์ด ๊ณ ์ณค๋‚˜์š”?

1: https://chromium.googlesource.com/chromium/src/+/master/headless/README.md

๊ด€๋ จ ํฌ๋Ÿผ์ด ์žˆ์Šต๋‹ˆ๋‹ค: https://groups.google.com/a/chromium.org/forum/#!forum/headless -dev

์ด์— ๋Œ€ํ•œ ์ง„์ „์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ํ…Œ์ŠคํŠธ์— ์ •๋ง ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

segmentio/nightmare ๋Š” ์ด์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ:

const nightmare = Nightmare({
  show: true
});

@amilajack ๋จธ๋ฆฌ ์—†์ด ๊ฐ„๋‹จํ•œ Mocha ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ Nightmare๋Š” 20ํŒŒ์šด๋“œ ํฐ ๋ง์น˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์€ ๋ชป์„ ๋ฐ•๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค(์ฝ๊ธฐ: ์—„์ฒญ๋‚œ ๊ณผ์ž‰). ๊ธฐ๋ณธ ํƒ์ƒ‰ ๋ฐ ์ž…๋ ฅ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ HTML ๋ฐ PDF ํŒŒ์ผ์„ ๋””์Šคํฌ์— ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์Šคํฌ๋ฆฐ์ƒท์„ ์ฐ์„ ์ˆ˜ ์žˆ๋Š” ๋ธŒ๋ผ์šฐ์ € ์ž๋™ํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํฌํ•จ๋œ ๋ณธ๊ฒฉ์ ์ธ ๋ฐฐํ„ฐ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ •ํ™•ํžˆ 0%๋Š” ๊ฐ„๋‹จํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@isiahmeadows @mcolyer ๋Š” ๋Œ€์ฒดํ’ˆ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ—ค๋“œ๋ฆฌ์Šค ๋ฒ„์ „์˜ atom-shell์„ ์›ํ•œ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. Electron์€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์˜ˆ, ํ•˜์ง€๋งŒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์„คํƒ•์ด ์™œ ํ•„์š”ํ•œ๊ฐ€์š”? (๋‚˜๋Š” ๋ชจ๋“  ์„คํƒ•์„ ์–ธ๊ธ‰ํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ก ์ ์œผ๋กœ ๋ฐ”๋‹๋ผ ๋…ธ๋“œ + OpenGL ๋ฐ”์ธ๋”ฉ์œผ๋กœ Electron์„ ์™„์ „ํžˆ ๋‹ค์‹œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).

ํ—ค๋“œ๋ฆฌ์Šค ๋ธŒ๋ผ์šฐ์ €์˜ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” CLI์—์„œ ๋ธŒ๋ผ์šฐ์ € ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฏธ mocha-phantomjs ๋ฐ Karma๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ Firefox/Chrome์„ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ Travis์—์„œ ํ—ค๋“œ๋ฆฌ์Šค X ์„œ๋ฒ„์ธ xvfb๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ ์ค‘์ธ X ์„œ๋ฒ„๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— Electron์„ ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ PhantomJS ๋ฐ SlimerJS์™€ ๊ฐ™์€ ํ—ค๋“œ๋ฆฌ์Šค ๋ธŒ๋ผ์šฐ์ €๋Š” ' X ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Electron + Nightmare๋Š” ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ์ข…๋ฅ˜์˜ X ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ(xvfb์ผ์ง€๋ผ๋„) ์ด ๋ฌธ์ œ๋Š” ํ•ด๋‹น ์ข…์†์„ฑ์„ ์ œ๊ฑฐํ•˜๋„๋ก ์š”์ฒญํ•˜์ง€๋งŒ Chromium ์ž์ฒด๊ฐ€ ํ—ค๋“œ๋ฆฌ์Šค๊ฐ€ ๋˜๊ณ  ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ „ํŒŒ๋  ๋•Œ๊นŒ์ง€๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค. libchromiumcontent .

ํ—ค๋“œ๋ฆฌ์Šค๋Š” ์ด์ œ Chrome 59์— ์žˆ์Šต๋‹ˆ๋‹ค. https://www.chromestatus.com/features/5678767817097216

@sindresorhus @zcbenz Chromium์˜ ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์—ฌ๊ธฐ์— ์–ด๋–ค ์ฐจ์ด๋ฅผ ๋งŒ๋“ค๊นŒ์š”?

Electron์€ ์ด๋ฏธ ํ›Œ๋ฅญํ•˜๊ณ  ํ—ค๋“œ๋ฆฌ์Šค ๋ชจ๋“œ๋Š” ๋” ๋‚˜์•„์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค!

(Electron ๊ธฐ๋ฐ˜์˜ Nightmare ์—๋„

๋žŒ๋‹ค ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š” ๋žŒ๋‹ค์—์„œ Xvfb ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค... https://github.com/nisaacson/aws-lambda-xvfb

Electron์ด ์–ธ์ œ ์ง„์ •ํ•œ ํ—ค๋“œ๋ฆฌ์Šค๋ฅผ ์ง€์›ํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ๋ง์”€์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์ด ์ผ์–ด๋‚  ๊ฒƒ์ด๋ผ๊ณ  ๋ฏฟ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? xvfb๋ฅผ ์‚ญ์ œํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@lastmjs xvfb๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ AWS Lambda์—์„œ Electron์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ?

@schickling ์ฐธ์กฐ https://github.com/nisaacson/aws-lambda-xvfb

@MrSaints์˜ ์˜๊ฒฌ์„ ๋ณด๋‚ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. nightmare ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ ๋ช‡ ์‹œ๊ฐ„ ๋™์•ˆ ์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์„ ์œ„ํ•ด ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

@zcbenz FYI chrome 59๋Š” ํ—ค๋“œ๋ฆฌ์Šค ๋ชจ๋“œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. https://www.chromestatus.com/features/5678767817097216

@schickling ์ฐธ์กฐ https://github.com/JohannesHoppe/nightmare-html2pdf -- Xvfb๋ฅผ ์‚ฌ์šฉํ•œ ๋„์ปค์˜ ์•…๋ชฝ

@JohannesHoppe ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. Xvfb๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Docker์—์„œ Nightmare๋ฅผ ์ž‘๋™ํ•˜๊ฒŒ ํ–ˆ์ง€๋งŒ ๋Œ€์‹  AWS Lambda์—์„œ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” Nightmare์—์„œ Electron์„ ํ—ค๋“œ๋ฆฌ์Šค ํฌ๋กฌ์œผ๋กœ ๊ต์ฒดํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค: https://github.com/segmentio/nightmare/issues/1092

@schickling ์ด๊ฒƒ์„ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค: https://github.com/dimkir/nightmare-lambda-tutorial

์ด๊ฒƒ์ด ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋‹ต๋ณ€ ๋œ ๊ฒฝ์šฐ ์‚ฌ๊ณผํ•˜์ง€๋งŒ ๊ตฌ์ฒด์ ์ธ ๋‹ต๋ณ€์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์œ„์˜ +1 ๋Œ“๊ธ€ ์—์„œ @sandstrom ์€ ์ด์ œ Chrome 59์—์„œ ํ—ค๋“œ๋ฆฌ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ง€์ ํ–ˆ์Šต๋‹ˆ๋‹ค.

Electron์˜ ๊ฐœ๋ฐœ ๋กœ๋“œ๋งต์—์„œ Chrome์˜ ํ—ค๋“œ๋ฆฌ์Šค ํ”Œ๋ž˜๊ทธ์— ๋Œ€ํ•œ ์ง€์›์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ์ง„์ •ํ•œ ํ—ค๋“œ๋ฆฌ์Šค ์‚ฌ์šฉ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Electron์—๊ฒŒ ์ž ์žฌ์ ์œผ๋กœ ํฐ "์Šน๋ฆฌ"์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@rinogo๋‹˜ ๋ง์”€์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ „์ž์— ๋Œ€ํ•œ ํ—ค๋“œ๋ฆฌ์Šค ์˜ต์…˜์ด ์žˆ์œผ๋ฉด ๊ฐ€์ƒ ๋””์Šคํ”Œ๋ ˆ์ด๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ณ  ์‹œ์Šคํ…œ์„ ์ธ์ˆ˜ํ•˜์ง€ ์•Š๊ณ ๋„ ci ์‹œ์Šคํ…œ ๋ฐ ๊ฐœ๋ฐœ ์ƒ์ž์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ ์ „์ž์— ๋Œ€ํ•œ ๋กœ๋“œ๋งต์„ ์•Œ๊ณ  ๊ธฐ์—ฌํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

Xvfb๋Š” ์งœ์ฆ๋‚˜์ง€๋งŒ Electron์ด ์ง„์ •ํ•œ ํ—ค๋“œ๋ฆฌ์Šค๋ฅผ ์ง€์›ํ•œ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค!

xvfb-์•„๋งˆ๋„ ๊ทธ ๋™์•ˆ

Google์—์„œ ์ƒˆ ๊ธฐ์‚ฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. https://developers.google.com/web/updates/2017/04/headless-chrome

๊ณง ์ถœ์‹œ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

Chrome 59๊ฐ€ ํ˜„์žฌ ์•ˆ์ •์ ์ธ ์ฑ„๋„์— ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Electron์—์„œ ํ—ค๋“œ๋ฆฌ์Šค๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ œ๋ฐœ, ์ด๊ฒƒ์„ ํ˜„์‹ค๋กœ ๋งŒ๋“œ์‹ญ์‹œ์˜ค. ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  NightmareJS๊ฐ€ ํ—ค๋“œ๋ฆฌ์Šค Electron์„ ์‹คํ–‰ํ•˜๋„๋ก ํ•˜๋ฉด ๊ถ๊ทน์ ์œผ๋กœ ๋ชจ๋“  Selenium ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ 3๋ถ„์˜ 1 ์ •๋„๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.*

* ๊ณผ์žฅ๋˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@aendrew ์ €๋Š” NightmareJS๊ฐ€ Electron(์ฒ ํ•™: _ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๋ฐ์Šคํฌํƒ‘ ์•ฑ ๋นŒ๋“œ _)์„ ํ—ค๋“œ๋ฆฌ์Šค๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ณด๋‹ค ์˜คํžˆ๋ ค CDP ๋ฐฑ์—”๋“œ๋ฅผ ์‚ฌ์šฉ/ํฌํ•จํ•˜๋„๋ก _์žฌ์ž‘์„ฑ_ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฐธ์กฐ: https://github.com/cyrus-and/chrome-remote-interface

@MrSaints ๋‚˜๋Š” ๊ด€๋ฆฌ์ž๋ฅผ ๋ถ€๋Ÿฌ์›Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ _๊ทธ๋ƒฅ_ 1๋…„ ์ „์— PhantomJS์—์„œ ๋ณ€ํ™˜์„ ์™„๋ฃŒํ–ˆ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  Nightmare์˜ ๋ธŒ๋ผ์šฐ์ € ๋ ˆ์ด์–ด๋ฅผ ํ”Œ๋Ÿฌ๊ทธํ˜•์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ข‹์€ ๋™๊ธฐ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  Electron์ด ๋ฐ์Šคํฌํƒ‘ ์ง€ํ–ฅ์ ์ด๋ผ๋Š” ์ ์€ ์ž˜ ๋ฐ›์•„๋“ค์—ฌ์กŒ์Šต๋‹ˆ๋‹ค.

@aendrew @MrSaints ๋‚ด ๋ฌด์ง€๋ฅผ headless ํ”Œ๋ž˜๊ทธ ์ง€์›)์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์–ด๋ ต์Šต๋‹ˆ๊นŒ? Electron์ด Chromium๊ณผ ์ธํ„ฐํŽ˜์ด์Šค/ํ™•์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. Electron์˜ Chromium์„ ๋ฒ„์ „ 59+๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜์‹ญ์‹œ์˜ค.
  2. headless ๋ช…๋ น์ค„ ํ”Œ๋ž˜๊ทธ/๊ตฌ์„ฑ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  3. ๋‚ด๊ฐ€ ๋ถ„๋ช…ํžˆ ์„ค๋ช…ํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ๊ฒƒ๋“ค. :)

๋‚ด ๋ง์€ headless ์ด์ œ Chromium์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜์—ฌ ํ—ค๋“œ๋ฆฌ์Šค ๋ชจ๋“œ(์˜ˆ: NightmareJS์šฉ)๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋น„๊ต์  ๊ฐ„๋‹จํ•ด ๋ณด์ธ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก , Electron์˜ ๋ฒ”์šฉ ๋ฒ„์ „์€ ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ NightmareJS์™€ ๊ฐ™์€ ๊ฒƒ์„ ์œ„ํ•ด ์„ค๊ณ„๋œ ๋นŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋งค์šฐ ๊ฐ„๋‹จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ฃ ?

์†๋„ ํ–ฅ์ƒ์ด ๋‹น์žฅ ํ•„์š”ํ•˜๋‹ค๋ฉด ๋›ฐ์–ด๋“ค์–ด์„œ ์‹œ๋„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ NightmareJS๋ฅผ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋‹น๋ถ„๊ฐ„์€ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ์ด๋Ÿฌํ•œ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์˜ ์œ ์ง€ ๊ด€๋ฆฌ์ž์˜ ๊ธฐ์—ฌ์™€ ๋…ธ๋ ฅ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! :)

NightmareJS ๊ด€๋ จ: ์šฐ๋ฆฌ๋Š” ํ˜„์žฌ AWS Lambda์™€ ๊ฐ™์€ ์„œ๋ฒ„๋ฆฌ์Šค ํ™˜๊ฒฝ์—์„œ๋„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ—ค๋“œ๋ฆฌ์Šค Chrome ๊ธฐ๋ฐ˜์˜ Nightmare ๋ฒ„์ „์„ ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค. ๊ณง @graphcool์—์„œ ์†Œ์Šค๋ฅผ ๊ณต๊ฐœํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ๐Ÿš€

@schickling ๊ต‰์žฅํ• ๊ฑฐ์•ผ!

ํฌ๋กฌ์˜ --headless ์—์„œ ๋ช…์‹ฌํ•ด์•ผ ํ•  ํ•œ ๊ฐ€์ง€๋Š” ๋ชจ๋“  ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋Œ€ํ•œ ์ง€์›์„ ๋น„ํ™œ์„ฑํ™”ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ”Œ๋ž˜์‹œ(์ „์ž/์•…๋ชฝ์œผ๋กœ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ) ๋˜๋Š” PDF ๋ทฐ์–ด ๋“ฑ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ --headless ๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์œผ๋ฉฐ xvfb๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

AWS Lambda์—์„œ Electron์„ ์‹คํ–‰ํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค...์ œ ์ƒ๊ฐ์—๋Š”

์•„๋ฉ˜ @lastmjs ์•„๋ฉ˜

์ด ์†”๋ฃจ์…˜์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?
https://github.com/dimkir/nightmare-lambda-tutorial

์•„์ง ์‹œ๋„ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ

@xplodedthemes ๋Š”

๋ป”๋ป”ํ•œ ํ”Œ๋Ÿฌ๊ทธ: https://github.com/joelgriffith/navalia. ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ๋“ฑ์„ ์œ„ํ•ด ํ—ค๋“œ๋ฆฌ์Šค Chrome์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ž‘์—… ๋ณ‘๋ ฌํ™”, GraphQL ํ”„๋ŸฐํŠธ ์—”๋“œ ๋“ฑ๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ๋ฉ‹์ง„ ๊ธฐ๋Šฅ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด๋–ค PR/์ด์Šˆ/ํ”ผ๋“œ๋ฐฑ๋„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!

์•ˆ๋…• ๋ชจ๋‘๋“ค! ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ํ•ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค... ๐Ÿ’ค

์šฐ๋ฆฌ๋Š” Chromeless๋ฅผ ์˜คํ”ˆ์†Œ์Šคํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ—ค๋“œ๋ฆฌ์Šค Chrome์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ ๋กœ์ปฌ ๋ฐ AWS Lambda ๋ชจ๋‘์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. API๋Š” NightmareJS์™€ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: https://chromeless.netlify.com

Chromeless๊ฐ€ ๋ฐฉ๊ธˆ Nightmare๋ฅผ ๋Œ€์ฒดํ–ˆ์Šต๋‹ˆ๊นŒ? Chromeless๋Š” Nightmare๋ฅผ ๋”ฐ๋ผ์žก๊ธฐ๊นŒ์ง€ ๊ฐˆ ๊ธธ์ด ๋ฉ‰๋‹ˆ๋‹ค.

๋™์‹œ์— ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Nightmare์˜ ๋Œ€์ฒดํ’ˆ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์งˆ๋ฌธ(์ด ์Šค๋ ˆ๋“œ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ): pdf ๊ธฐ๋Šฅ์„ ์ž‘๋™์‹œํ‚ค๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์—„์ฒญ๋‚œ ๋‘ํ†ต(๋ฐ ๋น„์šฉ)์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์™€, ์ •๋ง ๋†€๋ž๋„ค์š”. ์ž˜ํ–ˆ์–ด ์–˜๋“ค์•„!

@zcbenz ์ด์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์ด ๋‚˜์˜จ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ซ์•„๋„ ๋ ๊นŒ์š”?

์Œ ์ด ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ๋งค์šฐ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค. "ํ•ด๊ฒฐ์ฑ…"์€ ๋ชจ๋‘ ์•…๋ชฝ์—์„œ ์™„์ „ํžˆ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒƒ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

@keithkml์— ์™„์ „ํžˆ ๋™์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์†”๋ฃจ์…˜์€ ๋น„๋ก ์˜๋„๋Š” ์ข‹์•˜์ง€๋งŒ(๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!) ์‹ค์ œ ์†”๋ฃจ์…˜์ด ์ œ๊ณต๋  ๋•Œ๊นŒ์ง€ "๋Œ€์•ˆ"์— ๋” ์ด์ „ ์˜๊ฒฌ ์—์„œ ์ œ๊ธฐํ•œ ์งˆ๋ฌธ์— ๋‹ต๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ์ถฉ๋ถ„ํ•œ ์ „๋ฌธ ์ง€์‹์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? (๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ, ๋‚˜์˜ ๋ฌด์ง€๋ฅผ ์šฉ์„œํ•˜์‹ญ์‹œ์˜ค! :))

๋‚˜๋Š” ์—ฌ์ „ํžˆ ๋Œ€๋‹ต์˜ ์š”์ ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ „์ž ์•ฑ์„ CI์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” NATIVE ํ—ค๋“œ๋ฆฌ์Šค ๋ชจ๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ๋ˆ„๊ฐ€ ๋‚˜์—๊ฒŒ ๋ช…ํ™•ํžˆ ์•Œ๋ ค์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@hitliubo Chrome์—๋Š” --headless ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ์ง€๋งŒ Flash ๋˜๋Š” PDF ๋ฆฌ๋”์™€ ๊ฐ™์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹  ์ด ์ธ ๊ฒฝ์šฐ ๋Œ€๋‹ต์€ ํ˜„์žฌ ๊ธ์ •์  ์ธ ์•„๋‹ˆ์˜ค์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ธŒ๋ผ์šฐ์ € ์ปจํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ•ด๋‹น ํ”Œ๋ž˜๊ทธ(ํ•„์š”ํ•œ ๊ฒฝ์šฐ --disable-gpu ์™€ ํ•จ๊ป˜ - ์ตœ์‹  Chrome ๋ฒ„์ „ IIRC์—์„œ ๋ˆ„๋ฝ๋œ ์˜๋ฏธ๋ฅผ ์ˆ˜์ •ํ•จ)๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๋งŒ์•ฝ ๋‹น์‹ ์ด Nightmare์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ  ๋‹น์‹ ์ด ๋‘ ๋ฒˆ์งธ ๋ฒ”์ฃผ์— ์†ํ•œ๋‹ค๋ฉด, ๋‹น์‹ ์€ ์ด๋ฏธ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๋ฉด ๊ทธ ํ”„๋กœ์ ํŠธ์˜ ๊ฐ๊ฐ์˜ repo์— ์ •๋ง๋กœ ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.)

--headless ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ(๋˜๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ)์—๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • Windows: ๋ชจํ˜ธํ•œ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ ํ•ญ์ƒ ๋ Œ๋”๋งํ•  ์ฐฝ ์ปจํ…์ŠคํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Windows Server 2016์€ ๊ธฐ๋ณธ GUI ์ง€์›์„ ์ค‘๋‹จํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ GUI ์ฐฝ ์ƒ์„ฑ ์„ ์ง€์›ํ•˜๋ฉฐ AFAICT ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค .
  • macOS: ์—ฌ๊ธฐ์—๋Š” ํ•ญ์ƒ GUI๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋ Œ๋”๋งํ•  ์ฐฝ ์ปจํ…์ŠคํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Apple์€ ๊ทธ๋ ‡์ง€ ์•Š์€ ๋ฒ„์ „์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Linux: xvfb๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ์ผ๋ฐ˜์ ์ธ Linux ๋ฐฐํฌํŒ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ—ค๋“œ๋ฆฌ์Šค X ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค. Travis๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ง€์นจ์ด ์žˆ์Šต๋‹ˆ๋‹ค .

@isiahmeadows ์ •๋ณด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰ ์ค‘์ธ ์›น ์•ฑ์ด ์žˆ๊ณ  chrome/firefox๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ—ค๋“œ๋ฆฌ์Šค ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ํ•ญ์ƒ --headless๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ์— ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ Electron ์•ฑ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ œ macOS์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” --headless๋กœ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ด์œ ๋ฅผ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”!

์‚ฌ์‹ค ๋‚˜๋Š” xvfb์˜ ์†”๋ฃจ์…˜์ด ๋„ค์ดํ‹ฐ๋ธŒ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋„ค์ดํ‹ฐ๋ธŒ ํ—ค๋“œ๋ฆฌ์Šค๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•˜๋ฉด ์‹œ๋„ํ•ด ๋ณผ ํ•„์š”๊ฐ€ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ  - ์ด์ œ ํ…Œ์ŠคํŠธ์— ์นดํ”ผ๋ฐ”๋ผ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

Linux ํ”„๋ ˆ์ž„ ๋ฒ„ํผ๋กœ ์ง์ ‘ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ฒŒ์‹œ๋ฌผ์—์„œ ์—ฌ๊ธฐ๋กœ ๋ฆฌ๋””๋ ‰์…˜๋˜์—ˆ์ง€๋งŒ ์ด๊ฒƒ์€ ํ—ค๋“œ๋ฆฌ์Šค ํ…Œ์ŠคํŠธ์— ์ดˆ์ ์„ ๋งž์ถ˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. _real_ ํ”„๋ ˆ์ž„ ๋ฒ„ํผ๋กœ ์ง์ ‘ ๋ Œ๋”๋งํ•˜๋Š” ๊ณผ์ •์ด ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

@quinn ์›ํ•˜๋Š” ๊ฒฝ์šฐ ํ”„๋ ˆ์ž„ ๋ฒ„ํผ์—์„œ X11(Xorg)์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ(์ฐธ์กฐ: https://www.x.org/releases/current/) X ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. doc/man/man4/fbdev.4.xhtml).

_ํŽธ์ง‘ํ•˜๋‹ค:_

์‹ค์ œ๋กœ ์ด๊ฒƒ์„ ์กฐ๊ธˆ ๋” ์‚ดํŽด๋ณด๋ฉด ์˜ค์กด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๊ฒƒ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ( https://github.com/jakwu/ozone-fb )

์˜ค์กด์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„์˜ Linux ๋ฐฐํฌํŒ์—์„œ ์ดํ›„๋กœ ์ „์ž๊ฐ€ ๋ˆ„๋ฝ๋œ ๋˜ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์ธ wayland ์ง€์›์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์˜ค์กด -fb ๋ฐ ๋”ฐ๋ฅด๋ฉด ํ”„๋ ˆ์ž„ ๋ฒ„ํผ๋กœ ๋ Œ๋”๋งํ•˜๋ฉด GPU ๊ฐ€์†์ด ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@trusktr 2๋…„ ๋œ ๋Œ“๊ธ€์ž…๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋‚ด ์˜๊ฒฌ์„ ๊ถŒ์œ„ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ฐ›์•„๋“ค์ด์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค(๊ทธ ์ดํ›„๋กœ ํ™•์ธํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค).

์ „์ž์— headless lib๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  HeadlessShellMain์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹คใ€‚
์šด์˜:

e run  --headless --enable-logging --v=2 --disable-gpu --screenshot  http://192.168.50.206

๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

Running "/home/a/dev0/e9.2.1/src/out/ReleaseSym0/electron --headless --enable-logging --v=2 --disable-gpu --screenshot http://192.168.50.206:8889"
[1028/172650.483932:INFO:cpu_info.cc(53)] Available number of cores: 4
[1028/172650.484061:VERBOSE1:zygote_main_linux.cc(217)] ZygoteMain: initializing 0 fork delegates
[1028/172650.484400:INFO:cpu_info.cc(53)] Available number of cores: 4
[1028/172650.484465:VERBOSE1:zygote_main_linux.cc(217)] ZygoteMain: initializing 0 fork delegates
[1028/172650.493514:VERBOSE1:webrtc_internals.cc(119)] Could not get the download directory.
[1028/172650.494623:VERBOSE1:proxy_config_service_linux.cc(500)] All gsettings tests OK. Will get proxy config from gsettings.
[1028/172650.494764:VERBOSE1:proxy_config_service_linux.cc(1261)] Obtained proxy settings from annotation hash code 11258689
[1028/172650.494873:VERBOSE1:proxy_config_service_linux.cc(500)] All gsettings tests OK. Will get proxy config from gsettings.
[1028/172650.494919:VERBOSE1:proxy_config_service_linux.cc(1261)] Obtained proxy settings from annotation hash code 11258689
[1028/172650.504033:VERBOSE1:sandbox_linux.cc(69)] Activated seccomp-bpf sandbox for process type: renderer.
[1028/172650.505596:VERBOSE2:thread_state.cc(470)] [state:0x556bd75583a0] ScheduleGCIfNeeded
[1028/172650.511468:VERBOSE2:thread_state.cc(470)] [state:0x556bd75583a0] ScheduleGCIfNeeded
[1028/172650.524408:VERBOSE2:thread_state.cc(470)] [state:0x556bd75583a0] ScheduleGCIfNeeded
[1028/172650.524916:VERBOSE2:thread_state.cc(470)] [state:0x556bd75583a0] ScheduleGCIfNeeded
[1028/172650.525173:VERBOSE2:thread_state.cc(470)] [state:0x556bd75583a0] ScheduleGCIfNeeded
[1028/172650.525963:VERBOSE1:sandbox_linux.cc(69)] Activated seccomp-bpf sandbox for process type: gpu-process.
[1028/172650.526373:VERBOSE2:thread_state.cc(470)] [state:0x556bd75583a0] ScheduleGCIfNeeded
[1028/172650.528735:VERBOSE2:thread_state.cc(470)] [state:0x556bd75583a0] ScheduleGCIfNeeded
[1028/172650.531839:VERBOSE2:thread_state.cc(470)] [state:0x556bd75583a0] ScheduleGCIfNeeded
[1028/172650.535051:ERROR:paint_controller.cc(646)] PaintController::FinishCycle() completed
[1028/172650.550076:VERBOSE1:configured_proxy_resolution_service.cc(873)] PAC support disabled because there is no system implementation
[1028/172650.550312:VERBOSE1:configured_proxy_resolution_service.cc(873)] PAC support disabled because there is no system implementation
[1028/172650.550923:VERBOSE1:network_delegate.cc(32)] NetworkDelegate::NotifyBeforeURLRequest: http://192.168.50.206:8889/
[1028/172650.575829:VERBOSE1:url_loader.cc(418)] To buffer: http://192.168.50.206:8889/
[1028/172650.580122:VERBOSE1:v8_context_snapshot.cc(153)] A context is created from snapshot for main world
[1028/172650.587399:VERBOSE1:v8_context_snapshot.cc(153)] A context is created from snapshot for main world
[1028/172650.595294:ERROR:paint_controller.cc(646)] PaintController::FinishCycle() completed
[1028/172650.612295:ERROR:paint_controller.cc(646)] PaintController::FinishCycle() completed
[1028/172650.676553:INFO:headless_shell.cc(620)] Written to file screenshot.png.

ํ—ค๋“œ๋ฆฌ์Šค๊ฐ€ ๊ตฌํ˜„๋˜์—ˆ๋‹ค๋Š” ๋œป์ธ๊ฐ€์š”?

@bigben0123 ํฅ๋ฏธ๋กญ๊ณ  ๋งค์šฐ ํฅ๋ฏธ์ง„์ง„ํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๋ž˜์„œ ํฌ๋กฌ์—์„œ ํ—ค๋“œ๋ฆฌ์Šค ์‰˜์„ ํ†ตํ•ฉํ•˜๋Š” ์ „์ž ๋ฒ„์ „์„ ์ปดํŒŒ์ผ ํ–ˆ์Šต๋‹ˆ๊นŒ?

Linux์—์„œ X๊ฐ€ ์—†๋Š” ํ™˜๊ฒฝ์—์„œ ์ž‘๋™ํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ?

ํฌ๋กฌ์ด ํ—ค๋“œ๋ฆฌ์Šค ๋ชจ๋“œ์—์„œ ์‹คํ–‰๋  ๋•Œ ๋ Œ๋”๋ง ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค๋Š” ํ—ค๋“œ๋ฆฌ์Šค ํ”Œ๋ž˜๊ทธ๋ฅผ ํ†ตํ•ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค(๋ฉ”๋ชจ๋ฆฌ์—์„œ 'ps args'๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค). ์ด๊ฒƒ์ด ๋‹น์‹ ์„ ์œ„ํ•ด ์ผ์–ด๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

(์ด์ƒํ•˜๊ฒŒ๋„ ํ˜„์žฌ ์ „์ž์™€ ํ•จ๊ป˜ ์‹œ์ž‘ํ•˜๋ ค๊ณ  ํ•˜๋ฉด โ€”headless ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋ Œ๋”๋ง ํ”„๋กœ์„ธ์Šค๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋˜์ง€ ์•Š๊ณ  GPU ํ”„๋กœ์„ธ์Šค์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.)

@bigben0123 ํฅ๋ฏธ๋กญ๊ณ  ๋งค์šฐ ํฅ๋ฏธ์ง„์ง„ํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๋ž˜์„œ ํฌ๋กฌ์—์„œ ํ—ค๋“œ๋ฆฌ์Šค ์‰˜์„ ํ†ตํ•ฉํ•˜๋Š” ์ „์ž ๋ฒ„์ „์„ ์ปดํŒŒ์ผ ํ–ˆ์Šต๋‹ˆ๊นŒ?

Linux์—์„œ X๊ฐ€ ์—†๋Š” ํ™˜๊ฒฝ์—์„œ ์ž‘๋™ํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•ด ๋ณด์…จ์Šต๋‹ˆ๊นŒ?

ํฌ๋กฌ์ด ํ—ค๋“œ๋ฆฌ์Šค ๋ชจ๋“œ์—์„œ ์‹คํ–‰๋  ๋•Œ ๋ Œ๋”๋ง ํ•˜์œ„ ํ”„๋กœ์„ธ์Šค๋Š” ํ—ค๋“œ๋ฆฌ์Šค ํ”Œ๋ž˜๊ทธ๋ฅผ ํ†ตํ•ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค(๋ฉ”๋ชจ๋ฆฌ์—์„œ 'ps args'๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค). ์ด๊ฒƒ์ด ๋‹น์‹ ์„ ์œ„ํ•ด ์ผ์–ด๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

(์ด์ƒํ•˜๊ฒŒ๋„ ํ˜„์žฌ ์ „์ž์™€ ํ•จ๊ป˜ ์‹œ์ž‘ํ•˜๋ ค๊ณ  ํ•˜๋ฉด โ€”headless ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋ Œ๋”๋ง ํ”„๋กœ์„ธ์Šค๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋˜์ง€ ์•Š๊ณ  GPU ํ”„๋กœ์„ธ์Šค์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.)

์˜ˆ, ์‚ฌ์šฉ์ž ๋ช…๋ น ๋ชจ๋“œ์—์„œ ์‹œ์ž‘ํ•˜๋Š” ์šฐ๋ถ„ํˆฌ์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
ํ—ค๋“œ๋ฆฌ์Šค ํ†ต๊ณผ:

electron --headless --enable-logging --v=2 --disable-gpu -print-to-pdf http://www.google.com
electron --type=zygote --no-zygote-sandbox --enable-logging --headless --v=2 --headless
electron --type=zygote --enable-logging --headless --v=2 --headless
electron --type=zygote --enable-logging --headless --v=2 --headless
electron --type=gpu-process --field-trial-handle=15536072708541054845,15522400966085077738,131072 --enable-logging --headless --v=2 --headless --gpu-preferences=MAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAQAAAAAAAAAAAAAAAAAAAACAAAAAAAAAA= --use-gl=swiftshader-webgl --override-use-software-gl-for-tests --enable-logging --v=2 --shared-files
electron --type=utility --field-trial-handle=15536072708541054845,15522400966085077738,131072 --lang=en-US --service-sandbox-type=network --enable-logging --use-gl=swiftshader-webgl --v=2 --headless --enable-logging --v=2 --shared-files=v8_snapshot_data:100
electron --type=renderer --allow-pre-commit-input --enable-logging --v=2 --field-trial-handle=15536072708541054845,15522400966085077738,131072 --disable-databases --disable-gpu-compositing --lang=en-US --headless --lang=en-US --num-raster-threads=2 --enable-main-frame-before-activation --renderer-client-id=4 --shared-files=v8_snapshot_data:100
electron --type=broker

@bigben0123 ์–ด๋”˜๊ฐ€์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์–ด๋–ค ์ด์œ ๋กœ ์ „์ž ์ฝ”์–ด๋กœ ๋งŒ๋“ค์ง€ ์•Š๋”๋ผ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ด ์ปค๋ฐ‹์€ chrome headless lib๋ฅผ ์ „์ž์— ๋ณ‘ํ•ฉํ•˜๊ธฐ๋งŒ ํ•˜๊ณ  ํฌ๋กฌ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/bigben0123/electron/commit/b6cad8993d68d39f1732aa6ed5ece0135b9ae0c8

๋‚ด๊ฐ€ ์•„๋Š” ํ•œ, ํฌ๋กฌ๊ณผ ํ—ค๋“œ๋ฆฌ์Šค๋Š” ์ฝ˜ํ…์ธ  ๋ ˆ์ด์–ด ๊ตฌํ˜„์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋‘ ๊ฐœ์˜ ๋ธŒ๋ผ์šฐ์ € ์…ธ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ—ค๋“œ๋ฆฌ์Šค๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด "chrome --headless"๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ํฌ๋กฌ๊ณผ ์•„๋ฌด ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.

ํ—ค๋“œ๋ฆฌ์Šค ๋ชฉํ‘œ ์ค‘ ํ•˜๋‚˜๋Š” "Chromium์˜ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์— ๋Œ€ํ•œ ์นจ์ž… ๋˜๋Š” ํ—ค๋“œ๋ฆฌ์Šค ๊ด€๋ จ ๋ณ€๊ฒฝ(์˜ˆ: #ifdefs)์˜ ์ˆ˜๋ฅผ ์ตœ์†Œํ™”"ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ xvfb๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ์ „์ž๊ฐ€ ํ—ค๋“œ๋ฆฌ์Šค์ธ ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ „์ž๊ฐ€ ํ—ค๋“œ๋ฆฌ์Šค๋ฅผ ์ง€์›ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ „์ž ์•ฑ์„ ์‹คํ–‰ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ํ—ค๋“œ๋ฆฌ์Šค ๋ถ„๊ธฐ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์ „์ž๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด ํ—ค๋“œ๋ฆฌ์Šค ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ „์ž/BUILD.gn์—์„œ ์ข…์†์„ฑ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

      "//ui/events/devices/x11",
      "//ui/events/platform/x11",
      "//ui/gtk"  #all of gkt related

    if (use_x11) {
      deps += [
        "//ui/gfx/x",
        "//ui/gtk:x",
      ]
    }
    configs += [ ":gio_unix" ]
    configs += [ "//build/config/linux:x11" ]

๋‹ค์Œ์œผ๋กœ ๊ต์ฒด:
"//UI/๋””์Šคํ”Œ๋ ˆ์ด",
"//UI/์ด๋ฒคํŠธ/์žฅ์น˜",

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