Webã³ã³ããŒãã³ãã€ã³ãã©ã¹ãã©ã¯ãã£ã®å æ¬çã¬ã€ãããã¬ãŒã ã¯ãŒã¯ã®å®è£ ããã¹ããã©ã¯ãã£ã¹ãåå©çšå¯èœãªUIèŠçŽ ãäœæããããã®å®äŸã解説ããŸãã
Webã³ã³ããŒãã³ãã€ã³ãã©ã¹ãã©ã¯ãã£ïŒãã¬ãŒã ã¯ãŒã¯å®è£ ã¬ã€ã
Webã³ã³ããŒãã³ãã¯ãéçºè ãåå©çšå¯èœã§ã«ãã»ã«åãããHTMLèŠçŽ ãäœæã§ããããã«ããäžé£ã®Webæšæºã§ãããããã®ã³ã³ããŒãã³ãã¯ææ°ã®ãã©ãŠã¶ã§ãã€ãã£ãã«åäœããæ¡çšãããŠãããã¬ãŒã ã¯ãŒã¯ïŒãŸãã¯ãã®æ¬ åŠïŒã«é¢ä¿ãªããããããWebãããžã§ã¯ãã§äœ¿çšã§ããŸãããã®ã¬ã€ãã§ã¯ããã¬ãŒã ã¯ãŒã¯ã®éžæããã¹ããã©ã¯ãã£ã¹ãããã³å®äžçã§ã®èæ ®äºé ãç¶²çŸ ããå ç¢ãªWebã³ã³ããŒãã³ãã€ã³ãã©ã¹ãã©ã¯ãã£ã®å®è£ ãæ¢ããŸãã
Webã³ã³ããŒãã³ãã®çè§£
Webã³ã³ããŒãã³ãã¯ã4ã€ã®äž»èŠãªä»æ§ã«åºã¥ããŠããŸãïŒ
- ã«ã¹ã¿ã èŠçŽ (Custom Elements): æ°ããHTMLã¿ã°ãšãã®é¢é£åäœãå®çŸ©ããŸãã
- Shadow DOM: ã³ã³ããŒãã³ãã®å éšæ§é ãã¹ã¿ã€ãªã³ã°ãããã³åäœãã«ãã»ã«åããŸãã
- HTMLãã³ãã¬ãŒã (HTML Templates): DOMã«ã¯ããŒã³ããŠæ¿å ¥ã§ãããåå©çšå¯èœãªHTMLã®æçãå®çŸ©ããŸãã
- HTMLã€ã³ããŒã (éæšå¥š): Webã³ã³ããŒãã³ããå«ãHTMLããã¥ã¡ã³ããã€ã³ããŒãããããã«äœ¿çšãããŠããŸãããæè¡çã«ã¯éæšå¥šã§ãããã€ã³ããŒãã®ç®çãçè§£ããããšã¯éèŠãªæèã§ãããã®æ©èœã¯äž»ã«ã¢ãžã¥ãŒã«ã·ã¹ãã ã«çœ®ãæããããŸããã
ãããã®ä»æ§ã¯ãããããWebã¢ããªã±ãŒã·ã§ã³ã«å®¹æã«çµ±åã§ãããã¢ãžã¥ãŒã«åŒã§åå©çšå¯èœãªUIã³ã³ããŒãã³ããæ§ç¯ããããã®åºç€ãæäŸããŸãã
Webã³ã³ããŒãã³ãéçºã®ããã®ãã¬ãŒã ã¯ãŒã¯ãªãã·ã§ã³
Webã³ã³ããŒãã³ãã¯ããã©JavaScriptã䜿çšããŠäœæã§ããŸãããããã€ãã®ãã¬ãŒã ã¯ãŒã¯ãã©ã€ãã©ãªãéçºããã»ã¹ãç°¡çŽ åããŸãããããã®ãã¬ãŒã ã¯ãŒã¯ã¯ã宣èšçãªãã³ãã¬ãŒããããŒã¿ãã€ã³ãã£ã³ã°ãã©ã€ããµã€ã¯ã«ç®¡çãªã©ã®æ©èœãæäŸããè€éãªã³ã³ããŒãã³ãã®æ§ç¯ã容æã«ããŸãã
LitElement (çŸLit)
LitElementïŒçŸLitïŒã¯ãGoogleãæäŸãã軜éãªã©ã€ãã©ãªã§ãWebã³ã³ããŒãã³ããæ§ç¯ããããã®ã·ã³ãã«ã§å¹ççãªæ¹æ³ãæäŸããŸãããã³ã¬ãŒã¿ããªã¢ã¯ãã£ãããããã£ã®ãããªææ°ã®JavaScriptæ©èœã掻çšããŠãã³ã³ããŒãã³ãéçºãå¹çåããŸãã
äŸ (Lit):
import { LitElement, html, css } from 'lit';
import { customElement, property } from 'lit/decorators.js';
@customElement('my-element')
export class MyElement extends LitElement {
static styles = css`
p { color: blue; }
`;
@property({ type: String })
name = 'World';
render() {
return html`Hello, ${this.name}!
`;
}
}
ãã®äŸã§ã¯ã`my-element`ãšããã«ã¹ã¿ã èŠçŽ ãå®çŸ©ããæšæ¶ã衚瀺ããŸãã`@customElement`ãã³ã¬ãŒã¿ãèŠçŽ ããã©ãŠã¶ã«ç»é²ãã`@property`ãã³ã¬ãŒã¿ã`name`ãšãããªã¢ã¯ãã£ãããããã£ãå®çŸ©ããŸãã`render`颿°ã¯ãLitã®`html`ãã³ãã¬ãŒããªãã©ã«ã䜿çšããŠã³ã³ããŒãã³ãã®HTMLæ§é ãå®çŸ©ããŸãã
Stencil
Stencilã¯ãTypeScriptããWebã³ã³ããŒãã³ããçæããã³ã³ãã€ã©ã§ããé å»¶èªã¿èŸŒã¿ãããªã¬ã³ããªã³ã°ãéçè§£æãªã©ã®æ©èœãæäŸãã髿§èœãªã³ã³ããŒãã³ãã©ã€ãã©ãªã®æ§ç¯ã«é©ããŠããŸãã
äŸ (Stencil):
import { Component, h, State } from '@stencil/core';
@Component({
tag: 'my-component',
styleUrl: 'my-component.css',
shadow: true,
})
export class MyComponent {
@State()
name: string = 'World';
render() {
return (
Hello, {this.name}!
);
}
}
ãã®äŸã§ã¯ã`my-component`ãšããStencilã³ã³ããŒãã³ããå®çŸ©ããæšæ¶ã衚瀺ããŸãã`@Component`ãã³ã¬ãŒã¿ãã³ã³ããŒãã³ããç»é²ãããã®ã¡ã¿ããŒã¿ãæå®ããŸãã`@State`ãã³ã¬ãŒã¿ã¯`name`ãšãããªã¢ã¯ãã£ããªç¶æ 倿°ãå®çŸ©ããŸãã`render`颿°ã¯JSXã©ã€ã¯ãªæ§æã䜿çšããŠã³ã³ããŒãã³ãã®HTMLæ§é ãè¿ããŸãã
Svelte
å³å¯ã«ã¯Webã³ã³ããŒãã³ããã¬ãŒã ã¯ãŒã¯ã§ã¯ãããŸããããSvelteã¯ã³ã³ããŒãã³ããé«åºŠã«æé©åãããããã©JavaScriptã«ã³ã³ãã€ã«ããWebã³ã³ããŒãã³ããšå®¹æã«çµ±åã§ããŸããSvelteã¯ããå°ãªãã³ãŒãèšè¿°ãéèŠããåªããããã©ãŒãã³ã¹ãæäŸããŸãã
äŸ (Svelteã®ã«ã¹ã¿ã èŠçŽ APIã䜿çš):
Hello, {name}!
// register the Svelte component as a custom element
import MyComponent from './MyComponent.svelte';
customElements.define('my-svelte-element', class extends HTMLElement {
connectedCallback() {
this.attachShadow({ mode: 'open' });
new MyComponent({ target: this.shadowRoot, props: { name: this.getAttribute('name') || 'World' } });
}
static get observedAttributes() {
return ['name'];
}
attributeChangedCallback(name, oldValue, newValue) {
if (this.shadowRoot) {
new MyComponent({ target: this.shadowRoot, props: { name: newValue } });
}
}
});
ãã®äŸã¯ãSvelteã³ã³ããŒãã³ããWebã³ã³ããŒãã³ããšããŠäœ¿çšãããæ§åã瀺ããŠããŸããLitãStencilãšæ¯èŒããŠæåã§ã®çµ±åãå€ãå¿ èŠã§ãããç°ãªãæè¡éã®çžäºéçšæ§ã瀺ããŠããŸããã³ã³ããŒãã³ãã¯æšæºã®`customElements.define` APIã䜿çšããŠã«ã¹ã¿ã èŠçŽ ãšããŠç»é²ãããŸãã
ãã®ä»ã®ãã¬ãŒã ã¯ãŒã¯ãšã©ã€ãã©ãª
Webã³ã³ããŒãã³ãéçºããµããŒããããã®ä»ã®ãã¬ãŒã ã¯ãŒã¯ãã©ã€ãã©ãªã«ã¯ã以äžã®ãããªãã®ããããŸãïŒ
- Angular Elements: Angularã³ã³ããŒãã³ããWebã³ã³ããŒãã³ããšããŠããã±ãŒãžåã§ããŸãã
- Vue.js (`defineCustomElement`ã䜿çš): Vue 3ã¯ã«ã¹ã¿ã èŠçŽ ã®äœæããµããŒãããŠããŸãã
- FAST (Microsoft): Webã³ã³ããŒãã³ãããŒã¹ã®UIã³ã³ããŒãã³ããšããŒã«ã®ã³ã¬ã¯ã·ã§ã³ã§ãã
Webã³ã³ããŒãã³ãã€ã³ãã©ã¹ãã©ã¯ãã£ã®æ§ç¯
å ç¢ãªWebã³ã³ããŒãã³ãã€ã³ãã©ã¹ãã©ã¯ãã£ãäœæããã«ã¯ãåã«ãã¬ãŒã ã¯ãŒã¯ãéžæããã ãã§ã¯äžååã§ããããã€ãã®éèŠãªåŽé¢ã®æ éãªèšç»ãšæ€èšãå¿ èŠã§ãïŒ
ã³ã³ããŒãã³ãã®èšèšãšã¢ãŒããã¯ãã£
ã³ãŒãã«åãæããåã«ãæç¢ºãªã³ã³ããŒãã³ãèšèšãšã¢ãŒããã¯ãã£ãå®çŸ©ããããšãäžå¯æ¬ ã§ããããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã«å¿ èŠãªã³ã³ããŒãã³ããç¹å®ãããããã®è²¬åãå®çŸ©ããã³ã³ããŒãã³ãéã®æç¢ºãªéä¿¡ãã¿ãŒã³ã確ç«ããããšãå«ãŸããŸãã
以äžã®èŠçŽ ãèæ ®ããŠãã ããïŒ
- ã³ã³ããŒãã³ãéå±€: ã³ã³ããŒãã³ãã¯ã©ã®ããã«ãã¹ããããæŽçãããŸããïŒ
- ããŒã¿ãããŒ: ã³ã³ããŒãã³ãéã§ããŒã¿ã¯ã©ã®ããã«æž¡ãããŸããïŒ
- ã€ãã³ãåŠç: ã³ã³ããŒãã³ãã¯äºãã«ããŸãå€éšãšã©ã®ããã«éä¿¡ããŸããïŒ
- ã¢ã¯ã»ã·ããªã㣠(A11y): é害ãæã€ãŠãŒã¶ãŒãã³ã³ããŒãã³ãã«ã¢ã¯ã»ã¹ã§ããããã«ããã«ã¯ã©ãããã°ããã§ããïŒ (äŸïŒARIA屿§ã®äœ¿çš)
- åœéå (i18n): ã³ã³ããŒãã³ãã¯ã©ã®ããã«å€èšèªããµããŒãããŸããïŒ (äŸïŒç¿»èš³ããŒã®äœ¿çš)
äŸãã°ãæ¥ä»ããã«ãŒã³ã³ããŒãã³ãã¯ãã«ã¬ã³ããŒãã¥ãŒãããã²ãŒã·ã§ã³ãã¿ã³ãéžæãããæ¥ä»ã®è¡šç€ºãªã©ã®ãµãã³ã³ããŒãã³ãã§æ§æããããããããŸããã芪ã³ã³ããŒãã³ãã¯å šäœã®ç¶æ ã管çãããµãã³ã³ããŒãã³ãéã®çžäºäœçšã調æŽããŸããåœéåãèæ ®ããå Žåãæ¥ä»åœ¢åŒãæåã¯ãŠãŒã¶ãŒã®ãã±ãŒã«ã«åºã¥ããŠããŒã«ã©ã€ãºãããã¹ãã§ããé©åã«èšèšãããã³ã³ããŒãã³ãã©ã€ãã©ãªã¯ããããã®èšèšååãæåããèæ ®ã«å ¥ããã¹ãã§ãã
ã¹ã¿ã€ãªã³ã°ãšããŒãèšå®
Shadow DOMã¯ã«ãã»ã«åãæäŸããŸããããã¯ãã³ã³ããŒãã³ãå ã§å®çŸ©ãããã¹ã¿ã€ã«ãå€éšã«æŒãåºããã¢ããªã±ãŒã·ã§ã³ã®ä»ã®éšåã«åœ±é¿ãäžããªãããšãæå³ããŸããããã¯åŒ·åãªæ©èœã§ãããã³ã³ããŒãã³ãã®ã¹ã¿ã€ãªã³ã°ãšããŒãèšå®ã®æ¹æ³ãæ éã«æ€èšããå¿ èŠããããŸãã
Webã³ã³ããŒãã³ãã®ã¹ã¿ã€ãªã³ã°ã«ã¯ã以äžã®ãããªã¢ãããŒãããããŸãïŒ
- CSS倿° (ã«ã¹ã¿ã ããããã£): ã³ã³ããŒãã³ãã«é©çšã§ããã°ããŒãã«ã¹ã¿ã€ã«ãå®çŸ©ã§ããŸãã
- Shadow Parts: ã³ã³ããŒãã³ãã®Shadow DOMã®ç¹å®ã®éšåãå€éšããã®ã¹ã¿ã€ãªã³ã°ã®ããã«å ¬éããŸãã
- Constructable Stylesheets: è€æ°ã®ã³ã³ããŒãã³ãéã§ã¹ã¿ã€ã«ã·ãŒããå¹ççã«å ±æããããã®ææ°ã®APIã§ãã
- CSS-in-JSã©ã€ãã©ãª (泚æãå¿ èŠ): Styled ComponentsãEmotionã®ãããªã©ã€ãã©ãªã䜿çšã§ããŸãããã¹ã¿ã€ã«ãåçã«æ³šå ¥ããããšã«ããããã©ãŒãã³ã¹ãžã®åœ±é¿ã®å¯èœæ§ã«æ³šæããŠãã ãããCSSãShadow DOMå ã§é©åã«ã¹ã³ãŒããããŠããããšã確èªããŠãã ããã
äžè¬çãªã¢ãããŒãã¯ãCSS倿°ã䜿çšããŠããŒãé¢é£ã®ããããã£ïŒäŸïŒ`--primary-color`, `--font-size`ïŒã®ã»ãããå®çŸ©ããã¢ããªã±ãŒã·ã§ã³å šäœã®ã«ãã¯ã¢ã³ããã£ãŒã«ã«åãããŠã«ã¹ã¿ãã€ãºã§ããããã«ããããšã§ãããããã®å€æ°ã¯ã«ãŒãèŠçŽ ã«èšå®ãããã¹ãŠã®ã³ã³ããŒãã³ãã«ç¶æ¿ãããããšãã§ããŸãã
ã³ã³ããŒãã³ãã®ã©ã€ããµã€ã¯ã«ç®¡ç
Webã³ã³ããŒãã³ãã«ã¯ãåæåã屿§ã®å€æŽãDOMããã®åæã«é¢ããã³ãŒã«ããã¯ãå«ããæç¢ºã«å®çŸ©ãããã©ã€ããµã€ã¯ã«ããããŸãããããã®ã©ã€ããµã€ã¯ã«ã¡ãœãããçè§£ããããšã¯ãã³ã³ããŒãã³ãã®ç¶æ ãšåäœã管çããããã«äžå¯æ¬ ã§ãã
äž»èŠãªã©ã€ããµã€ã¯ã«ã³ãŒã«ããã¯ã«ã¯ã以äžãå«ãŸããŸãïŒ
- `constructor()`: ã³ã³ããŒãã³ããäœæããããšãã«åŒã³åºãããŸãã
- `connectedCallback()`: ã³ã³ããŒãã³ããDOMã«ã¢ã¿ããããããšãã«åŒã³åºãããŸããããã¯ãã³ã³ããŒãã³ãã®ç¶æ ãåæåããã€ãã³ããªã¹ããŒãèšå®ããã®ã«æé©ãªå Žæã§ãã
- `disconnectedCallback()`: ã³ã³ããŒãã³ããDOMãããã¿ããããããšãã«åŒã³åºãããŸãããªãœãŒã¹ã®ã¯ãªãŒã³ã¢ãããã€ãã³ããªã¹ããŒã®åé€ã«äœ¿çšããŸãã
- `attributeChangedCallback(name, oldValue, newValue)`: ã³ã³ããŒãã³ãã®å±æ§ã倿Žããããšãã«åŒã³åºãããŸãã
- `adoptedCallback()`: ã³ã³ããŒãã³ããæ°ããããã¥ã¡ã³ãã«ç§»åãããšãã«åŒã³åºãããŸãã
äŸãã°ã`connectedCallback()`ã䜿çšããŠã³ã³ããŒãã³ããããŒãžã«è¿œå ããããšãã«APIããããŒã¿ããã§ãããã`disconnectedCallback()`ã䜿çšããŠä¿çäžã®ãªã¯ãšã¹ãããã£ã³ã»ã«ããããšãã§ããŸãã
ãã¹ã
培åºçãªãã¹ãã¯ãWebã³ã³ããŒãã³ãã®å質ãšä¿¡é Œæ§ã確ä¿ããããã«äžå¯æ¬ ã§ãããã¹ãæŠç¥ã«ã¯ã以äžãå«ããã¹ãã§ãïŒ
- åäœãã¹ã: åã ã®ã³ã³ããŒãã³ããåé¢ããŠãã¹ããããã®åäœãæ€èšŒããŸãã
- çµ±åãã¹ã: ã³ã³ããŒãã³ããšã¢ããªã±ãŒã·ã§ã³ã®ä»ã®éšåãšã®çžäºäœçšããã¹ãããŸãã
- ãšã³ãããŒãšã³ããã¹ã: ãŠãŒã¶ãŒã®æäœãã·ãã¥ã¬ãŒãããã¢ããªã±ãŒã·ã§ã³å šäœã®æ©èœæ§ãæ€èšŒããŸãã
- ããžã¥ã¢ã«ãªã°ã¬ãã·ã§ã³ãã¹ã: ã³ã³ããŒãã³ãã®ã¹ã¯ãªãŒã³ã·ã§ããããã£ããã£ããããŒã¹ã©ã€ã³ç»åãšæ¯èŒããŠèŠèŠçãªå€æŽãæ€åºããŸããããã¯ãç°ãªããã©ãŠã¶ããã©ãããã©ãŒã éã§äžè²«ããã¹ã¿ã€ãªã³ã°ã確ä¿ããã®ã«ç¹ã«åœ¹ç«ã¡ãŸãã
JestãMochaãChaiãCypressãªã©ã®ããŒã«ãWebã³ã³ããŒãã³ãã®ãã¹ãã«äœ¿çšã§ããŸãã
ããã¥ã¡ã³ããŒã·ã§ã³
å æ¬çãªããã¥ã¡ã³ããŒã·ã§ã³ã¯ãWebã³ã³ããŒãã³ããåå©çšå¯èœã§ä¿å®ããããããããã«äžå¯æ¬ ã§ããããã¥ã¡ã³ããŒã·ã§ã³ã«ã¯ã以äžãå«ããã¹ãã§ãïŒ
- ã³ã³ããŒãã³ãã®æŠèŠ: ã³ã³ããŒãã³ãã®ç®çãšæ©èœã®ç°¡åãªèª¬æã
- 䜿çšäŸ: ããŸããŸãªã·ããªãªã§ã³ã³ããŒãã³ãã䜿çšããæ¹æ³ã瀺ãã³ãŒãã¹ããããã
- APIãªãã¡ã¬ã³ã¹: ã³ã³ããŒãã³ãã®ããããã£ãã¡ãœãããã€ãã³ãã®è©³çްãªèª¬æã
- ã¢ã¯ã»ã·ããªãã£ã«é¢ããèæ ®äºé : é害ãæã€ãŠãŒã¶ãŒãã³ã³ããŒãã³ãã«ã¢ã¯ã»ã¹ã§ããããã«ããæ¹æ³ã«é¢ããæ å ±ã
- åœéåã«é¢ããæ³šæç¹: ã³ã³ããŒãã³ããé©åã«åœéåããããã®æé ã
StorybookãJSDocãªã©ã®ããŒã«ã䜿çšããŠãWebã³ã³ããŒãã³ãã®ã€ã³ã¿ã©ã¯ãã£ããªããã¥ã¡ã³ããŒã·ã§ã³ãçæã§ããŸãã
é åžãšããã±ãŒãžã³ã°
Webã³ã³ããŒãã³ããéçºãããã¹ããããåŸãä»ã®ãããžã§ã¯ãã§äœ¿çšããããã«ããã±ãŒãžåããŠé åžããå¿ èŠããããŸãã
äžè¬çãªããã±ãŒãžã³ã°åœ¢åŒã«ã¯ã以äžã®ãããªãã®ããããŸãïŒ
- NPMããã±ãŒãž: Webã³ã³ããŒãã³ããnpmã¬ãžã¹ããªã«å ¬éããç°¡åãªã€ã³ã¹ããŒã«ãšç®¡çãå¯èœã«ããŸãã
- ãã³ãã«ãããJavaScriptãã¡ã€ã«: WebpackãRollupãParcelãªã©ã®ããŒã«ã䜿çšããŠãã³ã³ããŒãã³ããåäžã®JavaScriptãã¡ã€ã«ã«ãã³ãã«ã§ããŸãã
- ã³ã³ããŒãã³ãã©ã€ãã©ãª: é¢é£ããã³ã³ããŒãã³ãã®ã³ã¬ã¯ã·ã§ã³ãã©ã€ãã©ãªãšããŠããã±ãŒãžåããç°¡åã«åå©çšã§ããããã«ããŸãã
Webã³ã³ããŒãã³ããé åžããéã«ã¯ãç°ãªãç°å¢ã§ã®ã€ã³ã¹ããŒã«æ¹æ³ãšäœ¿ç𿹿³ã«é¢ããæç¢ºãªæç€ºãæäŸããããšãéèŠã§ãã
å®äžçã®äŸ
Webã³ã³ããŒãã³ãã¯ãããŸããŸãªã¢ããªã±ãŒã·ã§ã³ãæ¥çã§äœ¿çšãããŠããŸãã以äžã«ããã€ãã®äŸãæããŸãïŒ
- Googleã®Material Web Components: Material Design仿§ã«åºã¥ããåå©çšå¯èœãªUIã³ã³ããŒãã³ãã®ã³ã¬ã¯ã·ã§ã³ã
- Salesforce Lightning Web Components: Salesforceãã©ãããã©ãŒã çšã®ã«ã¹ã¿ã UIã³ã³ããŒãã³ããæ§ç¯ããããã®ãã¬ãŒã ã¯ãŒã¯ã
- Microsoftã®FAST: ãšã³ã¿ãŒãã©ã€ãºã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®Webã³ã³ããŒãã³ãããŒã¹ã®UIã³ã³ããŒãã³ããšããŒã«ã®ã³ã¬ã¯ã·ã§ã³ã
- SAPã®UI5 Web Components: SAPãã¯ãããžãŒã䜿çšããŠãšã³ã¿ãŒãã©ã€ãºã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®UIã³ã³ããŒãã³ãã®ã³ã¬ã¯ã·ã§ã³ããããã®ã³ã³ããŒãã³ãã¯åœéåãšããŒã«ãªãŒãŒã·ã§ã³ã®ããã«èšèšãããŠããŸãã
ãããã®äŸã¯ãè€éã§åå©çšå¯èœãªUIèŠçŽ ãæ§ç¯ããããã®Webã³ã³ããŒãã³ãã®å€æ§æ§ãšèœåã瀺ããŠããŸãã
ãã¹ããã©ã¯ãã£ã¹
Webã³ã³ããŒãã³ãã€ã³ãã©ã¹ãã©ã¯ãã£ã®æåã確å®ã«ããããã«ã以äžã®ãã¹ããã©ã¯ãã£ã¹ã«åŸã£ãŠãã ããïŒ
- ã³ã³ããŒãã³ããå°ãããçŠç¹ãçµã: åã³ã³ããŒãã³ãã¯æç¢ºã§ãããå®çŸ©ããã責åãæã€ã¹ãã§ãã
- ã«ãã»ã«åã®ããã«Shadow DOMã䜿çšãã: ã³ã³ããŒãã³ãã®ã¹ã¿ã€ã«ãšåäœãå€éšããã®å¹²æžããä¿è·ããŸãã
- æç¢ºãªéä¿¡ãã¿ãŒã³ãå®çŸ©ãã: ã³ã³ããŒãã³ãéã®ããŒã¿ãããŒãšã€ãã³ãåŠçã®ããã®æç¢ºãªãããã³ã«ã確ç«ããŸãã
- å æ¬çãªããã¥ã¡ã³ããŒã·ã§ã³ãæäŸãã: ä»ã®äººãããªãã®ã³ã³ããŒãã³ããçè§£ãã䜿çšããããããŸãã
- 培åºçã«ãã¹ããã: å æ¬çãªãã¹ããéããŠãã³ã³ããŒãã³ãã®å質ãšä¿¡é Œæ§ã確ä¿ããŸãã
- ã¢ã¯ã»ã·ããªãã£ãåªå ãã: é害ãæã€ãŠãŒã¶ãŒãå«ãããã¹ãŠã®ãŠãŒã¶ãŒãã³ã³ããŒãã³ãã«ã¢ã¯ã»ã¹ã§ããããã«ããŸãã
- ããã°ã¬ãã·ããšã³ãã³ã¹ã¡ã³ããæ¡çšãã: JavaScriptãç¡å¹ã«ãªã£ãŠããããå®å šã«ã¯ãµããŒããããŠããªãå Žåã§ãæ©èœããããã«ã³ã³ããŒãã³ããèšèšããŸãã
- åœéåãšããŒã«ãªãŒãŒã·ã§ã³ãèæ ®ãã: ã³ã³ããŒãã³ããç°ãªãèšèªãå°åã§ããŸãæ©èœããããšã確èªããŸããããã«ã¯ãæ¥ä»/æå»ã®åœ¢åŒãé貚èšå·ãããã¹ãã®æ¹åïŒäŸïŒã¢ã©ãã¢èªã®å³ããå·ŠãžïŒãå«ãŸããŸãã
çµè«
Webã³ã³ããŒãã³ãã¯ãWebçšã®åå©çšå¯èœãªUIèŠçŽ ãæ§ç¯ããããã®åŒ·åã§æè»ãªæ¹æ³ãæäŸããŸãããã®ã¬ã€ãã§æŠèª¬ãããã¬ã€ãã©ã€ã³ãšãã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãã¹ã±ãŒã©ãã«ã§ä¿å®å¯èœãªWebã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯ã«åœ¹ç«ã€å ç¢ãªWebã³ã³ããŒãã³ãã€ã³ãã©ã¹ãã©ã¯ãã£ãäœæã§ããŸããé©åãªãã¬ãŒã ã¯ãŒã¯ã®éžæãã³ã³ããŒãã³ãã®æ éãªèšèšããã¹ããšããã¥ã¡ã³ããŒã·ã§ã³ã®åªå ã¯ããã¹ãŠããã»ã¹ã«ãããéèŠãªã¹ãããã§ãããããã®ååãåãå ¥ããããšã§ãWebã³ã³ããŒãã³ãã®å¯èœæ§ãæå€§éã«åŒãåºããç°ãªããããžã§ã¯ãããã©ãããã©ãŒã éã§å ±æã§ããçã«åå©çšå¯èœãªUIèŠçŽ ãäœæã§ããŸãã