์ฐ๋ฆฌ๋ jest๋ฅผ 24์์ 25๋ก ์
๊ทธ๋ ์ด๋ํ๊ณ ์ ํจ์ค์์ ๋จ์ ํ
์คํธ๊ฐ 5๋ถ 23์ด์์ 11๋ถ์ด ๋๊ฒ ๊ฑธ๋ฆฌ๋ ๊ฒ์ ๋ณด์์ต๋๋ค. ์
๊ทธ๋ ์ด๋์์ ๋ช ๊ฐ์ง ์ค๋
์ท ํ
์คํธ๋ง ์ค๋จ๋์์ต๋๋ค. ์ฐ๋ฆฌ๋ -u
ํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ฌ๊ฐํ ํ๊ท imo์
๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ดํดํ๋๋ก ๋์์ฃผ์ธ์. ํญ์ ์ต์ ๋ฒ์ ์ ์คํํ๋๋ก CI์ ์บ์๋ฅผ ์ง์๋๋ค.
ํ๊ท๊ฐ ๋ฌด์์ธ์ง์ ๋ํ ๋ช
ํํ๊ณ ๊ฐ๊ฒฐํ ์ค๋ช
.
์คํ ์๊ฐ์ด 5:23์์ 11:00์ผ๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค.
24.8.0
๋ฒ์ ๊น์ง ์์
:
24.8.0
๋ฒ์ ์์ ์๋ ์ค์ง:
25.1.0
์ฃ์กํฉ๋๋ค. ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๊ณต์ ํ ์ ์์ต๋๋ค.
๋์์ ์ฌํํ๋ ๋จ๊ณ:
์์ํ๋ ์ผ์ ๋ํ ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ ์ค๋ช .
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
ํด๋ณดํด์ ๋ฏธ์ํ์ง๋ง
์ฃ์กํฉ๋๋ค. ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๊ณต์ ํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ์๋ฌด๊ฒ๋ ํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด๊ฒ์ ๋ด๊ฐ 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]
์ ํจ๊ป[email protected]
์ ํจ๊ป[email protected]
์ ํจ๊ป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
๋ณด๋ค ์ฌ์ ํ ๋๋ฆฝ๋๋ค.
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๋ณด๋ค ์ฌ์ ํ ์๋นํ ๋๋ฆฝ๋๋ค.
@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์ ๋๋ค
v24.9์ ๋๋ค
@SimenB ๊ฐ์ฌํฉ๋๋ค! ์ด๊ฒ์ ๋๋๋ค. ~2000๊ฐ ์ ํ๊ตฐ์์ ~22000๊ฐ ํ ์คํธ์ ๋ํ ๊ฒฐ๊ณผ:
์ด๋ ์ฐ๋ฆฌ๊ฐ ์ด์ ์ ๋ณธ ~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๊ฐ์ ํ ์คํธ ์ธํธ์์ ์ผ๊ด๋๊ฒ ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ต๋๋ค.
์ด๊ฒ์ ์๋ ์ ํ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ๋ฌ ๊ฐ์ง๋ฅผ ์๋ํ ๋ช ๋ฌ ํ ๋ด ๋ง์์ ์กฐ๊ธ ๋ ๋ ค ๋ฒ๋ ธ๋ค. 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์ ๊ณ์ ํด๋ฆญํ ์ ์์ผ๋ฉฐ ๋ ์ด์ ๋ฐ์ค์ด ํ์๋์ง ์์ต๋๋ค.
์ด๊ฒ์ ๋ ํฐ ์คํ์ ๋ํด ๊ฑฐ๋ํ ์ ์์ต๋๋ค. โค๏ธ
//ํธ์งํ๋ค
์๊ธด ๊ฒ์ ๊ทธ๊ฒ์ด ํ
์ด๋ ํฐ๋ฏธ๋์ด๋ ์ด์ ์๋ ์๋ฌด๋ฐ ์ฐจ์ด๊ฐ ์์์ต๋๋ค. ๋ณ๊ฒฝ ํ ๋๋ฅผ ์ํด ๋ ๋น ๋ฆ
๋๋ค.
@pleunv ์ด๋ฒ ์ฃผ์ ์๊ฐ์ ๋ด์ ๋ค์ ๊ฐ์ ธ์ค๋๋ก ๋ ธ๋ ฅํ๊ฒ ์ต๋๋ค. ์ค์ ๊ฑฐ๋๋ iTerm์ ๋ํด ์ด ๋ฌธ์ ๋ฅผ ์์ ํ๋ ๊ฒ์ด์ง๋ง Linux์ ๋ค๋ฅธ ํฐ๋ฏธ๋์๋ ํ์ดํผ๋งํฌ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. iTerm ํ๋ก์ ํธ์ ๋ฌธ์ ๋ฅผ ์ ์ถํ์๊ฒ ์ต๋๊น?
์ฌ๊ธฐ ์์ ๋ฌธ์ ๋ฅผ ๋ง๋ค์์ต๋๋ค(GitLab์ ์์). ๋๊ตฐ๊ฐ ์ถ๊ฐ ์ธ๋ถ ์ฌํญ์ด๋ ์ฌํ ํ๋ก์ ํธ๊ฐ ์์ผ๋ฉด ์์ ๋กญ๊ฒ ์ถ๊ฐํ์ญ์์ค.
๊ทธ ์ฌ์ด์ ์ข ๋ ์คํ์ ํด๋ณด๋ ๋ ์์ ํ ์คํธ ํ์ ์งํฉ(20๊ฐ ํ ์คํธ ํ์ผ)์์๋ง ์คํํ ๋ ํ์ดํผ๋งํฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ํฐ ์ฐจ์ด๋ฅผ ๋ง๋ค์ง ์๋๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ์ ์ฒด ์ธํธ(700๊ฐ ํ์ผ)์์ ์คํํ ๋ ๊ทธ ์ํฅ์ ๋งค์ฐ ์ธก์ ๊ฐ๋ฅํฉ๋๋ค.
๋๋ ๋ํ ์ฅ๊ธฐ์ ์ผ๋ก jest์ ์ฝ์ ์ถ๋ ฅ์ด ์ ๋ง ๊ธ๋ฆฌ์น/ํ๋์๊ฐ ๋๊ธฐ ์์ํ๋ค๋ ์ธ์์ ๋ฐ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ํ๋จ์ ์งํ ๋ผ์ธ์ ๋ณด์ด๋ ๊ฒ๋ณด๋ค ์จ๊ฒจ์ ธ ์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@SimenB 24.9์ 25.1 ์ฌ์ด์ ์ฑ๋ฅ ํ๊ท๊ฐ ๋์ ๋ ์์น๋ฅผ ์ฐพ๊ธฐ ์ํด
git bisect
๋ฅผ ์ํํ์ต๋๋ค. 24.9์์ 26.1๊น์ง ์์ ์์ด ์คํ๋๊ธฐ ๋๋ฌธ์ ๋ ์์ ํ ์คํธ๋ฅผ ์ฌ์ฉํ์ต๋๋ค.๋นํ์ฑํ๋ ์บ์์ js ํ์ ์งํฉ์ ์ธ ๋ฒ ์คํ(์ธ์ ๊ฐ ์์ ์ ์ํด)์ ๋์ ๋ฐํ์์ ๋น๊ตํ์ต๋๋ค. ๋ ํน๋ณํ ๋ด๊ฐ ์ฌ์ฉํ๋ ๋ช ๋ น์ ๋ ธ๋ 10.19์์ (
yarn run jest --no-cache tests/js/
)์ด์์ต๋๋ค. ๋ ธ๋ 10์ด 24.9์ ๊ถ์ฅ ๋ฒ์ ์ด์๊ธฐ ๋๋ฌธ์ ๋๋ค.๊ฒฐ๊ณผ:
compileFunction
๊ฐ ์ ์๋์ง ์์ ๊ฒฝ์ฐ ๋์ฒด๊ฐ ์์ผ๋ฏ๋ก ad5377333daf6716af3465bba39f86b7db485e2b์์compileFunction
๋ถ๊ธฐ๋ฅผ ์ ๊ฑฐํ์ฌ ์ฑ๋ฅ์ ๋ณต์ํ์ต๋๋ค.26.1์ ๋ณด๋ฉด ์ฝ๋๊ฐ ์ฝ๊ฐ ์ด๋ํ์ง๋ง
compileFunction
๋ฐ ๋์ฒด๊ฐ ์ฌ์ ํ ์์ต๋๋ค. ๊ทธ๋์:์ฆ,
compileFunction
๋ถ๊ธฐ( patch )๋ฅผ ์ ๊ฑฐํ๋ฉด 26.1์ด 24.9์ ๋ฐํ์์ผ๋ก ๋์๊ฐ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ํด๊ฒฐ์ฑ ์ด ์๋๋ผ๊ณ ํ์ ํ์ง๋ง ์ ์ด๋ ์ฐ๋ฆฌ๋ ํจ๊ป ์ผํด์ผ ํฉ๋๋ค.