ãã¬ã¼ã ã¯ã¼ã¯ã®ä¸»ãªæ©è½
主è¦ãª JavaScript ãã¬ã¼ã ã¯ã¼ã¯ã¯ããããã DOM ã®æ´æ°ããã©ã¦ã¶ã¼ã¤ãã³ãã®å¦çãæ¥½ããéçºè ã¨ã¯ã¹ããªã¨ã³ã¹ã®æä¾ã«é¢ãã¦ãç°ãªãã¢ããã¼ããæ¡ç¨ããã¦ãã¾ãããã®è¨äºã§ã¯ããããã° 4ããã¬ã¼ã ã¯ã¼ã¯ã®ä¸»ãªç¹å¾´ãæ¢ãããã¬ã¼ã ã¯ã¼ã¯ãã©ã®ããã«æ©è½ããå¾åãããããé«ãã¬ãã«ããè¦ã¦ããããããã®éããè¦ã¦ããã¾ãã
| åææ¡ä»¶: | ã³ã¢ã® HTMLã CSSã JavaScript è¨èªãåãã£ã¦ãããã¨ã |
|---|---|
| å¦ç¿ææ: | JavaScript ãã¬ã¼ã ã¯ã¼ã¯ã§æä¾ããã主è¦ãªæ©è½ãçè§£ãããã¨ã |
ãã¡ã¤ã³åºæè¨èª
ãã®ã¢ã¸ã¥ã¼ã«ã§èª¬æãããã¹ã¦ã®ãã¬ã¼ã ã¯ã¼ã¯ã¯ JavaScript ãå©ç¨ãã¦ãããã¢ããªã±ã¼ã·ã§ã³ãæ§ç¯ããããã«ãã¡ã¤ã³åºæè¨èª (DSL) ã使ç¨ã§ãã¾ããç¹ã«ã React ã¯ã³ã³ãã¼ãã³ãã®ä½æã« JSX ã®ä½¿ç¨ãæ®åããã䏿¹ã Ember 㯠Handlebars ãå©ç¨ãã¾ãã HTML ã¨ã¯ç°ãªãããããã®è¨èªã¯ãã¼ã¿å¤æ°ã®èªã¿åãæ¹æ³ãç¥ã£ã¦ããããã®ãã¼ã¿ã使ç¨ã㦠UI ã使ããããã»ã¹ãåçåã§ãã¾ãã
Angular ã¢ããªã§ã¯ã TypeScript ãé »ç¹ã«ä½¿ç¨ããã¾ãã TypeScript ã¯ã¦ã¼ã¶ã¼ã¤ã³ã¿ã¼ãã§ã¤ã¹ã®è¨è¿°ã«ã¯é¢ä¸ãã¾ãããããã¡ã¤ã³åºæã®è¨èªã§ãããé常㮠JavaScript ã¨ã¯å¤§ããªéããããã¾ãã
DSL ã¯ãã©ã¦ã¶ã¼ã§ç´æ¥èªã¿åããã¨ã¯ã§ãã¾ãããæåã« JavaScript ã¾ã㯠HTML ã«å¤æããå¿ è¦ãããã¾ãããã¬ã¼ã ã¯ã¼ã¯ãã¼ã«ã«ã¯é常ããã®ã¹ããããå¦çããããã«å¿ è¦ãªãã¼ã«ãå«ã¾ãã¦ãããããã®ã¹ããããå«ããããã«èª¿æ´ãããã¨ãã§ãã¾ãããããã®ãã¡ã¤ã³åºæè¨èªã使ç¨ããã«ãã¬ã¼ã ã¯ã¼ã¯ã¢ããªãæ§ç¯ãããã¨ãå¯è½ã§ããããããã®è¨èªãæ¡ç¨ããã¨ãéçºããã»ã¹ãåçåããããããã®ãã¬ã¼ã ã¯ã¼ã¯ã«é¢ããã³ãã¥ããã£ããã®ãã«ããè¦ã¤ãããããªãã¾ãã
JSX
JSX ã¯ã JavaScript 㨠XML ã®ç¥ã§ãJavaScript ç°å¢ã« HTML ã®ãããªæ§æããããã JavaScript ã®æ¡å¼µæ©è½ã§ãããã㯠React ã¢ããªã±ã¼ã·ã§ã³ã§ä½¿ç¨ããããã« React ãã¼ã ã«ãã£ã¦çºæããã¾ãããã Vue ã¢ããªãªã©ã®ä»ã®ã¢ããªã±ã¼ã·ã§ã³ã®éçºã«ã使ç¨ã§ãã¾ãã
以ä¸ã«ç°¡å㪠JSX ã®ä¾ã示ãã¾ãã
const subject = "World";
const header = (
<header>
<h1>Hello, {subject}!</h1>
</header>
);
ãã®å¼ã¯ã HTML ã® <header> è¦ç´ ã®å
é¨ã« <h1> è¦ç´ ããããã¨ã表ãã¾ãã {subject} ãå²ã䏿¬å¼§ã¯ãã¢ããªã±ã¼ã·ã§ã³ã« subject 宿°ã®å¤ãèªã¿åããããã <h1> ã«æ¿å
¥ããããã«æç¤ºãã¾ãã
React ã§ä½¿ç¨ããã¨ãåã®ã¹ããããã® JSX ã¯æ¬¡ã®ããã«ã³ã³ãã¤ã«ããã¾ãã
const subject = "World";
const header = React.createElement(
"header",
null,
React.createElement("h1", null, "Hello, ", subject, "!"),
);
æçµçã«ãã©ã¦ã¶ã¼ã«ãã£ã¦ã¬ã³ããªã³ã°ãããã¨ãä¸è¨ã®ã¹ããããã¯æ¬¡ã®ãã㪠HTML ãçæãã¾ãã
<header>
<h1>Hello, World!</h1>
</header>
Handlebars
Handlebars ã¯ãã³ãã¬ã¼ãè¨èªã§ã Ember ã¢ããªã±ã¼ã·ã§ã³ã«åºæã®ãã®ã§ã¯ããã¾ãããã Ember ã¢ããªã±ã¼ã·ã§ã³ã§é »ç¹ã«å©ç¨ããã¦ãã¾ãã Handlebars ã³ã¼ã㯠HTML ã«ä¼¼ã¦ãã¾ãããä»ã®å ´æãããã¼ã¿ãåãè¾¼ããªãã·ã§ã³ãããã¾ãããã®ãã¼ã¿ã¯ãã¢ããªã±ã¼ã·ã§ã³ãæçµçã«æ§ç¯ãã HTML ã«å½±é¿ãä¸ããããã«ä½¿ç¨ã§ãã¾ãã
JSX ã¨åæ§ã«ã Handlebars ã¯ä¸æ¬å¼§ã使ç¨ãã¦å¤æ°ã®å¤ãæ¿å ¥ãã¾ãããã³ãã«ãã¼ã¯ãåä¸ãã¢ã§ã¯ãªããäºéãã¢ã®ä¸æ¬å¼§ã使ç¨ãã¾ãã
ãã®ãã³ãã«ãã¼ãã³ãã¬ã¼ããèæ ®ããã¨ã次ã®ããã«ãªãã¾ãã
<header>
<h1>Hello, {{subject}}!</h1>
</header>
ããã¦ãã®ãã¼ã¿ã¯æ¬¡ã®ããã«ãªãã¾ãã
{
subject: "World";
}
Handlebars ã¯æ¬¡ã®ãã㪠HTML ãæ§ç¯ãã¾ãã
<header>
<h1>Hello, World!</h1>
</header>
TypeScript
TypeScript 㯠JavaScript ã®ãã¹ã¼ãã¼ã»ãããã§ããã¤ã¾ãã JavaScript ãæ¡å¼µãããã®ã§ãããã¹ã¦ã® JavaScript ã³ã¼ãã¯æå¹ãª TypeScript ã§ããããã®éã¯ããã¾ããã TypeScript ã¯ãéçºè
ãã³ã¼ãã«å³å¯æ§ãé©ç¨ã§ããã¨ããç¹ã§å½¹ç«ã¡ã¾ãããã¨ãã°ãæ´æ° a 㨠b ãåãåãããã®åè¨ãè¿ã颿° add() ã«ã¤ãã¦èãã¦ã¿ã¾ãããã
JavaScript ã§ã¯ããã®é¢æ°ã¯æ¬¡ã®ããã«è¨è¿°ã§ãã¾ãã
function add(a, b) {
return a + b;
}
ãã®ã³ã¼ã㯠JavaScript ã«æ
£ãã¦ãã人ã«ã¨ã£ã¦ã¯ç°¡åããããã¾ããããããã«æç¢ºã«ãªãå¯è½æ§ãããã¾ãã JavaScript ã§ã¯ + æ¼ç®åã使ç¨ãã¦æååãé£çµã§ããããã a 㨠b ãæååã®å ´åã§ããã®é¢æ°ã¯æè¡çã«ã¯æ©è½ãã¾ãããæå¾
ããçµæãå¾ãããªãå¯è½æ§ãããã¾ãããã®é¢æ°ã«æ°å¤ã®ã¿ã渡ããã¨ã許å¯ãããå ´åã¯ã©ãããã°ããã§ãããã? TypeScript ã使ç¨ããã¨ã次ã®ãã¨ãå¯è½ã«ãªãã¾ãã
function add(a: number, b: number) {
return a + b;
}
ããã§å弿°ã®å¾ã«æ¸ããã : number ã¯ãTypeScript ã« a 㨠b ã®ä¸¡æ¹ãæ°å¤ã§ãªããã°ãªããªããã¨ãä¼ãã¾ãããã®é¢æ°ã使ç¨ãã¦å¼æ°ã¨ã㦠'2' ãæ¸¡ãã¨ã TypeScript ã¯ã³ã³ãã¤ã«ä¸ã«ã¨ã©ã¼ãçºçãããééããä¿®æ£ããå¿
è¦ãããã¾ãããããã®ã¨ã©ã¼ãçºçãããç¬èªã® JavaScript ã使ãããã¨ãã§ãã¾ãããã½ã¼ã¹ã³ã¼ãã大å¹
ã«åé·ã«ãªãã¾ãã TypeScript ã«ãã®ãããªãã§ãã¯ãå¦çãããæ¹ãããããåççã§ãã
ã³ã³ãã¼ãã³ãã®ä½æ
åã®ç« ã§è¿°ã¹ãããã«ãã»ã¨ãã©ã®ãã¬ã¼ã ã¯ã¼ã¯ã«ã¯ä½ããã®ã³ã³ãã¼ãã³ãã¢ãã«ãããã¾ãã React ã³ã³ãã¼ãã³ã㯠JSX ã§ã Ember ã³ã³ãã¼ãã³ã㯠Handlebars ã§ã Angular ã³ã³ãã¼ãã³ã㨠Vue ã³ã³ãã¼ãã³ã㯠HTML ãè»½ãæ¡å¼µãããã³ãã¬ã¼ãæ§æã§ä½æã§ãã¾ãã
ã³ã³ãã¼ãã³ããã©ã®ããã«è¨è¿°ããã¹ããã«ã¤ãã¦ã®æè¦ãä½ã§ãããã¨ãåãã¬ã¼ã ã¯ã¼ã¯ã®ã³ã³ãã¼ãã³ãã¯ãå¿ è¦ã¨ãªãå¯è½æ§ã®ããå¤é¨ããããã£ãã³ã³ãã¼ãã³ãã管çããå¿ è¦ãããå é¨ç¶æ ãããã³ã¦ã¼ã¶ã¼ãã³ã³ãã¼ãã³ãã®ãã¼ã¯ã¢ããã§ããªã¬ã¼ã§ããã¤ãã³ããè¨è¿°ããæ¹æ³ãæä¾ãã¾ãã
ãã®ç¯ã®æ®ãã®ã³ã¼ãã¹ããããã¯ä¾ã¨ã㦠React ã使ç¨ãã JSX ã§æ¸ããã¦ãã¾ãã
ããããã£
ãããã㣠(Propertiesãã¾ã㯠props) ã¯ãã³ã³ãã¼ãã³ããã¬ã³ããªã³ã°ããããã«å¿
è¦ãªå¤é¨ãã¼ã¿ã§ãããªã³ã©ã¤ã³ãã¬ã¸ã³ã®ã¦ã§ããµã¤ããæ§ç¯ãã¦ãã¦ãããããã®å¯ç¨¿è
ãèªåã®ä½åã«å¯¾ãã¦ã¯ã¬ã¸ãããåå¾ã§ããããã«ããå¿
è¦ãããã¨ãã¾ããåè¨äºã«ä»éãã AuthorCredit ã³ã³ãã¼ãã³ãã使ãããã¨ãã§ãã¾ãããã®ã³ã³ãã¼ãã³ãã¯ãèè
ã®èåã¨èè
ã«é¢ããçãç½²åæã表示ããå¿
è¦ãããã¾ããã©ã®ç»åãã¬ã³ããªã³ã°ããããã©ã®ç½²åæ¬ãå°å·ããããç¥ãããã«ã AuthorCredit ã¯ããã¤ãã®ããããã£ãåãå
¥ããå¿
è¦ãããã¾ãã
ãã® AuthorCredit ã³ã³ãã¼ãã³ãã® React 表ç¾ã¯æ¬¡ã®ããã«ãªãã¾ãã
function AuthorCredit(props) {
return (
<figure>
<img src={props.src} alt={props.alt} />
<figcaption>{props.byline}</figcaption>
</figure>
);
}
{props.src}, {props.alt}, ããã³ {props.byline} ã¯ã props ãã³ã³ãã¼ãã³ãã«æ¿å
¥ãããå ´æã表ãã¾ãããã®ã³ã³ãã¼ãã³ããã¬ã³ããªã³ã°ããã«ã¯ãã¬ã³ããªã³ã°ãããå ´æï¼ããããå¥ã®ã³ã³ãã¼ãã³ãå
ã«ããã§ãããï¼ã«æ¬¡ã®ãããªã³ã¼ããè¨è¿°ãã¾ãã
<AuthorCredit
src="./assets/zelda.png"
alt="Portrait of Zelda Schiff"
byline="Zelda Schiff is editor-in-chief of the Library Times."
/>
ããã«ãããæçµçã«æ¬¡ã® <figure> è¦ç´ ããã©ã¦ã¶ã¼ã«ã¬ã³ããªã³ã°ããã¾ãããã®æ§é 㯠AuthorCredit ã³ã³ãã¼ãã³ãã§å®ç¾©ããã¦ããã¨ããã§ããããã®ã³ã³ãã³ãã¯æ¬¡ã®ããã«ãªãã¾ãã AuthorCredit ã³ã³ãã¼ãã³ãå¼ã³åºãã«å«ã¾ããããããã£ã§å®ç¾©ããã¾ãã
<figure>
<img src="assets/zelda.png" alt="Portrait of Zelda Schiff" />
<figcaption>Zelda Schiff is editor-in-chief of the Library Times.</figcaption>
</figure>
ç¶æ
åã®ç« ã§ç¶æ (state) ã®æ¦å¿µã«ã¤ãã¦èª¬æãã¾ããã广çãªãã¬ã¼ã ã¯ã¼ã¯ã®éµã¨ãªãã®ã¯å ç¢ãªç¶æ å¦çã¡ã«ããºã ã§ãããåã³ã³ãã¼ãã³ãã«ã¯ç¶æ ã®å¶å¾¡ãå¿ è¦ãªãã¼ã¿ãå«ã¾ããå ´åãããã¾ãããã®ç¶æ ã¯ãã³ã³ãã¼ãã³ãã使ç¨ããã¦ããéããä½ããã®å½¢ã§æç¶ãã¾ããããããã£ã¨åæ§ã«ãç¶æ ã使ç¨ãã¦ã³ã³ãã¼ãã³ãã®ã¬ã³ããªã³ã°æ¹æ³ã«å½±é¿ãä¸ãããã¨ãã§ãã¾ãã
ä¾ã¨ãã¦ãã¯ãªãã¯ãããåæ°ãæ°ãããã¿ã³ã«ã¤ãã¦èãã¦ã¿ã¾ãããããã®ã³ã³ãã¼ãã³ãã¯ãèªèº«ã® count ç¶æ ã追跡ããå¿ è¦ããããæ¬¡ã®ããã«è¨è¿°ã§ãã¾ãã
function CounterButton() {
const [count] = useState(0);
return <button>Clicked {count} times</button>;
}
useState() 㯠**React ããã¯**ã§ãããã¼ã¿å¤ã¯ãæ´æ°ããããã³ã«ãã®å¤ã追跡ãã¾ããã³ã¼ãã¯æåããã©ã¦ã¶ã¼ã§æ¬¡ã®ããã«è¡¨ç¤ºããã¾ãã
<button>Clicked 0 times</button>
useState() å¼ã³åºãã¯ãã¢ããªå
¨ä½ã«ããã£ã¦å
ç¢ãªæ¹æ³ã§ count å¤ã追跡ãã¾ãããã®ããã®ã³ã¼ããèªåã§è¨è¿°ããå¿
è¦ã¯ããã¾ããã
ã¤ãã³ã
æä½ã§ããããã«ããããã«ã¯ãã¢ããªã±ã¼ã·ã§ã³ãã¦ã¼ã¶ã¼ã«å¿çã§ããããã«ãã³ã³ãã¼ãã³ãããã©ã¦ã¶ã¼ã¤ãã³ãã«å¿çããæ¹æ³ãå¿ è¦ã§ãããã¬ã¼ã ã¯ã¼ã¯ã¯ããããããã©ã¦ã¶ã¼ã¤ãã³ããå¾ ã¡åãããããã®ç¬èªã®æ§æãæä¾ããåçã®ãã¤ãã£ããã©ã¦ã¶ã¼ã¤ãã³ãã®ååãåç §ãã¾ãã
React ã§ã¯ãclick ã¤ãã³ããå¾
ã¡åãããã«ã¯ãç¹å¥ãªãããã㣠onClick ãå¿
è¦ã§ããä¸è¨ã® CounterButton ã³ã¼ããæ´æ°ãã¦ãã¯ãªãã¯æ°ãã«ã¦ã³ãã§ããããã«ãã¾ãããã
function CounterButton() {
const [count, setCount] = useState(0);
return (
<button onClick={() => setCount(count + 1)}>Clicked {count} times</button>
);
}
ãã®ãã¼ã¸ã§ã³ã§ã¯ã追å ã® useState() æ©è½ã使ç¨ãã¦ç¹å¥ãª setCount() 颿°ã使ãããããå¼ã³åºã㦠count ã®å¤ãæ´æ°ãã¾ãããã®é¢æ°ã onClick ã¤ãã³ããã³ãã©ã¼å
ã§å¼ã³åºãã¦ããcountããç¾å¨ã®å¤ã« 1 ãå ããå¤ã«è¨å®ãã¾ãã
ã¹ã¿ã¤ã«è¨å®ã³ã³ãã¼ãã³ã
åãã¬ã¼ã ã¯ã¼ã¯ã¯ãã³ã³ãã¼ãã³ããã¾ãã¯ã¢ããªã±ã¼ã·ã§ã³å ¨ä½ã®ã¹ã¿ã¤ã«ãå®ç¾©ããæ¹æ³ãæä¾ãã¾ããã³ã³ãã¼ãã³ãã®ã¹ã¿ã¤ã«ãå®ç¾©ããããã®åãã¬ã¼ã ã¯ã¼ã¯ã®ã¢ããã¼ãã¯è¥å¹²ç°ãªãã¾ããããããã®ãã¬ã¼ã ã¯ã¼ã¯ã§ãè¤æ°ã®æ¹æ³ãæä¾ããã¦ãã¾ããããã¤ãã®ãã«ãã¼ã¢ã¸ã¥ã¼ã«ã追å ããã¨ã Sass ã¾ã㯠Less ã§ãã¬ã¼ã ã¯ã¼ã¯ã¢ããªã®ã¹ã¿ã¤ã«ãè¨å®ãããã CSS ã¹ã¿ã¤ã«ã·ã¼ãã PostCSS ã使ç¨ãã¦ãã©ã³ã¹ãã¤ã«ãããã§ãã¾ãã
ä¾åé¢ä¿ã®å¦ç
ãã¹ã¦ã®ä¸»è¦ãªãã¬ã¼ã ã¯ã¼ã¯ã¯ãä»ã®ã³ã³ãã¼ãã³ãå ã®ã³ã³ãã¼ãã³ãã使ç¨ãã¦ãå ´åã«ãã£ã¦ã¯è¤æ°ã®é層ã¬ãã«ã使ç¨ãã¦ãä¾åé¢ä¿ãå¦çããããã®ã¡ã«ããºã ãæä¾ãã¾ããä»ã®æ©è½ã¨åæ§ãæ£ç¢ºãªã¡ã«ããºã ã¯ãã¬ã¼ã ã¯ã¼ã¯ã«ãã£ã¦ç°ãªãã¾ãããæçµçãªçµæã¯åãã§ããã³ã³ãã¼ãã³ãã¯ãæ¨æºã® JavaScript ã¢ã¸ã¥ã¼ã«æ§æ ãã¾ãã¯å°ãªãã¨ãããã«é¡ä¼¼ãããã®ã使ç¨ãã¦ãã³ã³ãã¼ãã³ããä»ã®ã³ã³ãã¼ãã³ãã«ã¤ã³ãã¼ãããå¾åãããã¾ãã
ã³ã³ãã¼ãã³ãå ã®ã³ã³ãã¼ãã³ã
ã³ã³ãã¼ãã³ããã¼ã¹ã® UI ã¢ã¼ããã¯ãã£ã®ä¸»ãªå©ç¹ã® 1 ã¤ã¯ãã³ã³ãã¼ãã³ããä¸ç·ã«æ§æã§ãããã¨ã§ãã HTML ã¿ã°ãç¸äºã«è¨è¿°ãã¦ã¦ã§ããµã¤ããæ§ç¯ã§ããã®ã¨åãããã«ãä»ã®ã³ã³ãã¼ãã³ãå ã§ã³ã³ãã¼ãã³ãã使ç¨ãã¦ã¦ã§ãã¢ããªã±ã¼ã·ã§ã³ãæ§ç¯ã§ãã¾ãã åãã¬ã¼ã ã¯ã¼ã¯ã使ç¨ããã¨ãä»ã®ã³ã³ãã¼ãã³ããå©ç¨ãã (ãããã£ã¦ä¾åãã) ã³ã³ãã¼ãã³ãã使ã§ãã¾ãã
ãã¨ãã°ã AuthorCredit React ã³ã³ãã¼ãã³ãã¯ã Article ã³ã³ãã¼ãã³ãå
ã§å©ç¨ãããå¯è½æ§ãããã¾ãã ã¤ã¾ãã Article 㯠AuthorCredit ãã¤ã³ãã¼ãããå¿
è¦ãããã¾ãã
import AuthorCredit from "./components/AuthorCredit";
ãããå®äºããã¨ã AuthorCredit ã Article ã³ã³ãã¼ãã³ãå
ã§æ¬¡ã®ããã«ä½¿ç¨ã§ãã¾ãã
<Article>
<AuthorCredit />
</Article>
ä¾åé¢ä¿ã®æ³¨å ¥
å®éã®ã¢ããªã±ã¼ã·ã§ã³ã«ã¯ãå¤ãã®å ´åãè¤æ°ã¬ãã«ã®ãã¹ããå«ãã³ã³ãã¼ãã³ãæ§é ãå«ã¾ãããã¨ãããã¾ããå¤ãã®ã¬ãã«ã§ãã¹ãããã AuthorCredit ã³ã³ãã¼ãã³ãã¯ãä½ããã®çç±ã§ãã¢ããªã±ã¼ã·ã§ã³ã®ã¾ãã«ã«ã¼ãã¬ãã«ããã®ãã¼ã¿ãå¿
è¦ã¨ããå ´åãããã¾ãã
ç§ãã¡ãæ§ç¯ãã¦ããéèªãµã¤ããæ¬¡ã®ãããªæ§é ã«ãªã£ã¦ããã¨ãã¾ãã
<App>
<Home>
<Article>
<AuthorCredit {/* props */} />
</Article>
</Home>
</App>
App ã³ã³ãã¼ãã³ãã«ã¯ãAuthorCredit ã³ã³ãã¼ãã³ããå¿
è¦ã¨ãããã¼ã¿ãå«ã¾ãã¦ãã¾ãã Home 㨠Article ãæ¸ãæãã¦ã props ãæ¸¡ããã¨ãã§ããããã«ãããã¨ãã§ãã¾ãããããããã¼ã¿ã®éä¿¡å
ã¨éä¿¡å
ã®éã«é常ã«å¤ãã®ã¬ãã«ãããå ´åãããã¯é¢åã«ãªãå¯è½æ§ãããã¾ãããããè¡ãéãã§ãã Home 㨠Article ã§ã¯ãå®éã«ã¯èè
ã®èåç»ãç½²åã使ç¨ããã¦ãã¾ããããããããã®æ
å ±ã AuthorCredit ã«åãè¾¼ã¿ããå ´åã¯ãããã«åãã㦠Home 㨠Article ã夿´ããå¿
è¦ãããã¾ãã
å¤ãã®ã³ã³ãã¼ãã³ã層ãä»ãã¦ãã¼ã¿ã渡ãåé¡ã¯ããããããªã«ã¨å¼ã°ããå¤§è¦æ¨¡ãªã¢ããªã±ã¼ã·ã§ã³ã«ã¯çæ³çã§ã¯ããã¾ããã
ããããããªã«ãåé¿ããããã«ããã¬ã¼ã ã¯ã¼ã¯ã¯ä¾åé¢ä¿æ³¨å ¥ã¨ãã¦ç¥ãããæ©è½ãæä¾ãã¾ããããã¯ãç¹å®ã®ãã¼ã¿ããä»å¨ããã¬ãã«ãä»ããã«ãå¿ è¦ãªã³ã³ãã¼ãã³ãã«ç´æ¥åå¾ããæ¹æ³ã§ããåãã¬ã¼ã ã¯ã¼ã¯ã¯ãç°ãªãååã§ç°ãªãæ¹æ³ã§ä¾åæ§æ³¨å ¥ãå®è£ ãã¾ãããçµæã¯æçµçã«ã¯åãã§ãã
Angular ã§ã¯ããã®ããã»ã¹ãä¾åé¢ä¿ã®æ³¨å
¥ã¨å¼ã³ã¾ãã Vue ã«ã¯ provide() ããã³ inject() ã³ã³ãã¼ãã³ãã¡ã½ãããããã¾ãã React ã«ã¯Context API ãããã¾ãã Ember 㯠ãµã¼ãã¹ãéãã¦ç¶æ
ãå
±æãã¾ãã
ã©ã¤ããµã¤ã¯ã«
ãã¬ã¼ã ã¯ã¼ã¯ã®ã³ã³ããã¹ãã§ã¯ãã³ã³ãã¼ãã³ãã® ã©ã¤ããµã¤ã¯ã« ã¯ãã³ã³ãã¼ãã³ãã DOM ã«è¿½å ããã¦ãã©ã¦ã¶ã¼ã«ãã£ã¦ã¬ã³ããªã³ã°ãããæç¹ DOM ã®è¿½å ï¼ãã¦ã³ãã¨å¼ã°ãããã¨ãå¤ãï¼ããåé¤ãããæç¹ã¾ã§ãã³ã³ãã¼ãã³ããééãããã§ã¼ãºã®éåã§ãã DOM ã®åé¤ï¼ã¢ã³ãã¦ã³ãã¨å¼ã°ãããã¨ãå¤ãï¼ãåãã¬ã¼ã ã¯ã¼ã¯ã¯ãããã®ã©ã¤ããµã¤ã¯ã«ãã§ã¼ãºã«ç°ãªãååãä»ãã¦ããããã¹ã¦ã®ãã¬ã¼ã ã¯ã¼ã¯ã§éçºè ãåããã§ã¼ãºã«ã¢ã¯ã»ã¹ã§ããããã§ã¯ããã¾ããããã¹ã¦ã®ãã¬ã¼ã ã¯ã¼ã¯ã¯åãä¸è¬çãªã¢ãã«ã«å¾ãã¾ããéçºè ã¯ãã³ã³ãã¼ãã³ãã® DOM ã®è¿½å ï¼ãã¦ã³ãï¼ , DOM ã®æç» (ã¬ã³ããªã³ã°), DOM ã®åé¤ï¼ã¢ã³ãã¦ã³ãï¼ ããã³ãããã®éã®å¤ãã®ãã§ã¼ãºã§ç¹å®ã®ã¢ã¯ã·ã§ã³ãå®è¡ã§ãã¾ãã
ã¬ã³ããªã³ã°ãã§ã¼ãºã¯ãã¦ã¼ã¶ã¼ãã¢ããªã±ã¼ã·ã§ã³ãæä½ããã¨ãã«æãé »ç¹ã«ç¹°ãè¿ããããããçè§£ãããã¨ãæãéè¦ã§ããããã¯ããã©ã¦ã¶ã¼ãä½ãæ°ããæ å ±ã表示ããå¿ è¦ããããã³ã«å®è¡ããã¾ãããã®æ°ããæ å ±ããã©ã¦ã¶ã¼å ã®æ å ±ã¸ã®è¿½å ãåé¤ãã¾ãã¯ç·¨éã§ãããã©ããã«é¢ä¿ããã¾ããã
ãã® React ã³ã³ãã¼ãã³ãã®ã©ã¤ããµã¤ã¯ã«ã®å³ã¯ãæ¦å¿µã®æ¦è¦ã示ãã¦ãã¾ãã
è¦ç´ ã®ã¬ã³ããªã³ã°
ã©ã¤ããµã¤ã¯ã«ã¨åæ§ã«ããã¬ã¼ã ã¯ã¼ã¯ã¯ã¢ããªã±ã¼ã·ã§ã³ãã¬ã³ããªã³ã°ããæ¹æ³ã«å¯¾ãã¦ãç°ãªããã®ã®åæ§ã®ã¢ããã¼ããæ¡ç¨ãã¾ãããããã¯ãã¹ã¦ããã©ã¦ã¶ã¼ã® DOM ã®ç¾å¨ã¬ã³ããªã³ã°ããããã¼ã¸ã§ã³ã追跡ããã¢ããªã±ã¼ã·ã§ã³ã®ã³ã³ãã¼ãã³ããåã¬ã³ããªã³ã°ãããã¨ãã« DOM ãã©ã®ããã«å¤æ´ãããã¹ããã«ã¤ãã¦ããããããããã«ç°ãªã決å®ãä¸ãã¾ãããããã®æ±ºå®ã¯ãã¬ã¼ã ã¯ã¼ã¯ãè¡ããããé常ã¯èªåã§ DOM ãæä½ãããã¨ã¯ããã¾ããã DOM ããé¢ãããã®æ½è±¡åã¯ã DOM ãèªåã§æ´æ°ãããããè¤éã§ã¡ã¢ãªã¼ã大éã«æ¶è²»ãã¾ãããããããªããã°ããã¬ã¼ã ã¯ã¼ã¯ã§ããç¥ããã¦ãã宣è¨åã®æ¹æ³ã§ããã°ã©ãã³ã°ãããã¨ã¯ã§ãã¾ããã
ä»®æ³ DOM ã¯ããã©ã¦ã¶ã¼ã® DOM ã«é¢ããæ å ±ã JavaScript ã¡ã¢ãªã¼ã«ä¿åããã¢ããã¼ãã§ããã¢ããªã±ã¼ã·ã§ã³ã¯ã DOM ã®ãã®ã³ãã¼ãæ´æ°ããããããå®éã®ã DOM (ã¦ã¼ã¶ã¼ã«å¯¾ãã¦å®éã«ã¬ã³ããªã³ã°ããã DOM) ã¨æ¯è¼ãã¦ãä½ãã¬ã³ããªã³ã°ããããæ±ºå®ãã¾ããã¢ããªã±ã¼ã·ã§ã³ã¯ãæ´æ°ãããä»®æ³ DOM ã¨ç¾å¨ã¬ã³ããªã³ã°ããã¦ãã DOM ã®éããæ¯è¼ãããå·®åããæ§ç¯ãããã®å·®åã使ç¨ãã¦å®éã® DOM ã«æ´æ°ãé©ç¨ãã¾ãã React 㨠Vue ã¯ã©ã¡ããä»®æ³ DOM ã¢ãã«ãå©ç¨ãã¾ãããå·®ååæãã¬ã³ããªã³ã°æã«ã¾ã£ããåããã¸ãã¯ãé©ç¨ããããã§ã¯ããã¾ããã
ä»®æ³ DOM ã®è©³ç´°ã«ã¤ãã¦ã¯ãReact ã®ããã¥ã¡ã³ããã覧ãã ããã
å¢å DOM ã¯ãä½ãã¬ã³ããªã³ã°ããããæ±ºå®ããããã« DOM diff ãæ§ç¯ããã¨ããç¹ã§ä»®æ³ DOM ã«ä¼¼ã¦ãã¾ããã JavaScript ã¡ã¢ãªã¼å ã« DOM ã®å®å ¨ãªã³ãã¼ã使ããªãã¨ããç¹ã§ç°ãªãã¾ãã夿´ããå¿ è¦ã®ãªã DOM ã®é¨åã¯ç¡è¦ããã¾ãã Angular ã¯ããã®ã¢ã¸ã¥ã¼ã«ã§ããã¾ã§èª¬æãããå¢å DOM ã使ç¨ããå¯ä¸ã®ãã¬ã¼ã ã¯ã¼ã¯ã§ãã
Incremental DOM ã®è©³ç´°ã«ã¤ãã¦ã¯ãAuth0 ããã°ãã覧ãã ããã
Glimmer VM 㯠Ember ã«åºæã®ãã®ã§ããããã¯ä»®æ³ DOM ãå¢å DOM ã§ã¯ããã¾ãããããã¯ã Ember ã®ãã³ãã¬ã¼ããã JavaScript ãããèªã¿ãããé«éã«èªã¿åããä¸ç¨®ã®ããã¤ãã³ã¼ããã«ãã©ã³ã¹ãã¤ã«ããå¥ã®ããã»ã¹ã§ãã
ã«ã¼ãã£ã³ã°
åã®ç« ã§è¿°ã¹ãããã«ãã«ã¼ãã£ã³ã°ã¯ã¦ã§ãã¨ã¯ã¹ããªã¨ã³ã¹ã®éè¦ãªé¨åã§ãã夿°ã®ãã¥ã¼ãåããé常ã«è¤éãªã¢ããªã§ã®æä½æ§ã®ä½ä¸ãé¿ããããã«ããã®ã¢ã¸ã¥ã¼ã«ã§èª¬æããåãã¬ã¼ã ã¯ã¼ã¯ã¯ãéçºè ãã¢ããªã±ã¼ã·ã§ã³ã«ã¯ã©ã¤ã¢ã³ãå´ã«ã¼ãã£ã³ã°ãå®è£ ããã®ã«å½¹ç«ã¤ã©ã¤ãã©ãªã¼(ã¾ãã¯è¤æ°ã®ã©ã¤ãã©ãªã¼)ãæä¾ãã¾ãã
ãã¹ã
ãã¹ã¦ã®ã¢ããªã±ã¼ã·ã§ã³ã¯ãã½ããã¦ã§ã¢ãæå¾ ã©ããã«åä½ãç¶ãããã¨ãä¿è¨¼ãããã¹ãã«ãã¬ãã¸ã®æ©æµãåãã¾ããã¦ã§ãã¢ããªã±ã¼ã·ã§ã³ãä¾å¤ã§ã¯ããã¾ãããåãã¬ã¼ã ã¯ã¼ã¯ã®ã¨ã³ã·ã¹ãã ã¯ããã¹ãã®ä½æã容æã«ãããã¼ã«ãæä¾ãã¾ãããã¹ããã¼ã«ã¯ãã¬ã¼ã ã¯ã¼ã¯èªä½ã«ã¯çµã¿è¾¼ã¾ãã¦ãã¾ãããããã¬ã¼ã ã¯ã¼ã¯ã¢ããªã®çæã«ä½¿ç¨ããã CLI ãã¼ã«ã使ç¨ããã¨ãé©åãªãã¹ããã¼ã«ã«ã¢ã¯ã»ã¹ã§ãã¾ãã
åãã¬ã¼ã ã¯ã¼ã¯ã«ã¯ããã®ã¨ã³ã·ã¹ãã å ã«åä½ãã¹ãã¨çµ±åãã¹ãã®æ©è½ãåããåºç¯ãªãã¼ã«ãããã¾ãã
Testing Library ã¯ãReactãVueãAngular ãªã©ã®å¤ãã® JavaScript ç°å¢ç¨ã®ãã¼ã«ãåãããã¹ãã¦ã¼ãã£ãªãã£ã®ã¹ã¤ã¼ãã§ãã Ember ããã¥ã¡ã³ãã§ã¯ãEmber ã¢ããªã®ãã¹ãã«ã¤ãã¦èª¬æãã¦ãã¾ãã
ããã¯ã React ãã¹ãã©ã¤ãã©ãªã¼ã®å©ããåãã¦æ¸ããã CounterButton ã®ç°¡åãªãã¹ãã§ãããã¿ã³ã®åå¨ãããã¿ã³ã 0 ã1 ã 2 åã¯ãªãã¯ãããå¾ã«æ£ããããã¹ãã表示ããã¦ãããã©ãããªã©ããã¾ãã¾ãªãã¨ããã¹ããã¾ãã
import { fireEvent, render, screen } from "@testing-library/react";
import CounterButton from "./CounterButton";
it("Renders a semantic button with an initial state of 0", () => {
render(<CounterButton />);
const btn = screen.getByRole("button");
expect(btn).toBeInTheDocument();
expect(btn).toHaveTextContent("Clicked 0 times");
});
it("Increments the count when clicked", () => {
render(<CounterButton />);
const btn = screen.getByRole("button");
fireEvent.click(btn);
expect(btn).toHaveTextContent("Clicked 1 times");
fireEvent.click(btn);
expect(btn).toHaveTextContent("Clicked 2 times");
});
ã¾ã¨ã
ãã®æç¹ã§ããã¬ã¼ã ã¯ã¼ã¯ã使ç¨ãã¦ã¢ããªã±ã¼ã·ã§ã³ã使ããã¨ãã«ä½¿ç¨ããå®éã®è¨èªãæ©è½ããã¼ã«ã«ã¤ãã¦ããã«çè§£ã§ããã¯ãã§ããããªãã¯ãã£ã¨ãå®éã«ã³ã¼ãã£ã³ã°ããã¦ã¿ããã¨ç±æãæã£ã¦åãçµãã§ããã¨æãã¾ãããããæ¬¡ã«è¡ããã¨ã§ãããã®æç¹ã§ãæåã«å¦ç¿ãéå§ãããã¬ã¼ã ã¯ã¼ã¯ã鏿ã§ãã¾ãã