рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЖрдкрдХреЛ рдмрдВрдбрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрдореА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЗрдПрд╕ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдирд░рдХ рддрдм рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк рдЕрдкрдиреА рд╕рд╛рдЗрдЯ рдпрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдЪреМрдЦрдЯреЗ рдПрдХ рдиреЛрдб рд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ / рдпрд╛ ES5 рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, E2E рдкрд░реАрдХреНрд╖рдг рд▓реЙрдиреНрдЪ рдХрд░рдирд╛ рдЕрдм рдХреЛрдИ рддреБрдЪреНрдЫ рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИ рдФрд░ рдХреЛрдб рдХреЛ рдХрд╡рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрд░рд╛рдВрд╕рдкрд┐рд▓рд┐рдХреЗрд╢рди рдФрд░ рд╕реЛрд░реНрд╕рдореИрдкреНрд╕ рдХреЗ рдЯреИрдореНрдмреЛрд░рд┐рди рдХреЗ рд╕рд╛рде рдиреГрддреНрдп рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред рдЖрдк рдЧрд▓рдд рд╕реНрдерд╛рди рдХреА рдУрд░ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдХрдардкреБрддрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛,
рдФрд░ рдХреИрд╕реЗ рдореИрдВрдиреЗ рдиреЛрдб рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдИрдПрд╕ 6 рдореЙрдбреНрдпреВрд▓ рд▓реЙрдиреНрдЪ рдХрд┐рдП, рдЬрд┐рд╕рдореЗрдВ рдХрд▓реЗрдХреНрдЯрд░реЛрдВ рдХреЗ рдмрд┐рдирд╛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрд░реЛрдд рд░рд╣рд╛ред
рдХреНрдпреЛрдВ рдХрдардкреБрддрд▓реА, рдЖрдк рдкреВрдЫрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВ рдирд╣реАрдВ WebDriver? рдореИрдВрдиреЗ рдЕрднреА рджреЗрдЦрд╛ рдХрд┐ рд▓реЛрдХрдкреНрд░рд┐рдп рдУрдкрди рд╕реЛрд░реНрд╕ WebGL рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдХреЛ рдХрд┐рд╕ рддрд░рд╣ рд╕реЗ рддрдбрд╝рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдирдХреЗ рдкрд╛рд╕ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде 300 рдкреГрд╖реНрда рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрд┐рд╕реА рднреА рдкреНрд░рддрд┐рдмрджреНрдз рдХреЗ рд╕рд╛рде рдЯреВрдЯ рд╕рдХрддрд╛ рд╣реИред рд╡реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рдж рдЙрдирдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдЧрд░ рд╡реЗ рдХреБрдЫ рдЦреЛрд▓рдирд╛ рднреВрд▓ рдЧрдП - рдХреНрд╖рдорд╛ рдХрд░реЗрдВ ┬п\_(уГД)_/┬п
it, рддреЛ рдпрд╣ рдЯреВрдЯ рдЧрдпрд╛ред рдпрджрд┐ рдХрд┐рд╕реА рдиреЗ рдЕрднреА рддрдХ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЫреЛрдЯреЗ рд╕реЗ рдкрд░рд┐рд╡рд╛рдж рдореЗрдВ рдЗрд╕реЗ рдЖрдЬрдорд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдкрд╣рд▓реЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рд╣реЗрдбрд▓реЗрд╕-рдЧреНрд▓ рдХреЛ рдЪрд▓рд╛рдирд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдкреНрд░рдЪрд▓рд┐рдд рд╣реИред рдиреЛрдб-рдЬреАрдПрд▓рдПрд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА WebGL2 рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рджреБрд░реНрд▓рдн рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдирд╣реАрдВред WebDriver? рдореИрдВрдиреЗ рднреА рдЗрд╕рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреАред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрджрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ, рддреЛ рдореБрдЭреЗ рдЕрдЬрдЧрд░ / рд╕реА # / рдЬрд╛рд╡рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╡реАрдирддрдо рдиреЛрдб рдФрд░ рдирд╡реАрдирддрдо рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдЬреЗрдПрд╕ / рдЯреАрдПрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдбрд╝рд╛рди рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдирд╡реАрдирддрдо рдХрд▓реНрдкрдирд╛ рд╕реЗ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред
ES6 рдореЙрдбреНрдпреВрд▓ рдХреНрдпреЛрдВ рд╣реИрдВ? рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ WebGL рдФрд░ ES6 рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд▓рдЧрднрдЧ рдПрдХ рд╣реА рд╣реИред рдФрд░ рдмрдВрдбрд▓ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рдпрд╛ рдирд╣реАрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рддрдп рдХрд░рдиреЗ рджреЗрдВ, рдЖрдк рдмрд╕ рджреЛрдиреЛрдВ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдирд┐рдХрд▓рддрд╛ рд╣реИ, рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрд░реЛрддрдореИрдк рдмрд╣реБрдд рд╕рд░рд▓рддрд╛ рд╕реЗ рдирд┐рдХрд╛рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдкрд░реАрдХреНрд╖рдг рдиреЛрдб рдпрд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рдЗрд╢рд╛рд░реЛрдВ рдХреЗ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рдХрдардкреБрддрд▓реА рдореЗрдВ рдЪрд▓рд╛рдирд╛, рдХреЛрдб рдХрд╡рд░реЗрдЬ рдХреЗ рд╕рд╛рде E2E рд▓рдЧрднрдЧ рдореБрдлреНрдд рд╣реИред ES6 рдореЗрдВ рд▓рдХреНрд╖реНрдп рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рд▓реЗрдХрд┐рди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╡рд░ рдХреА рдЧрдИ рдПрдХ рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░, рд╕рд╛рдорд╛рдиреНрдп рдЬреЗрдПрд╕ рднреА рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред
рдЗрд╕рд▓рд┐рдП, рдкрд░реНрдпрд╛рдкреНрдд рдкрд░рд┐рдЪрдп, рдореИрдВрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ puppeteer
рдФрд░ puppeteer-to-istanbul
рдХреЛ рд░рдЦрд╛ рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЖрд╡рд░рдг рдХреЛ рд▓рд┐рдЦрд╛ред
рдЬрд┐рд╕реЗ рдХрдорд╛рдВрдб node --experimental-modules --no-warnings ./test/puppeteer.js
рд╕рд╛рде рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред 11+ рдиреЛрдб рдХреЗ рд╕рд╛рде / node --experimental-modules --no-warnings ./test/puppeteer.js
, рдпрд╛ рдиреЛрдб 13.2+ рдкрд░ рдЭрдВрдбреЗ рдХреЗ рдмрд┐рдирд╛ рднреАред рдмреЗрд╢рдХ рдЖрдк require
, рддреЛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ... рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВ? рдпрд╣ рдЖрдо рддреМрд░ рдкрд░ рдПрдХ рдмреИрдХрдПрдВрдб рд╣реИ, рдпрд╣рд╛рдБ рдЧреНрд░рд╛рд╣рдХ рд╕рд╣рд╛рдпрддрд╛ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ! package.json
рд╕реЗ рдирд┐рдореНрди рдХреЛрдб рд╣рдореЗрдВ рдХрдВрд╕реЛрд▓ рдФрд░ рд╕реАрдЖрдИ рдХреНрд▓рд╛рдЙрдб рдореЗрдВ HEADLESS рдбрд╛рдЙрдирд▓реЛрдб рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдпрджрд┐ рдЙрдирдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред рдЯреНрд░реИрд╡ / рд╕рд░реНрдХрд▓-рд╕реАрдЖрдИ рдореЗрдВ, рд╕рдВрднрд╡рддрдГ рд▓рд┐рдирдХреНрд╕ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЖрдк рдЗрд╕ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред concurrently
рдПрдХ рдХрдВрд╕реЛрд▓ рдореЗрдВ рджреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЦреЛрд▓рддрд╛ рд╣реИред
// package.json { //bla-bla... "type": "module", // this line indicates that we are using es6 modules "scripts": { "test": "node --experimental-modules --no-warnings ./test/puppeteer.js", "server": "http-server -c-1 -p 1234", "not-bad-cmd--dude": "concurrently -k -s first \"npm:test\" \"npm:server\"", "ci": "HEADLESS=true concurrently -k -s first \"npm:test\" \"npm:server\"", } }
рд╕реНрдерд╛рдиреАрдп рдорд╢реАрди рдкрд░, npm run server
рдХрдорд╛рдВрдб рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, http npm run server
рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдФрд░ npm run test
рдкрд░ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдВрдбреЛ, рдХреНрд░реЛрдо рд╡рд┐рдВрдбреЛ рдореЗрдВ npm run test
рдХрдардкреБрддрд▓реА npm run test
ред рдореВрд▓ рд░реВрдк рд╕реЗ рдЖрдк рд╕рднреА рдХреЛ рдХрдардкреБрддрд▓реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ, рдбрд┐рд╡рд╛рдЗрд╕ рдПрдореБрд▓реЗрд╢рди, рдПрдбрдорд┐рди рдПрд░рд┐рдпрд╛ рдЖрджрд┐ рдкрд░ рдЖрдЧреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рдкрд░ рд╣реИрдВ ред рд╡реИрд╕реЗ, puppeteer
рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде, рдЖрдкрдиреЗ node_modules
рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдХреНрд░реЛрдо рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЕрдЧрд░ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕реЗ node_modules
puppeteer-core
рдпрд╛ puppeteer-firefox
рд╕рд╛рде рдмрджрд▓реЗрдВред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдореЗрдВ рдирд┐: рд╢реБрд▓реНрдХ рдЬреЗрдПрд╕ / рд╕реАрдПрд╕рдПрд╕ рдХреЛрдб рдХрд╡рд░реЗрдЬ рдорд┐рд▓рд╛ рд╣реИ рдЬреЛ рдХрд┐ .nyc_output рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИ, рдЬрдм рддрдХ рд╣рдо рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ рд╕реНрддрд░ рдкрд░ рд╣рдо рдЗрд╕реЗ рдардВрдбрд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдпрд╣ рдЧрд░реНрдо рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреБрдЫ рд╣реИ, рддреЛ рдпрд╣ рд╡рд╣рд╛рдВ рд╣реИ рдФрд░ рдЖрдВрдХрдбрд╝реЗ рд╣реИрдВ рдЯреЗрд╕реНрдЯ рдХрд╡рд░реЗрдЬ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рддреИрдпрд╛рд░ рд╣реИред

рдЕрдм рд╣рдо рд╕реНрд╡рдпрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ, рдпрд╣ рдЪреБрдирдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдореИрдВ рдЕрдкрдиреЗ рдЫреЛрдЯреЗ рд╕реЗ рдкрд░рд┐рд╡рд╛рдж рдореЗрдВ рдИ 2 рдИ рдХрд╣рд╛рдВ рдЪрд▓рд╛рдКрдВрдЧрд╛, рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЧреНрд░рд╛рдл рдореЗрдВ рдЖрдпрд╛, рдЬрд┐рд╕рдиреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд░реВрдкрд░реЗрдЦрд╛ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рддреБрд▓рдирд╛ рдХреАред рд╢рд╛рдпрдж, рд░рдирдЯрд╛рдЗрдо рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдХреБрдЫ рдЬреЗрд╕реНрдЯ рдиреЗ рдЙрдиреНрд╣реЗрдВ 10 рдЧреБрдирд╛ рдзреАрдорд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рддреЛ рд╕рд╡рд╛рд▓ "рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ" рдЙрдарддрд╛ рд╣реИред HTML рдЪрдпрди рдореЗрдВ рдореБрдЦреНрдп рдЪрдпрди рдорд╛рдирджрдВрдб <script type="module" src="./test.js"></script>
рд╕рд╛рде es6 рдЪрд▓ рд░рд╣рд╛ рдерд╛ред рдЪреВрдВрдХрд┐ рдореЗрд░реЗ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдордп, рдиреЛрдб рдиреЗ рдЕрднреА рддрдХ ES6 рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ (рдХрд▓ рдЗрд╕реЗ 12.3 рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рдЭрдВрдбреЗ рд╣рдЯрд╛ рджрд┐рдП рдЧрдП рдереЗ)ред рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдпрджрд┐ рдЖрдк рдЯреАрдПрд╕ рдпрд╛ рдИрдПрд╕ 6+ рдХреЗ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд╕рд╛рде рд░реВрдкрд░реЗрдЦрд╛ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╢реБрд░реВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЖрдк рд╢рд╛рдпрдж рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдореЛрдЪрд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдкреГрд╖реНрда рдкрд░ рдЕрдзрд┐рдХ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдШреЛрд╖рд┐рдд рд╡рд░реНрдЧ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЖрдк рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рдзрд╛рд╡рдХ рдХрд╛ рдирд╛рдо рдпрд╣рд╛рдВ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдЬрд╝реЛрд░рд╛ TAP рдкреНрд░рд╛рд░реВрдк рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ TAP рдЦрд╛рдиреЗ рд╡рд╛рд▓реЛрдВ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рдЪрд┐рдбрд╝рд┐рдпрд╛рдШрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред рдЗрд╕рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрднрд┐рдХрд░реНрдордХ рд╣реИрдВ, рдпрд╣ async рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдЬреЛ рдиреЛрдб рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдмрд┐рдирд╛ рд╢реБрджреНрдз ES6 рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдореБрдЭреЗ рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╕рд▓реА рд╣реАрд░рд╛ рд▓рдЧ рд░рд╣рд╛ рдерд╛ред
рдирддреАрдЬрддрди, рдореБрдЭреЗ рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдорд┐рд▓реЗ рдЬреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдФрд░ рдиреЛрдб рджреЛрдиреЛрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЬрд╝реЛрд░рд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдЖрджреЗрд╢реЛрдВ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдФрд░ рд╕рдореВрд╣реЛрдВ рдкрд░ рд╡реНрдпрд╛рдкрдХ рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВред
рд╡рд┐рдзрд╛рдирд╕рднрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рдХрдВрд╕реЛрд▓ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдПрдХ рд╕рдорд╛рди рд╕реНрдирд┐рдлрд░ рдмрдирд╛рдирд╛ рдерд╛ред рдирдВрдЧреЗ рдХрдВрд╕реЛрд▓ рдмрд╣реБрдд рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИ, рдореИрд░рд╛рдерди рдХрд╛ рдорд╛рд░реНрдЧрджрд░реНрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреАрдПрдкреА рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдХрд╣реАрдВ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдордЬреЗрджрд╛рд░ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо рдСрдирд▓рд╛рдЗрди рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реАрдЖрдИ рдореЗрдВ рдареАрдХ рдпрд╣реА рдХреЛрдб рдХрд┐рд╕реА рднреА рдХрдорд┐рдЯ рдкрд░ рдЪрд▓рддрд╛ рд╣реИред
<!DOCTYPE html> <html lang="en"> <head> </head> <body> <script> const addSniffer = (spyTarget) => function() { spyTarget.apply(window.console, arguments); sniffer([...arguments]); } window.console.log = addSniffer(window.console.log); window.console.error = addSniffer(window.console.error); let screen = document.getElementById('screen'); function sniffer(string) { let screen = document.getElementById("screen"); string.forEach(line => { let div = document.createElement("div"); let text = document.createTextNode(line); div.appendChild(text) screen.appendChild(div); }); } </script> <script type="module" src="./test.js"></script> </body> </html>
рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рдирд╣реАрдВ рд╣реИ, рддреИрдпрд╛рд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде, рдЖрдк рдЕрдкрдбреЗрдЯ рдХреА рд╢реБрджреНрдзрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЕрдкрдиреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдСрдЯреЛ рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрдорд┐рдд / рдЧреНрд░реАрдирдХреАрдкрд░ / рдирд┐рд░реНрднрд░рдмреЛрдЯ рдЬреИрд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдСрдЯреЛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдЯреНрд░реИрд╡рд┐рд╕ / рдЬреАрдереБрдм-рд╕реА / рд╕рд░реНрдХрд▓-рд╕реАрдЖрдИ рдиреЗ рдПрдирдкреАрдПрдо рдкреИрдХреЗрдЬреЛрдВ рдХрд╛ рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рд╣реЛрдЧрд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд╡реАрдиреАрдХрд░рдг рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╡рд┐рдиреНрдпрд╛рд╕ рд░рд╡рд┐рд╡рд╛рд░ рдХреЛ рдСрдЯреЛ рдХрдорд┐рдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ
{ "automerge": true, "automergeType": "branch", "bumpVersion": "patch", "schedule": ["on sunday"], "ignorePaths": [".circleci"] }
рдФрд░ рдЯреНрд░реИрд╡рд┐рд╕, рдЬрдм рдЖрдкрдиреЗ рдЦреБрдж рд╕рдВрд╕реНрдХрд░рдг рдпрд╛ рдХреБрдЫ рдмреЙрдЯ рдЙрдард╛рдпрд╛, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреИрдХреЗрдЬ рдХреЛ рдПрдирдкреАрдПрдо рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, travis-ci.org
рдкрд░ рдПрдХ рдЦрд╛рддрд╛ travis-ci.org
, рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдмрддрд╛рдП рдЕрдиреБрд╕рд╛рд░ f2a рдХреЛ рд╕рдХреНрд╖рдо рдХрд░реЗрдВ , рджреЛ рдЧреБрдкреНрдд рдХреБрдВрдЬреА $NPM_EMAIL
рдФрд░ $NPM_TOKEN
, рдФрд░ рдПрдХ рд╕рдорд╛рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрдирд╛рдПрдВред
language: node_js node_js: '12' script: - npm run ci deploy: provider: npm edge: true email: $NPM_EMAIL api_key: $NPM_TOKEN on: branch: master
рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдпрд╣ рдХрд┐рд╕реА рддрд░рд╣ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдЧрд┐рддреБрдм рд╕реЗ рд╕реВрдЪрдирд╛рдУрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рддрд░рд╣ рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдореЗрдВ рдПрдХ рднреЗрджреНрдпрддрд╛ рджрд┐рдЦрд╛рдИ рджреА: рдбреА