์ด๊ฒ๋ ํ์ํฉ๋๋ค. ๋๊ตฐ๊ฐ๊ฐ ๋๋ฅผ ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ผ๋ก ์๋ดํ ์ ์๋ค๋ฉด ๊ธฐ๊บผ์ด ํ ๋ฆฌํ์คํธ๋ฅผ ์ํํ ๊ฒ์ ๋๋ค.
@ SegFaultx64 ์ด ๋ฌธ์ ์ ๋ํ ์ฒซ ๋ฒ์งธ ๊ฒ์๋ฌผ์์ schettino72๊ฐ ์ ๊ณตํ URL์ "์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ"์ ๋๋ค.
๊ณตํํ๊ฒ, ๋๋ ์ฐ๋ฆฌ๊ฐ ์ด ํฐ ํ๋ก์ ํธ์ ์ด๋ป๊ฒ ๊ด์ฐฐ์๋ฅผ ๋ฑ๋กํ ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ทธ๋ฐ ๋ฌผ๊ฑด์ ๋ณด๊ดํ๋ ๊ณณ์ด ์์ต๋๊น?
@ SegFaultx64 jsdom์ ํด๋น ๋ถ๋ถ์ ๋ณด์ง ์์๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ด ๋ฌด์์ธ์ง ๋ช ํํ์ง ์์ต๋๋ค. NS ๋ฉ์๋๋ฅผ ์์ ํ๋ ์์ ์ ํ ๋(#727 ์ฐธ์กฐ; ๋ช ๋ชฉ์ ๋ฒ๊ทธ ์์ ์ด์ง๋ง jsdom์ ๋ด์ฅ์ ์๋นํ ๋ณ๊ฒฝ์ด ํ์ํ์ต๋๋ค) ๋๋ ์ ์ฌํ ๊ตฌ์กฐ๋ฅผ ์ฐพ๊ณ ์๋ก์ด ํด๋์ค/๋ฐ์ดํฐ/ ๋ฑ. ๋๋ ๋ด๊ฐ ๊ฐ์ฅ ์ข๋ค๊ณ ์๊ฐํ๋ ๋๋ก ์งํํ๊ณ , Domenic์ ๋ช ๊ฐ์ง ์๊ฒฌ์ ๋งํ๊ณ , ๋๋ ์กฐ์ ์ด ํ์ํ ๋ถ๋ถ์ ์กฐ์ ํ๊ณ ๊ทธ๊ฒ ์ ๋ถ์์ต๋๋ค.
@lddubeau ๋ค, ํฌ์ธํฐ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ค์ ๋ก MutationObserver https://github.com/megawac/MutationObserver.js/blob/master/MutationObserver.js์ ๋ํ ๋ฉ์ง shim์ ์ฐพ์์ต๋๋ค
๋ด ์ ์ผํ ์กฐ์ธ์ https://dom.spec.whatwg.org/ ๋ฅผ ์ ๋ ํ๊ณ ๋์ฐ๋ณ์ด ๋ ์ฝ๋๊ฐ ๋๊ธฐ์ด์ ์๋ ์์น์ ๋ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ดํด๋ณด๋ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ฌ์ ํ ์๋ก์ด DOM ํ์ค์ผ๋ก ์ ํํ๊ณ ์๊ธฐ ๋๋ฌธ์ jsdom์์ ์ ์ ํ ๋์๋ฌผ์ ์ฐพ๋ ๊ฒ์ด ๊น๋ค๋ก์ธ ์ ์์ง๋ง ์ ์ด๋ ์ฌ์์ ๊ตฌํํด์ผ ํ ์ฌํญ์ ๋ํ ์ง์นจ์ ์ ๊ณตํ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
@kresli ํ ๋ฆฌํ์คํธ๋ฅผ ํ์ํฉ๋๋ค!
์ด๋ป๊ฒ ํด์ผํ ์ง ๋ชจ๋ฅด๊ฒ ์ผ๋ ๋ช๊ฐ์ง ์คํ์ ํด๋ณด๊ธฐ๋ก ํ์ต๋๋ค. ์ต์ ์ ๊ฒฝ์ฐ๋ ๋ด๊ฐ ์กฐ๊ธ ๋ฐฐ์ฐ๊ณ , ์ต์ ์ ๊ฒฝ์ฐ๋ ๋ด๊ฐ ๊ธฐ์ฌํ ์ ์์ ๊ฒ์ ๋๋ค.
์ ๋ ํ์ฌ jsdom์ด ์ด๋ป๊ฒ ๊ตฌ์ฑ๋์ด ์๊ณ webidl์ด ์ด๋ป๊ฒ ์๋ํ๋์ง(๊ทธ๋ฆฌ๊ณ jsdom์์ ์ฌ์ฉ๋๋์ง) ์ดํดํ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค.
MutationObserver: https://dxr.mozilla.org/mozilla-central/source/dom/webidl/MutationObserver.webidl~~~
์ด์ ์กฐ๊ธ ๋ ์ ์ดํดํฉ๋๋ค. ์ฌ์ฉํ ์ธํฐํ์ด์ค๋ ์ฌ๊ธฐ์ ์ค๋ช ๋ ๊ฒ์ด์ด์ผ ํฉ๋๋ค. https://dom.spec.whatwg.org/#interface -mutationobserver - ๋ง์ต๋๊น?
@henrikkorsgaard ๋ง์ต๋๋ค! jsdom์์ ์๋ํ๊ฒ ํ๋ ค๋ฉด ๋ช ๊ฐ์ง ์์ ๋ถํฐ ์์ํด์ผ ํฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ impl ํด๋์ค์์ ๊ด์ฐฐ, ์ฐ๊ฒฐ ํด์ ๋ฐ takeRecords ๋ฉ์๋์ ์์ฑ์๋ฅผ "๊ทธ๋ฅ" ๊ตฌํํด์ผ ํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๊ฐ๋ฅํ ํ ์ฌ์์ ๋ฐ๋ฅด๋๋ก ๋ ธ๋ ฅํด์ผ ํฉ๋๋ค. ( @Sebmaster , ์์ฑ์๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ ์ ์์ต๋๊น?)
์ด ๊ฒฝ์ฐ CharacterData์ ๊ฐ์ ๋จ์ํ ๊ฒ๊ณผ ๋ฌ๋ฆฌ ๋ง์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ค๋ฅธ jsdom impl ํ์ผ์ ์์ ํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ฌ์์๋ "๊ฐ ๋ ธ๋์๋ ๋ฑ๋ก๋ ๊ด์ฐฐ์์ ๊ด๋ จ ๋ชฉ๋ก์ด ์์ต๋๋ค."๋ผ๊ณ ๋์ ์์ต๋๋ค. ์ด๋ฅผ ์ํด์๋ Node impl์ ์ธ์คํด์ค ๋ณ์๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
์ฌ์์ ๋ํ "๊ด๋ จ๋ ์ ์ฌ ์ถ์ฒ ๋ธ๋ผ์ฐ์ง ์ปจํ ์คํธ์ ๊ฐ ๋จ์์๋ ์ด๊ธฐ์ ์ค์ ๋์ง ์์ ๋์ฐ๋ณ์ด ๊ด์ฐฐ์ ๋ณตํฉ ๋ง์ดํฌ๋กํ์คํฌ ๋๊ธฐ์ด ํ๋๊ทธ์ ์ด๊ธฐ์ ๋น์ด ์๋ ๊ด๋ จ MutationObserver ๊ฐ์ฒด ๋ชฉ๋ก์ด ์์ต๋๋ค."๋ผ๊ณ ๋งํฉ๋๋ค. jsdom์์ "๊ด๋ จ ์ ์ฌ ์ถ์ฒ ๋ธ๋ผ์ฐ์ง ์ปจํ ์คํธ์ ๋จ์"๊ฐ ๋ช ํํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์กฐ๊ธ ๋ ๊น๋ค๋กญ์ต๋๋ค. ์ด๋ฅผ ์ํด ๋ด๊ฐ ํ ์ผ์ ๊ทธ๊ฒ๋ค์ Window ๊ฐ์ฒด์ ๋๋ ๊ฒ๋ถํฐ ์์ํ๋ ๊ฒ์ ๋๋ค. Window ๊ฐ์ฒด๋ ์์ง IDL์ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก Window.js์ ๋ฐ์ค ์ ๋์ฌ๊ฐ ๋ถ์ ์์ฑ์ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๋ฏธ๋์ ์ฐ๋ฆฌ๋ ์ฌ๋ฌ ์ฐฝ์์ ์ฌ๋ฌผ์ด ์ถ์ ๋๋์ง ํ์ธํ๋ ๊ฒ์ ๋ํด ๊ฑฑ์ ํ ์ ์์ต๋๋ค(์ฆ, iframe ๊ด๋ฆฌ). ๊ทธ๋ฌ๋ ํ์ฌ๋ก์๋ ์ฐฝ์ ๋๊ธฐ์ ์ข์ ์ฅ์์ ๋๋ค.
๋ง์ง๋ง์ผ๋ก, "๋์ฐ๋ณ์ด ๋ ์ฝ๋๋ฅผ ํ์ ๋ฃ๋" ์ ์ ํ ์์น๋ฅผ ์ฐพ์์ ๊ตฌํ์ ๋ง์ ๋ถ๋ถ์ ์ฒ๋ฆฌํฉ๋๋ค. https://dom.spec.whatwg.org/#queue -a-mutation-record๋ก ์ด๋ํ์ฌ "queue a mutation record"๋ฅผ ํด๋ฆญํ๋ฉด ๋ฐ์ํ๋ ์ฌ์์ ๋ชจ๋ ์์น๋ฅผ ๋ณผ ์ ์์ต๋๋ค. jsdom์๋ ์ํฉ์ด ๋ฐ์ํ ๋ ์ฌ์์ด ์ํํ๋ ๊ฒ๊ณผ ๋๊ฐ์ ํํฌ๊ฐ ๋ชจ๋ ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์ฝ๊ฐ ๊น๋ค๋ก์ธ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ jsdom์ _attrModified, _descendantRemoved ๋ฐ _descendantAdded ํํฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ํํ ์ ์์ด์ผ ํฉ๋๋ค. https://github.com/tmpvar/jsdom/blob/master/lib/jsdom/living/attributes.js ์๋ "TODO ๋์ฐ๋ณ์ด ๊ด์ฐฐ์ ํญ๋ชฉ"๋ ์์ต๋๋ค.
๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค!
์์ฒญ๋ :)
๋ค์ ๋งํ์ง๋ง, ์ ๋ webidl ๋ฐ ๋ ํฐ ์ฝ๋๋ฒ ์ด์ค์ ๋ํ ๊ฒฝํ์ด ๋ง์ง ์์ต๋๋ค. ๋๋ ๋ํ ๋ช ๊ฐ์ง ๊ธฐํ์ผ๋ก ์ธํด ์ฝ๊ฐ ๋ฌด๋ฆฌ๊ฐ ์์ต๋๋ค ;)
๋๋ ์ต์ ์ ๋คํ๊ณ ์์ผ๋ก ๋ช ์ฃผ ๋์ ๊ทธ๊ฒ์ ํ ๊ฒ์ ๋๋ค. ์ ๋ ํ๋ฒ ํ ์คํธ ์ผ์ด์ค๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
ํ์ธ,
๋๋ ์ง๊ธ๊น์ง idl๊ณผ Impl์ ๋ง๋ค๊ณ ๊ทธ๊ฒ์ window.js์ ์๊ตฌํ์ต๋๋ค.
์ด์ ํ ์คํธ ํ์ผ์ ๋ง๋ค๋ ค๊ณ ํ๊ณ ์ฐฝ ์ ๋์ฌ๋ฅผ ์ฌ์ฉํ์ฌ new MutationObserver()๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
const window = jsdom("<html><body><div id='mutation'></div></body></html>").defaultView;
let observer = new window.MutationObserver(function(mutations){
console.log(mutations);
});
์ฌ๊ธฐ์ ์์์๊ฐ ๋๋ฝ๋์๊ฑฐ๋ MutationObserver๋ฅผ ์ ์ญ ๊ฐ์ฒด๋ก ๋ ธ์ถํด์ผ ํ๋ ๊ณณ์ด ์์ต๋๊น(์ฐฝ ๊ฐ์ฒด์์ ํธ์ถํ์ง ์๊ณ ํธ์ถ๋จ).
Window.js์ ๋ค์ ์ค์ ์ถ๊ฐํ์ต๋๋ค.
const MutationObserver = require("../living/generated/MutationObserver");
์ด๋ฐ ์ง๋ฌธ์ ํด์ ์ฃ์กํฉ๋๋ค. ํ ์คํธ๋ฅผ ์์ํ๊ณ jsdom ์ํคํ ์ฒ/ํจํด์ ๋ฐ๋ฅผ ์ ์๋๋ก ๋ช ๊ฐ์ง ์ง์ ์ ์ ์ค์ ํ๋ ค๊ณ ํฉ๋๋ค.
์ ์ฃ์กํฉ๋๋ค ๊ทธ ๋ถ๋ถ์ ๊น๋นกํ๋ค์. https://github.com/tmpvar/jsdom/blob/28f00b30236d540df1777ca6c2c0ee9e5e19fe5b/lib/jsdom/living/index.js#L28 ๊ณผ ๊ฐ์ ์ค์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
๋์ฐ๋ณ์ด ์์ ์ @domenic ์ ์์ด๋์ด๊ฐ ์๋ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค( webkit์ ์ ์ฉ ์ค๋ ๋/๋๊ธฐ์ด์ ๋์ฐ๋ณ์ด ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค ). ๊ทธ๋ฌ๋ ์ด๊ฒ์ ๋ํ ๋๊ธฐ์ด์ ์ด๋ค ํํ์ ๋ ์ค์ํ๊ฒ๋ ๋๊ธฐ์ด์ ์๋ ๊ฒ์ ์คํํ๋ ์ผ๋ถ ๋ ผ๋ฆฌ๋ฅผ ํ์๋ก ํฉ๋๋ค. ์ด๊ฒ์ ๋ ๊ฐ์ง ์ง๋ฌธ์ผ๋ก ์ด์ด์ง๋๋ค.
์ด๋ฌํ ๋๊ธฐ์ด์ ์ด์ ์ ์ป์ ์ ์๋ jsdom์ ๋ค๋ฅธ ๊ตฌ์ฑ ์์๊ฐ ์์ต๋๊น? ์ํคํ ์ฒ ๋ฐ (๋ฏธ๋) ํตํฉ ์ธก๋ฉด์์ ์ฌ๊ธฐ์์ ๊ณ ๋ คํด์ผ ํ ์ฌํญ์ด ์์ต๋๊น?
ํ์ด๋จธ(jsdom์ ์ ์ญ ํฑ์ด ์์ต๋๊น?) ๋๋ ๋จ์ง ์ฝ์/์๋ฃ ์ฝ๋ฐฑ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋๊ธฐ์ด์์ ์์ ์ ์คํํ๋ ๊ฒ์ด ๊ฐ์ฅ ํ๋ช ํ ๊น์?
์ ๋ ๋งค์ฐ ๊ธฐ๋ณธ์ ์ธ ๊ตฌํ์ ์๋ฃํ๊ณ ๋ฏธ๋์ ๊ตฌํ์ ์๋ดํ๊ธฐ ์ํด ๊ด๋ฒ์ํ ํ ์คํธ ์ฌ๋ก๋ฅผ ์์ฑํ๋ ๋ฐ ์ง์คํ๊ณ ์์ต๋๋ค.
๋ฐ๋ผ์ ๋ง์ดํฌ๋กํ์คํฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก process.nextTick(fn)
์
๋๋ค. ์ด๊ฒ์ ๋ณตํฉ ๋ง์ดํฌ๋ก ํ์คํฌ ๋น์ฆ๋์ค์ "๋ณตํฉ ๋ง์ดํฌ๋ก ํ์คํฌ ํ์ ํ์คํฌ ์คํ"์ผ๋ก ์ธํด ๋์ฐ๋ณ์ด ๊ด์ฐฐ์์๊ฒ ์กฐ๊ธ ๋ ๊น๋ค๋กญ์ต๋๋ค. ๋๋ _ ์๊ฐ _ ๋๋ถ๋ถ ๊ทธ๊ฒ์ ๋ฌด์ํ ์ ์์ต๋๋ค. jsdom์ ์ค์ ์ค์ธ ํญ๋ชฉ์ ๋ํด ๊ฑฑ์ ํ ํ์๊ฐ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ฌ์์ "๋์ฐ๋ณ์ด ๊ด์ฐฐ์์๊ฒ ์๋ฆฌ๊ธฐ ์ํด ๋ณตํฉ ๋ง์ดํฌ๋กํ์คํฌ ๋๊ธฐ์ด์ ์ถ๊ฐ"๋ผ๊ณ ํ์๋๋ฉด process.nextTick(notifyMutationObservers)
ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ notifyMutationObservers
๋ด๋ถ์์ 3๋จ๊ณ๋ ํ์ ๋จ๊ณ๋ฅผ ๋๊ธฐ์ ์ผ๋ก ์ํํ๋ ๋์ฐ๋ณ์ด ๊ด์ฐฐ์์ ๋ํ ๋ฃจํ์ผ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํ ์คํธ๋ฅผ ์ํด https://github.com/tmpvar/jsdom/blob/master/Contributing.md ๋ฅผ ํ์ธ
์ด๊ฒ์ ์ง๋ฌธํ๊ธฐ์ ์ ์ ํ ์ฅ์๊ฐ ์๋ ์๋ ์์ง๋ง impl ํ์ผ(Node-impl -> MutationObserver-Impl) ๊ฐ์ webidl ์คํค๋ง ๊ฐ์ฒด(์: /generated/MutationRecord.js)๋ฅผ ์๋ค๋ก ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. .
MutationRecords์ ์คํค๋ง๋ฅผ ๋ฏธ๋ฌ๋งํ๋ ์์ JSON ๊ฐ์ฒด๋ก ๊ฐ์ฒด๋ฅผ ๊ตฌ์ฑํ๊ณ ๋์ฐ๋ณ์ด๊ฐ ๋ฐ์ํ ๋ Node-impl์์ MutationObserver๋ก ์ ๋ฌํ๊ณ ์ถ์ ์ ํน์ด ์์ต๋๋ค. ์ด๊ฒ์ด ์ฌ์์ ์ค๋ช ๋ ๋๋ก MutationObservers์ ๋ชจ๋ ์ธก๋ฉด์ ๊ตฌํํ๋ ค๋ ์ผ์ฌ์ ๊นจ๋จ๋ฆด ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ์ด๊ฒ์ด jsdom webidl ์ํคํ ์ฒ/๊ฐ์ฒด ๋ชจ๋ธ/์ธํฐํ์ด์ค์ ์ต์ํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฝ๋ ๋ด์ ์๋ ๋ํ impl ํ์ผ์์ /generated/ ๊ฐ์ฒด๋ก ์์ ํ๋ ๊ฒ์ ์ดํดํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ๋ ์๋ง๋ ์ด๊ฒ์ ์ด๋๊ฐ์ ๋ฌธ์ํํด์ผ ํ์ง๋ง ์ฌ๊ธฐ์ ๊ฐ๋ค:
์ผ๋ฐ์ ์ผ๋ก ์์ฑ๋ API๋ฅผ ํต๊ณผํ๋ ๋ชจ๋ ์ธ์๋ ์๋์ผ๋ก ์ธ๋ฐ์ฑ/๋ฆฌ๋ฐ์ฑ๋๋ฏ๋ก ์์ฑ๋ ๊ฐ์ฒด์ ๋ํด ์ ๊ฒฝ ์ธ ํ์๊ฐ ์์ต๋๋ค. ๊ตฌํ ๊ฐ์ฒด๋ง ์ค์ํฉ๋๋ค. ์ ์ธ - ์ค์ ๋ก๋ ์๋๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ด๋ฏธ IDL ๊ธฐ๋ฐ์ผ๋ก _๋ชจ๋ ๊ฒ_์ ์ ํํ๋ค๋ฉด ์ด๊ฒ์ ์ฌ์ค์ด ๋ ๊ฒ์
๋๋ค. ๊ทธ๋ ์ง ์์ต๋๋ค. ์ธ์ ๋ฐ ๋ฐํ ๊ฐ์ ์๋ํ์ง๋ง ๋น IDL ํด๋์ค(์: Window)์ ์ํธ ์์ฉํ ๋๋ง๋ค ์ธ์๋ฅผ ์ง์ ์ ๊ณตํ ๋ unboxing/reboxing์ ์ํํด์ผ ํฉ๋๋ค(์ : https://github. com/tmpvar/jsdom/blob/master/lib/jsdom/living/events/EventTarget-impl.js#L103 , ์ฌ๊ธฐ์ Window๋ ์์ง idl๋์ง ์์์ง๋ง EventTarget(Windows๊ฐ ์์ํ๋ ๋ถํฐ) ์
๋๋ค. ํ์ํ ๊ฒฝ์ฐ idlUtils.wrapperForImpl
/ idlUtils.implForWrapper
์๋ ๋ณต์ฑ์ ์ํํฉ๋๋ค.
๋ฐ๋ผ์ ์ผ๋ฐ์ ์ผ๋ก Impl ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ค๊ณ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด ์์ฑ๋ ํ์ผ์ด ํ์ํ๊ณ ๋ด๋ณด๋ด๊ธฐ์ ๋ํด createImpl
๋ฅผ ํธ์ถํฉ๋๋ค. args์ ๋ฐฐ์ด(public-constructor ์ธ์์ ๊ฒฝ์ฐ)๊ณผ private args์ ๊ฐ์ฒด(๋ ๋ชจ๋ impl ํด๋์ค์ ์ ๊ณต๋จ)๋ฅผ ์ทจํฉ๋๋ค. ์ด์ ๋ํ ์๋ https://github.com/tmpvar/jsdom/blob/9dd9069354e36c077032f4cbcb1616a7d9e6f0c4/lib/jsdom/living/nodes/Document-impl.js#L549 ๋ฅผ ์ฐธ์กฐ
๋๋ ์ด๊ฒ์ด ์ ์ฒด๋ฅผ ํ์ ํ๊ธฐ์ ์ถฉ๋ถํ ๊น์ด ์์ง ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค(์ ์๊ฐ์๋). ๋ฐ๋ผ์ ๋ ๊ตฌ์ฒด์ ์ธ ๊ฒ์ด ์์ผ๋ฉด ๊ธฐ๊บผ์ด ๋ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
@Sebmaster ๊ฐ์ฌํฉ๋๋ค, ๋ง์ ๋์์ด ๋์์ต๋๋ค.
์, API/๊ฐ์ฒด๋ฅผ ํตํฉํ๊ณ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ช ๊ฐ์ง ์์ ํจ๊ป ์ด๊ฒ์ ๋ฌธ์ํํ๋ฉด ๋์์ด ๋ ๊ฒ์ด์ง๋ง ๋ค์ ๋ช ๋จ๊ณ์ ๋ํด์๋ ์ถฉ๋ถํ ์๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋น ๋ฅธ ์
๋ฐ์ดํธ!
MutationRecord๊ฐ ์ฌ์์ ๋ฐ๋ฅผ ๊ฒฝ์ฐ W3C ํ
์คํธ ๋ ์คํจํ ๊ฒ์
๋๋ค(์ ์๊ฐ์๋). ๋๋ ๊ทธ๋ค์ ์ ์ฅ์์ ์๊ฒฌ์ ๋จ๊ฒผ์ต๋๋ค.
๋ด ๋ชฉ์ ์ ์ํด ๋ก์ปฌ๋ก ์ ๋ฐ์ดํธํ์ง๋ง W3C/jsdom์ ์ปค๋ฐํ ์ง ํ์คํ์ง ์์ต๋๋ค. ์ฆ, ๋์๊ฒ๋ ๊ทธ ์ผ์ ๋ง์น ์๊ฐ์ด ์๋ค๋ฉด ๋ง์ด๋ค.
๊ทธ๋ฌ๋ ์์ฑ ๋์ฐ๋ณ์ด๋ ์ด์ ๋๋ถ๋ถ์ ํ ์คํธ๋ฅผ ํต๊ณผํ์ผ๋ฉฐ ์ฃผ๋ง์ด๋ ๋ค์ ์ฃผ ์ด์ pull ์์ฒญ์ ํ ๊ฒ์ ๋๋ค.
์ ๋ง ํฅ๋ฏธ์ง์งํฉ๋๋ค! ๋ฌธ์ ๊ฐ ๋ฌด์์ธ์ง ์กฐ๊ธ ๋ ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น? ๋๋ https://github.com/w3c/web-platform-tests/issues/2482 ๋ฅผ ๋ฐ๋ผ๊ฐ ์ ์์์ต๋๋ค. ๊ทธ๋์ ์๋ง๋: MutationRecord์ ์์ฑ ๊ฐ์ด ํ ์คํธ์์ ์์ํ๋ ๊ฒ๊ณผ ์ฌ์์ ํ์ํ ๊ฒ์ด ๋ฌด์์ด๋ผ๊ณ ์๊ฐํฉ๋๊น? ?
๋ฌธ์ ๋ ํ ์คํธ๊ฐ ๋น๊ตํ ์ ์ฒด mutationRecord๋ฅผ ์ง์ ํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ์ฒซ ๋ฒ์งธ ํ ์คํธ ์ฌ๋ก ์์ ํ ์คํธ๋ id ๊ฐ์ ๋ณ๊ฒฝํ๊ณ ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ฐํ๋ ๋์ฐ๋ณ์ด ๋ ์ฝ๋๋ ์ด์ ๊ฐ ์์ฑ์ ๊ฐ๊ฒ ๋ฉ๋๋ค. oldValue ์์ฑ์ด ์์ ๊ฐ์ฒด์ ์ ์๋์ด ์์ง ์์ ํ ์คํธ๊ฐ ์คํจํฉ๋๋ค. ๋ด๊ฐ ์ดํดํ๋ ๊ฒ์ฒ๋ผ ๋์ฐ๋ณ์ด ๋ ์ฝ๋๋ null์ธ ๊ฒฝ์ฐ์๋ ํญ์ ๋ชจ๋ ์์ฑ์ ํฌํจํด์ผ ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ DOMString null์ด์ด์ผ ํฉ๋๋ค. ํ ์คํธ ์ผ์ด์ค์ ์์ฑ์ด ์ค์ ๋์ง ์์ ๊ฒฝ์ฐ ํ ์คํธ๋ null(typeof ๊ฐ์ฒด)๊ณผ null(typeof ๋ฌธ์์ด)์ ๋น๊ตํ๊ณ ์คํจํ๊ฒ ๋ฉ๋๋ค.
ํ ์คํธ๋ ๋๋ฆฌ๊ฒ ๊ตฌ์ฑ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ ์๋์ง ์์ ํ๋๋ ์๋์ผ๋ก null(๊ฐ์ฒด)๋ก ์ค์ ๋ฉ๋๋ค. ์ด๊ฒ์ a) mutationRecord๊ฐ ์์ ๋ ์ฝ๋ ๊ฐ์ฒด(์: oldValue)์ ์ค์ ๋์ง ์์ ์์ฑ์ ๋ฐํํ๊ณ b) mutation ๋ ์ฝ๋ ์์ฑ์ด DOMstring null(์: attributeNamespace)์ผ ๋ ํ ์คํธ๊ฐ ์คํจํ๋๋ก ํฉ๋๋ค.
๋ง๋ ๋ง์ด๋ค?
๋ด๊ฐ ์ณ๋ค๋ฉด ๊ณ ์น ์ ์์ง๋ง ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ํ๋์ฉ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ jsdom ๋ฐ w3c ํ ์คํธ ๋ชจ๋์ ๋ํ ์ธ๋ถ์ธ์ผ๋ก์ ์ฝ๊ฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค. :)
์ฃ์กํฉ๋๋ค. ๋จ์ํํ ์ ์์ต๋๊น? ๋๋ ๋ค์ ํ์์ ๋ต๋ณ์ ์ ํธํฉ๋๋ค. ํ ์คํธ์์๋ oldValue๊ฐ null์ด๊ฑฐ๋ ์ ์๋์ง ์์ ๊ฒ์ผ๋ก ์์ํ์ง๋ง ์ฌ์์ "null" ๊ฐ์ ์ ๊ณตํฉ๋๋ค. ๋๋ ์ ์ฌํฉ๋๋ค.
์์์ ์ฐธ์กฐํ ํ ์คํธ๋ ์์์ ์ผ๋ก oldValue๊ฐ null์ผ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. "n"์ด์ด์ผ ํฉ๋๋ค.
ํด๋น ํ์ผ์ ๋ชจ๋ ํ ์คํธ ์ฌ๋ก๋ attributeNamespace๊ฐ null(๊ฐ์ฒด)์ผ ๊ฒ์ผ๋ก ์์ํ๋ฉฐ ์ฌ์์ ๋ฐ๋ผ DOMString null์ด์ด์ผ ํฉ๋๋ค.
attributeNamespace์ ์ ํ์ DOMString?์ด๋ฏ๋ก null์ด ํ์ฉ๋ฉ๋๋ค("null"์ด ์๋๋ผ null๋ง).
oldValue ์ฌ๋ก์ ๋ํด ์ค๋ช ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. :).
๋ค, ๋ช ํํ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ฌ์์ ์ค์ํ ์ธก๋ฉด์ ๋์น ๊ฒ ๊ฐ์ต๋๋ค.
๋ด ํฌํฌ์ MutationObserver ๋ถ๊ธฐ๋ฅผ ์ถ๊ฐํ๊ณ ํธ์ํ์ต๋๋ค. ํ์ฌ Attribute ๋ฐ CharacterData ๋์ฐ๋ณ์ด๋ ๊ฐ์ฅ ์ค์ํ w3c ํ ์คํธ๋ฅผ ํต๊ณผํ๊ณ ์์ต๋๋ค.
์๋ ค์ง ์ด์ /๋ฌธ์ (๋ฒ์ ์ง์ #317 ๋๋ฝ ๋ฑ)๋ก ์ธํด ํต๊ณผํ์ง ๋ชปํ ํ ์คํธ๋ ์ด๋์ ๋ฌธ์ํํฉ๋๊น?
์ฐ๋ฆฌ๊ฐ ํ๋ ์ผ์ ์น ํ๋ซํผ ํ ์คํธ๋ฅผ ์ํด index.js ํ์ผ์ ์ถ๊ฐํ๋ ๊ฒ์ด์ง๋ง ์ด์ ์ ๋ํ ์ค๋ช ๊ณผ ํจ๊ป ์ฃผ์ ์ฒ๋ฆฌ๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ฐ๋ฆฌ๊ฐ ํ ํ๋ฆฟ์ ๋ํด ์ํํ๋ ์์ ์ ์ฐธ์กฐํ์ญ์์ค.
์ด๊ฒ ์๊ฒฐ๊น์ง ๋ฉ์๋์?
๋์ฐ๋ณ์ด ์ด๋ฒคํธ๊ฐ 8.5์์ ์ ๊ฑฐ๋ ๊ฒ ๊ฐ์ต๋๋ค . 8.5๋ก ๋์๊ฐ์ ํด๋ฆฌํ์ ์์กดํ์ง ์๊ณ ์ฌ์ฉ์ ์ ์ ์์(๋์ฐ๋ณ์ด ๊ด์ฐฐ์ ํ์)๋ฅผ ํ
์คํธํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? DOMParser
๋ 8.5์์ ๊ตฌํ๋์ง ์์์ผ๋ฉฐ Shadow DOM ํด๋ฆฌํ์ ์ํด ์ด๋ฅผ ์๊ตฌํ๋ฏ๋ก ํ์ฌ JSDOM์์ ํ
์คํธ๋ฅผ ์คํํ ์ ์์ด ์ฐจ๋จ๋ฉ๋๋ค. ์ฌ๊ธฐ์ ์ด๋ค ์ง์นจ์ด ๋์์ด ๋ ๊ฒ์
๋๋ค. ๋ถํํ๋ ์ง๊ธ ๋น์ฅ์ ์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ๋
ธ๋ ฅํ๊ณ ๋์์ ์ค ๋ฅ๋ ฅ์ด ์์ต๋๋ค.
๋๋ ๊ทธ๋ ๊ฒํ๋ ๋ฐฉ๋ฒ์ ์์ง ๋ชปํฉ๋๋ค. ์ฃ์กํฉ๋๋ค :(.
์ด ๋ฌธ์ ๋ฅผ ์ฎ๊ธฐ๋ ๊ฒ์ ๋์๋๋ฆด๊น์? https://github.com/henrikkorsgaard/jsdom/commits/MutationObserver ์์ ์ผ๋ถ ์์ ์ด ์์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ฎ๊ธฐ๊ธฐ ์ํด ์ฌ์ ํ ๋ฌด์์ด ํ์ํ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. MutationObserver
๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ๊ณณ์์ ์ง์๋๋ค๋ ์ ์ ๊ฐ์ํ ๋ ์ด๊ฒ์ด ์กด์ฌํ์ง ์๋ ๊ฒ์ ํฐ ๊ฒฉ์ฐจ์ฒ๋ผ ๋๊ปด์ง๋๋ค. http://caniuse.com/#feat =mutationobserver
webcomponentsjs ํด๋ฆฌํ์ ํ์ฉํ ์ ์์ต๋๊น? https://github.com/webcomponents/webcomponentsjs
ํ ๋ฆฌํ์คํธ๋ ์ธ์ ๋ ํ์์ ๋๋ค. @henrikkorsgaard ์ ์์ ์ ํ์คํ ์์ํ๊ธฐ์ ์ข์ ์ฅ์์ ๋๋ค. ํ์ง๋ง ํด๋ฆฌํ์ด ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ด๊ฐ ๋งํ ์ ์๋ ๋ฐ์ ๋ฐ๋ฅด๋ฉด ๋์ฐ๋ณ์ด ์ด๋ฒคํธ๋ ์ฑ๋ฅ ๊ณ ๋ ค ์ฌํญ ๋๋ฌธ์ ์ ๊ฑฐ๋์์ต๋๋ค. Mutation Observer๊ฐ ๋ธ๋ผ์ฐ์ ์ ์ํด ์ง์ ๋๊ณ ๊ตฌํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ด์ ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ธ๋ผ์ฐ์ ๋ ์ต์ํ MO ์ง์์ด ๊ตฌํ๋ ๋๊น์ง ํด๋น ๊ธฐ๋ฅ์ ์ ์งํ์ต๋๋ค. ์ฌ๊ธฐ์์ ์ค์ฉ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ด์ ๋ํ ์ง์์ ๋ค์ ์ถ๊ฐํ๋ ๊ฒ์ผ ์ ์์ผ๋ฏ๋ก ์ต์ํ MO๋ ์ด๊ฒ์ด ๊ตฌํ๋ ๋๊น์ง ํด๋ฆฌํ๋ ์ ์์ต๋๋ค. JSDOM์ ์ ์ง ๊ด๋ฆฌ์ ์ด์์ ์ด์ง ์์ผ๋ฉฐ ๊ทธ ์ดํ๋ก ์ฝ๋๋ฒ ์ด์ค๊ฐ ๋ถ๊ธฐ๋์์ ์ ์์์ ์๊ณ ์์ต๋๋ค. ์ฆ, ๊ณ ๋ คํด ๋ณผ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ ํนํ ์น ๊ตฌ์ฑ ์์๊ฐ ํ๋ก๋์ ์ฑ์ ์ํ ์คํ ๊ฐ๋ฅํ ์๋ฃจ์ ์ด๊ณ MO๋ฅผ ํด๋ฆฌํํด์ผ ํ๋ ์ด ๋จ๊ณ์์ ํฐ ๊ฒฉ์ฐจ๋ฅผ ๋จ๊น๋๋ค. JSDOM์์ ํ ์คํธ๋ฅผ ์คํํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
4๋ ์ ์ธ๋ฐ ์์ง๋ ์งํ์ค์ธ๊ฐ์? ์ด ๋ฌธ์ ๋ ๋ฒ์ 9.0.0 ์ดํ ๋ณ๊ฒฝ ๋ก๊ทธ์ ์ธ๊ธ๋์ด ์์ต๋๋ค. ์ฌ๋ฌ๋ถ, ์ด๊ฒ์ ๋ํ ์์์ด ์์ต๋๊น?
@MeirionHughes ํ์ผ์ด ์ํํ๊ฒ ์๋ํ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค!
์ด ๋ฌธ์ ์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น?
@domenic ์ ๋งํฌ์ ๋ํ ํ์ฅ์
๋๋ค.
@MeirionHughes๊ฐ ์ ์ํ ํด๋น ํ์ผ์ ๋ฃ์ผ๋ ค๊ณ ํ๋ฉด ์ง๊ธ๊น์ง ์ ์๋ํ์ต๋๋ค.
@mtrabelsi @MeirionHughes ์๋
ํ์ธ์, Jest์์ ์๋ํ๋๋ก ๊ด๋ฆฌํ์ง ๋ชปํ์ต๋๋ค. ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. https://stackoverflow.com/questions/43190171/jsdom-cannot-read-property-location-of-null
JSDOM์์ MO๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ ์ ์์๋์ง ์ค๋ช
ํด ์ฃผ์๊ฒ ์ต๋๊น?
ํธ์งํ๋ค:
์ข์, ๋๋ ๊ทธ๊ฒ์ ์๋ํ๊ฒ ๋ง๋๋ ๊ฒ ๊ฐ๋ค https://gist.github.com/romuleald/1b9272fce11d344e257d0bdfd3a984b0
@romuleald ์์ ์ ์ค๋ฅ๊ฐ ์์ต๋๋ค. this.expando
๋ฐ this.counter
๋ฅผ ์ค์ ํ ๋ค์ ์ ์ ์ผ๋ก ์ก์ธ์คํฉ๋๋ค. ์ด๊ฒ์ _findMutations
์์ ์ฌ๊ฐํ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ๊ฒ์
๋๋ค. ๋ณํํ๋ ค๋ typescript ํ์ผ์์ ๋ ์์ฑ์ด ๋ชจ๋ ์ ์ ์์ ์ ์ ์์ต๋๋ค(ES6์์๋ ๋ถ๊ฐ๋ฅ). Util ํด๋์ค ์๋์ ๋ค์ ์ค์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
Util.counter = 1;
Util.expando = 'mo_id';
๊ทธ๋ฐ ๋ค์ ์์ฑ์๋ฅผ ์์ ํ ์ ๊ฑฐํ ์ ์์ต๋๋ค(ํด๋์ค๋ ์ด์จ๋ ์ธ์คํด์คํ๋์ง ์์).
์ง๋ ํ๋ฃจ ๋ฐ ๋์ ์ด ๋ฌธ์ ๋ก ์ธํด ๋ฐ์ํ ๋ฌธ์ ๋ฅผ ๋๋ฒ๊น ํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๊ฒฌํ๋ ๋ฐ ์ฐฝํผํ ์ ๋๋ก ์ค๋ ์๊ฐ์ด ๊ฑธ๋ ธ์ต๋๋ค.
๋ํ shim์ ๊ธฐ๋ฐ์ด ๋ ์์ค๋ CharacterData
๋
ธ๋์ .data
์์ฑ ๋ณ๊ฒฝ์ ์ง์ํ์ง ์์ต๋๋ค. ๊ฐ๋จํ ์์ ์ ์ํด ์ด ๋๊ธ ์์ ๋ด ์ฐ๊ฒฐ๋ ๋ฌธ์ ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
๋น๋ถ๊ฐ https://github.com/megawac/MutationObserver.js ํด๋ฆฌํ์ ์ฌ์ฉํ์ฌ ์ด๊ฒ์ ํ ์คํธํ ์ ์์์ต๋๋ค.
์ ๋ AVA๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ '''๋ MutationObserver๋ฅผ ํฌํจํ๋ ๋ด ๋ชจ๋์ ๋๋ค.
import test from 'ava';
import delay from 'delay';
import jsdom from 'jsdom';
import m from '.';
const dom = new jsdom.JSDOM();
global.window = dom.window;
global.document = dom.window.document;
require('mutationobserver-shim');
global.MutationObserver = window.MutationObserver;
test('MutationObserver test', async t => {
delay(500).then(() => {
const el = document.createElement('div');
el.id = 'late';
document.body.appendChild(el);
});
const checkEl = await m('#late');
t.is(checkEl.id, 'late');
});
Polyfill์ด๊ธฐ ๋๋ฌธ์ ํ์ค ์ธํฐํ์ด์ค์ ๋ค๋ฅธ ์ ์ด ์์ต๋๋ค. ํ์ง๋ง ์ด ๋ฌธ์ ๋ ์ง์ ์ด ์๋ ๊ฒ ๊ฐ์ผ๋ ํ๋์ ์ต์ ์ผ๋ก ์ฐธ๊ณ ํด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
jsdom ๋ฐ jest๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ฆฌํ๋ก ์ฌ์ฉํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ shim์ ์คํฌ๋ฆฝํธ๋ก ์๋์ผ๋ก ๋ก๋ํ๋ ๊ฒ์ ๋๋ค.
npm install mutationobserver-shim
์๋ฅผ ๋ค์ด beforeAll ํจ์ ๋ด๋ถ:
const mo = fs.readFileSync(
path.resolve('node_modules', 'mutationobserver-shim', 'dist', 'mutationobserver.min.js'),
{ encoding: 'utf-8' },
);
const moScript = win.document.createElement('script');
moScript.textContent = mo;
win.document.body.appendChild(moScript);
์ด "ํดํน"์ ๋๋ฅผ ์ํด, ์๋ง๋ ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ๋ ํจ๊ณผ๊ฐ ์์ต๋๋ค ;)
IIRC Jest์ฉ setupFiles์ ์ผ๋ถ๋ก shim(pal-nodejs์์ ์กฐ์ ๋ ๋ฒ์ ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ง๋ง ์์ npm ํจํค์ง๊ฐ ๋ฌด์์ ๊ธฐ๋ฐ์ผ๋ก ํ๋์ง ํ์คํ์ง ์์)์ ๋ก๋ํ๋ ๊ฒ์ด ์ ์๋ํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ๊ด์ฌ ์๋ ์ฌ๋์ด ์์ผ๋ฉด ๋ค๋ฅธ ๋ฉํฑ์์ ๋ ๊ตฌ์ฒด์ ์ธ ์ ๋ณด๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
์คํํ์ง ๊ฑฐ์ 5๋ ์ ๋ ๋์๋๋ฐ ์ํ ์ ๋ฐ์ดํธ๊ฐ ์๋์?
@mendrik ์กฐ๋กฑ์ ๋๋ฅผ ์ํด ์ผํ์ต๋๋ค https://github.com/benitogf/corsarial/blob/master/test/specs/utils.js#L29 ์์์ ์ธ๊ธํ๋ฏ์ด ํด๋ฆฌํ ์๋ฃจ์ ๋ ์์ต๋๋ค. ์ข์ ํ๋ฃจ ๋์ธ์ :)
https://github.com/skatejs/skatejs/blob/master/packages/ssr/register/MutationObserver.js์ ๋ถ๋ถ ๊ตฌํ์ด ์์ต๋๋ค
@benitogf ๋๋ ๊ทธ๊ฒ์ ์๋ํ์ง๋ง ์ด๋ป๊ฒ ๋ ๋ ์ฝ๋๊ฐ ๋๋ฅผ ์ํด ๋ฐ์ฌ๋์ง ์์์ต๋๋ค :(์ค๋ฅ๋ฅผ ๋์ง์ง ์์์ต๋๋ค.
@treshugart ์ด๋ป๊ฒ ์ฌ์ฉํฉ๋๊น? :)
ํ
์คํธ์์ @mendrik , https://github.com/aurelia/pal-nodejs/blob/master/src/polyfills/mutation-observer.ts ๊ฐ์ ธ์ค๊ธฐ
์ ์ญ ๋ณ์๋ก ์ค์ ํฉ๋๋ค. ๊ทธ๊ฑฐ์ผ!
@mendrik JSDOM https://github.com/skatejs/skatejs/tree/master/packages/ssr#usage ๋ฅผ ์ตํธ์์ํ๋ ค๋ ๊ฒฝ์ฐ
์ด๊ฒ์ react-quill์ ํ์ฅํ ๊ตฌ์ฑ ์์๋ฅผ ํ ์คํธํ๋ ค๊ณ ํ ๋ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ์ ์ถฉ๋ถํ์ต๋๋ค.
import 'mutationobserver-shim';
document.getSelection = () => null;
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
https://twitter.com/slicknet/status/782274190451671040