์›”๊ฐ„ ํฌ๋กฌ ์ด์Šˆ ๋ฆฌํฌํŠธ 2023๋…„ 6์›”ํ˜ธ


๋“ค์–ด๊ฐ€๋ฉฐ

ํ”„๋ŸฐํŠธ์—”๋“œ ๊ฐœ๋ฐœ์— ๊ฐ€์žฅ ๋งŽ์€ ์˜ํ–ฅ์„ ์ฃผ๋Š” ํฌ๋กฌ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฒ„์ „๋ณ„ ๋ณ€๊ฒฝ ์˜ˆ์ • ํ•ญ๋ชฉ์„ ์ •๋ฆฌ ๋ฐ ๊ณต์œ ํ•œ๋‹ค.

๐Ÿ’ก ๊ฐ ํ•ญ๋ชฉ์€ Chrome Platform Status์˜ Roadmap๊ณผ ํ•œ ๋‹ฌ๊ฐ„์˜ blink-dev ํ™œ๋™ ์š”์•ฝ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ •๋ฆฌํ–ˆ๋‹ค.

๐Ÿ’ก ๊ฐ ํ•ญ๋ชฉ์˜ ๐Ÿšซ๋Š” ์ง€์› ์ค‘๋‹จ ๋ฐ ์ œ๊ฑฐ(Removed), โš ๏ธ๋Š” ์ง€์› ์ค‘๋‹จ(Deprecated), โœ…๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ(Enabled by default), ๐Ÿงช๋Š” ๊ฐœ๋ฐœ์ž ๋ฏธ๋ฆฌ ๋ณด๊ธฐ(Trial)๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

๐Ÿ’ก ๊ฐ ํ•ญ๋ชฉ ์ค‘ ๊ธฐ์กด ์„œ๋น„์Šค์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์ด ํฌ๋‹ค๊ณ  ํŒ๋‹จํ•œ ํ•ญ๋ชฉ์€ ์†Œ์ œ๋ชฉ ๋’ค์— ๐Ÿ“Œ ํ‘œ์‹œ๋ฅผ ํ–ˆ๋‹ค.

๐Ÿ’ก ์ง€์› ์ค‘๋‹จ ๋ฐ ์ œ๊ฑฐ(๐Ÿšซ), ์ง€์› ์ค‘๋‹จ(โš ๏ธ) ์™ธ์˜ ํ•ญ๋ชฉ์€ ๊ณต์œ  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ•œ ๊ฒฝ์šฐ์—๋งŒ ํฌํ•จํ–ˆ๋‹ค.

๐Ÿ’ก ๊ฐœ๋ฐœ์ž ๋ฏธ๋ฆฌ ๋ณด๊ธฐ(๐Ÿงช)๋Š” chrome://flags์—์„œ Experimental Web Platform features ํ•ญ๋ชฉ์„ ํ™œ์„ฑํ™”ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’ก ๊ฐ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ € ๋ฐ ์›น ๊ฐœ๋ฐœ์ž์˜ ์˜๊ฒฌ์€ Chrome Platform Status๋ฅผ ๊ทธ๋Œ€๋กœ ์ธ์šฉํ–ˆ๋‹ค.

๋ชฉ์ฐจ

  1. Chrome 115

    • โš ๏ธ document.domain ์„ค์ •์ž(Setter) ์ง€์› ์ค‘๋‹จ ๐Ÿ“Œ
    • โš ๏ธ Mutation ์ด๋ฒคํŠธ ์ง€์› ์ค‘๋‹จ ๐Ÿ“Œ
    • โœ… CSS ๋‹ค์ค‘ display ์†์„ฑ
    • โœ… CSS ์Šคํฌ๋กค ์• ๋‹ˆ๋ฉ”์ด์…˜
    • ๐Ÿงช HTTPS ์—ฐ๊ฒฐ ์—…๊ทธ๋ ˆ์ด๋“œ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ
    • ๐Ÿงช SHA-1 ์„œ๋ฒ„ ์ „์ž ์„œ๋ช… ์ง€์› ์ค‘๋‹จ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ
    • ๐Ÿ—“๏ธ ๋ฐฐํฌ ์˜ˆ์ •์ผ
  2. Chrome 116

    • โœ… CSS Motion Path
    • โœ… display, content-visibility์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‚ฌ์šฉ ์ง€์›
    • โœ… CSS ๋ถˆ์—ฐ์† ์†์„ฑ์˜ Transition ์ง€์›
    • ๐Ÿงช SVGUseElement์˜ data: URL ์ง€์› ์ค‘๋‹จ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ
    • ๐Ÿ—“๏ธ ๋ฐฐํฌ ์˜ˆ์ •์ผ
  3. Chrome 117

    • โš ๏ธ CSS zoom ์†์„ฑ ์ง€์› ์ค‘๋‹จ ๐Ÿ“Œ
    • โš ๏ธ RTCPeerConnection.getStats() ์ฝœ๋ฐฑ ๋ฐฉ์‹ ์ง€์› ์ค‘๋‹จ
    • โœ… CSS Anchor ๋ฐฐ์น˜
    • โœ… @scope ๊ทœ์น™
    • ๐Ÿ—“๏ธ ๋ฐฐํฌ ์˜ˆ์ •์ผ
  4. Chrome NEXT

    • โš ๏ธ [Chrome 119] ๋น„ํ‘œ์ค€ shadowroot ์†์„ฑ ์ง€์› ์ค‘๋‹จ
    • โš ๏ธ [Chrome 119] WebSQL ์ง€์› ์ค‘๋‹จ
    • โš ๏ธ [Chrome LATER] unload ์ด๋ฒคํŠธ ์ง€์› ์ค‘๋‹จ
    • โœ… [Chrome LATER] ๋‚ด๋ถ€๋ง์— ๋Œ€ํ•œ ํ•˜์œ„ ๋ฆฌ์†Œ์Šค ์š”์ฒญ ๊ทœ์น™ ์ ์šฉ

1. Chrome 115

โš ๏ธ document.domain ์„ค์ •์ž(Setter) ์ง€์› ์ค‘๋‹จ ๐Ÿ“Œ

SOP(Same-Origin Policy)๋Š” ๋ธŒ๋ผ์šฐ์ € ๋ณด์•ˆ ์ •์ฑ…์œผ๋กœ, ๋‘ ํŽ˜์ด์ง€๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ์ถœ์ฒ˜(origin)์ผ ๋•Œ ์ด ๋‘ ํŽ˜์ด์ง€ ์‚ฌ์ด์˜ ํ†ต์‹ ์„ ๋ง‰๋Š”๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด parent.example.com ํŽ˜์ด์ง€์— <iframe>์œผ๋กœ child.example.com ํŽ˜์ด์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ child.example.com์€ window.parent๋กœ ๋ถ€๋ชจ์ฐฝ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ณ , ์ด ๋ฐ˜๋Œ€๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค. ๊ธฐ์กด์—๋Š” ์ƒ์œ„ ๋„๋ฉ”์ธ์ด ๊ฐ™์€ ๊ฒฝ์šฐ, document.domain ์„ค์ •์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์œ„ ๋„๋ฉ”์ธ(example.com)์œผ๋กœ ์ถœ์ฒ˜๋ฅผ ๋ณ€๊ฒฝํ•ด SOP๋ฅผ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋ณด๋‹ค ๊ฐ•๋ ฅํ•œ ๋ณด์•ˆ์„ ์œ„ํ•ด ์ด ์„ค์ •์ž๋ฅผ ์ง€์› ์ค‘๋‹จํ•œ๋‹ค. ์ง€์› ์ค‘๋‹จ ๊ธฐ๊ฐ„ ๋™์•ˆ document.domain ์„ค์ •์ž๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ์ถœ์ฒ˜๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ chrome://flags์—์„œ Origin-keyed agent clusters ๊ธฐ๋Šฅ์„ ์„ค์ •ํ•ด ๊ธฐ์กด์ฒ˜๋Ÿผ document.domain์œผ๋กœ ์ถœ์ฒ˜๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ ์˜ต์…˜์ด ์•„๋‹ˆ๊ธฐ์— ๋Œ€์•ˆ์„ ์ฐพ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋Œ€์•ˆ์€ window.postMessage๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

// parent.example.com
window.addEventListener('message', (event) => {
  if (event.origin !== 'http://child.example.com') {
    return;
  }

  console.log(event.data); // ์•ˆ๋…•ํ•˜์„ธ์š”?
});

// child.example.com
window.postMessage('์•ˆ๋…•ํ•˜์„ธ์š”?', 'http://parent.example.com');

window.postMessage์˜ ์ž์„ธํ•œ ์‚ฌ์šฉ๋ฒ• ๋ฐ ๋‹ค๋ฅธ ๋Œ€์•ˆ์€ ์—ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ•ด๋„ ์ข‹๋‹ค.

์ด ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ € ๋ฐ ์›น ๊ฐœ๋ฐœ์ž์˜ ์˜๊ฒฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ฐธ์กฐ


โš ๏ธ Mutation ์ด๋ฒคํŠธ ์ง€์› ์ค‘๋‹จ ๐Ÿ“Œ

MutationEvent๋Š” DOM ์š”์†Œ์— ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋กœ, DOMSubtreeModified, DOMNodeInserted, DOMNodeRemoved ๋“ฑ์ด ์žˆ๋‹ค.

element.addEventListener(
  'DOMNodeInserted',
  (event) => {
    console.log('์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ๊ฐ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค.', event.srcElement);
  },
  false
);

element.append(document.createElement('span'));

// ์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ๊ฐ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค. <span></span>

์ด ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด DOM ๋ณ€๊ฒฝ์„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ์„ค๊ณ„์ƒ ๊ฒฐํ•จ๊ณผ ์น˜๋ช…์ ์ธ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์ด์œ ๋กœ 2011๋…„์— ํ‘œ์ค€์—์„œ ํ‡ด์ถœ๋˜์—ˆ๋‹ค.

2012๋…„์— ๋” ์•ˆ์ •์ ์ธ MutationObserver๊ฐ€ ๋“ฑ์žฅํ•˜์—ฌ ํ˜„์žฌ ๋Œ€๋ถ€๋ถ„์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ด ์ด๋ฒคํŠธ ์‚ฌ์šฉ ์‹œ ์ฝ˜์†”์— ๊ฒฝ๊ณ ๋ฅผ ๋…ธ์ถœํ•œ๋‹ค. ์•„์ง MutationEvent๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด MutationObserver๋กœ ์ „ํ™˜ํ•  ๊ฒƒ์„ ์ ๊ทน ๊ถŒ์žฅํ•œ๋‹ค.

const observer = new MutationObserver((mutations) => {
  for (const mutation of mutations) {
    if (mutation.type === 'childList') {
      console.log('์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ๊ฐ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค.', ...mutation.addedNodes);
    }
  }
});

observer.observe(element, { childList: true });
element.append(document.createElement('span'));

// ์ƒˆ๋กœ์šด ์š”์†Œ๋ฅผ ๊ฐ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค. <span></span>

Chrome 115๋ถ€ํ„ฐ๋Š” Mutation ์ด๋ฒคํŠธ ์‚ฌ์šฉ ์‹œ ์ข€ ๋” ๊ฐ•๋ ฅํ•œ ๊ฒฝ๊ณ ๋ฅผ ๋…ธ์ถœํ•˜๋ฉฐ, ๋‚ด๋…„ 7์›” ๋ง ๋ฐฐํฌ ์˜ˆ์ •์ธ Chrome 127๋ถ€ํ„ฐ๋Š” ์•„์˜ˆ ํ•ด๋‹น API๋ฅผ ์ œ๊ฑฐํ•  ์˜ˆ์ •์ด๋‹ค.

์ด ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ € ๋ฐ ์›น ๊ฐœ๋ฐœ์ž์˜ ์˜๊ฒฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ฐธ์กฐ


โœ… CSS ๋‹ค์ค‘ display ์†์„ฑ

display ์†์„ฑ์— ์ตœ๋Œ€ 3๊ฐœ์˜ ๊ฐ’์„ ๊ฐ™์ด ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝํ•œ๋‹ค. ์ƒˆ๋กœ์šด display ๋™์ž‘์ด ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ๊ธฐ์กด์— ํ•˜๋‚˜์˜ ๊ฐ’์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•˜๋˜ display ์†์„ฑ์„ ์ข€ ๋” ๋ช…์‹œ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๋„๋ก ๊ตฌ๋ฌธ์„ ๋ณ€๊ฒฝํ•œ ๊ฒƒ์ด๋‹ค.

๋จผ์ € ์ž๊ธฐ ์ž์‹ ์˜ ์ •๋ ฌ์„ ๊ฒฐ์ •ํ•˜๋Š” <display-outside>์™€ ์ž์‹ ์š”์†Œ์˜ ์ •๋ ฌ์„ ๊ฒฐ์ •ํ•˜๋Š” <display-inside>๋ฅผ ๋”ฐ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ์กด(์ถ•์•ฝ ๋ฌธ๋ฒ•) ๋‹ค์ค‘ ์†์„ฑ
block block flow
inline-block inline flow-root
table block table
inline-table inline table
flex block flex
inline-flex inline flex
grid block grid
inline-grid inline grid
list-item block flow list-item

ํŠนํžˆ inline- ์ ‘๋‘์‚ฌ๋ฅผ ๊ฐ€์ง„ ๊ฐ’์€ ๋ ˆ๊ฑฐ์‹œ ๊ฐ’(<display-legacy>)์œผ๋กœ ์ทจ๊ธ‰ํ•œ๋‹ค. ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ์†์„ฑ์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค inline-{์†์„ฑ๋ช…}์„ ๊ฐ™์ด ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์„ ์ค„์ธ ๊ฒƒ์ด๋‹ค. ๊ธฐ์กด ์†์„ฑ์€ ๋Œ€๋ถ€๋ถ„ ๋‹ค์ค‘ ์†์„ฑ ํ‘œ๊ธฐ์˜ ์ถ•์•ฝ ๋ฌธ๋ฒ•์œผ๋กœ ์ทจ๊ธ‰ํ•œ๋‹ค.

์ƒˆ๋กœ ์ถ”๊ฐ€๋  flow, flow-root๋Š” flow layout์„ ๊ฒฐ์ •ํ•˜๋Š” ์†์„ฑ์œผ๋กœ, flow๋Š” <display-outside>์˜ ๊ฐ’์— ๋”ฐ๋ผ ๋‚ด๋ถ€์— block-container๋ฅผ ์ƒ์„ฑํ• ์ง€, inline-box๋ฅผ ์ƒ์„ฑํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋ฉฐ, flow-root๋Š” ํ•ญ์ƒ ์ƒˆ๋กœ์šด block-container๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

์ด ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ € ๋ฐ ์›น ๊ฐœ๋ฐœ์ž์˜ ์˜๊ฒฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • Firefox: ๋ฐฐํฌ ์™„๋ฃŒ
  • Safari: ๋ฐฐํฌ ์™„๋ฃŒ
  • ์›น ๊ฐœ๋ฐœ์ž: ๊ธ์ •์ 

์ฐธ์กฐ


โœ… CSS ์Šคํฌ๋กค ์• ๋‹ˆ๋ฉ”์ด์…˜

ํ˜„์žฌ CSS ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ๋ชจ๋‘ document.timeline์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ DocumentTimeline์„ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹œ๊ฐ„๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. DocumentTimeline์€ ๋ฌธ์„œ๋ฅผ ์—ฐ ํ›„ ์ง€๋‚œ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„์˜ ์‹œ๊ฐ„๊ฐ’์œผ๋กœ, ํ˜„์žฌ CSS ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋ชจ๋‘ ๊ฒฝ๊ณผ ์‹œ๊ฐ„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๊ธฐ๋„ ํ•˜๋‹ค.

Chrome 115์—์„œ ์ •์‹ ๋ฐ˜์˜ ์˜ˆ์ •์ธ ScrollTimeline, ViewTimeline์€ ์š”์†Œ์˜ ์Šคํฌ๋กค ์œ„์น˜๊ฐ’์„ ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ์‹œ๊ฐ„๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

์Šคํฌ๋กค ์• ๋‹ˆ๋ฉ”์ด์…˜ ์˜ˆ์‹œ

๊ธฐ์กด์—๋Š” ์œ„์™€ ๊ฐ™์€ ์˜ˆ์ œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ•„์ˆ˜์˜€์œผ๋‚˜, ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋˜๋Š” animation-timeline ์†์„ฑ๊ณผ scroll() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด CSS๋งŒ์œผ๋กœ๋„ ์œ„์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

@keyframes animate-progress {
  from {
    transform: scaleX(0);
  }
  to {
    transform: scaleX(1);
  }
}

#progress {
  position: fixed;
  transform-origin: left center;
  width: 100%;
  height: 48px;
  background-color: coral;
  animation: animate-progress auto linear;
  animation-timeline: scroll(root vertical);
}

scroll() ํ•จ์ˆ˜์—๋Š” ์Šคํฌ๋กค ์š”์†Œ๋ฅผ ์ง€์ •ํ•˜๋Š” <scroller>์™€ ๋ฐฉํ–ฅ์„ ์ง€์ •ํ•˜๋Š” <axis> ๋‘ ๊ฐ€์ง€ ์†์„ฑ์„ ๋„˜๊ธธ ์ˆ˜ ์žˆ๋‹ค. ์ธ์ž๋ฅผ ์ƒ๋žตํ•˜๋ฉด <scroller>๋Š” ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์Šคํฌ๋กค ์š”์†Œ๋ฅผ ์ฐพ๋Š” nearest๋ฅผ, <axis>๋Š” block์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ง€์ •ํ•œ๋‹ค.

๋˜ ๋‹ค๋ฅธ ViewTimeline์€ animation-timeline์— view() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์ง€์ •ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ScrollTimeline์ด ์Šคํฌ๋กค ์ง„ํ–‰๋„๋ฅผ ์‹œ๊ฐ„๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ViewTimeline์€ ํ•ด๋‹น ์š”์†Œ๊ฐ€ ์Šคํฌ๋กค์— ๋”ฐ๋ผ ํ™”๋ฉด์— ๋ณด์ด๋Š” ์ •๋„๋ฅผ ์‹œ๊ฐ„๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

view-timeline ์˜ˆ์‹œ

(์ถœ์ฒ˜: Animate elements on scroll with Scroll-driven animations)

์œ„ ์˜ˆ์‹œ์—์„œ ์š”์†Œ๊ฐ€ ํ™”๋ฉด ์•„๋ž˜์— ์žˆ๋‹ค๋ฉด ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ์ง„ํ–‰๋„๋Š” 0%, ์š”์†Œ๊ฐ€ ์™„์ „ํžˆ ํ™”๋ฉด ์œ„์— ์žˆ๋‹ค๋ฉด 100%๊ฐ€ ๋œ๋‹ค. view()์—๋Š” scroll()๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฐฉํ–ฅ์„ ์ง€์ •ํ•˜๋Š” <axis>์™€, ์ง„ํ–‰๋„ ๊ณ„์‚ฐ์— ์‚ฌ์šฉํ•  ์š”์†Œ์˜ ๊ฒฝ๊ณ„๋ฅผ ์„ค์ •ํ•˜๋Š” <view-timeline-inset>์„ ๋„˜๊ธธ ์ˆ˜ ์žˆ๋‹ค.

.foo {
  animation-timeline: view(block 12px);
}

์ด ๊ธฐ๋Šฅ์€ ์•„์ง ์ดˆ์•ˆ์œผ๋กœ ์‚ฌ์šฉ๋ฒ•์ด๋‚˜ ์ด๋ฆ„ ๋“ฑ์ด ๋ฐ”๋€” ์ˆ˜ ์žˆ์Œ์— ์ฃผ์˜ํ•˜์ž.

์ด ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ € ๋ฐ ์›น ๊ฐœ๋ฐœ์ž์˜ ์˜๊ฒฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ฐธ์กฐ


๐Ÿงช HTTPS ์—ฐ๊ฒฐ ์—…๊ทธ๋ ˆ์ด๋“œ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ

ํ•ด๋‹น ์‚ฌ์ดํŠธ๊ฐ€ HTTPS ์—ฐ๊ฒฐ์„ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ, ์ž๋™์œผ๋กœ HTTPS ์—ฐ๊ฒฐ์„ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜๋Š” ๊ธฐ๋Šฅ์˜ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ๊ธฐ์กด์—๋„ Strict-Trasport-Security ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTTPS ์—ฐ๊ฒฐ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์œ ๋„ํ•˜๊ฑฐ๋‚˜, Chrome ์„ค์ •์˜ Always use secure connections ์˜ต์…˜์„ ํ†ตํ•ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTTPS๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๊ฐ€ HTTP ์—ฐ๊ฒฐ์„ ์‚ฌ์šฉํ•ด ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

  • HSTS๋ฅผ ์‚ฌ์šฉํ•˜๋‚˜ ๋ธŒ๋ผ์šฐ์ €์— ํ•ด๋‹น ์‚ฌ์ดํŠธ๋ฅผ ๋ฐฉ๋ฌธํ•œ ๊ธฐ๋ก์ด ์—†๋Š” ๊ฒฝ์šฐ
  • ์‚ฌ์ดํŠธ์—์„œ HTTP๋ฅผ HTTPS๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๋‚˜ HSTS๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
  • ์‚ฌ์ดํŠธ์—์„œ HTTP์™€ HTTPS๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•˜๋‚˜ HTTP๋ฅผ HTTPS๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

์ด ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ € ๋ฐ ์›น ๊ฐœ๋ฐœ์ž์˜ ์˜๊ฒฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ฐธ์กฐ


๐Ÿงช SHA-1 ์„œ๋ฒ„ ์ „์ž ์„œ๋ช… ์ง€์› ์ค‘๋‹จ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ

SHA(Secure Hash Algorithm)๋Š” ํ•ด์‹œ ํ•จ์ˆ˜์˜ ์ง‘ํ•ฉ์ด๋‹ค. ๊ทธ ์ค‘์—์„œ๋„ SHA-1์€ ๊ณผ๊ฑฐ ์ธ์ฆ์„œ์™€ ์ „์ž ์„œ๋ช…์— ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋˜ ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ,1995๋…„์— ์ฒ˜์Œ ๋“ฑ์žฅํ•ด 2000๋…„๋Œ€๋ถ€ํ„ฐ 2010๋…„๋Œ€ ์ดˆ๋ฐ˜๊นŒ์ง€ ํ‘œ์ค€์œผ๋กœ ๋„๋ฆฌ ์‚ฌ์šฉํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ทจ์•ฝ์ ์ด ์ œ๊ธฐ๋˜์–ด 2011๋…„์— SHA-2๊ฐ€ ์ƒˆ๋กœ์šด ํ‘œ์ค€ ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋˜์—ˆ๊ณ , ํ˜„์žฌ ๋Œ€๋ถ€๋ถ„์˜ ์ตœ์‹  OS, ๋ธŒ๋ผ์šฐ์ €์—์„œ SHA-1 ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.

Chrome๋„ ์ด๋ฏธ ๊ณผ๊ฑฐ์— SHA-1์„ ์‚ฌ์šฉํ•œ ์„œ๋ฒ„ ์ธ์ฆ์„œ๋ฅผ ์ง€์› ์ค‘๋‹จํ–ˆ๋‹ค. Chrome 117์—์„œ๋Š” SHA-1์„ ์‚ฌ์šฉํ•œ ์„œ๋ฒ„ ์ „์ž ์„œ๋ช…์„ ์ง€์› ์ค‘๋‹จํ•  ์˜ˆ์ •์ด๋‹ค. SHA-1์„ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์ธ์ฆ์„œ๋‚˜ ์ „์ž ์„œ๋ช…์€ ์•„์ง ์ง€์› ์ค‘๋‹จ ์ผ์ •์ด ์—†์–ด, ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ์„œ๋ฒ„์—์„œ ์ง์ ‘ SHA-1์„ ์‚ฌ์šฉํ•œ ์ธ์ฆ์„œ๋ฅผ ๊ฑฐ๋ถ€ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

์ด ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ € ๋ฐ ์›น ๊ฐœ๋ฐœ์ž์˜ ์˜๊ฒฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ฐธ์กฐ


๐Ÿ—“๏ธ ๋ฐฐํฌ ์˜ˆ์ •์ผ

Chrome 115๋Š” 2023๋…„ 7์›” 12์ผ์— ์ •์‹ ๋ฐฐํฌ ์˜ˆ์ •์ด๋‹ค.


2. Chrome 116

โœ… CSS Motion Path

CSS์— offset-path ์†์„ฑ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. offset-path๋Š” offset์˜ ํ•˜์œ„ ์†์„ฑ์œผ๋กœ, ํ•ด๋‹น ์š”์†Œ๊ฐ€ ์›€์ง์ผ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜๋Š” ์†์„ฑ์ด๋‹ค.

motion ์˜ˆ์ œ

(์ถœ์ฒ˜: Motion Path Module Level 1)

๊ธฐ์กด์—๋Š” path()๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋Œ€๋ถ€๋ถ„์ด์—ˆ์œผ๋‚˜, ์—…๋ฐ์ดํŠธ ์ดํ›„์—๋Š” ๊ฐ๋„๋กœ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜๋Š” ray(), ์›์„ ๊ทธ๋ฆฌ๋Š” circle(), polygon() ๋“ฑ ๋‹ค์–‘ํ•œ ํ•จ์ˆ˜๋ฅผ ์ง€์›ํ•  ์˜ˆ์ •์ด๋‹ค.

circle ์˜ˆ์ œ

(์ถœ์ฒ˜: Motion Path Module Level 1)

์ด ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ € ๋ฐ ์›น ๊ฐœ๋ฐœ์ž์˜ ์˜๊ฒฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • Firefox: ๊ฐœ๋ฐœ ์ค‘
  • Safari: ๊ฐœ๋ฐœ ์ค‘
  • ์›น ๊ฐœ๋ฐœ์ž: ์˜๊ฒฌ ์—†์Œ

์ฐธ์กฐ


โœ… display, content-visibility์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‚ฌ์šฉ ์ง€์›

display ์†์„ฑ ๋ฐ content-visibility ์†์„ฑ์„ CSS ์• ๋‹ˆ๋ฉ”์ด์…˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝํ•œ๋‹ค.

@keyframes slideOut {
  from {
    display: block;
  }
  to {
    transform: translateX(40px);
    opacity: 0;
  }
}

.hide {
  animation: slideOut 0.2s;
  display: none;
}

์œ„ ์˜ˆ์‹œ์—์„œ hide ํด๋ž˜์Šค๋ฅผ ์ง€์ •ํ•œ ์š”์†Œ๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜ ์—†์ด ๋ฐ”๋กœ ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ง„๋‹ค. display ์†์„ฑ์€ opacity ๋“ฑ์˜ ์†์„ฑ๊ณผ ๋‹ฌ๋ฆฌ ์ค‘๊ฐ„๊ฐ’์„ ์—ฐ์‚ฐํ•  ์ˆ˜ ์—†๋Š” ๋ถˆ์—ฐ์†(discrete) ์†์„ฑ์ด๋‹ค. ์• ๋‹ˆ๋ฉ”์ด์…˜์—์„œ display ์†์„ฑ ์ž์ฒด๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์•„ display: block; ๊ตฌ๋ฌธ์„ ๋ฌด์‹œํ•œ ๊ฒƒ์ด๋‹ค.

์—…๋ฐ์ดํŠธ ์ดํ›„์—๋Š” display ๋ฐ content-visibility ์†์„ฑ์˜ ์ค‘๊ฐ„๊ฐ’์„ none | hidden์ด ์•„๋‹Œ ํŠน์ • ๊ฐ’์œผ๋กœ ์—ฐ์‚ฐํ•ด ํ•ด๋‹น ์†์„ฑ์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‚ฌ์šฉ์„ ์ง€์›ํ•  ์˜ˆ์ •์ด๋‹ค.

์ด ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ € ๋ฐ ์›น ๊ฐœ๋ฐœ์ž์˜ ์˜๊ฒฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • Firefox: ์˜๊ฒฌ ์—†์Œ
  • Safari: ์˜๊ฒฌ ์—†์Œ
  • ์›น ๊ฐœ๋ฐœ์ž: ๊ธ์ •์ 

์ฐธ์กฐ


โœ… CSS ๋ถˆ์—ฐ์† ์†์„ฑ์˜ Transition ์ง€์›

CSS ๋ถˆ์—ฐ์†(discrete) ์†์„ฑ์ด๋ž€ ์ค‘๊ฐ„๊ฐ’์„ ์—ฐ์‚ฐํ•  ์ˆ˜ ์—†๋Š” display, visibility ๋“ฑ์„ ๋งํ•œ๋‹ค. ์ด๋“ค์€ ์ค‘๊ฐ„๊ฐ’์„ ์—ฐ์‚ฐํ•  ์ˆ˜ ์—†์–ด transition ์†์„ฑ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.

๊ธฐ์กด์—๋Š” ํŠน์ • ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋๋‚œ ํ›„ display: none; ์†์„ฑ์„ ์ ์šฉํ•˜๋ ค๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ง์ ‘ ์Šคํƒ€์ผ์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ–ˆ๋‹ค.

.hide {
  transition: opacity 0.3s;
  opacity: 0;
  /* display: none; */
}
const target = document.querySelector('#target');

target.addEventListener('transitionend', () => {
  target.style.setProperty('display', 'none');
});

target.classList.add('hide');

Chrome 115๋ถ€ํ„ฐ๋Š” transition-property ์†์„ฑ์— ๋ถˆ์—ฐ์† ์†์„ฑ์„ ๋ช…์‹œํ•ด transition์˜ ๋Œ€์ƒ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

.hide {
  transition: opacity 0.3s, display 0.3s;
  opacity: 0;
  display: none;
}
const target = document.querySelector('#target');

target.classList.add('hide');

์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€ all์€ ์—ฌ์ „ํžˆ ๋ถˆ์—ฐ์† ์†์„ฑ์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ด๋‹ค. ๋ถˆ์—ฐ์† ์†์„ฑ์„ transition์˜ ๋Œ€์ƒ์œผ๋กœ ์ง€์ •ํ•˜๋ ค๋ฉด ํ•ด๋‹น ์†์„ฑ์„ ๋ช…์‹œ์ ์œผ๋กœ transition-property์— ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

/* ์• ๋‹ˆ๋ฉ”์ด์…˜ ์—†์ด ๋ฐ”๋กœ ์‚ฌ๋ผ์ง„๋‹ค. */
.hide {
  transition: all 0.3s;
  opacity: 0;
  display: none;
}

/* 0.3์ดˆ ํ›„ ์‚ฌ๋ผ์ง„๋‹ค. */
.hide {
  transition: display 0.3s, opacity 0.3s;
  opacity: 0;
  display: none;
}

์ด ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ € ๋ฐ ์›น ๊ฐœ๋ฐœ์ž์˜ ์˜๊ฒฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • Firefox: ์˜๊ฒฌ ์—†์Œ
  • Safari: ์˜๊ฒฌ ์—†์Œ
  • ์›น ๊ฐœ๋ฐœ์ž: ์˜๊ฒฌ ์—†์Œ

์ฐธ์กฐ


๐Ÿงช SVGUseElement์˜ data: URL ์ง€์› ์ค‘๋‹จ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ

SVG์˜ <use>๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์™ธ๋ถ€ SVG ์ด๋ฏธ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์™€ ํ˜„์žฌ ๋ฌธ์„œ์— ๋ถ™์—ฌ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค. ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ด๋‚˜ ๋ณด์•ˆ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๋งŒํผ <use>์—๋Š” ๋™์ผ ์ถœ์ฒ˜ ์ •์ฑ…(same-origin policy)์ด ์ ์šฉ๋œ๋‹ค. ํ•˜์ง€๋งŒ data: URL์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ํ•ญ์ƒ ๋™์ผ ์ถœ์ฒ˜๋กœ ์ทจ๊ธ‰ํ•˜๋ฉฐ, ์ผ๋ถ€ ๋ณด์•ˆ ๋ชจ๋“ˆ์„ ๊ฑฐ์น˜์ง€ ์•Š๋Š”๋‹ค.

๊ธฐ์กด์— data: URL์„ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ๋™์ผ ์ถœ์ฒ˜์˜ .svg ์ด๋ฏธ์ง€๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜, ์ธ๋ผ์ธ์—์„œ ์ง์ ‘ ์ด๋ฏธ์ง€๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ „ํ™˜ํ•˜๊ธฐ๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค.

<svg viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
  <circle id="circle" cx="5" cy="5" r="4" stroke="blue" />
  <use href="#circle" />
</svg>

const url = URL.createObjectURL(blob);
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');
use.setAttribute('href', `${url}#circle`);
svg.appendChild(use);
document.body.appendChild(svg);

์ด ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ € ๋ฐ ์›น ๊ฐœ๋ฐœ์ž์˜ ์˜๊ฒฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ฐธ์กฐ


๐Ÿ—“๏ธ ๋ฐฐํฌ ์˜ˆ์ •์ผ

Chrome 116์€ 2023๋…„ 8์›” 9์ผ์— ์ •์‹ ๋ฐฐํฌ ์˜ˆ์ •์ด๋‹ค. 7์›” 19์ผ๋ถ€ํ„ฐ 7์›” 27์ผ ์‚ฌ์ด์— Chrome ๋ฒ ํƒ€ ๋ฒ„์ „์—์„œ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ๋ฏธ๋ฆฌ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


3. Chrome 117

โš ๏ธ CSS zoom ์†์„ฑ ์ง€์› ์ค‘๋‹จ ๐Ÿ“Œ

๋น„ํ‘œ์ค€ CSS ์†์„ฑ์ธ zoom์„ ์ง€์› ์ค‘๋‹จํ•œ๋‹ค.

zoom์€ ์š”์†Œ ํฌ๊ธฐ ๋ฐฐ์œจ์„ ์ง€์ •ํ•˜๋Š” CSS ์†์„ฑ์ด๋‹ค. transform: scale()๊ณผ ์œ ์‚ฌํ•˜๋‚˜, zoom์€ ์‹ค์ œ ๋ ˆ์ด์•„์›ƒ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฉฐ, ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ด ๋‹ค๋ฅด๋‹ค.

์•„์ง zoom์„ ์‚ฌ์šฉํ•˜๋Š” ํŽ˜์ด์ง€๊ฐ€ ์žˆ๋‹ค๋ฉด ํ‘œ์ค€ ์†์„ฑ์ธ transform: scale()์œผ๋กœ์˜ ์ „ํ™˜์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค. ํ˜„์žฌ ์ด ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ํŽ˜์ด์ง€๋Š” ์ „์ฒด ํŽ˜์ด์ง€์˜ ์•ฝ 0.5% ์ •๋„๋ผ๊ณ  ํ•œ๋‹ค.

์ด ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ € ๋ฐ ์›น ๊ฐœ๋ฐœ์ž์˜ ์˜๊ฒฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ฐธ๊ณ 


โš ๏ธ RTCPeerConnection.getStats() ์ฝœ๋ฐฑ ๋ฐฉ์‹ ์ง€์› ์ค‘๋‹จ

RTCPeerConnection.getStats()๋Š” ํ•ด๋‹น ์˜ค๋””์˜ค๋‚˜ ๋น„๋””์˜ค ์—ฐ๊ฒฐ์— ๋Œ€ํ•œ ํ†ต๊ณ„ ์ž๋ฃŒ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” API๋‹ค. ํ˜„์žฌ Chrome์—์„œ ์ด API๋Š” ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ตœ์‹  ๋ฒ„์ „๊ณผ, ์ฝœ๋ฐฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ๋ฒ„์ „ ๋‘ ๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค.

myPeerConnection.getStats(); // ์ตœ์‹  ๋ฒ„์ „
myPeerConnection.getStats(null, onSuccess, onFailure); // ๊ตฌ๋ฒ„์ „, Promise ๋ฐ˜ํ™˜ X

์ฝœ๋ฐฑ ๋ฐฉ์‹์€ ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ์–ด์šธ๋ฆฌ์ง€ ์•Š๊ณ , ํ‘œ์ค€ ์ŠคํŽ™ ๋ฌธ์„œ๋„ ์—†์–ด ์žฅ๊ธฐ์ ์œผ๋กœ ์ง€์›์„ ์ค‘๋‹จํ•  ์˜ˆ์ •์ด๋‹ค. Chrome 113 ์ด์ƒ์—์„œ๋Š” ์ฝœ๋ฐฑ ๋ฐฉ์‹ ์‚ฌ์šฉ ์‹œ ์ฝ˜์†”์— ๊ฒฝ๊ณ ๋ฅผ ๋…ธ์ถœํ•˜๋ฉฐ, chrome://flags์—์„œ ์ง€์› ์ค‘๋‹จ ํ™˜๊ฒฝ์„ ๋ฏธ๋ฆฌ ์ฒดํ—˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ € ๋ฐ ์›น ๊ฐœ๋ฐœ์ž์˜ ์˜๊ฒฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • Firefox: ๋ฐฐํฌ ์™„๋ฃŒ
  • Safari: ๋ฐฐํฌ ์™„๋ฃŒ
  • ์›น ๊ฐœ๋ฐœ์ž: ์˜๊ฒฌ ์—†์Œ

์ฐธ์กฐ


โœ… CSS Anchor ๋ฐฐ์น˜

ํŠน์ • ์š”์†Œ์— ๊ธฐ๋ฐ˜ํ•ด ํ˜„์žฌ ์š”์†Œ๋ฅผ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋Š” Anchor ๋ฐฐ์น˜ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ํŠนํžˆ ํˆดํŒ ๋“ฑ์„ ๊ตฌํ˜„ํ•  ๋•Œ ์œ ์šฉํ•œ๋ฐ, absolute ๋ฐฐ์น˜์™€ ๋น„์Šทํ•˜๋‚˜ DOM ๊ตฌ์กฐ์— ๊ตฌ์•  ๋ฐ›์ง€ ์•Š๊ณ  ํˆดํŒ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ๋‹ค๋ฅด๋‹ค.

.anchor {
  anchor-name: --tooltip;
}

.tooltip {
  position: fixed;
  anchor-default: --tooltip;
  bottom: anchor(auto);
  left: anchor(right);
  min-width: anchor-size(width);
}

์˜ˆ์ œ์ฒ˜๋Ÿผ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด .tooltip์€ .anchor ์š”์†Œ์˜ ์˜ค๋ฅธ์ชฝ ์œ„์— ๋‚˜ํƒ€๋‚œ๋‹ค. ๋งŒ์•ฝ .tooltip์ด ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์„ ๋ฒ—์–ด๋‚œ๋‹ค๋ฉด bottom: anchor(auto)์— ์˜ํ•ด .anchor ์š”์†Œ์˜ ์•„๋ž˜์— ๋ฐฐ์น˜๋œ๋‹ค.

anchor-name์—๋Š” ํ•ด๋‹น Anchor์˜ ์ด๋ฆ„์„ ์„ ์–ธํ•˜๋ฉฐ, ํ•ด๋‹น Anchor์— ๋ฐฐ์น˜ํ•  ์š”์†Œ์—์„œ ์ด ์ด๋ฆ„์œผ๋กœ ํ•ด๋‹น ์š”์†Œ์˜ ์œ„์น˜๋‚˜ ํฌ๊ธฐ ๋“ฑ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. anchor() ํ•จ์ˆ˜๋Š” ํ•ด๋‹น Anchor์˜ ์œ„์น˜๊ฐ’์„, anchor-size()๋Š” ํ•ด๋‹น Anchor์˜ ํฌ๊ธฐ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋กœ, ๊ธฐ๋ณธ์ ์œผ๋กœ ์•„๋ž˜์ฒ˜๋Ÿผ Anchor์˜ ์ด๋ฆ„์„ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค.

.tooltip {
  bottom: anchor(--tooltip auto);
  max-width: anchor-size(--tooltip width);
}

๋งŒ์•ฝ ํ•ด๋‹น ์š”์†Œ์— anchor-default๋ฅผ ์„ค์ •ํ–ˆ๋‹ค๋ฉด ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.

.tooltip {
  anchor-default: --tooltip;
  bottom: anchor(auto);
  max-width: anchor-size(width);
}

@position-fallback ๊ทœ์น™์„ ์„ ์–ธํ•˜๋ฉด ํ•ด๋‹น ์š”์†Œ๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์„ ๋ฒ—์–ด๋‚  ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์Šคํƒ€์ผ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

@position-fallback --tooltip-position {
  @try {
    top: anchor(--tooltip bottom);
    left: anchor(--tooltip left);
  }

  @try {
    bottom: anchor(--tooltip top);
    left: anchor(--tooltip left);
  }

  @try {
    top: anchor(--tooltip bottom);
    right: anchor(--tooltip right);
  }
}

#tooltip {
  position: fixed;
  position-fallback: --tooltip-position;
}

์œ„ ์ฝ”๋“œ๋Š” ๋จผ์ € Anchor์˜ ์™ผ์ชฝ ์•„๋ž˜์— ๋ฐฐ์น˜๋ฅผ ์‹œ๋„ํ•˜๋ฉฐ, ๋งŒ์•ฝ ํ™”๋ฉด์„ ๋ฒ—์–ด๋‚˜๋ฉด Anchor์˜ ์™ผ์ชฝ ์œ„, ๋งˆ์ง€๋ง‰์œผ๋กœ Anchor์— ์˜ค๋ฅธ์ชฝ ์•„๋ž˜์— #tooltip์„ ๋ฐฐ์น˜ํ•˜๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค.

์ด ๊ธฐ๋Šฅ์€ ์•„์ง ์ดˆ์•ˆ์œผ๋กœ ์„ธ์„ธํ•œ ์ŠคํŽ™์ด๋‚˜ ๋™์ž‘์ด ๋ฐ”๋€” ์ˆ˜ ์žˆ์Œ์— ์ฃผ์˜ํ•˜์ž.

์ด ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ € ๋ฐ ์›น ๊ฐœ๋ฐœ์ž์˜ ์˜๊ฒฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ฐธ์กฐ


โœ… @scope ๊ทœ์น™

CSS ์ดˆ์•ˆ์œผ๋กœ ์ œ์•ˆ ์ค‘์ธ @scope ๊ทœ์น™์„ ์ ์šฉํ•œ๋‹ค. @scope๋Š” CSS ๊ทœ์น™์„ ํŠน์ • ๊ตฌ๊ฐ„์—๋งŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ๋ฒ•์œผ๋กœ, CSS์— ์Šค์ฝ”ํ”„๋ผ๋Š” ์ƒˆ๋กœ์šด ๊ฐœ๋…์ด ์ƒ๊ธฐ๋Š” ์…ˆ์ด๋‹ค.

@scope ๊ทœ์น™์„ ๋‹จ์ˆœํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

@scope (.red-theme) {
  span {
    color: red;
  }
}

@scope (.blue-theme) {
  span {
    color: blue;
  }
}

์œ„ ๋ฌธ๋ฒ•์€ ์•„๋ž˜์ฒ˜๋Ÿผ ์ผ๋ฐ˜ ์„ ํƒ์ž๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์œผ๋‚˜, ๊ฝค ํฐ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

.red-theme span {
  color: red;
}

.blue-theme span {
  color: blue;
}

์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜์™€ ๊ฐ™์€ ํŽ˜์ด์ง€๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ด ๋ณด์ž.

<div class="blue-theme">
  <span>this is blue-theme</span>

  <div class="red-theme">
    <span>this is red-theme</span>
  </div>
</div>

์ผ๋ฐ˜ ์„ ํƒ์ž๋กœ ๊ตฌํ˜„ํ•œ ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜๋ฉด ๋‘ <span> ํ…์ŠคํŠธ๋Š” ๋ชจ๋‘ ํŒŒ๋ž€์ƒ‰์œผ๋กœ ๋‚˜ํƒ€๋‚œ๋‹ค. .blue-theme span๊ณผ .red-theme span์˜ CSS ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๊ฐ™์•„ ๋‚˜์ค‘์— ์„ ์–ธํ•œ .blue-theme span์˜ ์Šคํƒ€์ผ์ด .red-theme span์˜ ์Šคํƒ€์ผ์„ ๋ฎ์–ด์”Œ์šฐ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

@scope ๊ทœ์น™์œผ๋กœ ์ž‘์„ฑํ•œ ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜๋ฉด ์˜๋„๋Œ€๋กœ ์ฒซ ๋ฒˆ์งธ <span>์€ ํŒŒ๋ž€์ƒ‰, ๋‘ ๋ฒˆ์งธ <span>์€ ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ๋‚˜ํƒ€๋‚œ๋‹ค. @scope๋Š” @scope์— ์„ ์–ธํ•œ ์ƒ์œ„ ์Šค์ฝ”ํ”„์— ํ•ด๋‹น ์š”์†Œ๊ฐ€ ๊ฐ€๊นŒ์šธ ์ˆ˜๋ก ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’๋‹ค. ๋•Œ๋ฌธ์— ๋‘ ๋ฒˆ์งธ <span>์— ์Šคํƒ€์ผ์„ ์ ์šฉํ•  ๋•Œ @scope (.blue-theme)์—์„œ ์„ ์–ธํ•œ ๊ทœ์น™๋ณด๋‹ค @scope (.red-theme)์—์„œ ์„ ์–ธํ•œ ๊ทœ์น™์ด ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋” ๋†’์•„ color: red; ์Šคํƒ€์ผ์ด color: blue; ์Šคํƒ€์ผ์„ ๋ฎ์–ด ์”Œ์šด๋‹ค.

๋˜ํ•œ @scope A to B ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ์Šคํƒ€์ผ์˜ ์ ์šฉ ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ณ ,

@scope (.article) to (.comment) {
  p {
    margin: 12px 0;
  }
}

& ์„ ํƒ์ž ๋˜๋Š” :scope ๊ฐ€์ƒ ์„ ํƒ์ž๋ฅผ ์ด์šฉํ•˜๋ฉด ํ˜„์žฌ ์ƒ์œ„ ์Šค์ฝ”ํ”„ ์š”์†Œ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.

@scope (.light-theme) {
  & {
    background-color: white;
  }
}

@scope (.dark-theme) {
  :scope {
    background-color: black;
  }
}

์ด ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ € ๋ฐ ์›น ๊ฐœ๋ฐœ์ž์˜ ์˜๊ฒฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ฐธ์กฐ


๐Ÿ—“๏ธ ๋ฐฐํฌ ์˜ˆ์ •์ผ

Chrome 117์€ 2023๋…„ 9์›” 6์ผ์— ์ •์‹ ๋ฐฐํฌ ์˜ˆ์ •์ด๋‹ค. 8์›” 16์ผ๋ถ€ํ„ฐ 8์›” 24์ผ ์‚ฌ์ด์— Chrome ๋ฒ ํƒ€ ๋ฒ„์ „์—์„œ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ๋ฏธ๋ฆฌ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


4. Chrome NEXT

โš ๏ธ [Chrome 119] ๋น„ํ‘œ์ค€ shadowroot ์†์„ฑ ์ง€์› ์ค‘๋‹จ

์„ ์–ธ์  Shadow DOM์€ <template> ์š”์†Œ์— shadowroot ์†์„ฑ์„ ์ง€์ •ํ•ด ํ…œํ”Œ๋ฆฟ์—์„œ ์ง์ ‘ Shadow DOM์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ํ‘œ์ค€์—์„œ ์ด ์†์„ฑ์— ๋Œ€ํ•œ ์ด๋ฆ„์„ shadowrootmode๋กœ ๋ณ€๊ฒฝํ•จ์— ๋”ฐ๋ผ ๊ธฐ์กด shadowroot ์†์„ฑ์„ ์ง€์› ์ค‘๋‹จํ•œ๋‹ค. shadowroot๋Š” Chrome์—์„œ ๊ทธ๋Œ€๋กœ ๋™์ž‘ํ•˜๋‚˜, Chrome 111์—์„œ ์ถ”๊ฐ€๋œ ์ŠคํŠธ๋ฆฌ๋ฐ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. shadowrootmode๋Š” Chrome 111 ์ด์ƒ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‹ค๋ฅธ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ์ง€์› ์˜ˆ์ •์ด๋ฏ€๋กœ shadowrootmode ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

<host-element>
- <template shadowroot="open">
+ <template shadowrootmode="open">
    <slot></slot>
  </template>
  <h2>Light content</h2>
</host-element>

Chrome 112์—์„œ shadowroot ์†์„ฑ์— ๋Œ€ํ•œ ์ง€์› ์ค‘๋‹จ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค. Chrome 112 ์ด์ƒ์—์„œ chrome://flags์—์„œ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•ด ์†์„ฑ ์ง€์› ์ค‘๋‹จ์„ ๋ฏธ๋ฆฌ ์ฒดํ—˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ € ๋ฐ ์›น ๊ฐœ๋ฐœ์ž์˜ ์˜๊ฒฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • Firefox: ์˜๊ฒฌ ์—†์Œ
  • Safari: ์˜๊ฒฌ ์—†์Œ
  • ์›น ๊ฐœ๋ฐœ์ž: ์˜๊ฒฌ ์—†์Œ

์ฐธ์กฐ


โš ๏ธ [Chrome 119] WebSQL ์ง€์› ์ค‘๋‹จ

WebSQL์€ ๊ณผ๊ฑฐ ๋ธŒ๋ผ์šฐ์ €์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ œ์•ˆ๋œ API๋กœ, Webkit ๊ธฐ๋ฐ˜์˜ ์ผ๋ถ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ํ”„๋กœ์ ํŠธ๋Š” ๋ณด์•ˆ ๊ตฌํ˜„ ๋“ฑ์˜ ์–ด๋ ค์›€์œผ๋กœ 1๋…„ ๋งŒ์— ํ๊ธฐ๋˜์—ˆ๊ณ , Webkit๋„ 2019๋…„์— ์ด API๋ฅผ ์ง€์› ์ค‘๋‹จํ–ˆ๋‹ค.

์ด๋ฏธ ๋Œ€๋ถ€๋ถ„์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ Web Storage API, IndexedDB API ๊ฐ™์€ ์ตœ์‹  ์ €์žฅ์†Œ API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ์ด API๋ฅผ ์ง€์› ์ค‘๋‹จํ•œ๋‹ค. ์ด๋ฏธ Chrome 97์—์„œ ์ œ3์ž ์ปจํ…์ŠคํŠธ์—์„œ WebSQL์„ ์ œ๊ฑฐํ–ˆ์œผ๋ฉฐ, Chrome 105์—์„œ๋Š” ๋ณด์•ˆ ์—ฐ๊ฒฐ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํŽ˜์ด์ง€์—์„œ์˜ ์‚ฌ์šฉ์„ ์ง€์› ์ค‘๋‹จํ–ˆ๋‹ค.

์›น์—์„œ SQL์„ ๊ณ„์† ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์›น ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ์ด์šฉํ•œ SQLite๊ฐ€ ๊ณต์‹ ๋Œ€์•ˆ์ด๋ฏ€๋กœ ์ฐธ๊ณ ํ•˜์ž.

์ด ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ € ๋ฐ ์›น ๊ฐœ๋ฐœ์ž์˜ ์˜๊ฒฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ฐธ์กฐ


โš ๏ธ [Chrome LATER] unload ์ด๋ฒคํŠธ ์ง€์› ์ค‘๋‹จ

unload ์ด๋ฒคํŠธ๋Š” ํ•ด๋‹น ๋ฌธ์„œ ๋˜๋Š” ์ž์‹ ๋ฌธ์„œ๋ฅผ ํ•ด์ œํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ์ด๋‹ค. ์ด ์ด๋ฒคํŠธ๋ฅผ ์ด์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— ํŠน์ • ๋™์ž‘์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

window.addEventListener('unload', (event) => {
  navigator.sendBeacon('/api/log', 'unload!');
});

ํ•˜์ง€๋งŒ unload ์ด๋ฒคํŠธ๋Š” beforeunload ์ด๋ฒคํŠธ์™€ ๋‹ฌ๋ฆฌ ๊ธฐ๋ณธ ๋™์ž‘์„ ์ทจ์†Œ(event.preventDefault())ํ•  ์ˆ˜ ์—†์–ด ์ด๋ฒคํŠธ๊ฐ€ ์•„์˜ˆ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ธฐ๋„ ํ•œ๋‹ค. W3C์˜ ํ†ต๊ณ„์— ๋”ฐ๋ฅด๋ฉด unload ์ด๋ฒคํŠธ๊ฐ€ ์ œ๋Œ€๋กœ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ Chrome ๋ฐ์Šคํฌํƒ‘์—์„œ๋Š” 95%, ๋ชจ๋ฐ”์ผ์—์„œ๋Š” 57% ~ 68% ์ •๋„๋กœ, ์ด๋Š” ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์˜ ํŠน์„ฑ์ƒ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์•ฑ์„ ๋ณด๋‹ค๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ์ž์ฒด๋ฅผ ์ข…๋ฃŒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋นˆ๋ฒˆํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ด ํ•ญ๋ชฉ์€ ์ œ์•ˆ ์ค‘์œผ๋กœ ์ ์šฉ ์—ฌ๋ถ€๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์œผ๋‚˜, ๊ธฐ์กด์— unload ์ด๋ฒคํŠธ์— ์˜์กดํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ด€์‹ฌ์„ ๊ฐ€์ง€๊ณ  ์ง€์ผœ๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

์ด ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ € ๋ฐ ์›น ๊ฐœ๋ฐœ์ž์˜ ์˜๊ฒฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ฐธ์กฐ


โœ… [Chrome LATER] ๋‚ด๋ถ€๋ง์— ๋Œ€ํ•œ ํ•˜์œ„ ๋ฆฌ์†Œ์Šค ์š”์ฒญ ๊ทœ์น™ ์ ์šฉ

๋‚ด๋ถ€๋ง ์ ‘๊ทผ ๊ทœ์น™(Local Network Access) ์ ์šฉ์˜ ์ผ๋ถ€๋กœ ํ•˜์œ„ ๋ฆฌ์†Œ์Šค(.js, .css ๋“ฑ)๋ฅผ ์š”์ฒญํ•  ๋•Œ ๋‚ด๋ถ€๋ง(์‚ฌ์„ค IP, localhost)์— ๋Œ€ํ•œ ์ ‘๊ทผ ์ œํ•œ์„ ๊ฒ€ํ†  ์ค‘์ด๋‹ค. ์ •์‹ ์ ์šฉ ์ผ์ •์€ ๋ถˆํˆฌ๋ช…ํ•˜๋‚˜, ๋ฏธ๋ฆฌ ๋ณด๊ธฐ๋กœ ์ผ๋ถ€ ๊ธฐ๋Šฅ์„ ์ฒดํ—˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ณต๊ฐœ ์›น ์‚ฌ์ดํŠธ์˜ ๋‚ด๋ถ€๋ง ํ•˜์œ„ ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ ์ œํ•œ

๊ณต๊ฐœ ์›น ์‚ฌ์ดํŠธ(๊ณต๊ฐœ IP๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์‚ฌ์ดํŠธ)์—์„œ ๋‚ด๋ถ€๋ง์— ํ•˜์œ„ ๋ฆฌ์†Œ์Šค(.js, .css ๋“ฑ) ์š”์ฒญ ์‹œ ๋ฐ˜๋“œ์‹œ ๋ณด์•ˆ ์ปจํ…์ŠคํŠธ(HTTPS)๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ œํ•œํ•œ๋‹ค. ๋‚ด๋ถ€๋ง์˜ ํ•˜์œ„ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ๋ณด์•ˆ ์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.

Chrome 86 ์ด์ƒ์˜ chrome://flags์—์„œ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•ด ์ ‘๊ทผ ์ œํ•œ์„ ๋ฏธ๋ฆฌ ์ฒดํ—˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‚ด๋ถ€๋ง์— ํ•˜์œ„ ๋ฆฌ์†Œ์Šค ์š”์ฒญ ์‹œ ์‚ฌ์ „ ์š”์ฒญ ๋ฐœ์†ก

๋‚ด๋ถ€๋ง์— ํ•˜์œ„ ๋ฆฌ์†Œ์Šค ์š”์ฒญ ์‹œ ์‚ฌ์ „ ์š”์ฒญ์„ ๋ณด๋‚ด ์—ฐ๊ฒฐ ํ—ˆ์šฉ ์—ฌ๋ถ€๋ฅผ ๋จผ์ € ๋ฌป๋Š”๋‹ค. ํ˜„์žฌ๋Š” ์‚ฌ์ „ ์š”์ฒญ ์‹คํŒจ ์‹œ ๊ฐœ๋ฐœ์ž ์ฝ˜์†”์— ๊ฒฝ๊ณ ๋งŒ ๋…ธ์ถœํ•œ๋‹ค.

์ฐธ์กฐ


์ด์›ํ‘œ2023.06.21
Back to list