<p>25 ๊ณต์—ฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค</p>

์— ๋งŒ๋“  2020๋…„ 01์›” 24์ผ  ยท  119์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: facebook/jest

๐Ÿ’ฅ ํšŒ๊ท€ ๋ณด๊ณ ์„œ

์šฐ๋ฆฌ๋Š” jest๋ฅผ 24์—์„œ 25๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ๊ณ  ์  ํ‚จ์Šค์—์„œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๊ฐ€ 5๋ถ„ 23์ดˆ์—์„œ 11๋ถ„์ด ๋„˜๊ฒŒ ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์—…๊ทธ๋ ˆ์ด๋“œ์—์„œ ๋ช‡ ๊ฐ€์ง€ ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ๋งŒ ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” -u ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์‹ฌ๊ฐํ•œ ํšŒ๊ท€ imo์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•˜๋„๋ก ๋„์™€์ฃผ์„ธ์š”. ํ•ญ์ƒ ์ตœ์‹  ๋ฒ„์ „์„ ์‹คํ–‰ํ•˜๋„๋ก CI์˜ ์บ์‹œ๋ฅผ ์ง€์›๋‹ˆ๋‹ค.

ํšŒ๊ท€๊ฐ€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•œ ์„ค๋ช….
์‹คํ–‰ ์‹œ๊ฐ„์ด 5:23์—์„œ 11:00์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ์ž‘์—… ๋ฒ„์ „

24.8.0
๋ฒ„์ „๊นŒ์ง€ ์ž‘์—…:
24.8.0
๋ฒ„์ „์—์„œ ์ž‘๋™ ์ค‘์ง€:
25.1.0

์žฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๋™์ž‘์„ ์žฌํ˜„ํ•˜๋Š” ๋‹จ๊ณ„:

์˜ˆ์ƒ๋˜๋Š” ํ–‰๋™

์˜ˆ์ƒํ–ˆ๋˜ ์ผ์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•œ ์„ค๋ช….

repl ๋˜๋Š” repo์— ๋Œ€ํ•œ ๋งํฌ(๋งค์šฐ ๊ถŒ์žฅ๋จ)

repl.it ๋ฐ๋ชจ ๋˜๋Š” GitHub์˜ ์ตœ์†Œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜์„ธ์š”.

์žฌ์ƒ์‚ฐ ๋งํฌ๊ฐ€ ์—†๋Š” ๋ฌธ์ œ๋Š” ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

npx envinfo --preset jest

์—ฌ๊ธฐ์— ๊ฒฐ๊ณผ๋ฅผ ๋ถ™์—ฌ๋„ฃ์Šต๋‹ˆ๋‹ค.

  System:
    OS: macOS Mojave 10.14.6
    CPU: (12) x64 Intel(R) Core(TM) i9-8950HK CPU @ 2.90GHz
  Binaries:
    Node: 10.16.0 - ~/.nvm/versions/node/v10.16.0/bin/node
    Yarn: 1.19.0 - ~/.nvm/versions/node/v10.16.0/bin/yarn
    npm: 6.13.6 - ~/.nvm/versions/node/v10.16.0/bin/npm
Regression Needs Repro

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

@SimenB 24.9์™€ 25.1 ์‚ฌ์ด์˜ ์„ฑ๋Šฅ ํšŒ๊ท€๊ฐ€ ๋„์ž…๋œ ์œ„์น˜๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด git bisect ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. 24.9์—์„œ 26.1๊นŒ์ง€ ์ˆ˜์ • ์—†์ด ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ์˜ˆ์œ ํ…Œ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

๋น„ํ™œ์„ฑํ™”๋œ ์บ์‹œ์™€ js ํ•˜์œ„ ์ง‘ํ•ฉ์˜ ์„ธ ๋ฒˆ ์‹คํ–‰(์–ธ์  ๊ฐ€ ์•ˆ์ „์„ ์œ„ํ•ด)์˜ ๋ˆ„์  ๋Ÿฐํƒ€์ž„์„ ๋น„๊ตํ–ˆ์Šต๋‹ˆ๋‹ค. ๋” ํŠน๋ณ„ํžˆ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์€ ๋…ธ๋“œ 10.19์—์„œ ( yarn run jest --no-cache tests/js/ )์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ 10์ด 24.9์˜ ๊ถŒ์žฅ ๋ฒ„์ „์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ:

24.9.0-dev 3cdbd556948b4974b2cc23178977eb159d343df8 151.84s <- Good
25.1.0-dev 5dcc48075f22d581864f381f20bc8b257d2a73cd 223.29s <- Bad
24.9.0-dev bf6109591365a2b71c7b642fa33ed06d3db6cb26 122.58s
24.9.0-dev 77c3ceedfd61ddc841e11fec7b76e540924d3e60 120.42s
24.9.0-dev 30e08e9ae7d7d78f40df757c2ec4b49357285eda 221.28s
24.9.0-dev ad5377333daf6716af3465bba39f86b7db485e2b 222.33s
24.9.0-dev 8ddadfca76eb3fb979df81033d3d0ff564c415d6 120.32s
24.9.0-dev 966f22f2a08d9ac9300b6964ab91c4e75dba4761 120.46s
24.9.0-dev b9084101189639524863e15ef7557ea6bc6704b9 119.87s
24.9.0-dev 1d8245d77d47b4198d51e55da87893d7dfe1a759 129.93s

ad5377333daf6716af3465bba39f86b7db485e2b is the first bad commit
commit ad5377333daf6716af3465bba39f86b7db485e2b
Author: Simen Bekkhus <[email protected]>
Date:   Mon Dec 2 23:20:16 2019 +0100

    feat: add support for `compileFunction` allowing us to avoid the module wrapper (#9252)

compileFunction ๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋Œ€์ฒด๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ad5377333daf6716af3465bba39f86b7db485e2b์—์„œ compileFunction ๋ถ„๊ธฐ๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๋ณต์›ํ–ˆ์Šต๋‹ˆ๋‹ค.

26.1์„ ๋ณด๋ฉด ์ฝ”๋“œ๊ฐ€ ์•ฝ๊ฐ„ ์ด๋™ํ–ˆ์ง€๋งŒ compileFunction ๋ฐ ๋Œ€์ฒด๊ฐ€ ์—ฌ์ „ํžˆ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ:

26.1.0-dev 817d8b6aca845dd4fcfd7f8316293e69f3a116c5 242.99s <- with compileFunction
26.1.0-dev 817d8b6aca845dd4fcfd7f8316293e69f3a116c5 151.61s <- without compileFunction

์ฆ‰, compileFunction ๋ถ„๊ธฐ( patch )๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด 26.1์ด 24.9์˜ ๋Ÿฐํƒ€์ž„์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹ˆ๋ผ๊ณ  ํ™•์‹ ํ•˜์ง€๋งŒ ์ ์–ด๋„ ์šฐ๋ฆฌ๋Š” ํ•จ๊ป˜ ์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

ํ‡ด๋ณดํ•ด์„œ ๋ฏธ์•ˆํ•˜์ง€๋งŒ

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์•„๋ฌด๊ฒƒ๋„ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ 24์—์„œ 25๋กœ ๊ฐ€๋Š” ์„ฑ๋Šฅ์˜ 10-40% _improvement_์—์„œ ๋“ค์—ˆ๋˜ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ณณ์—์„œ ์„ฑ๋Šฅ ํ‡ดํ–‰์— ๋Œ€ํ•ด ์ฒ˜์Œ ๋“ค์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์ข…๋ฅ˜์˜ ์žฌ์ƒ์‚ฐ์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์žˆ๋Š” ๊ทธ๋Œ€๋กœ๋Š” ์ „ํ˜€ ์‹คํ–‰์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด ๋ณต์ œ ์ผ€์ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์‹œ๊ฐ„์„ ํ• ์• ํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ํ•ด์ฃผ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ข‹์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋Š๋ฆฐ ํ…Œ์ŠคํŠธ 10๊ฐœ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ ๋‹ค์Œ 24 ๋Œ€ 25๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋™์•ˆ CI์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์บ์‹œ๋ฅผ ์ง€์šฐ๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋ฌด์—‡์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๊นŒ? ํ•ด? ํ•˜์ง€๋งˆ?

๊ตฌ์„ฑ, ํŠนํžˆ transforms ๋ฐ ์„ค์ • ํŒŒ์ผ๋„ ๊ด€๋ จ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CI์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์บ์‹œ๋ฅผ ์ง€์šฐ๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๊ถŒ์žฅํ•˜๋Š” ์‚ฌํ•ญ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๊ฑฐ์ง“ ๋ถ€์ • ๋˜๋Š” ๊ธ์ •์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ ๋ถ€์‹คํ•œ ๊ฒƒ์ด ์—†๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์ƒ๊ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์บ์‹œ๋ฅผ ์ง€์šฐ์ง€ _ํ•˜์ง€_ ์•Š๋Š” ๊ฒƒ์ด ํ…Œ์ŠคํŠธ ๋Ÿฐํƒ€์ž„์— ํฐ ์ฐจ์ด๋ฅผ ์ค๋‹ˆ๊นŒ?

์บ์‹œ๋ฅผ ์ง€์šด ํ›„ ์‹คํ–‰ํ•˜๋ฉด ์ƒ๋‹นํžˆ ๋Š๋ ค์ง€๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํŒ์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์กฐ์‚ฌํ•˜๊ณ  ์žฌํ˜„์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

FWIW, ๋‚˜๋Š” ๋˜ํ•œ v25๊ฐ€ v24์™€ ๋™๋“ฑํ•˜๊ฑฐ๋‚˜ ์•ฝ๊ฐ„ ๋Š๋ฆฌ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๊ฑฐ์˜ 10-40% ๊ฐœ์„ ์„ ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์–ธ๊ธ‰๋œ ๋Œ€๋กœ jest 24์— ๋น„ํ•ด ์ƒ๋‹นํ•œ ์†๋„ ํ–ฅ์ƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. https://github.com/facebook/jest/issues/7811#issuecomment -577057189

์œ„์˜ ๋‚ด์šฉ์€ osx์—์„œ ํ…Œ์ŠคํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ •ํ™•ํžˆ ๋™์ผํ•œ ์„ค์ •์ด CentOS๋ฅผ ์‹คํ–‰ํ•˜๋Š” CI์—์„œ ํ›จ์”ฌ ๋” ๋Š๋ฆฌ๊ฒŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

Linux ๊ด€๋ จ ๋ฌธ์ œ? ์บ์‹œ ํŒŒ์ผ์„ ์ž‘์„ฑํ•  ๋•Œ I/O ๊ด€๋ จ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์„ ๋ฐฐ์ œํ•˜๊ธฐ ์œ„ํ•ด ์บ์‹œ ์ƒ์„ฑ์„ ์™„์ „ํžˆ ๋Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ์— ๋ฒ”์ธ์„ ์ฐพ์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ --collectCoverage ํ”Œ๋ž˜๊ทธ์ž…๋‹ˆ๋‹ค. Jest 24์™€ 25 ๋ชจ๋‘์— ๋Œ€ํ•ด ์ œ๊ฑฐ๋˜๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ 25 ๋ฏธ๋งŒ์—์„œ ์•ฝ 2๋ฐฐ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ํ™œ์„ฑํ™”๋˜๋ฉด 25 ๋ฏธ๋งŒ์˜ ํ…Œ์ŠคํŠธ๋Š” 24 ๋ฏธ๋งŒ์˜ ๋™์ผํ•œ ํ…Œ์ŠคํŠธ๋ณด๋‹ค ๊ฑฐ์˜ 4๋ฐฐ ๋Š๋ฆฝ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ OSX์™€ CentOS์—์„œ ๋ชจ๋‘ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด์ „ ์˜๊ฒฌ๊ณผ ๋‹ฌ๋ฆฌ Linux ๊ด€๋ จ ๋ฌธ์ œ๋Š” ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํฅ๋ฏธ๋กœ์šด! ์šฐ๋ฆฌ๋Š” ์ด์Šคํƒ„๋ถˆ์„ v3๋กœ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ฑฐ๊ธฐ์— ๋ฌด์–ธ๊ฐ€๊ฐ€ ํ‡ด๋ณดํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. v8 ์ฝ”๋“œ ์ ์šฉ ๋ฒ”์œ„์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ–ˆ์œผ๋ฏ€๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•  ๋•Œ ๋ฆฌํŒฉํ† ๋ง์„ ์—‰๋ง์œผ๋กœ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„ค! ์ œ๊ฐ€ ๋ณธ ๊ฒƒ๊ณผ๋„ ์ผ๋งฅ์ƒํ†ตํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” 2๋ฐฐ ๋Š๋ฆฐ CI์—์„œ ์ ์šฉ ๋ฒ”์œ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  cov ์—†์ด ๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•˜๋ฉด ๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค. @SimenB ์ด์ „ ์ด์Šคํƒ„๋ถˆ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์„ฑ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ? :)

@csvan ์ด ์–ด์จŒ๋“  ๋นŒ๋“œํ•˜๊ธฐ ์ „์— ์‚ญ์ œํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ๋ฒ”์ธ์ด๋ผ๋ฉด CI์—์„œ ์บ์‹œ ์ƒ์„ฑ์„ ๋„๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ด๋ผ๊ณ  ๋งํ•œ ๊ฒƒ์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ์žฌํ˜„ํ•  ์ˆ˜ ์—†๋‹ค - ๋‚ด๊ฐ€ ํ…Œ์ŠคํŠธํ•œ repos๋Š” v24์™€ v25 ์‚ฌ์ด์— --coverage ๊ฑฐ์˜ ๋™์ผํ•œ ์„ฑ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ jest 24์™€ jest 25๊ฐ€ ์žˆ๋Š” ์ €์žฅ์†Œ๋ฅผ ํ•จ๊ป˜ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‘˜ ์‚ฌ์ด๋ฅผ ์ „ํ™˜ํ•˜๋ฉด ์ฐจ์ด๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๊นŒ?

์ปค๋ฒ„๋ฆฌ์ง€๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋œ ์ƒํƒœ๋กœ CI ๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ–ˆ๋Š”๋ฐ @csvan ์ด ๋ญ”๊ฐ€๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋Š” ์ ์šฉ ๋ฒ”์œ„๊ฐ€ ๊บผ์ง„ ์ƒํƒœ์—์„œ 4:00์— ์‹คํ–‰๋˜๊ณ  ์ ์šฉ ๋ฒ”์œ„๊ฐ€ ์ผœ์ง„ ์ƒํƒœ์—์„œ 11๋ถ„์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ ์ฃผ๋ง์— ์–ด๋Š ์‹œ์ ์—์„œ ์žฌํ˜„์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋นŒ๋“œ ์—์ด์ „ํŠธ์˜ exinfo:

00:03:31.992   System:
00:03:31.992     OS: Linux 3.10 CentOS Linux 7 (Core)
00:03:31.992     CPU: (8) x64 Intel Core Processor (Skylake, IBRS)
00:03:31.992   Binaries:
00:03:31.992     Node: 10.16.0 - ~/workspace/grocery-electrode/tools/nix_64/nodejs-10.16.0/bin/node
00:03:31.992     npm: 6.9.0 - ~/workspace/grocery-electrode/tools/nix_64/npm-6.9.0/node_modules/.bin/npm
00:03:31.993   npmPackages:
00:03:31.993     jest: 25.1.0 => 25.1.0 

๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. Jest 25๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ์ ์šฉ ๋ฒ”์œ„๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ…Œ์ŠคํŠธ ์†๋„๊ฐ€ ๋Š๋ ค์กŒ์Šต๋‹ˆ๋‹ค(Jest 24์˜ 166 ๋Œ€ Jest 25์˜ 381). Jest 25์—์„œ ๊ฒ€์‚ฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋งŽ์€ ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
 1: 0x10003d041 node::Abort() [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 2: 0x10003d24b node::OnFatalError(char const*, char const*) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 3: 0x1001b8e25 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 4: 0x100586d82 v8::internal::Heap::FatalProcessOutOfMemory(char const*) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 5: 0x100589855 v8::internal::Heap::CheckIneffectiveMarkCompact(unsigned long, double) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 6: 0x1005856ff v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 7: 0x1005838d4 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 8: 0x10059016c v8::internal::Heap::AllocateRawWithLigthRetry(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 9: 0x1005901ef v8::internal::Heap::AllocateRawWithRetryOrFail(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
10: 0x10055fb34 v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationSpace) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
11: 0x1007e7e14 v8::internal::Runtime_AllocateInNewSpace(int, v8::internal::Object**, v8::internal::Isolate*) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
12: 0xb9c575dbe3d 
13: 0xb9c57ab091a 
14: 0xb9c579e7d65 
15: 0xb9c579ebaf3 

<--- Last few GCs --->

[733:0x102804000]    84639 ms: Mark-sweep 1335.2 (1449.6) -> 1325.4 (1452.1) MB, 1443.2 / 0.0 ms  (average mu = 0.135, current mu = 0.076) allocation failure scavenge might not succeed
[733:0x102804000]    85872 ms: Mark-sweep 1338.3 (1452.1) -> 1327.8 (1455.1) MB, 1159.4 / 0.0 ms  (average mu = 0.101, current mu = 0.059) allocation failure scavenge might not succeed


<--- JS stacktrace --->

Jest 24๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

๋˜ํ•œ Jest 25๋Š” ํ•ด๋‹น ๊ตฌ์„ฑ์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”ํ•œ ํŒŒ์ผ์—์„œ ์ ์šฉ ๋ฒ”์œ„๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— collectCoverageFrom ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. glob ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ์ง€์›์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

JS ์ถ”์ ์ด ์ „ํ˜€ ์—†์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์ด ์–ด๋””์—์„œ ์ฃฝ์—ˆ๋Š”์ง€ ๋ณด๋Š” ๊ฒƒ์€ ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ Jest 25๊ฐ€ ํ•ด๋‹น ๊ตฌ์„ฑ์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”ํ•œ ํŒŒ์ผ์—์„œ ์ ์šฉ ๋ฒ”์œ„๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— collectCoverageFrom์„ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. glob ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ์ง€์›์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

Micromatch 4๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ๋Š”๋ฐ ๋ญ”๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜๋„์ ์œผ๋กœ ๋ณ€๊ฒฝํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์žฌ์ƒ์‚ฐ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

JS ์ถ”์ ์ด ์ „ํ˜€ ์—†์Šต๋‹ˆ๊นŒ?

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ธ์‡„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

==== JS stack trace =========================================

    0: ExitFrame [pc: 0x521cca5be3d]
Security context: 0x0ebfa799e6e9 <JSObject>
    1: _clearMemoizedQueries [0xebf2a5aba99] [/Users/evhaus/Git/zenhub/client/node_modules/jest-environment-jsdom/node_modules/jsdom/lib/jsdom/living/nodes/Node-impl.js:~208] [pc=0x521cd0d9a4e](this=0x0ebf5bee2aa9 <EventTargetImpl map = 0xebf7963d039>)
    2: _clearMemoizedQueries [0xebf2a5aba99] [/Users/evhaus/Git/zenhub/client/node_modules/jest-environment-...

ํŽธ์ง‘ : ์‚ฌ์‹ค, ์ ์šฉ ๋ฒ”์œ„๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ์—๋„ ํž™ ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

Micromatch 4๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ๋Š”๋ฐ ๋ญ”๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜๋„์ ์œผ๋กœ ๋ณ€๊ฒฝํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์žฌ์ƒ์‚ฐ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ•  ๊ฒƒ์ด๋‹ค.

๋‹ค์‹œ ๋ผ์–ด๋“ญ๋‹ˆ๋‹ค. ์ ์šฉ ๋ฒ”์œ„๋Š” ํ™•์‹คํžˆ ๋Š๋ฆฌ๊ณ  ๊ฐ€์งœ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ OSX์˜ ํƒ€์ด๋ฐ์ž…๋‹ˆ๋‹ค.

46.69
41.77
45.06

v24 coverage
78.60
75.79
80.38

v25
45.93
52.49
53.36

v25 circus
61.27
52.08

v25 coverage
310.98
227.15
153.81

CI(ํŠธ๋ผ๋น„์Šค)์˜ ํƒ€์ด๋ฐ.

v24 coverage -w 4
101.634s

v25 coverage -w 4
178.306s

@milesj v25 ์„œ์ปค์Šค๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€์š”?

๋” ๋นจ๋ผ์•ผ ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ๋ณธ ๊ฒƒ๊ณผ๋Š” ์ „ํ˜€ ๋‹ค๋ฅธ ์ƒˆ๋กœ์šด ์ฃผ์ž๋ผ๊ณ  ๋†๋‹ด์„ ๋˜์ง‘๋‹ˆ๋‹ค. https://www.npmjs.com/package/jest-circus

@EvHaus JSDOM์˜ Traces๋Š” ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค(๋ฌผ๋ก  ์™„์ „ํžˆ ์šฐ์—ฐ์˜ ์ผ์น˜์ผ ์ˆ˜๋„ ์žˆ์Œ). jest-environment-jsdom@24 ํ•˜๊ณ  ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” 11์—์„œ 15๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ ํ–ˆ์œผ๋ฏ€๋กœ ๊ฑฐ๊ธฐ์— ๋ฌด์–ธ๊ฐ€๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กฑ์ƒท์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋ˆ„๊ฐ€ ์•Œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@SimenB ๋‚ด package.json ์—์„œ jest-environment-jsdom ๋ฅผ <24.0.0 ๋กœ ๋กค๋ฐฑํ•˜๋Š” ๊ฒƒ์€ ํ™•์‹คํžˆ ์˜ํ–ฅ์„ ๋ฏธ์ณค์Šต๋‹ˆ๋‹ค. heap out of memory ์˜ค๋ฅ˜๊ฐ€ ์‚ฌ๋ผ์ง€๊ณ  Jest๊ฐ€ ๋ฌธ์ œ ์—†์ด ์‹คํ–‰์„ ์™„๋ฃŒํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํฅ๋ฏธ๋กœ์šด! ์‹œ๊ฐ„๋˜์‹œ๋ฉด ํ…Œ์ŠคํŠธ ํ•ด๋ณด๋ฉด ์ข‹์„๋“ฏ

๋˜๋Š” jsdom ํ•˜๊ณ  ์ด๋“ฑ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด์ผ ํ• ๊ฒŒ, ํ•˜์ง€๋งŒ ๋‚œ ์•„์ง ์ข‹์€ ์žฌ์ƒ์‚ฐ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์•„

๋‹ค์Œ ํ…Œ์ŠคํŠธ์˜ ๊ฒฝ์šฐ ์ ์šฉ ๋ฒ”์œ„๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • [email protected] ์™€ ํ•จ๊ป˜

    • ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ 143์ดˆ

    • ๋ฌธ์ œ ์—†์Œ

  • [email protected] ์™€ ํ•จ๊ป˜

    • ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ 154์ดˆ

    • ๋ฌธ์ œ ์—†์Œ

  • [email protected] ์™€ ํ•จ๊ป˜

    • ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ 228์ดˆ

    • ๐Ÿšจ๋งŽ์€ JavaScript heap out of memory ์˜ค๋ฅ˜

์Šคํƒ ์ถ”์ 

๋‹ค์Œ์€ jest-environment-jsdom-fourteen ์‹คํ–‰์˜ ์Šคํƒ ์ถ”์ ์ž…๋‹ˆ๋‹ค.

==== JS stack trace =========================================

    0: ExitFrame [pc: 0x20deef6dbe3d]
Security context: 0x36ee8219e6e9 <JSObject>
    1: _modified [0x36ee35982ec1] [/Users/evhaus/Git/zenhub/client/node_modules/jest-environment-jsdom-fourteen/node_modules/jsdom/lib/jsdom/living/nodes/Node-impl.js:~189] [pc=0x20deefba6433](this=0x36eef3246e99 <EventTargetImpl map = 0x36ee99264ee9>)
    2: _insert [0x36eeb41f1e41] [/Users/evhaus/Git/zenhub/client/node_modules/jest-environment-jsdom-fourte...
    0: ExitFrame [pc: 0x2aa5df5be3d]
Security context: 0x116a8d49e6e9 <JSObject>
    1: _clearMemoizedQueries [0x116a365133d1] [/Users/evhaus/Git/zenhub/client/node_modules/jest-environment-jsdom-fourteen/node_modules/jsdom/lib/jsdom/living/nodes/Node-impl.js:~208] [pc=0x2aa5dfe7dae](this=0x116a8f16cd11 <EventTargetImpl map = 0x116ae7cc9b61>)
    2: _clearMemoizedQueries [0x116a365133d1] [/Users/evhaus/Git/zenhub/client/node_modules/jest-...

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
 1: 0x10003d041 node::Abort() [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 2: 0x10003d24b node::OnFatalError(char const*, char const*) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 3: 0x1001b8e25 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 4: 0x100586d82 v8::internal::Heap::FatalProcessOutOfMemory(char const*) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 5: 0x100589855 v8::internal::Heap::CheckIneffectiveMarkCompact(unsigned long, double) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 6: 0x1005856ff v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 7: 0x1005838d4 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 8: 0x10059016c v8::internal::Heap::AllocateRawWithLigthRetry(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 9: 0x1005901ef v8::internal::Heap::AllocateRawWithRetryOrFail(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
10: 0x10055fb34 v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationSpace) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
11: 0x1007e7e14 v8::internal::Runtime_AllocateInNewSpace(int, v8::internal::Object**, v8::internal::Isolate*) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
12: 0x20deef6dbe3d 
13: 0x20deefba6433 
    0: ExitFrame [pc: 0xb8909f5be3d]
Security context: 0x09e628d9e6e9 <JSObject>
    1: childrenIterator [0x9e612e1d581] [/Users/evhaus/Git/zenhub/client/node_modules/symbol-tree/lib/SymbolTree.js:~367] [pc=0xb890a41010e](this=0x09e612e3eb01 <SymbolTree map = 0x9e6a7f56c09>,parent=0x09e685ca27d1 <EventTargetImpl map = 0x9e6061f36f1>,options=0x09e67b6026f1 <undefined>)
    2: arguments adaptor frame: 1->2
    3: _detach [0x9e65c4ae341] [/U...

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
 1: 0x10003d041 node::Abort() [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 2: 0x10003d24b node::OnFatalError(char const*, char const*) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 3: 0x1001b8e25 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 4: 0x100586d82 v8::internal::Heap::FatalProcessOutOfMemory(char const*) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 5: 0x100589855 v8::internal::Heap::CheckIneffectiveMarkCompact(unsigned long, double) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 6: 0x1005856ff v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 7: 0x1005838d4 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 8: 0x10059016c v8::internal::Heap::AllocateRawWithLigthRetry(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 9: 0x1005901ef v8::internal::Heap::AllocateRawWithRetryOrFail(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
10: 0x10055fb34 v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationSpace) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
11: 0x1007e7e14 v8::internal::Runtime_AllocateInNewSpace(int, v8::internal::Object**, v8::internal::Isolate*) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
12: 0x2aa5df5be3d 
    0: ExitFrame [pc: 0x180d6e95be3d]
Security context: 0x02052079e6e9 <JSObject>
    1: _modified [0x205b86c1861] [/Users/evhaus/Git/zenhub/client/node_modules/jest-environment-jsdom-fourteen/node_modules/jsdom/lib/jsdom/living/nodes/Node-impl.js:~189] [pc=0x180d6ede24fa](this=0x0205c8284411 <EventTargetImpl map = 0x205c1ea9769>)
    2: _attrModified [0x205b86ba771] [/Users/evhaus/Git/zenhub/client/node_modules/jest-environment-jsdom-fou...

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
 1: 0x10003d041 node::Abort() [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 2: 0x10003d24b node::OnFatalError(char const*, char const*) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 3: 0x1001b8e25 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 4: 0x100586d82 v8::internal::Heap::FatalProcessOutOfMemory(char const*) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 5: 0x100589855 v8::internal::Heap::CheckIneffectiveMarkCompact(unsigned long, double) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 6: 0x1005856ff v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 7: 0x1005838d4 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 8: 0x10059016c v8::internal::Heap::AllocateRawWithLigthRetry(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 9: 0x1005901ef v8::internal::Heap::AllocateRawWithRetryOrFail(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
10: 0x10055fb34 v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationSpace) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
11: 0x1007e7e14 v8::internal::Runtime_AllocateInNewSpace(int, v8::internal::Object**, v8::internal::Isolate*) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
12: 0xb8909f5be3d 

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

์ด๊ฒƒ์ด ๋„์›€์ด ๋ ์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์šฐ๋ฆฌ ์กฐ์ง์€ Jest 24์—์„œ Jest 25(18๋ถ„์—์„œ 28๋ถ„)๋กœ ์—„์ฒญ๋‚œ ์†๋„ ์ €ํ•˜๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, ์ด๋Š” ์ปค๋ฒ„๋ฆฌ์ง€ ์ˆ˜์ง‘์„ ๋ˆ ํ›„(10๋ถ„๊นŒ์ง€) ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.

@rosasynstylae , ๋‹น์‹ ์˜ ์ฝ”๋“œ์— ๋งŽ์€ ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@benmonro ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€! @SimenB ์ €์žฅ์†Œ์˜ ๋งŽ์€ ์Šค๋ƒ…์ƒท์ด ์ด ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

์Šค๋ƒ…์ƒท์ด ์—†๋Š” ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ณดํ—˜์„ ์ˆ˜์ง‘ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 24 -> 25์—์„œ ์ƒ๋‹นํ•œ ์†๋„ ์ €ํ•˜. 2๊ฐœ์˜ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ. ๋‹ค์–‘ํ•˜์ง€๋งŒ ๊ฐ์†์€ ์ค‘์š”ํ•˜๊ณ  ์ผ๊ด€์ ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ณ€๊ฒฝ ์—†์ด ํ…Œ์ŠคํŠธ๋ฅผ ๊ณ„์†ํ•ด์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ…Œ์ŠคํŠธ๋Š” 24๋ฒˆ์˜ ํ…Œ์ŠคํŠธ๋ณด๋‹ค ํ‰๊ท  10๋ฐฐ ๋” ๋Š๋ฆฝ๋‹ˆ๋‹ค.

24๋กœ ๋‹ค์‹œ ์ „ํ™˜ํ•˜๊ณ  ๋‹ฌ๋ฆฌ๊ธฐ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ–ˆ๋˜ ์†๋„๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ๊ฐ€ ์—†๋Š” 2๊ฐœ์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์–ธ๊ธ‰ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์žˆ๋Š” ๋ชจ๋“  ์˜๊ฒฌ์—์„œ ํ™•์‹คํžˆ ์ปค๋ฒ„๋ฆฌ์ง€๊ฐ€ ๋ฌธ์ œ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ๊ณ  ์•„๋งˆ๋„ ์ด์Šคํƒ„๋ถˆ์˜ ํšŒ๊ท€์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์žˆ๋Š” ๋ชจ๋“  ์˜๊ฒฌ์—์„œ ํ™•์‹คํžˆ ์ปค๋ฒ„๋ฆฌ์ง€๊ฐ€ ๋ฌธ์ œ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ๊ณ  ์•„๋งˆ๋„ ์ด์Šคํƒ„๋ถˆ์˜ ํšŒ๊ท€์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด์Šคํƒ„๋ถˆ์„ ์†๊ฐ€๋ฝ์œผ๋กœ ๊ฐ€๋ฆฌํ‚ฌ ์ •๋„๋กœ ๋น ๋ฅด์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋Š” ์ ์šฉ ๋ฒ”์œ„๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ์—๋„ Jest 25์—์„œ ์ƒ๋‹นํ•œ ์„ฑ๋Šฅ ๋ฐ ์•ˆ์ •์„ฑ ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/facebook/jest/issues/9457#issuecomment -579423330์„ ์ฐธ์กฐ

๋‘ ๊ฐ€์ง€ ๊ฐœ๋ณ„ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1) jest-environment-jsdom-fourteen ๊ด€๋ จ ๋ฌธ์ œ ๋ฐ
2) ์ด์Šคํƒ„๋ถˆ ์ปค๋ฒ„๋ฆฌ์ง€ ๋ฌธ์ œ

micromatch ๋ฅผ ^3.0.0 ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•˜๊ณ  --coverage ์‚ฌ์šฉํ•˜์—ฌ ์—„์ฒญ๋‚œ ์†๋„ ํ–ฅ์ƒ์„ ๋ณด์•˜๊ณ  Jest 24์—์„œ ๋ณด์•˜๋˜ ์„ฑ๋Šฅ์œผ๋กœ ์–ด๋Š ์ •๋„ ๋˜๋Œ์•„๊ฐ”์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๋„ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์—…๋ฐ์ดํŠธ: ๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ --coverage ์—†์ด ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๋„ Jest 24 ์ˆ˜์ค€์˜ ์„ฑ๋Šฅ์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ๋‘ ๋ฐฐ๋Š” ๋Š๋ฆฝ๋‹ˆ๋‹ค :-/

@EvHaus ํ™•์ธ

micromatch ๋ฅผ ^3.0.0 ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•˜๊ณ  --coverage ์‚ฌ์šฉํ•˜์—ฌ ์—„์ฒญ๋‚œ ์†๋„ ํ–ฅ์ƒ์„ ๋ณด์•˜๊ณ  Jest 24์—์„œ ๋ณด์•˜๋˜ ์„ฑ๋Šฅ์œผ๋กœ ์–ด๋Š ์ •๋„ ๋˜๋Œ์•„๊ฐ”์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๋„ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์—…๋ฐ์ดํŠธ: ๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ --coverage ์—†์ด ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๋„ Jest 24 ์ˆ˜์ค€์˜ ์„ฑ๋Šฅ์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ๋‘ ๋ฐฐ๋Š” ๋Š๋ฆฝ๋‹ˆ๋‹ค :-/

์„ธ์ƒ์—... ๋‚ด๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋Š” ํ•œ ์ด์Šคํƒ„๋ถˆ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ๋งˆ์ดํฌ๋กœ๋งค์น˜์— ์˜์กดํ•˜๋ฏ€๋กœ ๊ทธ๊ฒƒ์ด ์ ์šฉ ๋ฒ”์œ„์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์ด์œ ๋Š” ์ €๋ฅผ ๋„˜์–ด์„  ๊ฒƒ์ž…๋‹ˆ๋‹ค ๐Ÿ™

์ „์ฒด ๋งˆ์ดํฌ๋กœ๋งค์น˜ ์„ฑ๋Šฅ์ด ๋‹ค์†Œ ํ„ฐ๋ฌด๋‹ˆ์—†๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ปค๋ฒ„๋ฆฌ์ง€ v3๋Š” v4๋ณด๋‹ค ๋น ๋ฅด๋ฉฐ v4๊ฐ€ ์—†์œผ๋ฉด v3๋ณด๋‹ค ๋น ๋ฆ…๋‹ˆ๋‹ค. ๐Ÿ˜‚

@SimenB ๋„ค, ํ™•์ธ์„ ์œ„ํ•ด CI๋„ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์™ธ์—๋Š” ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Œ

  "resolutions": {
    "micromatch": "^3.0.0"
  }

package.json ์€ --coverage ์‚ฌ์šฉํ•  ๋•Œ ์‹คํ–‰ ์‹œ๊ฐ„์„ 6๋ถ„ ๋‹จ์ถ•ํ•˜์—ฌ Jest 24์—์„œ ๋ณธ ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๋™์ผํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ณผ ์ˆ˜์žˆ๋Š” ํ•œ ์ด์Šคํƒ„๋ถˆ์—์„œ๋Š” ๋งˆ์ดํฌ๋กœ ๋งค์น˜์— ์˜์กดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ๊ณผ ๊ด€๋ จ๋  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ์ด ๋Œ“๊ธ€์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

https://github.com/facebook/jest/issues/9464#issuecomment -579733243

์ด์Šคํƒ„๋ถˆ์—์„œ micromatch ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค(๋ฐ”๋ฒจ ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ minimatch ์‚ฌ์šฉ).

์ œ์™ธ๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌด์—‡์„ ๊ณ„์ธกํ•ด์•ผ ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. https://github.com/facebook/jest/blob/28f6da44cc58d41438bddfa9fcd741fd01b02ded/packages/jest-transform/src/shouldInstrument.ts. ๋‹น์‹ ์€ ์•„๋งˆ๋„ ๊ฑฐ๊ธฐ์— ๋ช‡ ๊ฐ€์ง€ ๊ธฐ๋ก์„ ์ถฉ์‹คํ•˜๊ณ  ์šฐ๋ฆฌ๊ฐ€ ๋Œ์•„ ์˜ค๋ฉด ๋ณผ ์ˆ˜ true ์–ด๋””์„œ๋‚˜๊ณผ micromatch@4 ์šฐ๋ฆฌ๊ฐ€ํ•˜์ง€ ์•Š๋Š” micromatch@3 ?

ํ™•์‹คํžˆ jsdom์— ๋Œ€ํ•œ ๋ฌธ์ œ์™€ ์ ์šฉ ๋ฒ”์œ„์— ๋Œ€ํ•œ ๋ฌธ์ œ์˜ ๋‘ ๊ฐ€์ง€ ๊ฐœ๋ณ„ ๋ฌธ์ œ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

micromatch@3 ๋„ ํ•ด๊ฒฐํ•˜๋ฉด CI์—์„œ ์ •์ƒ ์†๋„๋กœ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— Jest + typescript + ๋ฐ˜์‘ ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ  npm-force-resolutions๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ micromatch ^3.0.0์„ ๊ฐ•์ œ ์‹คํ–‰ํ•˜๋ฉด ์—„์ฒญ๋‚œ ์†๋„ ์ €ํ•˜๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š” ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.

๊ตฌ์„ฑ์— ์ปค๋ฒ„๋ฆฌ์ง€ ํŒจํ„ด์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ํ…Œ์ŠคํŠธ ํŒŒ์ผ ํŒจํ„ด์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@EvHaus jsdom ๋ฒ„์ „๊ณผ์˜ ํฐ ์ฐจ์ด์ ์„ ๋ณด์•˜์„ ๋•Œ Micromatch๋„ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•˜์—ฌ ์ฐจ์ด์ ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค๋ฉด ๋งค์šฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋‹น์‹ ์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ผ๋ฉด ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

  collectCoverage: true,
  collectCoverageFrom: [
    'src/**/*.ts',
    'src/**/*.tsx',
    'src/**/*.js',
    'src/**/*.jsx',
    '!src/themes/**',
    '!src/**/Styled*.tsx',
    '!src/**/Styled*.ts',
    '!src/**/*Actions.ts',
    '!src/mainStore.ts',
    '!src/App.tsx',
    '!src/AppView.tsx',
    '!src/AppError.tsx',
    '!src/StyledAppComponents.tsx',
    '!src/index.tsx',
    'src/utility/redux/*.ts',
    '!src/testingUtils/*',
    '!src/**/index.ts',
    '!docs/**/**',
  ],

์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ๊ทธ๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์šฐ๋ฆฌ์˜ ๊ธธ์ด/๊ฐ’์ด ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@Ancient123 ๋„ค

๋ถ€์ • ํŒจํ„ด์— ๋Œ€ํ•œ Micromatch ํšŒ๊ท€์™€ ๊ด€๋ จ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ ํ•ด์š”!

์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์กฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ „์ฒด ๋งˆ์ดํฌ๋กœ๋งค์น˜ ์„ฑ๋Šฅ์ด ์•ฝ๊ฐ„ ํ„ฐ๋ฌด๋‹ˆ์—†๊ฒŒ ๋˜์–ด๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์„ฑ๋Šฅ์ €ํ•˜ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๊ธ€๋กœ๋น™์„ ์œ„ํ•œ ์ •๊ทœ ํ‘œํ˜„์‹์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋ณด๊ธฐ๋ณด๋‹ค ํ›จ์”ฌ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋ถ€์ •๊ณผ ํ”Œ๋žซํผ ๊ฐ„์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๋•Œ. ์ง€๊ธˆ ์ด๊ฒƒ์— ๋Œ€ํ•ด ์กฐ์‚ฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@jonschlinkert ๋น„๋‚œํ•˜๋ ค๋Š” ์˜๋„๋Š” ์ „ํ˜€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. Micromatch ๋ฐ ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—

๋„ค! @SimenB๊ฐ€ ๋งํ•œ ๊ฒƒ. โค๏ธ

@EvHaus jsdom ๋ฒ„์ „๊ณผ์˜ ํฐ ์ฐจ์ด์ ์„ ๋ณด์•˜์„ ๋•Œ Micromatch๋„ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•˜์—ฌ ์ฐจ์ด์ ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค๋ฉด ๋งค์šฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด package.json ๋‹ค์Œ์„ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

"resolutions": {
    "micromatch": "^3.0.0"
}

npm install ๋‹ค์‹œ ์‹คํ–‰ํ•œ ๋‹ค์Œ node_modules/jest/micromatch (๋ฒ„์ „ 4์— ์žˆ์Œ)๋ฅผ ์ˆ˜๋™์œผ๋กœ ์‚ญ์ œํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ…Œ์ŠคํŠธ๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ "JavaScript heap out of memory" ์˜ค๋ฅ˜๊ฐ€ ์—ฌ์ „ํžˆ ๋งŽ์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

๋‹ค์šด๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์ œ๋Œ€๋กœ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

resolutions ๋Š” yarn ํ•˜๊ณ  npm ๋Š” ์•„์ง ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค(v7์˜ ๋กœ๋“œ๋งต์— ์žˆ์Šต๋‹ˆ๋‹ค: https://blog.npmjs.org/post/186983646370/npm- cli-๋กœ๋“œ๋งต-์—ฌ๋ฆ„-2019)

@EvHaus npm v7์ด ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ์ด ํŒจํ‚ค์ง€์™€ ํ•จ๊ป˜ npm์˜ ํ•ด์ƒ๋„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: https://www.npmjs.com/package/npm-force-resolutions

์ง€์—ฐ ๋ผ์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. npm-force-resolutions (์˜ฌ๋ฐ”๋ฅธ ์ผ์„ ํ•˜๊ณ  ์žˆ์Œ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ micromatch ๋ฅผ v3์— ๊ณ ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ๋‚ด ํž™ ์˜ค๋ฅ˜๊ฐ€ ์‚ฌ๋ผ์ง€์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ €๋ฅผ ์œ„ํ•ด ์—ฌ๊ธฐ์— ์–ธ๊ธ‰๋œ ๊ฒƒ์ฒ˜๋Ÿผ ์—ฌ์ „ํžˆ [email protected] . https://github.com/facebook/jest/issues/9457#issuecomment -579423330

jsdom์„ thirteen ๋กœ ํ•ด๊ฒฐํ•˜๋ฉด ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

25์—์„œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๊ฒฝํ—˜ํ•œ ์‚ฌ๋žŒ์ด jsdom@13 ๋˜๋Š” micromatch@3์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐ ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? JSDOM์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ์ˆ˜์ •๋˜๊ณ  ์žˆ์œผ๋ฉฐ(https://github.com/jsdom/jsdom/pull/2840 ๋ฐ ์ด์— ์—ฐ๊ฒฐ๋œ ๋‹ค์–‘ํ•œ ๋ฌธ์ œ/PR) micromatch์˜ ํšŒ๊ท€๊ฐ€ ๋ณด๊ณ ๋˜์–ด ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค. https:// github.com/micromatch/micromatch/issues/179.

JSDOM ๊ณ ์ • ๋ฒ„์ „์ด ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. jest-environment-jsdom-sixteen ๋ฅผ ์„ค์น˜ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @EvHaus ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@SimenB ๋‚ด ๋ฌธ์ œ๋Š” ์•„๋งˆ๋„ ๊ด€๋ จ์ด ์—†์ง€๋งŒ ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ•˜์—ฌ jest-environment-jsdom-sixteen ์‹œ๋„ํ–ˆ๊ณ  ๋ฐ˜๋ณต ์‹คํ–‰์„ ํ†ตํ•ด ๋™์ผํ•œ ํ…Œ์ŠคํŠธ ์ œํ’ˆ๊ตฐ์˜ ๋Ÿฐํƒ€์ž„์ด 20์ดˆ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

v15(๊ธฐ๋ณธ์ ์œผ๋กœ jest์™€ ํ•จ๊ป˜ ์ œ๊ณต๋จ)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋‹ค๋ฅธ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์—†์Šต๋‹ˆ๊นŒ? 16.1.0์œผ๋กœ๋„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ(๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ํ…Œ์ŠคํŠธ๊ฐ€ ๋” ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Œ). JSDOM์ด ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ์ง€์›๊ณผ ํ•จ๊ป˜ ๋ฐฉ๊ธˆ ์ฐฉ๋ฅ™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์— ์•ฝ๊ฐ„์˜ ํšŒ๊ท€๊ฐ€ _๊ฐ€๋Šฅ์„ฑ_์žˆ์Šต๋‹ˆ๊นŒ? ํ™•์‹คํ•˜์ง€ ์•Š๋‹ค

JSDOM ๊ณ ์ • ๋ฒ„์ „์ด ์ถœ์‹œ๋˜์—ˆ์œผ๋ฉฐ jest-environment-jsdom-sixteen์„ ์„ค์น˜ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @EvHaus ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ถˆํ–‰ํžˆ๋„ jest-environment-jsdom-sixteen ์—ฌ์ „ํžˆ ํž™ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋ฅผ ์œ„ํ•œ JSDom์˜ ๋งˆ์ง€๋ง‰ ์•ˆ์ •์ ์ธ ์ž‘์—… ๋ฒ„์ „์€ jest-environment-jsdom-thirteen ์ž…๋‹ˆ๋‹ค.

JSDOM ๊ณ ์ • ๋ฒ„์ „์ด ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. jest-environment-jsdom-sixteen ๋ฅผ ์„ค์น˜ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @EvHaus ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ™˜๊ฒฝ์€ ์ฝ”๋“œ๋ฒ ์ด์Šค์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์ง€๋งŒ ๋Ÿฐํƒ€์ž„์—์„œ ์—ฌ์ „ํžˆ ๊ฑฐ์˜ 100% ํšŒ๊ท€๋ฅผ ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ผํ™”์ ์œผ๋กœ jest-environment-jsdom-sixteen ๋Š” 25.1 ๋Œ€ 24.9 ์‚ฌ์šฉํ•  ๋•Œ๋งŒ ์‹คํ–‰ ์‹œ๊ฐ„ ์„ฑ๋Šฅ์„ 10% ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @SimenB ๋‹˜

https://github.com/olebedev/jest-perf-issue ์—์„œ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ์‚ฌ๋ก€๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค @joscha

๊ฒฐ๊ณผ

๋ฒค์น˜๋งˆํฌ๋Š” MBP 2019, 32Gb RAM, i9-8950HK CPU @ 2.90GHz ์—์„œ ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

| ๋†๋‹ด ๋ฒ„์ „ | ์ง€์  | ์‹œ๊ฐ„ |
|:-----------------|:------:|----------:|
| 24.9.0 | master | 348.077s |
| 25.1.0 | jest25 | 591.33s |

์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ jest v25.1์ด v24.9์— ๋น„ํ•ด ~50% ๋Š๋ ธ์ง€๋งŒ ์ด์ œ ์ตœ์‹  jest v25.2.0์€ v25.1์— ๋น„ํ•ด 20% ๋” ๋Š๋ฆฝ๋‹ˆ๋‹ค ๐Ÿ™ˆ

@olebedev ์™€, ๊ณ ํ†ต์Šค๋Ÿฝ๋„ค์š” ๐Ÿ˜ฌ

๋‚˜๋Š” ๋‹น์‹ ๊ณผ ๋น„์Šทํ•œ ์ˆ˜์น˜๋ฅผ ์–ป๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ v8 ์ ์šฉ ๋ฒ”์œ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์žฌ์ƒ์‚ฐ์—์„œ ๋‚ด ์ปดํ“จํ„ฐ์˜ ๋Ÿฐํƒ€์ž„์€ 600์ดˆ์—์„œ 35์ดˆ๋กœ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ํฐ ์ฐจ์ด๊ฐ€ ๋‚˜๋Š” ์ด์œ ๋Š” ์•„๋งˆ๋„ v8 ์ ์šฉ ๋ฒ”์œ„์—์„œ ์ ์šฉ๋˜์ง€ ์•Š์€ ํŒŒ์ผ์„ ๊ณ„์ธกํ•˜๋ ค๊ณ  ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค(v8์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ชจ๋“  ๋ฐ”์ดํŠธ๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค).

https://jestjs.io/docs/en/configuration#coverageprovider -string

์™œ ๊ทธ๋ ‡๊ฒŒ ๋Š๋ฆฐ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค... ์‹œ๊ฐ„์„ ๋“ค์—ฌ ์กฐ์‚ฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค(๊ณง์€ ์•„๋‹ˆ์ง€๋งŒ). ์ ์–ด๋„ v24๋ณด๋‹ค v25์—์„œ ๋Š๋ ค์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

v8 ์ ์šฉ ๋ฒ”์œ„๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฌธ์„œ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?
...-sixteen ํ™˜๊ฒฝ์—์„œ?

๊ฑด๋ฐฐ,
์ œ์ด

2020๋…„ 4์›” 8์ผ ์ˆ˜์š”์ผ, 22:33 Simen Bekkhus, [email protected] ์ž‘์„ฑ:

@olebedev https://github.com/olebedev ์™€, ๊ณ ํ†ต์Šค๋Ÿฝ๋„ค์š” ๐Ÿ˜ฌ

๋‚˜๋Š” ๋‹น์‹ ๊ณผ ๋น„์Šทํ•œ ์ˆ˜์น˜๋ฅผ ์–ป๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ
v8 ์ ์šฉ ๋ฒ”์œ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋‚ด ์ปดํ“จํ„ฐ์—์„œ ๋Ÿฐํƒ€์ž„์ด 600์ดˆ์—์„œ 35์ดˆ๋กœ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.
๋‹น์‹ ์˜ ์žฌ์ƒ์‚ฐ์—์„œ ๊ธฐ๊ณ„. ํฐ ์ฐจ์ด์˜ ์ด์œ ๋Š” ์•„๋งˆ๋„
v8 ์ ์šฉ ๋ฒ”์œ„์—์„œ ์ ์šฉ๋˜์ง€ ์•Š์€ ํŒŒ์ผ์„ ๊ณ„์ธกํ•˜๋ ค๊ณ  ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

https://jestjs.io/docs/en/configuration#coverageprovider -string

์™œ ์ด๋ ‡๊ฒŒ ๋Š๋ฆฐ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค... ์‹œ๊ฐ„์„ ๋‚ด์„œ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์ ์–ด๋„ v24๋ณด๋‹ค v25์—์„œ ๋Š๋ ค์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/facebook/jest/issues/9457#issuecomment-610931770 ๋˜๋Š”
๊ตฌ๋… ์ทจ์†Œ
https://github.com/notifications/unsubscribe-auth/AABN5BW6R45SS5Z5GXGFGF3RLRVJLANCNFSM4KK67LOA
.

์˜ˆ, jest-environment-jsdom-sixteen ๋˜๋Š” ๋ฒˆ๋“ค jest-environment-node ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋…ธ๋“œ 8์ด ์•„๋‹Œ ๋…ธ๋“œ 10+์—์„œ๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

(๋‚˜๋Š” ์ด๊ฒƒ์„ ๋…ธ๋“œ ํ™˜๊ฒฝ์—์„œ๋งŒ ํ…Œ์ŠคํŠธํ–ˆ์ง€๋งŒ jsdom ํ™˜๊ฒฝ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์—ด์–ด์ฃผ์„ธ์š” ๐Ÿ™‚)

์ปค๋ฒ„๋ฆฌ์ง€ ์ œ๊ณต์ž๋กœ์„œ์˜ jest-environment-jsdom-sixteen + v8์€ jest 25.3.0, ๋…ธ๋“œ 12.16์—์„œ ์•ฝ 20% ๋” ๋‚˜์ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํ…Œ์ŠคํŠธ ์„ฑ๋Šฅ์ด jest 24์—์„œ 25๋กœ ์•ฝ 80% ์•…ํ™”๋œ ์ด์œ ๋ฅผ ๋””๋ฒ„๊ทธํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

@joual ๋งˆ์ดํฌ๋กœ

์—ฌ๊ธฐ์—์„œ ๋น„์Šทํ•œ ๊ฒฝํ—˜์„ ํ•˜๋ฉด v25์—์„œ ํ…Œ์ŠคํŠธ ์‹œ๊ฐ„(์ปค๋ฒ„๋ฆฌ์ง€ ์—†์Œ)์ด 35-40์ดˆ์—์„œ 80-90์ดˆ๋กœ ๋‘ ๋ฐฐ, ๋•Œ๋กœ๋Š” ๊ทธ ์ด์ƒ์œผ๋กœ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค. v3์—์„œ ๋งˆ์ดํฌ๋กœ๋งค์น˜๋ฅผ ์ž ๊ทธ๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ์ธก์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ฐจ์ด๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. Fwiw, ์•ฝ 3,000๊ฐœ์˜ ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ์œผ๋ฉฐ ๊ทธ ์ค‘ 58๊ฐœ๊ฐ€ ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.
jsdom์„ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์ตœ๊ทผ ๊ธฐ๋Šฅ์œผ๋กœ ์ธํ•ด ๋งŽ์€ ํ…Œ์ŠคํŠธ ์ค‘๋‹จ์„ ์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ๋“  ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ๋‹ค์‹œ ๋ณด๊ณ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@SimenB ๋” ์˜ˆ์œ ํ”„๋กœ์ ํŠธ์˜ ์ปค๋ฒ„๋ฆฌ์ง€ ๋ชจ์œผ๋Š” ์ž‘์—…๋„ ๋„ˆ๋ฌด ๋Š๋ฆฝ๋‹ˆ๋‹ค, ํ™•์ธ https://github.com/prettier/prettier/runs/579497097 Node.js 12 on ubuntu-latest ๋Š” ๋ฒ”์œ„๋ฅผ ์ˆ˜์ง‘ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์ž‘์—…์€ ์ˆ˜์ง‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ๋น„์Šทํ•œ ๊ฒฝํ—˜์„ ํ•˜๋ฉด v25์—์„œ ํ…Œ์ŠคํŠธ ์‹œ๊ฐ„(์ปค๋ฒ„๋ฆฌ์ง€ ์—†์Œ)์ด 35-40์ดˆ์—์„œ 80-90์ดˆ๋กœ ๋‘ ๋ฐฐ, ๋•Œ๋กœ๋Š” ๊ทธ ์ด์ƒ์œผ๋กœ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค. v3์—์„œ ๋งˆ์ดํฌ๋กœ๋งค์น˜๋ฅผ ์ž ๊ทธ๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ์ธก์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ฐจ์ด๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. Fwiw, ์•ฝ 3,000๊ฐœ์˜ ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ์œผ๋ฉฐ ๊ทธ ์ค‘ 58๊ฐœ๊ฐ€ ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.
jsdom์„ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์ตœ๊ทผ ๊ธฐ๋Šฅ์œผ๋กœ ์ธํ•ด ๋งŽ์€ ํ…Œ์ŠคํŠธ ์ค‘๋‹จ์„ ์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ๋“  ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ๋‹ค์‹œ ๋ณด๊ณ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜ jest @24 (๊ธฐ๋ณธ์ ์œผ๋กœ v11์ž„)์—์„œ ๋‹ค๋ฅธ jsdom ๋ฒ„์ „์œผ๋กœ ์‹คํ—˜ํ–ˆ์Šต๋‹ˆ๋‹ค. v14๊นŒ์ง€๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ v15๋ถ€ํ„ฐ ํ…Œ์ŠคํŠธ ์‹คํ–‰์€ ์ผ๊ด€๋˜๊ฒŒ 50-60% ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. v16์—์„œ๋„ ๊ฐ™์€ ์ด์•ผ๊ธฐ. jsdom์„ v14๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•˜์—ฌ jest @25 ์—์„œ ๋น„์Šทํ•œ ์„ฑ๋Šฅ์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

[email protected] ์—๋Š” ์ผ๋ถ€ ๋ฉ”๋ชจ๋ฆฌ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. @EvHaus ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? Jest์˜ --detect-leaks ๋Š” ์ด์ „ ๋ฒ„์ „์—์„œ ๋ˆ„์ถœ์„ ์ฐพ์•˜์ง€๋งŒ 16.2.2์—์„œ๋Š” ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ(Windows์—์„œ๋Š” ๋งค์šฐ ๋Š๋ฆผ) ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๊ฐœ์„  ์‚ฌํ•ญ์„ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ๋žŒ๋“ค์ด [email protected] ์„ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ •๋ง

@SimenB ๊ทธ๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? [email protected] devDependency๋กœ ์ง์ ‘ ์ถ”๊ฐ€ํ•˜๋ฉด Jest๋Š” ์ด๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ํ˜„์žฌ 15.2.1์ธ jest-environment-jsdom ์™€ ํ•จ๊ป˜ ๋ฒˆ๋“ค๋กœ ์ œ๊ณต๋˜๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์›ํ•˜๋Š” jsdom ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด npm ๋ฅผ ์–ด๋–ป๊ฒŒ ์†์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

jest-environment-jsdom-sixteen์„ ์„ค์น˜ํ•˜๊ณ  https://jestjs.io/docs/en/configuration#testenvironment -string ์‚ฌ์šฉ

Alpha๊ฐ€ ๊ฒŒ์‹œ๋˜์—ˆ์œผ๋ฏ€๋กœ jest@next ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ jsdom 16๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

@SimenB ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. [email protected] ๋ฐ [email protected] ์šด์ด ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋งŽ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory

๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ตญ ์ฃผ์ž๋Š” ์ฃฝ์Šต๋‹ˆ๋‹ค.

๋‚ด ์„ธ๋ถ€ ์ •๋ณด:

> npx envinfo --preset jest

  System:
    OS: macOS 10.15.4
    CPU: (8) x64 Intel(R) Core(TM) i5-8279U CPU @ 2.40GHz
  Binaries:
    Node: 10.17.0 - ~/.nvm/versions/node/v10.17.0/bin/node
    Yarn: 1.22.4 - /usr/local/bin/yarn
    npm: 6.14.4 - ~/.nvm/versions/node/v10.17.0/bin/npm
  npmPackages:
    jest: ^26.0.0-alpha.0 => 26.0.0-alpha.0 

๋‹ค์Œ์€ ๊ทธ ์ค‘ ์ผ๋ถ€์—์„œ ๋ฐ˜ํ™˜๋œ ์ „์ฒด ์Šคํƒ์ž…๋‹ˆ๋‹ค.

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
 1: 0x10003d041 node::Abort() [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 2: 0x10003d24b node::OnFatalError(char const*, char const*) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 3: 0x1001b8e25 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 4: 0x100586d82 v8::internal::Heap::FatalProcessOutOfMemory(char const*) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 5: 0x100589855 v8::internal::Heap::CheckIneffectiveMarkCompact(unsigned long, double) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 6: 0x1005856ff v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 7: 0x1005838d4 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 8: 0x10059016c v8::internal::Heap::AllocateRawWithLigthRetry(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 9: 0x1005901ef v8::internal::Heap::AllocateRawWithRetryOrFail(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
10: 0x10055fb34 v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationSpace) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
11: 0x1007e7e14 v8::internal::Runtime_AllocateInNewSpace(int, v8::internal::Object**, v8::internal::Isolate*) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
12: 0x3f82f50dbe3d 
13: 0x3f82f5c630de 
14: 0x3f82f5c94431 
15: 0x3f82f5c7d3be 
16: 0x3f82f5c4e98b 
17: 0x3f82f5c3c38e 

<--- Last few GCs --->

[50818:0x102804000]   189738 ms: Mark-sweep 1288.8 (1450.6) -> 1280.2 (1454.1) MB, 890.1 / 0.1 ms  (average mu = 0.181, current mu = 0.061) allocation failure scavenge might not succeed
[50818:0x102804000]   190673 ms: Mark-sweep 1292.8 (1454.1) -> 1282.9 (1457.6) MB, 856.2 / 0.2 ms  (average mu = 0.136, current mu = 0.084) allocation failure scavenge might not succeed


<--- JS stacktrace --->

==== JS stack trace =========================================

    0: ExitFrame [pc: 0x3f82f50dbe3d]
Security context: 0x274d67c9e6e9 <JSObject>
    1: createImpl [0x274d6d9ba1b9] [/Users/evhaus/Git/zenhub/client/node_modules/jsdom/lib/jsdom/living/generated/HTMLInputElement.js:~47] [pc=0x3f82f5c630de](this=0x274d51911261 <Object map = 0x274dd51fe489>,globalObject=0x274d89d38609 <Window map = 0x274d2fe6c211>,constructorArgs=0x274d832134b1 <JSArray[0]>,privateData=0x274d832134d1 <Object map = 0x274d69...

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
 1: 0x10003d041 node::Abort() [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 2: 0x10003d24b node::OnFatalError(char const*, char const*) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 3: 0x1001b8e25 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 4: 0x100586d82 v8::internal::Heap::FatalProcessOutOfMemory(char const*) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 5: 0x100589855 v8::internal::Heap::CheckIneffectiveMarkCompact(unsigned long, double) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 6: 0x1005856ff v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 7: 0x1005838d4 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 8: 0x10059016c v8::internal::Heap::AllocateRawWithLigthRetry(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 9: 0x1005901ef v8::internal::Heap::AllocateRawWithRetryOrFail(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
10: 0x10055fb34 v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationSpace) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
11: 0x1007e7e14 v8::internal::Runtime_AllocateInNewSpace(int, v8::internal::Object**, v8::internal::Isolate*) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
12: 0x2cea552dbe3d 
13: 0x2cea55937c04 
14: 0x2cea5592618b 

<--- Last few GCs --->

[51263:0x102804000]    34292 ms: Mark-sweep 1332.4 (1452.5) -> 1320.5 (1453.5) MB, 902.6 / 0.0 ms  (average mu = 0.149, current mu = 0.104) allocation failure scavenge might not succeed
[51263:0x102804000]    35480 ms: Mark-sweep 1332.6 (1453.5) -> 1323.6 (1457.5) MB, 1049.3 / 0.0 ms  (average mu = 0.131, current mu = 0.116) allocation failure scavenge might not succeed


<--- JS stacktrace --->

==== JS stack trace =========================================

    0: ExitFrame [pc: 0x2cea552dbe3d]
Security context: 0x1a4cb371e6e9 <JSObject>
    1: next [0x1a4ca627dcd1] [/Users/evhaus/Git/zenhub/client/node_modules/symbol-tree/lib/TreeIterator.js:~16] [pc=0x2cea55937c04](this=0x1a4c807c75b1 <TreeIterator map = 0x1a4c38b8a9c9>)
    2: shadowIncludingInclusiveDescendantsIterator(aka shadowIncludingInclusiveDescendantsIterator) [0x1a4ca627a641] [/Users/evhaus/Git/zenhub/client/node_modules/jsdom/li...

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
 1: 0x10003d041 node::Abort() [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 2: 0x10003d24b node::OnFatalError(char const*, char const*) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 3: 0x1001b8e25 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 4: 0x100586d82 v8::internal::Heap::FatalProcessOutOfMemory(char const*) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 5: 0x100589855 v8::internal::Heap::CheckIneffectiveMarkCompact(unsigned long, double) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 6: 0x1005856ff v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 7: 0x1005838d4 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 8: 0x10059016c v8::internal::Heap::AllocateRawWithLigthRetry(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 9: 0x1005901ef v8::internal::Heap::AllocateRawWithRetryOrFail(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
10: 0x10055fb34 v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationSpace) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
11: 0x1007e7e14 v8::internal::Runtime_AllocateInNewSpace(int, v8::internal::Object**, v8::internal::Isolate*) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
12: 0x3e0d8aedbe3d 
13: 0x3e0d8b35eedc 

<--- Last few GCs --->

[51519:0x102804000]    28074 ms: Mark-sweep 1324.5 (1445.0) -> 1315.7 (1449.0) MB, 760.4 / 0.0 ms  (average mu = 0.182, current mu = 0.080) allocation failure scavenge might not succeed
[51519:0x102804000]    28906 ms: Mark-sweep 1328.5 (1449.0) -> 1317.7 (1452.0) MB, 770.4 / 0.0 ms  (average mu = 0.129, current mu = 0.074) allocation failure scavenge might not succeed


<--- JS stacktrace --->

==== JS stack trace =========================================

    0: ExitFrame [pc: 0x3e0d8aedbe3d]
Security context: 0x3611d141e6e9 <JSObject>
    1: queueMutationRecord(aka queueMutationRecord) [0x361185f32321] [/Users/evhaus/Git/zenhub/client/node_modules/jsdom/lib/jsdom/living/helpers/mutation-observers.js:~33] [pc=0x3e0d8b35eedc](this=0x361116e826f1 <undefined>,type=0x3611aa0a3681 <String[9]: childList>,target=0x36110b275a91 <EventTargetImpl map = 0x3611a254a2f1>,name=0x361116e822b1 <null>,name...

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
 1: 0x10003d041 node::Abort() [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 2: 0x10003d24b node::OnFatalError(char const*, char const*) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 3: 0x1001b8e25 v8::internal::V8::FatalProcessOutOfMemory(v8::internal::Isolate*, char const*, bool) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 4: 0x100586d82 v8::internal::Heap::FatalProcessOutOfMemory(char const*) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 5: 0x100589855 v8::internal::Heap::CheckIneffectiveMarkCompact(unsigned long, double) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 6: 0x1005856ff v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector, v8::GCCallbackFlags) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 7: 0x1005838d4 v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace, v8::internal::GarbageCollectionReason, v8::GCCallbackFlags) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 8: 0x10059016c v8::internal::Heap::AllocateRawWithLigthRetry(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
 9: 0x1005901ef v8::internal::Heap::AllocateRawWithRetryOrFail(int, v8::internal::AllocationSpace, v8::internal::AllocationAlignment) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
10: 0x10055fb34 v8::internal::Factory::NewFillerObject(int, bool, v8::internal::AllocationSpace) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
11: 0x1007e7e14 v8::internal::Runtime_AllocateInNewSpace(int, v8::internal::Object**, v8::internal::Isolate*) [/Users/evhaus/.nvm/versions/node/v10.17.0/bin/node]
12: 0x8d8aedbe3d 
<--- Last few GCs --->

[51526:0x102804000]    33125 ms: Mark-sweep 1318.6 (1425.0) -> 1317.7 (1424.0) MB, 874.8 / 0.0 ms  (average mu = 0.126, current mu = 0.038) allocation failure scavenge might not succeed
[51526:0x102804000]    33136 ms: Scavenge 1318.5 (1424.0) -> 1318.0 (1424.5) MB, 3.8 / 0.0 ms  (average mu = 0.126, current mu = 0.038) allocation failure 
[51526:0x102804000]    33148 ms: Scavenge 1318.7 (1424.5) -> 1318.2 (1425.0) MB, 4.2 / 0.0 ms  (average mu = 0.126, current mu = 0.038) allocation failure 


<--- JS stacktrace --->

==== JS stack trace =========================================

    0: ExitFrame [pc: 0x8d8aedbe3d]
    1: StubFrame [pc: 0x8d8ae8d40b]
    2: ConstructFrame [pc: 0x8d8ae8cfa3]
Security context: 0x3324ecd9e6e9 <JSObject>
    3: new NodeImpl(aka NodeImpl) [0x3324c2083e11] [/Users/evhaus/Git/zenhub/client/node_modules/jsdom/lib/jsdom/living/nodes/Node-impl.js:~125] [pc=0x8d8b357fd4](this=0x332437582801 <the_hole>,globalObject=0x3324b10f98e9 <Window map = 0x3324649cf0a1>,args=0x3324b1841471 <JSArray[0]>,...

๋„ˆ๋ฌด ๋‚˜์ฉ๋‹ˆ๋‹ค ๐Ÿ˜ž ์ปค๋ฒ„๊ฐ€ ์žˆ๋Š” ๊ฑด์ง€ ์—†๋Š” ๊ฑด์ง€

์ปค๋ฒ„๋ฆฌ์ง€๊ฐ€ ์—†๋Š” ์ƒํ™ฉ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋ช…ํ™•ํžˆ ํ–ˆ์–ด์•ผ ํ–ˆ๋‹ค.

๋‚ด๊ฐ€ ์ƒ๋‹นํžˆ ์˜ค๋ž˜๋œ ๋ฒ„์ „์˜ Node(v10)๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์ด์— ๋Œ€ํ•œ ์š”์ธ์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

์ƒˆ๋กœ์šด ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒƒ์ด ์—†๋‹ค๋ฉด ํฅ๋ฏธ๋กœ์šด ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‹œ๋„๋Š” ํž™ ๋คํ”„๊ฐ€ ์ฃฝ๊ธฐ ์ง์ „์— ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํž™์— ๋ฌด์—‡์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์•„๋ฌด๋„ micromatch@4 ๊ฐ€ ์ •๊ทœ ํ‘œํ˜„์‹์„ ๋” ์ด์ƒ ์บ์‹œํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ด ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค( https://github.com/micromatch/micromatch/pull/151 ๋ฐ https://github.com/facebook/jest/pull/10131 ์ฐธ์กฐ ๋ˆ„๋ฝ ๋†๋‹ด ์ชฝ์—์„œ ์บ์‹ฑ.

๋‚˜๋ฅผ ์œ„ํ•ด micromatch@3์œผ๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•˜๊ณ  jest-environment-jsdom-sixteen ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด 50%์˜ ์‹œ๊ฐ„์ด ์ ˆ์•ฝ๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ jest 26 ๋ฐ ๋‚ด์žฅ jsdom์„ ์‚ฌ์šฉํ•˜๋ฉด ์ œ ๊ฒฝ์šฐ์—๋Š” --detectLeaks๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ jest๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์—ฌ์ „ํžˆ ๋ˆ„์ˆ˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์‹ ์„ ํ•œ repo๋ฅผ ์‹œ๋„ํ–ˆ๊ณ  ๋ชจ๋‘ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/facebook/jest/pull/10131 ์ด ๋ณ‘ํ•ฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!! <3

26.1.0์— ๋ฆด๋ฆฌ์Šค๋˜์—ˆ์œผ๋ฉฐ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋„์›€์ด ๋˜๋Š”์ง€ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@SimenB ์ถœ์‹œ

ํ˜„์žฌ์˜:

os: osx
node: 12.6.1
jest: 24.9
-----------------
174 test suites
823 tests
322 snapshots
-----------------
done in 23.569s

24.9 ์ด์ƒ์˜ ๋ชจ๋“  ๋ฒ„์ „์—์„œ

os: osx
node: 12.6.1
jest: 26.1.0
-----------------
174 test suites
823 tests
322 snapshots
-----------------
done in 133.763s

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

@SimenB

prettier ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ์ ์šฉ ๋ฒ”์œ„๋ฅผ ์ˆ˜์ง‘ํ•  ๋•Œ v24 ๋ณด๋‹ค ์—ฌ์ „ํžˆ ๋Š๋ฆฝ๋‹ˆ๋‹ค.

image

image

https://github.com/prettier/prettier/pull/8636

Bitbucket Pipeline์—์„œ ๋ฒ„์ „ 25 ๋ฐ 26์˜ ์„ฑ๋Šฅ์ด 24๋ณด๋‹ค ๋‚ฎ์€ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ ์šฉ ๋ฒ”์œ„๊ฐ€ ํ™œ์„ฑํ™”๋˜๋ฉด ์†๋„๊ฐ€ ๋Š๋ ค์ง€๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๋ฒ„์ „ 25๋Š” 26์— ๋น„ํ•ด ํ›จ์”ฌ ๋” ๋‚˜๋น ์ง€๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„๋กœ ์ธํ•ด ํŒŒ์ดํ”„๋ผ์ธ์ด ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.

@SimenB 24.9์™€ 25.1 ์‚ฌ์ด์˜ ์„ฑ๋Šฅ ํšŒ๊ท€๊ฐ€ ๋„์ž…๋œ ์œ„์น˜๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด git bisect ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. 24.9์—์„œ 26.1๊นŒ์ง€ ์ˆ˜์ • ์—†์ด ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ์˜ˆ์œ ํ…Œ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

๋น„ํ™œ์„ฑํ™”๋œ ์บ์‹œ์™€ js ํ•˜์œ„ ์ง‘ํ•ฉ์˜ ์„ธ ๋ฒˆ ์‹คํ–‰(์–ธ์  ๊ฐ€ ์•ˆ์ „์„ ์œ„ํ•ด)์˜ ๋ˆ„์  ๋Ÿฐํƒ€์ž„์„ ๋น„๊ตํ–ˆ์Šต๋‹ˆ๋‹ค. ๋” ํŠน๋ณ„ํžˆ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์€ ๋…ธ๋“œ 10.19์—์„œ ( yarn run jest --no-cache tests/js/ )์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ 10์ด 24.9์˜ ๊ถŒ์žฅ ๋ฒ„์ „์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ:

24.9.0-dev 3cdbd556948b4974b2cc23178977eb159d343df8 151.84s <- Good
25.1.0-dev 5dcc48075f22d581864f381f20bc8b257d2a73cd 223.29s <- Bad
24.9.0-dev bf6109591365a2b71c7b642fa33ed06d3db6cb26 122.58s
24.9.0-dev 77c3ceedfd61ddc841e11fec7b76e540924d3e60 120.42s
24.9.0-dev 30e08e9ae7d7d78f40df757c2ec4b49357285eda 221.28s
24.9.0-dev ad5377333daf6716af3465bba39f86b7db485e2b 222.33s
24.9.0-dev 8ddadfca76eb3fb979df81033d3d0ff564c415d6 120.32s
24.9.0-dev 966f22f2a08d9ac9300b6964ab91c4e75dba4761 120.46s
24.9.0-dev b9084101189639524863e15ef7557ea6bc6704b9 119.87s
24.9.0-dev 1d8245d77d47b4198d51e55da87893d7dfe1a759 129.93s

ad5377333daf6716af3465bba39f86b7db485e2b is the first bad commit
commit ad5377333daf6716af3465bba39f86b7db485e2b
Author: Simen Bekkhus <[email protected]>
Date:   Mon Dec 2 23:20:16 2019 +0100

    feat: add support for `compileFunction` allowing us to avoid the module wrapper (#9252)

compileFunction ๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋Œ€์ฒด๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ad5377333daf6716af3465bba39f86b7db485e2b์—์„œ compileFunction ๋ถ„๊ธฐ๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๋ณต์›ํ–ˆ์Šต๋‹ˆ๋‹ค.

26.1์„ ๋ณด๋ฉด ์ฝ”๋“œ๊ฐ€ ์•ฝ๊ฐ„ ์ด๋™ํ–ˆ์ง€๋งŒ compileFunction ๋ฐ ๋Œ€์ฒด๊ฐ€ ์—ฌ์ „ํžˆ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ:

26.1.0-dev 817d8b6aca845dd4fcfd7f8316293e69f3a116c5 242.99s <- with compileFunction
26.1.0-dev 817d8b6aca845dd4fcfd7f8316293e69f3a116c5 151.61s <- without compileFunction

์ฆ‰, compileFunction ๋ถ„๊ธฐ( patch )๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด 26.1์ด 24.9์˜ ๋Ÿฐํƒ€์ž„์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹ˆ๋ผ๊ณ  ํ™•์‹ ํ•˜์ง€๋งŒ ์ ์–ด๋„ ์šฐ๋ฆฌ๋Š” ํ•จ๊ป˜ ์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋กœ์„œ, ์šฐ๋ฆฌ์˜ jest ์ œํ’ˆ๊ตฐ์€ ํ˜„์žฌ ์—…๋ฐ์ดํŠธ MR ์—์„œ๋Š” ์•ฝ 3497์ดˆ๊ฐ€ ์†Œ์š”๋˜์–ด ์•ฝ 27% ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ํ›Œ๋ฅญํ•œ ์ž‘์—…์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋†๋‹ด ํŒ€์ž…๋‹ˆ๋‹ค. @wurstbonbon ์˜ ํƒ์ • ๊ธฐ์ˆ ์ด ์ด๋Ÿฌํ•œ ํšŒ๊ท€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!

@wurstbonbon ์‹œ๊ฐ„์„ compileFunction ์ด ๋” ๋Š๋ฆฌ๋‹ค๋Š” ๊ฒƒ์€ ๋งค์šฐ ํฅ๋ฏธ๋กœ์šด ์ผ์ž…๋‹ˆ๋‹ค... ์ฆ‰, ํŒจ์น˜๋ฅผ ์ ์šฉํ•˜๋Š” ๋Œ€์‹  ์‚ฌ์šฉ์ž ์ง€์ • ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

const NodeEnv = require('jest-environment-node');

class MyNodeEnv extends NodeEnv {}

delete MyNodeEnv.prototype.compileFunction;

module.exports = MyNodeEnv;

(jsdom ํ™˜๊ฒฝ์—์„œ๋„ ๋™์ผ). ํ™•์ธ ํ• ์ˆ˜ ์žˆ์–ด์š”?


๋ณ‘๋ชฉ ํ˜„์ƒ์ด ์ด์ƒํ•˜๊ฒŒ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. Node ์ž์ฒด๊ฐ€ 18๊ฐœ์›” ์ „์— ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ „ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค: https://github.com/nodejs/node/pull/21573. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ ์ธก์—์„œ ๋ญ”๊ฐ€ ์ด์ƒํ•œ ์ผ์„ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋งํฌ๋œ https://github.com/nodejs/node/issues/26229 ๋Š” ๋งค์šฐ ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด ์šฐ๋ฆฌ ์ธก์—์„œ ๋” ๋งŽ์€ ์บ์‹ฑ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ• ๊นŒ์š”?

@SimenB ๋ฐฉ๊ธˆ ์‚ฌ์šฉ์ž ์ง€์ • ํ™˜๊ฒฝ๊ณผ ๋น„์Šทํ•œ ๊ฒƒ์„ ์‹œ๋„ํ–ˆ๋Š”๋ฐ ์กฐ๊ธˆ ๋” ๋‚˜์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ jest 24๋ณด๋‹ค ๋Š๋ฆผ).

๋‚ด๊ฐ€ํ•ด์•ผ ํ•  ์ผ์„ํ–ˆ์„ MyNodeEnv.prototype.getVmContext = null; I 26 ๋†๋‹ด์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ๋•Œ๋ฌธ์—,ํ•˜์ง€๋งŒ, ๊ทธ๊ฒƒ์€ ๊ทธ๊ฒƒ ๊ฐ™์ด์— ๋Œ€ํ•œ ๊ฒ€์‚ฌ ๋ณด์ด๋Š” if (typeof this._environment.getVmContext === 'function') { ํ•ด์ฃผ๊ธฐ๋ฅผ . ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋ช‡ ๋ฒˆ์˜ ์‹คํ–‰ ํ›„์— ๋ณด๊ณ  ์žˆ๋Š” ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

Jest 26 w/testEnvironment: "๋…ธ๋“œ" => ~280์ดˆ
Jest 26 w/์ปค์Šคํ…€ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ => ~210s
๋†๋‹ด 24 => ~160์ดˆ

๋‹ค๋ฅธ ์ •๋ณด๋‚˜ ๋‹ค๋ฅธ ์ผ์„ ๋„์™€๋“œ๋ฆด ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”!

์˜ˆ์ƒ๋Œ€๋กœ ์‚ฌ์šฉ์ž ์ •์˜ ํ™˜๊ฒฝ์€ ๋” ์˜ˆ์œ ๊ฒƒ์— ๋Œ€ํ•ด ๋™์ผํ•œ ์†๋„ ํ–ฅ์ƒ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ์ฐจ์ด๊ฐ€ ~270s ๋Œ€ ~200s์ธ ์šฐ๋ฆฌ์˜ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์‹œ๋„ํ•ด ๋ณด์•˜์œผ๋ฏ€๋กœ 40% ๊ฐ์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ ์•ฝ 25%๋งŒ ๊ฐ์†Œํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ์šฐ๋ฆฌ๋Š” ์ƒˆ๋กœ์šด ํ˜„๋Œ€ ํƒ€์ด๋จธ ์กฐ๋กฑ์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— jest 24๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์œ„์˜ ์˜ˆ์—์„œ delete ๋ฅผ ๋†“์ณค์Šต๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.


์ปดํŒŒ์ผ๋œ ํ•จ์ˆ˜๋ฅผ ์ˆ˜๋™์œผ๋กœ ์บ์‹œํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•œ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒจ์น˜๋ฅผ ์ ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? (ํŠธ๋žœ์ŠคํŒŒ์ผ๋œ JS์™€ TS ์†Œ์Šค ๋ชจ๋‘ ์—ฌ๊ธฐ์— ํฌํ•จ๋จ)

diff --git i/packages/jest-runtime/build/index.js w/packages/jest-runtime/build/index.js
index 1d094a6dc0..f6d059caa3 100644
--- i/packages/jest-runtime/build/index.js
+++ w/packages/jest-runtime/build/index.js
@@ -267,6 +267,7 @@ const getModuleNameMapper = config => {
 const unmockRegExpCache = new WeakMap();
 const EVAL_RESULT_VARIABLE = 'Object.<anonymous>';
 const runtimeSupportsVmModules = typeof _vm().SyntheticModule === 'function';
+const compiledFunctionCache = new Map();
 /* eslint-disable-next-line no-redeclare */

 class Runtime {
@@ -1169,23 +1170,30 @@ class Runtime {
       value: this._createRequireImplementation(localModule, options)
     });
     const transformedCode = this.transformFile(filename, options);
-    let compiledFunction = null; // Use this if available instead of deprecated `JestEnvironment.runScript`
+    let compiledFunction = undefined; // Use this if available instead of deprecated `JestEnvironment.runScript`

     if (typeof this._environment.getVmContext === 'function') {
       const vmContext = this._environment.getVmContext();

       if (vmContext) {
-        try {
-          compiledFunction = (0, _vm().compileFunction)(
-            transformedCode,
-            this.constructInjectedModuleParameters(),
-            {
-              filename,
-              parsingContext: vmContext
-            }
-          );
-        } catch (e) {
-          throw (0, _transform().handlePotentialSyntaxError)(e);
+        const params = this.constructInjectedModuleParameters();
+        const cacheKey = transformedCode + params;
+        compiledFunction = compiledFunctionCache.get(cacheKey);
+
+        if (!compiledFunction) {
+          try {
+            compiledFunction = (0, _vm().compileFunction)(
+              transformedCode,
+              params,
+              {
+                filename,
+                parsingContext: vmContext
+              }
+            );
+            compiledFunctionCache.set(cacheKey, compiledFunction);
+          } catch (e) {
+            throw (0, _transform().handlePotentialSyntaxError)(e);
+          }
         }
       }
     } else {
@@ -1194,13 +1202,13 @@ class Runtime {
       const runScript = this._environment.runScript(script);

       if (runScript === null) {
-        compiledFunction = null;
+        compiledFunction = undefined;
       } else {
         compiledFunction = runScript[EVAL_RESULT_VARIABLE];
       }
     }

-    if (compiledFunction === null) {
+    if (!compiledFunction) {
       this._logFormattedReferenceError(
         'You are trying to `import` a file after the Jest environment has been torn down.'
       );
diff --git i/packages/jest-runtime/src/index.ts w/packages/jest-runtime/src/index.ts
index 522adabd1e..8958a4cef8 100644
--- i/packages/jest-runtime/src/index.ts
+++ w/packages/jest-runtime/src/index.ts
@@ -137,6 +137,8 @@ type RunScriptEvalResult = {[EVAL_RESULT_VARIABLE]: ModuleWrapper};

 const runtimeSupportsVmModules = typeof SyntheticModule === 'function';

+const compiledFunctionCache = new Map<string, ModuleWrapper>();
+
 /* eslint-disable-next-line no-redeclare */
 class Runtime {
   private _cacheFS: StringMap;
@@ -1000,24 +1002,29 @@ class Runtime {

     const transformedCode = this.transformFile(filename, options);

-    let compiledFunction: ModuleWrapper | null = null;
+    let compiledFunction: ModuleWrapper | undefined = undefined;

     // Use this if available instead of deprecated `JestEnvironment.runScript`
     if (typeof this._environment.getVmContext === 'function') {
       const vmContext = this._environment.getVmContext();

       if (vmContext) {
-        try {
-          compiledFunction = compileFunction(
-            transformedCode,
-            this.constructInjectedModuleParameters(),
-            {
+        const params = this.constructInjectedModuleParameters();
+
+        const cacheKey = transformedCode + params;
+
+        compiledFunction = compiledFunctionCache.get(cacheKey);
+
+        if (!compiledFunction) {
+          try {
+            compiledFunction = compileFunction(transformedCode, params, {
               filename,
               parsingContext: vmContext,
-            },
-          ) as ModuleWrapper;
-        } catch (e) {
-          throw handlePotentialSyntaxError(e);
+            }) as ModuleWrapper;
+            compiledFunctionCache.set(cacheKey, compiledFunction);
+          } catch (e) {
+            throw handlePotentialSyntaxError(e);
+          }
         }
       }
     } else {
@@ -1028,13 +1035,13 @@ class Runtime {
       );

       if (runScript === null) {
-        compiledFunction = null;
+        compiledFunction = undefined;
       } else {
         compiledFunction = runScript[EVAL_RESULT_VARIABLE];
       }
     }

-    if (compiledFunction === null) {
+    if (!compiledFunction) {
       this._logFormattedReferenceError(
         'You are trying to `import` a file after the Jest environment has been torn down.',
       );

ํŽธ์ง‘: ์•„๋‹ˆ์š”, ์ด๊ฒƒ์€ ๋”์ฐํ•˜๊ฒŒ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ๐Ÿ™ˆ ๋…ธ๋“œ ๋ฌธ์ œ์—์„œ ์ปดํŒŒ์ผ ์บ์‹œ๋ฅผ ์ฑ„์šธ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ฌผ์—ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿคž

๋‚˜๋Š” ์ด๊ฒƒ์ด ํŠธ๋ฆญ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

const params = this.constructInjectedModuleParameters();
const cacheKey = transformedCode + params;
const cachedData = compileFunctionCache.get(cacheKey);

try {
  compiledFunction = (0, _vm().compileFunction)(
    transformedCode,
    params,
    {
      filename,
      parsingContext: vmContext,
      cachedData,
      produceCachedData: !cachedData,
    },
  );

  if (compiledFunction.cachedDataProduced) {
    compileFunctionCache.set(cacheKey, compiledFunction.cachedData);
  } 
} catch (e) {
  throw (0, _transform().handlePotentialSyntaxError)(e);
}

์„ฑ๋Šฅ์ด ์•ฝ๊ฐ„ ํ–ฅ์ƒ๋˜์ง€๋งŒ Script ๋Š” ์—ฌ์ „ํžˆ ํ›จ์”ฌ ๋น ๋ฆ…๋‹ˆ๋‹ค.

@SimenB์—์„œ ์ถ”์ฒœ์„ ์‹œ๋„ : https://gitlab.com/gitlab-org/gitlab/-/merge_requests/33252/diffs?commit_id=6d633c88caf70f712fa0ccaac42d952976161ec6

์„ฑ๋Šฅ์ด ์•ฝ๊ฐ„ ํ–ฅ์ƒ๋˜์—ˆ์ง€๋งŒ jest 24.x๋ณด๋‹ค ์—ฌ์ „ํžˆ ์ƒ๋‹นํžˆ ๋Š๋ฆฝ๋‹ˆ๋‹ค.

  • Jest 24.x: jest ํ…Œ์ŠคํŠธ์˜ ์ด ๋Ÿฐํƒ€์ž„ 2580์ดˆ
  • Jest 26.x: jest ํ…Œ์ŠคํŠธ์˜ ์ด ๋Ÿฐํƒ€์ž„ 3166์ดˆ

@leipert ํ˜น์‹œ jsdom ํ™˜๊ฒฝ์„ 14๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•ด ๋ณด์…จ๋‚˜์š”?

jest ๊ตฌ์„ฑ์˜ yarn add test-environment-jsdom-fourteen --dev + "testEnvironment": "test-environment-jsdom-fourteen" . ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์šฐ๋ฆฌ๋ฅผ ์œ„ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์ง€์† ์‹œ๊ฐ„ ์ฆ๊ฐ€(40-50% ์ถ”๊ฐ€)์— ๋Œ€ํ•œ ์ฑ…์ž„์ด ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด์ง€๋งŒ ์—ฌ๋Ÿฌ ํšŒ๊ท€๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

@pleunv jest 24.x ์—์„œ๋Š” jest-environment-jsdom-sixteen jsdom 16์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์›น ๊ตฌ์„ฑ ์š”์†Œ ํ…Œ์ŠคํŠธ์™€ ๊ด€๋ จ๋œ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๋กœ ์ธํ•ด ์—…๊ทธ๋ ˆ์ด๋“œํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๊ฐ€ ํ•˜๋Š” ์œ ์ผํ•œ ๋ณ€๊ฒฝ์€: jest 24.x + jest-environment-jsdom-sixteen -> jest.26x + jest-environment-jsdom ์ด๋ฏ€๋กœ jsdom ๋ฒ„์ „์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@wurstbonbon์ด ๋ฐœ๊ฒฌํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•ด https://github.com/nodejs/node/issues/35375 ์—…์ŠคํŠธ๋ฆผ์„ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค.

@SimenB ๋งˆ์ดํฌ๋กœ ๋งค์น˜ ์— ๋Œ€ํ•œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋Œ€์•ˆ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ํ•ด๋‹น ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋Š” ํ˜„์žฌ ๋ฐ˜๋…„ ์ด์ƒ ์นจ๋ฌตํ•˜๊ณ  ์žˆ์œผ๋ฉฐ https://github.com/micromatch/micromatch/issues/179 ์™€ ๊ฐ™์€ Jest์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์ฃผ์š” ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

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

@SimenB ๋ชจ๋“  ๋Œ€์•ˆ๋ณด๋‹ค ๋งˆ์ดํฌ๋กœ

๋‚ด๊ฐ€ ์—ฐ ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ”ํƒ•์œผ๋กœ Node์—์„œ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๋ฉด ์•ฝ๊ฐ„์˜ ์ž‘์—…์ด ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์œผ๋ฏ€๋กœ ์ง€๊ธˆ์€ Script ์‚ฌ์šฉ์œผ๋กœ ๋˜๋Œ๋ ค์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@leipert @wurstbonbon ๋˜๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ, node_modules/jest-runtime/build/index.js ์—์„œ ์ด ํŒจ์น˜๋ฅผ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

diff --git i/packages/jest-runtime/build/index.js w/packages/jest-runtime/build/index.js
index 851d8e12cd..7235082546 100644
--- i/packages/jest-runtime/build/index.js
+++ w/packages/jest-runtime/build/index.js
@@ -1170,35 +1170,24 @@ class Runtime {
       value: this._createRequireImplementation(localModule, options)
     });
     const transformedCode = this.transformFile(filename, options);
-    let compiledFunction = null; // Use this if available instead of deprecated `JestEnvironment.runScript`
+    let compiledFunction = null;
+    const script = this.createScriptFromCode(transformedCode, filename);
+    let runScript = null; // Use this if available instead of deprecated `JestEnvironment.runScript`

     if (typeof this._environment.getVmContext === 'function') {
       const vmContext = this._environment.getVmContext();

       if (vmContext) {
-        try {
-          compiledFunction = (0, _vm().compileFunction)(
-            transformedCode,
-            this.constructInjectedModuleParameters(),
-            {
-              filename,
-              parsingContext: vmContext
-            }
-          );
-        } catch (e) {
-          throw (0, _transform().handlePotentialSyntaxError)(e);
-        }
+        runScript = script.runInContext(vmContext, {
+          filename
+        });
       }
     } else {
-      const script = this.createScriptFromCode(transformedCode, filename);
-
-      const runScript = this._environment.runScript(script);
+      runScript = this._environment.runScript(script);
+    }

-      if (runScript === null) {
-        compiledFunction = null;
-      } else {
-        compiledFunction = runScript[EVAL_RESULT_VARIABLE];
-      }
+    if (runScript !== null) {
+      compiledFunction = runScript[EVAL_RESULT_VARIABLE];
     }

     if (compiledFunction === null) {

v8 ์ฝ”๋“œ ์ ์šฉ ๋ฒ”์œ„๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ์กฐ์ •ํ•ด์•ผ ํ•˜์ง€๋งŒ ๋‚ด์ผ์ด๋‚˜ ๋‹ค์Œ ์ฃผ์— PR์„ ์—ด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ์—์„œ Script ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํŒจ์น˜๋ฅผ ํ…Œ์ŠคํŠธํ–ˆ์œผ๋ฉฐ ๋‹ค์Œ์€ ์ œ๊ฐ€ ์–ป์€ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.
์‹œ๊ฐ„์€ min:sec

์ด๋ฆ„ | ์Šค์œ„ํŠธ 1 | ์Šค์œ„ํŠธ 2 | ์Šค์œ„ํŠธ 3 | ์Šค์œ„ํŠธ 4
-- | -- | -- | -- | --
๋†๋‹ด 24 | 3์‹œ 25๋ถ„ | 3์‹œ 30๋ถ„ | 3์‹œ 29๋ถ„ | 0:53
๋†๋‹ด 26 ํŒจ์น˜ | 3์‹œ 32๋ถ„ | 4์‹œ 36๋ถ„ | 3:48 | 0:53
๋†๋‹ด 26 ํŒจ์น˜๋˜์ง€ ์•Š์€ | 5์‹œ 10๋ถ„ | 6์‹œ 12๋ถ„ | 5์‹œ 11๋ถ„ | 1:07
26 ํŒจ์น˜ ๋Œ€ 24 | 4% | 31% | 9% | 1%
26 ํŒจ์น˜๋˜์ง€ ์•Š์€ ๋Œ€ 24 | 52% | 76% | 49% | 27%
26 ํŒจ์น˜ ๋Œ€ ํŒจ์น˜๋˜์ง€ ์•Š์€ | 46% | 35% | 36% | 25%

๋ฐ˜๋ณต | ์Šค์œ„ํŠธ 1 | ์Šค์œ„ํŠธ 2 | ์Šค์œ„ํŠธ 3 | ์Šค์œ„ํŠธ 4
-- | -- | -- | -- | --
๋†๋‹ด 24 - 1 | 2:58 | 3์‹œ 37๋ถ„ | 3์‹œ 33๋ถ„ | 0:47
๋†๋‹ด 24 - 2 | 3์‹œ 18๋ถ„ | 3์‹œ 34๋ถ„ | 3์‹œ 32๋ถ„ | 0:51
๋†๋‹ด 24 - 3 | 3์‹œ 27๋ถ„ | 3:08 | 3:48 | 0:59
๋†๋‹ด 24 - 4 | 3์‹œ 37๋ถ„ | 3์‹œ 44๋ถ„ | 3์‹œ 38๋ถ„ | 0:53
๋†๋‹ด 24 - 5 | 3์‹œ 45๋ถ„ | 3์‹œ 31๋ถ„ | 2:56 | 0:55
๋†๋‹ด 26 ํŒจ์น˜ - 1 | 3์‹œ 42๋ถ„ | 4์‹œ 31๋ถ„ | 4:08 | 0:57
๋†๋‹ด 26 ํŒจ์น˜ - 2 | 3์‹œ 11๋ถ„ | 4:18 | 3์‹œ 28๋ถ„ | 0:57
๋†๋‹ด 26 ํŒจ์น˜ - 3 | 3์‹œ 55๋ถ„ | 5์‹œ 12๋ถ„ | 3์‹œ 19๋ถ„ | 0:55
๋†๋‹ด 26 ํŒจ์น˜ - 4 | 3์‹œ 22๋ถ„ | 4์‹œ 25๋ถ„ | 4์‹œ 20๋ถ„ | 0:46
๋†๋‹ด 26 ํŒจ์น˜๋˜์ง€ ์•Š์Œ - 1 | 4์‹œ 30๋ถ„ | 6์‹œ 12๋ถ„ | 4:28 | 1:08
๋†๋‹ด 26 ํŒจ์น˜๋˜์ง€ ์•Š์Œ - 2 | 5:16 | 6์‹œ 17๋ถ„ | 5:18 | 1:05
๋†๋‹ด 26 ํŒจ์น˜๋˜์ง€ ์•Š์Œ - 3 | 5:46 | 6:07 | 5:49 | 1:09

๋ชจ๋“  ํ…Œ์ŠคํŠธ๋Š” ๋™์ผํ•œ ์ปค๋ฐ‹ ๋ฐ ์œ ์‚ฌํ•œ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ(Azure DevOps Hosted Ubuntu 18)์—์„œ ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ์—์„œ ๋†๋‹ด์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ๋งŒ ์‹œ๊ฐ„์„ ๋“ค์˜€์Šต๋‹ˆ๋‹ค.
๋‚ด ์ œํ’ˆ๊ตฐ์˜ ๋Œ€๋ถ€๋ถ„์€ ๋ณธ์งˆ์ ์œผ๋กœ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค(๋ชจ๋“  ๋ฐฑ์—”๋“œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ).

๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜์žˆ๋Š” ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด Script ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŒจ์น˜๋Š” ์„ฑ๋Šฅ์— ํฐ ์ฐจ์ด๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
Suite 2 ์˜ ๊ฐ์†์ด ์ด์ƒ๊ฐ’์ธ์ง€ ์‹ค์ œ ํšŒ๊ท€์ธ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(4ํšŒ๋งŒ ์‹คํ–‰).
์—ฌ์ „ํžˆ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ๋‚˜์˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

v26์ด v24์—์„œ ์—ฌ์ „ํžˆ ๊ฐœ์„ ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค...

@์…€๋ฃฐ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค - ์‹œ๊ฐ„์ด ๋‚˜๋ฉด PR์„ ์ž‘์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฉ‹์ง„ ๋ฌผ๊ฑด! ๊ทธ๋Ÿฌ๋ฉด Micromatch ๋ฌธ์ œ๋งŒ ๋‚จ๊ณ  repo๊ฐ€ โ€‹โ€‹๋‹ค์‹œ ํ™œ์„ฑ ์œ ์ง€ ๊ด€๋ฆฌ๋ฅผ ๋ฐ›๊ฒŒ ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

BTW, JSDOM์—๋„ ์„ฑ๋Šฅ ํšŒ๊ท€๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ํฐ ์›น ํ”„๋กœ์ ํŠธ์—์„œ ๊ทธ๋Ÿฐ ํ…Œ์ŠคํŠธ๋ฅผ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ. ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ํŒจ์น˜๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๊ทธ๋ ‡๊ฒŒ ๋ณด์˜€๋‹ค.

Jest 24  (testEnvironment: "jsdom") (no rewires latest CRA)
144.014s

Jest 24 (testEnvironment: "jest-environment-jsdom-sixteen") (rewire latest CRA that changes testEnvironment)
409.473s (also few failed tests)

Jest 26 (testEnvironment: "jsdom") (no rewires latest CRA) so old jsdom? Whatever is the default for Jest 26 I assume? (I used react-app-rewired to rewire jest config and pnpmfile.js to override what version of Jest was installed with `react-scripts` as it still ships Jest 24 (like resolutions in yarn))
310.275s

Jest 26 (testEnvironment: "jest-environment-jsdom-sixteen") (rewire latest CRA that changes testEnvironment + pnpmfile.js)
over 1200s+ (some tests failed plus test run just stuck forever)

ํ™•์‹คํžˆ ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ๋งค์šฐ ๋ชจํ˜ธํ•˜๊ณ  ๋ถˆ์•ˆ์ •ํ•œ ์„ฑ๋Šฅ ๋ณด๊ณ ์„œ์ด์ง€๋งŒ ๋ชจ๋“  ์ž…๋ ฅ์ด ๋„์›€์ด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. :)

https://github.com/facebook/jest/releases/tag/v26.5.0 ์—๋Š” ์—ฌ๊ธฐ์— ๋…ผ์˜๋œ vm.Script ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

(ํŽธ์ง‘: ์ถ”๊ฐ€ ์‹คํ–‰ ํ›„ ์—…๋ฐ์ดํŠธ๋จ)

๋™์ผํ•œ ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ์— ๋Œ€ํ•œ ์˜ˆ๋น„ ๊ฒฐ๊ณผ:

๋†๋‹ด 26.5
๊ฐ๊ธฐ: 59.992
ํ•ซ: 43.976

๋†๋‹ด 26.4:
๊ฐ๊ธฐ: 90.213
ํ•ซ: 47.408

์ฝœ๋“œ ๋Ÿฐ์—์„œ ๋งค์šฐ ์ค‘์š”ํ•œ ์†๋„ ํ–ฅ์ƒ <3

๋‚ด ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ์˜ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋†๋‹ด 26.5
๊ฐ๊ธฐ: 149์ดˆ

๋†๋‹ด 26.4
๊ฐ๊ธฐ: 226์ดˆ

์ข‹์€ ์†Œ์‹์ž…๋‹ˆ๋‹ค ๐Ÿ™‚ ๋งˆ์ดํฌ๋กœ๋งค์น˜ ํšŒ๊ท€๋กœ ๋Œ์•„๊ฐ„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

npm-force-resolutions ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ micromatch 3๋ฅผ ๊ฐ•์ œ ์„ค์น˜ํ•˜๋Š” ๊ฒฝ์šฐ [email protected] ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// package.json
  ...
  "preinstall": "npx npm-force-resolutions",
  ..
  "resolutions": {
    "micromatch": "^3.0.0"
  }

ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์‹œ ์˜ค๋ฅ˜:

TypeError: _micromatch(...).default.scan is not a function
    at globs.map.glob (/home/travis/build/removed/node_modules/jest-util/build/globsToMatcher.js:65:47)
    at Array.map (<anonymous>)
    at globsToMatcher (/home/travis/build/removed/node_modules/jest-util/build/globsToMatcher.js:61:26)
    at new SearchSource (/home/travis/build/removed/node_modules/@jest/core/build/SearchSource.js:197:49)
    at contexts.map.context (/home/travis/build/removed/node_modules/@jest/core/build/runJest.js:265:16)
    at Array.map (<anonymous>)
    at runJest (/home/travis/build/removed/node_modules/@jest/core/build/runJest.js:264:34)
    at startRun (/home/travis/build/removed/node_modules/@jest/core/build/cli/index.js:479:35)
    at runWithoutWatch (/home/travis/build/removed/node_modules/@jest/core/build/cli/index.js:494:10)
    at _run10000 (/home/travis/build/removed/node_modules/@jest/core/build/cli/index.js:416:13)
npm ERR! Test failed.  See above for more details.

@SimenB ์—…๋ฐ์ดํŠธ ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. [email protected] ์—…๋ฐ์ดํŠธํ•œ ํ›„ Travis์—์„œ ์‹คํ–‰ ์‹œ๊ฐ„์˜ 20%๋ฅผ ์ ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ:

v26.5์ž…๋‹ˆ๋‹ค

  • 323.98์ดˆ
  • 321.24์ดˆ

v24.9์ž…๋‹ˆ๋‹ค

  • 262.17์ดˆ
  • 275.96์ดˆ

@SimenB ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ด๊ฒƒ์€ ๋†€๋ž๋‹ค. ~2000๊ฐœ ์ œํ’ˆ๊ตฐ์—์„œ ~22000๊ฐœ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ:

  • Jest 24.x: 2864์ดˆ
  • Jest 26.5.2: 2967์ดˆ

์ด๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ด์ „์— ๋ณธ ~27% ๊ฐ์†๊ณผ ๋น„๊ตํ•˜์—ฌ ์•ฝ 3% ๋Š๋ฆฌ๋ฏ€๋กœ ์˜ค์ฐจ ๋ฒ”์œ„์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ๋ณ‘ํ•ฉ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. https://gitlab.com/gitlab-org/gitlab/-/merge_requests/33252#note_425616404

Jest 26.5.2 ๋ฐ Node 14(์ด์ „์—๋Š” Node 10์— ์žˆ์—ˆ์Œ)๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•œ ํ›„ ์ด์ „์— ๊ฒช์—ˆ๋˜ ๋ชจ๋“  "๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ" ๋ฌธ์ œ ๊ฐ€ ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค. Jest์™€ Node๋กœ ์ธํ•ด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ๋น„์Šทํ•œ ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ  ์žˆ๋‹ค๋ฉด ๋‘˜ ๋‹ค๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•ด ๋ณด์‹ญ์‹œ์˜ค.

์—…๋ฐ์ดํŠธ : ์‹ ๊ฒฝ ์“ฐ์ง€ ๋งˆ์„ธ์š”. OOM ์˜ค๋ฅ˜๊ฐ€ ๋‹ค์‹œ ๋ฐœ์ƒํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๋žฉํ†ฑ์ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๊ณ„์„ ์— ์žˆ๊ณ  ์ฒ˜์Œ ๋ช‡ ๋ฒˆ ์‹คํ–‰์€ ์ข‹์•˜์ง€๋งŒ ์ง€๊ธˆ์€ ๋‹ค์‹œ ์ฃฝ์–ด๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ 24.xx๋ฅผ ๊ณ ์ˆ˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. :(

๋ˆ„๊ตฐ๊ฐ€ ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด JSDOM์— ๋น„ํ•ด ์„ฑ๋Šฅ์ด ๋งค์šฐ ์ข‹์€ DOM์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. Jest๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

| ์šด์˜ | JSDOM | ํ–‰๋ณตํ•œ DOM |
| ------------------------------------ | ------- | ---------- |
| ๊ฐ€์ ธ์˜ค๊ธฐ / ํ•„์š” | 333ms | 45ms |
| HTML ๊ตฌ๋ฌธ ๋ถ„์„ | 256ms | 26ms |
| HTML ์ง๋ ฌํ™” | 65ms | 8ms |
| ์‚ฌ์šฉ์ž ์ •์˜ ์š”์†Œ ๋ Œ๋”๋ง | 214ms | 19ms |
| querySelectorAll('ํƒœ๊ทธ ์ด๋ฆ„') | 4.9ms | 0.7ms |
| querySelectorAll('.class') | 6.4ms | 3.7ms |
| querySelectorAll('[์†์„ฑ]') | 4.0ms | 1.7ms |
| querySelectorAll('[ํด๋ž˜์Šค~="์ด๋ฆ„"]') | 5.5ms | 2.9ms |
| querySelectorAll(':n๋ฒˆ์งธ ์ž์‹(2n+1)') | 10.4ms | 3.8ms |

ํ”„๋กœ์ ํŠธ ๋งํฌ:
https://github.com/capricorn86/happy-dom/

@capricorn86 ์ด์˜๋„ค์š”. ์‚ฌ์–‘์„ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๊นŒ?

@capricorn86 ์ด์˜๋„ค์š”. ์‚ฌ์–‘์„ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๊นŒ?

@milesj ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๊ตฌํ˜„๋œ ๊ธฐ๋Šฅ์€ ์‚ฌ์–‘์— ๋”ฐ๋ผ ๊ตฌํ˜„๋˜์—ˆ์ง€๋งŒ ์•„์ง ์–ด๋–ค ์‚ฌ์–‘์ด ์ ์šฉ๋˜๋Š”์ง€์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๊ฐœ์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ํ•  ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

DOM์˜ ์ดˆ๊ธฐ ๋ชฉํ‘œ๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์— ํ•„์š”ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์›น ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ข‹์€ ์„ฑ๋Šฅ์œผ๋กœ ์„œ๋ฒ„ ์ธก์—์„œ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

FWIW, ๋ฐฉ๊ธˆ Jest 24.9์˜ react-scripts@3 @react-scripts@4 ์—์„œ Jest 26.6์˜

์šฐ๋ฆฌ์˜ ์„œ๋ฒ„ API ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ๋Š” ์ด์ „์— ์•ฝ 180-190์ดˆ ๋™์•ˆ ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Jest 26.6์œผ๋กœ ์ „ํ™˜ํ•œ ํ›„ ์ง€์†์ ์œผ๋กœ ์•ฝ 220์ดˆ๊ฐ€ ์†Œ์š”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. minimatch ๋ฅผ 4.0.2 ๊ฐ•์ œ๋กœ ํ•ด๊ฒฐํ•˜๋ ค๊ณ ๋„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ๋Ÿฌ๋„ˆ๋ฅผ jest-circus ์ „ํ™˜ํ•˜๋ฉด ๋ช‡ ์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์ „๋ฐ˜์ ์œผ๋กœ 26.6์€ ๋ˆˆ์— ๋„๊ฒŒ ๋Š๋ ค์ง‘๋‹ˆ๋‹ค.

react-scripts@4 ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ fwiw๋กœ jest-circus ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ micromatch ๊ฐ€ ์•„๋‹ˆ๋ผ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” minimatch ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ #10131์„ ํ†ตํ•ด micromatch ๋กค๋ฐฑ์„ ์ค‘๋‹จํ•œ ๊ฒƒ ๊ฐ™์œผ๋ฏ€๋กœ ๋” ์ด์ƒ ํšŒ๊ท€์˜ ์›์ธ์ธ์ง€ ํ…Œ์ŠคํŠธํ•˜๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@SimenB : atm์— ์ด์ƒํ•œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์„ค์ •์ด ์žˆ์Šต๋‹ˆ๋‹ค. CRA๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œํ•˜๋„๋ก ๋ณ€ํ™˜ ํ•œ ๋ ˆ๊ฑฐ์‹œ MEAN/AngularJS ์•ฑ์ž…๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ๊ตฌ์„ฑ์€ ๊ธฐ๋ณธ ์ œ๊ณต CRA Jest ๊ตฌ์„ฑ๊ณผ ๋น„๊ตํ•˜์—ฌ ๋ชจ๋‘ ์šฐ๋ฆฌ ์ž์‹ ์˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” CRA๊ฐ€ Jest์™€ ํ•จ๊ป˜ ์ข…์†์„ฑ์œผ๋กœ ์ œ๊ณต๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ด์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ATM ์•ž์— ๋‚ด ์ž‘์—… ์ƒ์ž๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ micromatch ์˜๋ฏธํ–ˆ๋Š”์ง€ ๋˜๋Š” ์‹ค์ œ๋กœ ๊ฑฐ๊ธฐ์— ์ž˜๋ชป๋œ ํŒจํ‚ค์ง€ ์ด๋ฆ„์— ์ง‘์ค‘ํ–ˆ๋Š”์ง€ ๊ธฐ์–ตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. :) ์‚ดํŽด๋ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์ฃผ์— ๋‹ค์‹œ.

๋ฐฉ๊ธˆ v26์ด macOS์˜ ๊ธฐ๋ณธ ํ„ฐ๋ฏธ๋„๋ณด๋‹ค iTerm์—์„œ _๋งŽ์ด_ ๋Š๋ฆฌ๊ฒŒ ์‹คํ–‰๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 6500๊ฐœ์˜ ํ…Œ์ŠคํŠธ ์„ธํŠธ์—์„œ ์ผ๊ด€๋˜๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.

  • v24, ํ„ฐ๋ฏธ๋„: ~90s
  • v24, iTerm2: ~90๋…„๋Œ€
  • v26, ํ„ฐ๋ฏธ๋„: ~110s
  • v26, iTerm2: ~150์ดˆ

์ด๊ฒƒ์€ ์†๋„ ์ €ํ•˜๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๊ฐ€์ง€๋ฅผ ์‹œ๋„ํ•œ ๋ช‡ ๋‹ฌ ํ›„ ๋‚ด ๋งˆ์Œ์„ ์กฐ๊ธˆ ๋‚ ๋ ค ๋ฒ„๋ ธ๋‹ค. Mac์—์„œ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์ด๊ฒƒ์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์ฐธ๊ณ ๋กœ ์ด๊ฒƒ์€ v26์˜ jsdom@14 ์ž…๋‹ˆ๋‹ค.

@pleunv ๋‚˜๋Š” ์ด๊ฒƒ์ด ๊ด€๋ จ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค: https://github.com/facebook/jest/pull/9294. ํ•˜์ดํผ๋งํฌ๊ฐ€ ๋‚ด ์ปดํ“จํ„ฐ์˜ iTerm2๋ฅผ ๋Š๋ฆฌ๊ฒŒ ๋งŒ๋“ค์–ด ๊ณ ๋ฅด์ง€ ๋ชปํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ „๋ฐ˜์ ์ธ ์‹คํ–‰ ์†๋„๋ฅผ ์กฐ์‚ฌํ•˜์ง€ ์•Š์•˜์œผ๋ฉฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

์œ ๋ ˆ์นด. "iTerm"์„ ๊ฒ€์ƒ‰ํ•˜๋ฉด ์ด PR์ด ๋‚˜์˜ต๋‹ˆ๋‹ค . ๋‚˜๋Š” ์ด์ „์— ์ด๋Ÿฌํ•œ ๋ฐ‘์ค„์„ ์•Œ์•„์ฐจ๋ ธ๊ณ  ๊ทธ๊ฒƒ์ด ํ•˜์ดํผ๋งํฌ๋ผ๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ PR์„ ๋ณธ ํ›„ iTerm์—์„œ ํ•˜์ดํผ๋งํฌ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜์—ฌ ๋Ÿฐํƒ€์ž„์„ 130์ดˆ๋กœ ๋‚ฎ์ท„์Šต๋‹ˆ๋‹ค. PR์—์„œ ์ฝ”๋“œ๋ฅผ ์ ์šฉํ•˜๊ณ  ํ•˜์ดํผ๋งํฌ๋ฅผ ์ œ๊ฑฐํ•œ ํ›„ ๋‹ค์‹œ 120์ดˆ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ์ด์„ฑ์ด ์•ฝ๊ฐ„ ํšŒ๋ณต๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

PR์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

ํŽธ์ง‘: @thymike ๊ฐ€ ์ €๋ฅผ ์ด๊ฒผ์Šต๋‹ˆ๋‹ค ๐Ÿ˜„

@pleunv ์ด๋ฒˆ ์ฃผ์— ์‹œ๊ฐ„์„ ๋‚ด์„œ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค๋„๋ก ๋…ธ๋ ฅํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ๊ฑฐ๋ž˜๋Š” iTerm์— ๋Œ€ํ•ด ์ด ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ Linux์˜ ๋‹ค๋ฅธ ํ„ฐ๋ฏธ๋„์—๋Š” ํ•˜์ดํผ๋งํฌ์— ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. iTerm ํ”„๋กœ์ ํŠธ์— ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋ฐฉ๊ธˆ์ด ๋ณ€๊ฒฝ์„ ์ˆ˜ํ–‰ํ–ˆ์œผ๋ฉฐ ๋‹จ์ผ ํ…Œ์ŠคํŠธ ํŒŒ์ผ์— ๋Œ€ํ•ด 1์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. URL์„ ๊ณ„์† ํด๋ฆญํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋” ์ด์ƒ ๋ฐ‘์ค„์ด ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
image

์ด๊ฒƒ์€ ๋” ํฐ ์‹คํ–‰์— ๋Œ€ํ•ด ๊ฑฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. โค๏ธ

//ํŽธ์ง‘ํ•˜๋‹ค
์›ƒ๊ธด ๊ฒƒ์€ ๊ทธ๊ฒƒ์ด ํ…€์ด๋“  ํ„ฐ๋ฏธ๋„์ด๋“  ์ด์ „์—๋Š” ์•„๋ฌด๋Ÿฐ ์ฐจ์ด๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ํ›„ ๋‚˜๋ฅผ ์œ„ํ•ด ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค.

@pleunv ์ด๋ฒˆ ์ฃผ์— ์‹œ๊ฐ„์„ ๋‚ด์„œ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค๋„๋ก ๋…ธ๋ ฅํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ๊ฑฐ๋ž˜๋Š” iTerm์— ๋Œ€ํ•ด ์ด ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ Linux์˜ ๋‹ค๋ฅธ ํ„ฐ๋ฏธ๋„์—๋Š” ํ•˜์ดํผ๋งํฌ์— ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. iTerm ํ”„๋กœ์ ํŠธ์— ๋ฌธ์ œ๋ฅผ ์ œ์ถœํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์—ฌ๊ธฐ ์—์„œ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค(GitLab์— ์žˆ์Œ). ๋ˆ„๊ตฐ๊ฐ€ ์ถ”๊ฐ€ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด๋‚˜ ์žฌํ˜„ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์œผ๋ฉด ์ž์œ ๋กญ๊ฒŒ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

๊ทธ ์‚ฌ์ด์— ์ข€ ๋” ์‹คํ—˜์„ ํ•ด๋ณด๋‹ˆ ๋” ์ž‘์€ ํ…Œ์ŠคํŠธ ํ•˜์œ„ ์ง‘ํ•ฉ(20๊ฐœ ํ…Œ์ŠคํŠธ ํŒŒ์ผ)์—์„œ๋งŒ ์‹คํ–‰ํ•  ๋•Œ ํ•˜์ดํผ๋งํฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ํฐ ์ฐจ์ด๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์ „์ฒด ์„ธํŠธ(700๊ฐœ ํŒŒ์ผ)์—์„œ ์‹คํ–‰ํ•  ๋•Œ ๊ทธ ์˜ํ–ฅ์€ ๋งค์šฐ ์ธก์ • ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ์žฅ๊ธฐ์ ์œผ๋กœ jest์˜ ์ฝ˜์†” ์ถœ๋ ฅ์ด ์ •๋ง ๊ธ€๋ฆฌ์น˜/ํ”Œ๋ž˜์‹œ๊ฐ€ ๋˜๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค๋Š” ์ธ์ƒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ•˜๋‹จ์˜ ์ง„ํ–‰ ๋ผ์ธ์€ ๋ณด์ด๋Š” ๊ฒƒ๋ณด๋‹ค ์ˆจ๊ฒจ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

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