Web Componentsã®å¿ é ãã¶ã€ã³ãã¿ãŒã³ãæ¢æ±ããå ç¢ã§åå©çšå¯èœãä¿å®æ§ã®é«ãã³ã³ããŒãã³ãã¢ãŒããã¯ãã£ã®æ§ç¯ãå¯èœã«ããŸããã°ããŒãã«ãªWebéçºã®ãã¹ããã©ã¯ãã£ã¹ãåŠã³ãŸãããã
Web Componentãã¶ã€ã³ãã¿ãŒã³ïŒåå©çšå¯èœãªã³ã³ããŒãã³ãã¢ãŒããã¯ãã£ã®æ§ç¯
Web Componentsã¯ãéçºè ãWebã¢ããªã±ãŒã·ã§ã³ãWebããŒãžã§äœ¿çšã§ãããåå©çšå¯èœã§ã«ãã»ã«åãããHTMLèŠçŽ ãäœæããããã®åŒ·åãªWebæšæºã»ããã§ããããã«ãããã³ãŒãã®åå©çšæ§ãä¿å®æ§ãããã³ç°ãªããããžã§ã¯ãããã©ãããã©ãŒã éã§ã®äžè²«æ§ãä¿é²ãããŸããããããåã«Web Componentsã䜿çšããã ãã§ã¯ãèªåçã«æ§é åãããããŸãã¯ä¿å®ããããã¢ããªã±ãŒã·ã§ã³ãä¿èšŒãããããã§ã¯ãããŸãããããã§ãã¶ã€ã³ãã¿ãŒã³ãç»å ŽããŸãã確ç«ããããã¶ã€ã³ååãé©çšããããšã§ãå ç¢ã§ã¹ã±ãŒã©ãã«ãªã³ã³ããŒãã³ãã¢ãŒããã¯ãã£ãæ§ç¯ã§ããŸãã
ãªãWeb Componentsã䜿çšããã®ãïŒ
ãã¶ã€ã³ãã¿ãŒã³ã«ã€ããŠè©³ãã説æããåã«ãWeb Componentsã®äž»ãªå©ç¹ãç°¡åã«åŸ©ç¿ããŸãããã
- åå©çšæ§ïŒã«ã¹ã¿ã èŠçŽ ãäžåºŠäœæããã°ãã©ãã§ã䜿çšã§ããŸãã
- ã«ãã»ã«åïŒShadow DOMã¯ãã¹ã¿ã€ã«ãšã¹ã¯ãªããã®åé¢ãæäŸããããŒãžã®ä»ã®éšåãšã®ç«¶åãé²ããŸãã
- çžäºéçšæ§ïŒWeb Componentsã¯ãJavaScriptãã¬ãŒã ã¯ãŒã¯ãã©ã€ãã©ãªããŸãã¯ãã¬ãŒã ã¯ãŒã¯ãªãã§ãã·ãŒã ã¬ã¹ã«åäœããŸãã
- ä¿å®æ§ïŒæç¢ºã«å®çŸ©ãããã³ã³ããŒãã³ãã¯ãçè§£ããã¹ããæŽæ°ã容æã§ãã
Web Componentsã®ã³ã¢æè¡
Web Componentsã¯ã3ã€ã®ã³ã¢æè¡ã«åºã¥ããŠããŸãã
- ã«ã¹ã¿ã èŠçŽ ïŒç¬èªã®HTMLèŠçŽ ãšãã®åäœãå®çŸ©ã§ããJavaScript APIã§ãã
- Shadow DOMïŒã°ããŒãã«DOMãšãã®ã¹ã¿ã€ã«ããã³ã³ããŒãã³ããä¿è·ããããã«ãã³ã³ããŒãã³ãçšã«å¥ã®DOMããªãŒãäœæããããšã§ã«ãã»ã«åãæäŸããŸãã
- HTMLãã³ãã¬ãŒãïŒ
<template>
ããã³<slot>
èŠçŽ ã«ãããåå©çšå¯èœãªHTMLæ§é ãšãã¬ãŒã¹ãã«ããŒã³ã³ãã³ããå®çŸ©ã§ããŸãã
Web Componentsã®ããã®å¿ é ãã¶ã€ã³ãã¿ãŒã³
以äžã®ãã¶ã€ã³ãã¿ãŒã³ã¯ããã广çã§ä¿å®æ§ã®é«ãWeb Componentã¢ãŒããã¯ãã£ã®æ§ç¯ã«åœ¹ç«ã¡ãŸãã
1. ç¶æ¿ãããã³ã³ããžã·ã§ã³
説æïŒç¶æ¿éå±€ã«äŸåããã®ã§ã¯ãªããããå°ããç¹åãããã³ã³ããŒãã³ãããã³ã³ããŒãã³ããæ§æããããšãåªå ããŸããç¶æ¿ã¯ãå¯çµåããã³ã³ããŒãã³ããè匱ãªåºåºã¯ã©ã¹ã®åé¡ã«ã€ãªããå¯èœæ§ããããŸããã³ã³ããžã·ã§ã³ã¯ãççµåãšãã倧ããªæè»æ§ãä¿é²ããŸãã
äŸïŒ<base-button>
ãç¶æ¿ãã<special-button>
ãäœæãã代ããã«ã<base-button>
ãå«ã<special-button>
ãäœæããç¹å®ã®ã¹ã¿ã€ã«ãæ©èœã远å ããŸãã
å®è£ ïŒã¹ãããã䜿çšããŠãWebã³ã³ããŒãã³ãã«ã³ã³ãã³ããå éšã³ã³ããŒãã³ããæåœ±ããŸããããã«ãããã³ã³ããŒãã³ãã®å éšããžãã¯ã倿Žããã«ãã³ã³ããŒãã³ãã®æ§é ãšã³ã³ãã³ããã«ã¹ã¿ãã€ãºã§ããŸãã
<my-composite-component>
<p slot="header">ããããŒã³ã³ãã³ã</p>
<p>ã¡ã€ã³ã³ã³ãã³ã</p>
</my-composite-component>
2. ãªãã¶ãŒããŒãã¿ãŒã³
説æïŒãªããžã§ã¯ãéã®1察å€ã®äŸåé¢ä¿ãå®çŸ©ãã1ã€ã®ãªããžã§ã¯ãã®ç¶æ ã倿Žããããšããã®ãã¹ãŠã®äŸåé¢ä¿ãèªåçã«éç¥ããã³æŽæ°ãããŸããããã¯ãããŒã¿ãã€ã³ãã£ã³ã°ãšã³ã³ããŒãã³ãéã®éä¿¡ãåŠçããããã«äžå¯æ¬ ã§ãã
äŸïŒ<data-source>
ã³ã³ããŒãã³ãã¯ãåºç€ãšãªãããŒã¿ã倿Žããããã³ã«<data-display>
ã³ã³ããŒãã³ãã«éç¥ã§ããŸãã
å®è£
ïŒã«ã¹ã¿ã ã€ãã³ãã䜿çšããŠãççµåãªã³ã³ããŒãã³ãéã§æŽæ°ãããªã¬ãŒããŸãã<data-source>
ã¯ããŒã¿ã倿Žããããšãã«ã«ã¹ã¿ã ã€ãã³ããçºè¡ãã<data-display>
ã¯ãã®ã€ãã³ãããªãã¹ã³ããŠãã¥ãŒãæŽæ°ããŸããè€éãªéä¿¡ã·ããªãªã§ã¯ãäžå€®éæš©åãããã€ãã³ããã¹ã®äœ¿çšãæ€èšããŠãã ããã
// data-source ã³ã³ããŒãã³ã
this.dispatchEvent(new CustomEvent('data-changed', { detail: this.data }));
// data-display ã³ã³ããŒãã³ã
connectedCallback() {
window.addEventListener('data-changed', (event) => {
this.data = event.detail;
this.render();
});
}
3. ç¶æ 管ç
説æïŒã³ã³ããŒãã³ããšã¢ããªã±ãŒã·ã§ã³å šäœã®ç¶æ ã管çããããã®æŠç¥ãå®è£ ããŸããé©åãªç¶æ 管çã¯ãè€éã§ããŒã¿é§ååã®Webã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«éèŠã§ããè€éãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ããªã¢ã¯ãã£ãã©ã€ãã©ãªãŸãã¯äžå€®éæš©åãããç¶æ ã¹ãã¢ã®äœ¿çšãæ€èšããŠãã ãããå°èŠæš¡ãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã³ã³ããŒãã³ãã¬ãã«ã®ç¶æ ã§ãååãªå ŽåããããŸãã
äŸïŒã·ã§ããã³ã°ã«ãŒãã¢ããªã±ãŒã·ã§ã³ã¯ãã«ãŒãå ã®ã¢ã€ãã ããŠãŒã¶ãŒã®ãã°ã€ã³ç¶æ ãé éå äœæã管çããå¿ èŠããããŸãããã®ããŒã¿ã¯ãè€æ°ã®ã³ã³ããŒãã³ãéã§ã¢ã¯ã»ã¹å¯èœã§äžè²«ããŠããå¿ èŠããããŸãã
å®è£ ïŒããã€ãã®æ¹æ³ãèããããŸãã
- ã³ã³ããŒãã³ãããŒã«ã«ç¶æ ïŒããããã£ãšå±æ§ã䜿çšããŠãã³ã³ããŒãã³ãåºæã®ç¶æ ãä¿åããŸãã
- äžå€®éæš©åãããç¶æ ã¹ãã¢ïŒReduxãVuexïŒãŸãã¯é¡äŒŒã®ãã®ïŒã®ãããªã©ã€ãã©ãªã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³å šäœã®ç¶æ ã管çããŸããããã¯ãè€éãªç¶æ äŸåé¢ä¿ãæã€å€§èŠæš¡ãªã¢ããªã±ãŒã·ã§ã³ã«æçã§ãã
- ãªã¢ã¯ãã£ãã©ã€ãã©ãªïŒLitElementãSvelteã®ãããªã©ã€ãã©ãªãçµ±åããŸãããããã®ã©ã€ãã©ãªã¯çµã¿èŸŒã¿ã®ãªã¢ã¯ãã£ããã£ãæäŸããç¶æ 管çã容æã«ããŸãã
// LitElementã䜿çš
import { LitElement, html, property } from 'lit-element';
class MyComponent extends LitElement {
@property({ type: String }) message = 'ããã«ã¡ã¯ãäžçïŒ';
render() {
return html`<p>${this.message}</p>`;
}
}
customElements.define('my-component', MyComponent);
4. ãã¡ãµãŒããã¿ãŒã³
説æïŒè€éãªãµãã·ã¹ãã ãžã®åçŽåãããã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŸããããã¯ãã¯ã©ã€ã¢ã³ãã³ãŒããåºç€ãšãªãå®è£ ã®è€éãããä¿è·ããã³ã³ããŒãã³ãã®äœ¿çšã容æã«ããŸãã
äŸïŒ<data-grid>
ã³ã³ããŒãã³ãã¯ãå
éšã§è€éãªããŒã¿ååŸããã£ã«ã¿ãªã³ã°ãããã³ãœãŒããåŠçããå ŽåããããŸãããã¡ãµãŒããã¿ãŒã³ã¯ãã¯ã©ã€ã¢ã³ããåºç€ãšãªãå®è£
ã®è©³çްãçè§£ããå¿
èŠãªãã«ã屿§ãŸãã¯ããããã£ãéããŠãããã®æ©èœãæ§æããããã®åçŽãªAPIãæäŸããŸãã
å®è£
ïŒåºç€ãšãªãè€éããã«ãã»ã«åãããæç¢ºã«å®çŸ©ãããããããã£ãšã¡ãœããã®ã»ãããå
¬éããŸããããšãã°ããŠãŒã¶ãŒã«ããŒã¿ã°ãªããã®å
éšããŒã¿æ§é ãçŽæ¥æäœãããã®ã§ã¯ãªããsetData()
ãfilterData()
ãsortData()
ã®ãããªã¡ãœãããæäŸããŸãã
// data-grid ã³ã³ããŒãã³ã
<data-grid data-url="/api/data" filter="active" sort-by="name"></data-grid>
// å
éšã§ã¯ãã³ã³ããŒãã³ãã屿§ã«åºã¥ããŠååŸããã£ã«ã¿ãªã³ã°ããœãŒããåŠçããŸãã
5. ã¢ããã¿ãŒãã¿ãŒã³
説æïŒã¯ã©ã¹ã®ã€ã³ã¿ãŒãã§ãŒã¹ãã¯ã©ã€ã¢ã³ããæåŸ ããå¥ã®ã€ã³ã¿ãŒãã§ãŒã¹ã«å€æããŸãããã®ãã¿ãŒã³ã¯ãWeb Componentsããç°ãªãAPIãæã€æ¢åã®JavaScriptã©ã€ãã©ãªããã¬ãŒã ã¯ãŒã¯ãšçµ±åããã®ã«åœ¹ç«ã¡ãŸãã
äŸïŒç¹å®ã®åœ¢åŒã§ããŒã¿ãæåŸ ããã¬ã¬ã·ãŒãªã°ã©ãæç»ã©ã€ãã©ãªããããããããŸãããæ±çšçãªããŒã¿ãœãŒã¹ãããã°ã©ãæç»ã©ã€ãã©ãªãæåŸ ãã圢åŒã«ããŒã¿ã倿ããã¢ããã¿ãŒã³ã³ããŒãã³ããäœæã§ããŸãã
å®è£ ïŒæ±çšçãªåœ¢åŒã§ããŒã¿ãåãåããã¬ã¬ã·ãŒã©ã€ãã©ãªãå¿ èŠãšãã圢åŒã«å€æããã©ãããŒã³ã³ããŒãã³ããäœæããŸãããã®ã¢ããã¿ãŒã³ã³ããŒãã³ãã¯ããã®åŸãã¬ã¬ã·ãŒã©ã€ãã©ãªã䜿çšããŠã°ã©ããæç»ããŸãã
// ã¢ããã¿ãŒã³ã³ããŒãã³ã
class ChartAdapter extends HTMLElement {
connectedCallback() {
const data = this.getData(); // ããŒã¿ãœãŒã¹ããããŒã¿ãååŸ
const adaptedData = this.adaptData(data); // å¿
èŠãªåœ¢åŒã«ããŒã¿ã倿
this.renderChart(adaptedData); // ã¬ã¬ã·ãŒã°ã©ãæç»ã©ã€ãã©ãªã䜿çšããŠã°ã©ããæç»
}
adaptData(data) {
// ããã§å€æããžãã¯
return transformedData;
}
}
6. ã¹ãã©ããžãŒãã¿ãŒã³
説æïŒã¢ã«ãŽãªãºã ã®ãã¡ããªãå®çŸ©ãããããããã«ãã»ã«åãããããã亀æå¯èœã«ããŸããã¹ãã©ããžãŒã«ãããã¢ã«ãŽãªãºã ã¯ããã䜿çšããã¯ã©ã€ã¢ã³ãããç¬ç«ããŠå€åã§ããŸããããã¯ãã³ã³ããŒãã³ããå€éšèŠå ããŠãŒã¶ãŒèšå®ã«åºã¥ããŠãåãã¿ã¹ã¯ãç°ãªãæ¹æ³ã§å®è¡ããå¿ èŠãããå Žåã«åœ¹ç«ã¡ãŸãã
äŸïŒ<data-formatter>
ã³ã³ããŒãã³ãã¯ããã±ãŒã«ïŒäŸïŒæ¥ä»åœ¢åŒãé貚èšå·ïŒã«åºã¥ããŠããŒã¿ãç°ãªãæ¹æ³ã§ãã©ãŒãããããå¿
èŠãããå ŽåããããŸããã¹ãã©ããžãŒãã¿ãŒã³ã䜿çšãããšãåå¥ã®ãã©ãŒãããã¹ãã©ããžãŒãå®çŸ©ããããããåçã«åãæ¿ããããšãã§ããŸãã
å®è£
ïŒãã©ãŒãããã¹ãã©ããžãŒã®ã€ã³ã¿ãŒãã§ãŒã¹ãå®çŸ©ããŸããåãã©ãŒãããã¹ãã©ããžãŒïŒäŸïŒDateFormattingStrategy
ãCurrencyFormattingStrategy
ïŒã®ãã®ã€ã³ã¿ãŒãã§ãŒã¹ã®å
·è±¡å®è£
ãäœæããŸãã<data-formatter>
ã³ã³ããŒãã³ãã¯ãã¹ãã©ããžãŒãå
¥åãšããŠåãåããããã䜿çšããŠããŒã¿ããã©ãŒãããããŸãã
// ã¹ãã©ããžãŒã€ã³ã¿ãŒãã§ãŒã¹
class FormattingStrategy {
format(data) {
throw new Error('ã¡ãœãããå®è£
ãããŠããŸãã');
}
}
// å
·è±¡ã¹ãã©ããžãŒ
class CurrencyFormattingStrategy extends FormattingStrategy {
format(data) {
return new Intl.NumberFormat(this.locale, { style: 'currency', currency: this.currency }).format(data);
}
}
// data-formatter ã³ã³ããŒãã³ã
class DataFormatter extends HTMLElement {
set strategy(strategy) {
this._strategy = strategy;
this.render();
}
render() {
const formattedData = this._strategy.format(this.data);
// ...
}
}
7. ãããªãã·ã¥ïŒãµãã¹ã¯ã©ã€ãïŒPubSubïŒãã¿ãŒã³
説æïŒãªãã¶ãŒããŒãã¿ãŒã³ã«äŒŒããªããžã§ã¯ãéã®1察å€ã®äŸåé¢ä¿ãå®çŸ©ããŸãããããççµåã§ãããããªãã·ã£ãŒïŒã€ãã³ããçºè¡ããã³ã³ããŒãã³ãïŒã¯ããµãã¹ã¯ã©ã€ããŒïŒã€ãã³ãããªãã¹ã³ããã³ã³ããŒãã³ãïŒãç¥ãå¿ èŠããããŸãããããã«ãããã¢ãžã¥ãŒã«æ§ãä¿é²ãããã³ã³ããŒãã³ãéã®äŸåé¢ä¿ãæžå°ããŸãã
äŸïŒ<user-login>
ã³ã³ããŒãã³ãã¯ããŠãŒã¶ãŒãæ£åžžã«ãã°ã€ã³ãããšãã«ãuser-logged-inãã€ãã³ããçºè¡ã§ããŸãã<profile-display>
ã³ã³ããŒãã³ãã<notification-center>
ã³ã³ããŒãã³ããªã©ãä»ã®è€æ°ã®ã³ã³ããŒãã³ãããã®ã€ãã³ãã賌èªããUIãããã«å¿ããŠæŽæ°ã§ããŸãã
å®è£ ïŒäžå€®éæš©åãããã€ãã³ããã¹ãŸãã¯ã¡ãã»ãŒãžãã¥ãŒã䜿çšããŠãã€ãã³ãã®çºè¡ãšè³Œèªã管çããŸããWeb Componentsã¯ã€ãã³ããã¹ã«ã«ã¹ã¿ã ã€ãã³ããçºè¡ã§ããä»ã®ã³ã³ããŒãã³ãã¯ãããã®ã€ãã³ãã賌èªããŠéç¥ãåä¿¡ã§ããŸãã
// ã€ãã³ããã¹ïŒç°¡ç¥åïŒ
const eventBus = {
events: {},
subscribe: function(event, callback) {
if (!this.events[event]) {
this.events[event] = [];
}
this.events[event].push(callback);
},
publish: function(event, data) {
if (this.events[event]) {
this.events[event].forEach(callback => callback(data));
}
}
};
// user-login ã³ã³ããŒãã³ã
this.login().then(() => {
eventBus.publish('user-logged-in', { username: this.username });
});
// profile-display ã³ã³ããŒãã³ã
connectedCallback() {
eventBus.subscribe('user-logged-in', (userData) => {
this.displayProfile(userData);
});
}
8. ãã³ãã¬ãŒãã¡ãœãããã¿ãŒã³
説æïŒæäœã§ã¢ã«ãŽãªãºã ã®ã¹ã±ã«ãã³ãå®çŸ©ããäžéšã®ã¹ãããããµãã¯ã©ã¹ã«å»¶æããŸãããã³ãã¬ãŒãã¡ãœããã«ããããµãã¯ã©ã¹ã¯ã¢ã«ãŽãªãºã ã®æ§é ã倿Žããã«ãã¢ã«ãŽãªãºã ã®ç¹å®ã®ã¹ããããåå®çŸ©ã§ããŸãããã®ãã¿ãŒã³ã¯ãããããªéãã§åæ§ã®æäœãå®è¡ããè€æ°ã®ã³ã³ããŒãã³ããããå Žåã«æå¹ã§ãã
äŸïŒè€æ°ã®ããŒã¿è¡šç€ºã³ã³ããŒãã³ãïŒäŸïŒ<user-list>
ã<product-list>
ïŒãããããã¹ãŠãããŒã¿ãååŸãããã©ãŒãããããã¬ã³ããªã³ã°ããå¿
èŠããããšããŸããåºæ¬ã¹ãããïŒååŸããã©ãŒããããã¬ã³ããªã³ã°ïŒãå®çŸ©ããæœè±¡çãªåºåºã³ã³ããŒãã³ããäœæã§ããŸãããåã¹ãããã®å
·äœçãªå®è£
ã¯å
·è±¡ãµãã¯ã©ã¹ã«ä»»ããŸãã
å®è£ ïŒã¡ã€ã³ã¢ã«ãŽãªãºã ãå®è£ ããæœè±¡åºåºã¯ã©ã¹ïŒãŸãã¯æœè±¡ã¡ãœãããæã€ã³ã³ããŒãã³ãïŒãå®çŸ©ããŸããæœè±¡ã¡ãœããã¯ããµãã¯ã©ã¹ã«ãã£ãŠã«ã¹ã¿ãã€ãºãããå¿ èŠãããã¹ãããã衚ããŸãããµãã¯ã©ã¹ã¯ãããã®æœè±¡ã¡ãœãããå®è£ ããŠãåºæã®åäœãæäŸããŸãã
// æœè±¡åºåºã³ã³ããŒãã³ã
class AbstractDataList extends HTMLElement {
connectedCallback() {
this.data = this.fetchData();
this.formattedData = this.formatData(this.data);
this.renderData(this.formattedData);
}
fetchData() {
throw new Error('ã¡ãœãããå®è£
ãããŠããŸãã');
}
formatData(data) {
throw new Error('ã¡ãœãããå®è£
ãããŠããŸãã');
}
renderData(formattedData) {
throw new Error('ã¡ãœãããå®è£
ãããŠããŸãã');
}
}
// å
·è±¡ãµãã¯ã©ã¹
class UserList extends AbstractDataList {
fetchData() {
// APIãããŠãŒã¶ãŒããŒã¿ãååŸ
return fetch('/api/users').then(response => response.json());
}
formatData(data) {
// ãŠãŒã¶ãŒããŒã¿ããã©ãŒããã
return data.map(user => `${user.name} (${user.email})`);
}
renderData(formattedData) {
// ãã©ãŒãããããããŠãŒã¶ãŒããŒã¿ãã¬ã³ããªã³ã°
this.innerHTML = `<ul>${formattedData.map(item => `<li>${item}</li>`).join('')}</ul>`;
}
}
Web Componentãã¶ã€ã³ã®ããã®è¿œå ã®èæ ®äºé
- ã¢ã¯ã»ã·ããªãã£ïŒA11yïŒïŒã³ã³ããŒãã³ããé害ãæã€ãŠãŒã¶ãŒã«ã¢ã¯ã»ã¹å¯èœã§ããããšã確èªããŠãã ãããã»ãã³ãã£ãã¯HTMLãARIA屿§ã䜿çšããããŒããŒãããã²ãŒã·ã§ã³ãæäŸããŠãã ããã
- ãã¹ãïŒã³ã³ããŒãã³ãã®æ©èœãšåäœãæ€èšŒããããã«ãåäœãã¹ããšçµ±åãã¹ããèšè¿°ããŠãã ããã
- ããã¥ã¡ã³ãïŒããããã£ãã€ãã³ãã䜿çšäŸãå«ããã³ã³ããŒãã³ããæç¢ºã«ææžåããŠãã ãããStorybookã®ãããªããŒã«ã¯ãã³ã³ããŒãã³ãã®ããã¥ã¡ã³ãã«æé©ã§ãã
- ããã©ãŒãã³ã¹ïŒDOMæäœãæå°éã«æããå¹ççãªã¬ã³ããªã³ã°ææ³ã䜿çšãããªãœãŒã¹ãé å»¶ããŒãããããšã§ãã³ã³ããŒãã³ããããã©ãŒãã³ã¹ã®ããã«æé©åããŠãã ããã
- åœéåïŒi18nïŒãšå°ååïŒl10nïŒïŒã³ã³ããŒãã³ããè€æ°ã®èšèªãšå°åããµããŒãããããã«èšèšããŠãã ãããåœéåAPIïŒäŸïŒ
Intl
ïŒã䜿çšããŠãç°ãªããã±ãŒã«ã«å¯ŸããŠæ¥ä»ãæ°å€ãéè²šãæ£ãããã©ãŒãããããŠãã ããã
Web Componentã¢ãŒããã¯ãã£ïŒãã€ã¯ãããã³ããšã³ã
Web Componentsã¯ããã€ã¯ãããã³ããšã³ãã¢ãŒããã¯ãã£ã«ãããŠéèŠãªåœ¹å²ãæãããŸãããã€ã¯ãããã³ããšã³ãã¯ãããã³ããšã³ãã¢ããªãå°ãããç¬ç«ããŠãããã€å¯èœãªãŠãããã«åè§£ãããã¢ãŒããã¯ãã£ã¹ã¿ã€ã«ã§ããWeb Componentsã¯ãåãã€ã¯ãããã³ããšã³ãã®æ©èœãã«ãã»ã«åããŠå ¬éããããã«äœ¿çšã§ãããããããã倧ããªã¢ããªã±ãŒã·ã§ã³ã«ã·ãŒã ã¬ã¹ã«çµ±åããããšãå¯èœã«ããŸããããã«ãããããã³ããšã³ãã®ããŸããŸãªéšåã®ç¬ç«ããéçºããããã€ãããã³ã¹ã±ãŒãªã³ã°ãä¿é²ãããŸãã
çµè«
ãããã®ãã¶ã€ã³ãã¿ãŒã³ãšãã¹ããã©ã¯ãã£ã¹ãé©çšããããšã§ãåå©çšå¯èœã§ä¿å®æ§ããããã¹ã±ãŒã©ãã«ãªWeb Componentsãäœæã§ããŸããããã«ããã䜿çšããJavaScriptãã¬ãŒã ã¯ãŒã¯ã«é¢ä¿ãªããããå ç¢ã§å¹ççãªWebã¢ããªã±ãŒã·ã§ã³ã«ã€ãªãããŸãããããã®ååãåãå ¥ããããšã§ãããè¯ãã³ã©ãã¬ãŒã·ã§ã³ãã³ãŒãå質ã®åäžããããŠæçµçã«ã¯ã°ããŒãã«ãªãŠãŒã¶ãŒã«ãšã£ãŠããè¯ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãå¯èœã«ãªããŸããèšèšããã»ã¹å šäœã§ãã¢ã¯ã»ã·ããªãã£ãåœéåãããã³ããã©ãŒãã³ã¹ãèæ ®ããããšãå¿ããªãã§ãã ããã