Vue: `:srcObject.prop`์„ ์‚ฌ์šฉํ•˜์—ฌ prop์„ null๋กœ ์„ค์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2018๋…„ 12์›” 03์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: vuejs/vue

๋ฒ„์ „

2.5.17

์žฌ์ƒ์‚ฐ ๋งํฌ

https://codesandbox.io/s/ppyq71wrxj

์žฌํ˜„ ๋‹จ๊ณ„

(์ตœ์†Œ ์žฌํ˜„ ์ฐธ์กฐ)

  1. :srcObject.prop ๋ฅผ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ ์†์„ฑ์— ๋ฐ”์ธ๋”ฉํ•˜๋Š” HTMLMediaElement ๊ฐ€ ์žˆ๋Š” ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค( null ).
<audio :srcObject.prop="stream">
  1. ์œ ํšจํ•œ MediaStream .
this.stream = new MediaStream();
  1. null ๋‹ค์‹œ ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค.
this.stream = null;

๋ฌด์—‡์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๊นŒ?

audio.srcObject๊ฐ€ null์ผ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

MediaStream์œผ๋กœ ์œ ์ง€๋˜๊ณ  ๋กœ๊ทธ์— TypeError๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.


๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์žฌํ˜„ ์˜ˆ์ œ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๋Š” ์ฒซ ๋ฒˆ์งธ ์‹œ๋„์—์„œ ์‹ค์ œ๋กœ ์ž‘๋™ํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„์ฐจ๋ ธ์Šต๋‹ˆ๋‹ค: https://jsfiddle.net/4tnkapxo/1/ (์•„๋งˆ๋„ ์ „์ฒด๊ฐ€ ์ธ๋ผ์ธ์ด๊ธฐ ๋•Œ๋ฌธ์—?)

์ด๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์œ ์šฉํ•œ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์Šคํƒ ์ถ”์ ์„ ๊ธฐ๋ฐ˜์œผ๋กœ updateDOMProps ์žˆ๋Š” ์ด ์ฝ”๋“œ์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  for (key in oldProps) {
    if (isUndef(props[key])) {
      elm[key] = '';
    }
  }

isUndef(null) ๋Š” true๋กœ ํ‰๊ฐ€๋˜๋ฏ€๋กœ ์†Œํ’ˆ์„ '' ๋กœ ์„ค์ •ํ•˜๋ ค๊ณ  ํ•˜์ง€๋งŒ srcObject ๊ตฌ์ฒด์ ์œผ๋กœ null ๋˜๋Š” MediaStream ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

improvement

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

.prop ๋ฐ”์ธ๋”ฉ์— ๋ณ€ํ™˜์„ ์ ์šฉํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

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

.prop ๋ฐ”์ธ๋”ฉ์— ๋ณ€ํ™˜์„ ์ ์šฉํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

์ด์ œ ๋ฌธ์ œ์˜ ์ฝ”๋“œ(src/platforms/web/runtime/modules/dom-props.js์˜ updateDOMProps )๋ฅผ ์‚ดํŽด๋ณด์•˜์œผ๋ฏ€๋กœ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์กฐ๊ธˆ ๋” ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ๋œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค(unit/modules/vdom/modules/dom-props.spec.js)๋Š” ์‚ญ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

  it('should remove the elements domProps', () => {
    const vnode1 = new VNode('a', { domProps: { src: 'http://localhost/' }})
    const vnode2 = new VNode('a', { domProps: {}})
    patch(null, vnode1)
    const elm = patch(vnode1, vnode2)
    expect(elm.src).toBe('')
  })

...์„ธํ„ฐ๊ฐ€ ์ •์˜ํ•œ ์ž„์˜์˜ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ ์™ธ์— HTMLEmelent ์†์„ฑ์„ "์‚ญ์ œ"ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์˜๋ฏธ์—์„œ elm[key] = ''; ๋กœ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์บ์ŠคํŒ…ํ•˜๋Š” ๊ฒƒ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ํ‘œ์ค€ ๋ฐฉ์‹์— ๊ฐ€์žฅ ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. <img> ํƒœ๊ทธ์˜ ๊ฒฝ์šฐ .src ์†Œํ’ˆ์„ ๋นˆ ๋ฌธ์ž์—ด ์˜†์— ์„ค์ •ํ•˜๋ฉด ๊ฝค ๋ถˆ์พŒํ•œ ๋™์ž‘์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

09:48:05.267 const img = document.createElement('img')
09:48:08.948 img.src
09:48:08.953 ""
09:48:14.469 img.src = null
09:48:17.213 img.src
09:48:17.222 "https://localhost:8080/null"

(๋‚˜๋Š” ๊ทธ ํ–‰๋™์— ๋Œ€ํ•œ ํฐ ์ด์œ ๊ฐ€ ์žˆ๊ณ  ํ•ฉ๋ฒ•์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.)

๋”ฐ๋ผ์„œ ํ•ด๋‹น ์ปจํ…์ŠคํŠธ์—์„œ ๋นˆ ๋ฌธ์ž์—ด์€ null/undef props์˜ ๊ฒฝ์šฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•ฉ๋ฆฌ์ ์ธ ๊ธฐ๋ณธ๊ฐ’์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. isUndef(props[key]) ์ˆ˜ํ‘œ๋ฅผ props.hasOwnProperty(key) ๋กœ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ undefined ์™€ ์ง์ ‘ ๋น„๊ตํ•˜๋Š” ์‹คํ—˜์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ prop์„ null๋กœ ์„ค์ •ํ•˜์—ฌ ์‚ญ์ œํ•˜๋Š” ๊ธฐ๋Šฅ์— ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ ์‹คํ–‰ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  dom-props.js ํŠน์ˆ˜ ์ผ€์ด์Šค ์†์„ฑ/์š”์†Œ ์กฐํ•ฉ์€ ์–ธ๊ธ‰์กฐ์ฐจ ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ •๋„๋กœ ๋”์ฐํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ๋‚ด๊ฐ€ ๊ฑฐ๊ธฐ์—์„œ ๋„ˆ๋ฌด ๋งŽ์€ ๊ฐ€์ •์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ ์ฝ”๋“œ๋Š” ์ˆœ์ „ํžˆ ์ƒˆ vnode์—์„œ ๋ˆ„๋ฝ๋œ ์†Œํ’ˆ์— ๋Œ€ํ•œ ๋ณดํ˜ธ์ž…๋‹ˆ๊นŒ? ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์ž๊ฐ€ src ์†์„ฑ๋งŒ ๊ณ ๋ คํ•œ ์ด์œ ๋Š” ์‹คํŒจ์˜ ์›์ธ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๊นŒ? prop์„ "์‚ญ์ œ"ํ•  ๋•Œ ์‚ฌ์šฉ์ž๊ฐ€ "" , null ๋ฐ undefined ์ค‘์—์„œ ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’์„ ์ œ๊ณตํ•  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๊นŒ?

๋ฐ˜๋ฉด์— ๋ฐ”์ธ๋”ฉ๋œ ์†์„ฑ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์‚ญ์ œ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ์˜๋ฏธ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค... <audio :srcObject.prop="stream"> ์˜ ์˜ˆ์™€ ๊ฐ™์ด stream ๊ณ„์‚ฐ๋œ ์†์„ฑ์€ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ {stream: {some: thing}} ๋ฅผ {} ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด ์ดํ•ด๋ฅผ ๋„˜์–ด์„œ๋Š” vnode ๋‚ด๋ถ€์— ๋ฌด์–ธ๊ฐ€๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ ์ œ์•ˆ์ด ๊ดœ์ฐฎ๋‹ค๋ฉด hasOwnProperty ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๊ฒ€์‚ฌ๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๊ฒฐ๊ณผ๋Š” elm[key] = '' ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋‚ด๊ฐ€ ๋งํ•œ ๊ฒƒ์ฒ˜๋Ÿผ "ํ‘œ์ค€" ์‚ญ์ œ๊ฐ€ ๋ชจ๋“  , ๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ์ ์šฉ๋˜๋Š” ๊ฒฝ์šฐ); ์ด๋ฒˆ ์ฃผ์— ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•ˆ์ „ํ•œ ๋ณ€๊ฒฝ์ด ์•„๋‹Œ ๊ฒฝ์šฐ ์‹œ๊ฐ„์„ ๋ณด๋‚ด๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด f11449d916a468651d4fd5024c37e3eebbc9941f์— ์˜ํ•ด ์ˆ˜์ •๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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