è€éãªå£ã«ã¶ã€ãããªãéããããã©JavaScriptã§æ¬æ Œçãªã¢ããªã±ãŒã·ã§ã³ãæžãããšã¯ã§ããŸããã ããããã³ã³ãã€ã©ãããªãã®ããã«ãããè¡ãããšãã§ããŸãã
-ãªããã»ããªã¹ã2016
ããããŒã°
é ãããè¡ããŸãã 2013幎é ããçŸåšãŸã§ãç§ã¯èªåã®ä»äºã§RactiveJSãç©æ¥µçã«äœ¿çšããŠããŸãããããã»ã©äººæ°ã¯ãããŸãããããªã¢ã¯ãã£ãMVVMãã¬ãŒã ã¯ãŒã¯ãéçºããŠããŸãã ãã®ç¬éãRactiveãç»å Žãããšããããã¯éåžžã«é©æ°çã§ãç§ã®æèŠã§ã¯ãŸã æã䟿å©ãªAPIãæã£ãŠããããã«æããŸãã ãã ããä»ã®ããŒã«ãšåæ§ã«ãRactiveã«ã¯æ¬ ç¹ããããŸãã ç§ã«ãšã£ãŠã®äž»ãªæ¬ ç¹ã¯ããã®ãµã€ãºïŒæå°åããã200KbïŒã§ããã競åä»ç€Ÿãšæ¯ã¹ãŠäœæ¥é床ãããã»ã©é«ããªãããšã§ãã
æ¯èŒçæè¿ããµã€ãçšã®ããªãã€ã³ã¿ã©ã¯ãã£ããªãŠã£ãžã§ããïŒalaã³ãŒã«ããã¯ãŠã£ãžã§ããïŒãæžãããšãå¿ èŠã«ãªããŸããã ãŠã£ãžã§ããã®åºæ¬çãªèŠä»¶ã¯æ確ã§ãïŒå°ãéããçŽ æ©ãåäœããã¯ãã§ãã äžèšã§èª¬æããçæãèæ ®ãããšãRactiveãããã³ä»ã®ã»ãšãã©ã®JSãã¬ãŒã ã¯ãŒã¯ïŒVueã70Kb / Reactã150Kb /ãªã©ïŒã¯ããã®ã¿ã¹ã¯ã«ã¯ããŸãé©ããŠããŸããã ãã®ãããããæç¹ã§ããã¬ãŒã ã¯ãŒã¯ãã©ã€ãã©ãªããŸã£ãã䜿çšããã«ãããã©JSã§ãŠã£ãžã§ãããäœæãããšããèããããããŸããã ããããç§ã¯å¹žéã§ããã
éæ³ã®ããã«æ¶ããUIãã¬ãŒã ã¯ãŒã¯
ãã®ããã SvelteJSã¯ããã«ã段éïŒAoTïŒã§ããã©javascriptã§ã³ãŒããã³ã³ãã€ã«ããJSãã¬ãŒã ã¯ãŒã¯ã§ãã ããã«é¢é£ããŠããã¬ãŒã ã¯ãŒã¯èªäœã«é¢é£ãããªãŒããŒãããã¯å®å šã«ãªããªããŸãã ãã®äœæè ã§ããã¡ã€ã³ã®ã¡ã³ãããŒã§ããRich Harrisã¯ã Rollup ã Buble ã Roadtripãªã©ã®ã¯ãŒã«ãªäœåã®èè ã§ãããåãRactiveã§ããããŸãã 2016幎ãRichã¯Ractiveã®ã¢ã¯ãã£ããªäœæ¥ãåæ¢ããSvelteãéçºããããã«ä»ã®ã¡ã³ãããŒã«ä»»ããåã幎ã«åœŒã®æ°ããéçºã«é¢ãã玹ä»èšäºãæžããŸããã
Richã¯æ°ãããé è³ãã§ããã¬ãŒã ã¯ãŒã¯ã䜿çšããçç±ãåèããããšããŸããã ãªãäœçŸãäœåãããã€ãã®javascriptããŠãŒã¶ãŒã®ãã©ãŠã¶ãŒã«éä¿¡ããæºåãã§ããŠããã®ã§ããããããã€ãã£ãã³ãŒãã®æœè±¡åã«åºå·ããæ¬è³ªçã«ããã©ãŒãã³ã¹ãäœäžãããŸãã ãããåé¡ã ãšæããªãå Žåã¯ã Alex Russellã®ããã°ãã芧ãã ãããèå³æ·±ãèããäŸããããããããŸãã
ã ããããªããã¯ããã¬ãŒã ã¯ãŒã¯ã解決ããäž»ãªã¿ã¹ã¯ã¯ããã¬ãŒã ã¯ãŒã¯ã³ãŒãã«é床ã®è€éããå ããããšã«ãã£ãŠãããªãèªèº«ã®ã³ãŒãã®è€éããæžããããšã§ã¯ãªããããªãã®èããšåé¡ã解決ããæ¹æ³ãæ§ç¯ããããšã§ãããšããçµè«ã«éããŸããã ã€ãŸãããã¬ãŒã ã¯ãŒã¯èªäœã¯å¿ èŠãããŸããã ã³ã³ããŒãã³ããªã©ã®ããçš®ã®ã¢ãããŒãã«ãã£ãŠå°ããããã¢ããªã±ãŒã·ã§ã³ãèšè¿°ããæ¹æ³ã®ã¿ãå¿ èŠã§ãã ãããŠããã®ããã®äŸ¿å©ãªAPIãå¿ èŠã§ãã ã§ã¯ããã¬ãŒã ã¯ãŒã¯ãã¢ããªã±ãŒã·ã§ã³ã³ãŒãèªäœã§ã¯ãªããã³ãŒããèšè¿°ããããã®åãªãæ段ã§ãããšãããã©ãã§ããããã
Svelteã説æãããã¿ã¹ã¯ã«çæ³çã«é©ããŠããã®ã¯ãªãã§ããïŒ
ReactãVueããŸãã¯Ractiveã§èšè¿°ãããšãã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒããšãã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒãã®ããŒã¹ãšãªã£ãŠãããã¬ãŒã ã¯ãŒã¯èªäœã®ã³ãŒããåŸãããŸããããããªããšããã®ã³ãŒãã¯å éšçã«æ©èœããŸããã åèšã§ããã¬ãŒã ã¯ãŒã¯ã³ãŒãïŒå¹³å100kbïŒ+ã¢ããªã±ãŒã·ã§ã³ã¿ã¹ã¯ãå®éã«è§£æ±ºããã¢ããªã±ãŒã·ã§ã³ã³ãŒãããããŸãã ãã ããSvelteã§èšè¿°ããå ŽåãSvelteã¯äž»ã«Svelte APIã䜿çšããŠèšè¿°ãããã³ãŒãããããã©JSãäœæããã³ã³ãã€ã©ã§ãããããã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒããããããŸããã ã³ã³ãã€ã«ãããã³ãŒãã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã¿ã¹ã¯ã®ã¿ã解決ãããªãŒããŒãããã¯ãããŸããã ãããã£ãŠãJSãã³ãã«ã®éãã¯ãã¢ããªã±ãŒã·ã§ã³èªäœã®ã³ãŒããšãŸã£ããåãã§ãã
次ã«ãSvelteã¯é«éã§ãã å®éãJavascriptèªäœãšåããããé«éã§ãã ããã¯æããã§ããSvelteã¯ãæžãå¿ èŠã®ãªãããã©ã®javascriptã§ããããã§ãã
èŠããã«ãSvelteã¯ããã©JSãæžãããšãªãããã©JSãæžãããã®ããŒã«ã§ãã ããã«ãã®ãããªããŒãããžãŒããããŸãã ïŒïŒïŒïŒïŒ
åªããæ©èœ
ãã®ãããäžèŠããã¹ãŠãçŸå³ãããã«èãããŸãããããèŠãå¿ èŠããããŸãã ç°¡åã«ïŒ
Svelteã¯ãããããç§ãæžãããã¹ãŠã®ãã¬ãŒã ã¯ãŒã¯ã®äžã§æãç©ãããªåŠç¿æ²ç·ãæã£ãŠããŸãã ç§ã®å ŽåãSvelte APIã¯Ractive APIãšã»ãšãã©åãã§ãããRactiveãããæŽç·ŽãããŠããããšãé€ããŠããã¬ãŒãã³ã°ããå¿ èŠãããŸããã§ããã ãã ããSvelteã¯ããã»ã©é ããŠãããããã®æŠåšåº«ã«ããã€ãã®ã¯ãŒã«ãªæ©èœããããŸããããã«ã€ããŠã¯ã以äžã§èª¬æããŸãã
ãã¹ãŠã®Svelteã®ããã¥ã¡ã³ãã¯æåéã1 ããŒãž ïŒ15åéã®èªã¿åãïŒã«ãããã€ã³ã¿ã©ã¯ãã£ããªã³ãŒãäŸïŒ 7GUIãå«ãïŒãåããããã«äœ¿çšã§ããREPLããããŸãã
Svelteã¢ããªã±ãŒã·ã§ã³ã®åºç€ã¯ã³ã³ããŒãã³ãã§ãïŒé©ãïŒã èŠãç®ãšæžãæ¹ã§ã¯ãsvelteã³ã³ããŒãã³ãã¯VueãŸãã¯Riotã¿ã°ã® åäžãã¡ã€ã«ã³ã³ããŒãã³ããšéåžžã«ãã䌌ãŠãããå®éã Ractiveã§ãã£ãŠããã»ãšãã©ãã¹ãŠã®ãã¬ãŒã ã¯ãŒã¯ã§é·ãé䜿çšãããŠãããã®ã«äŒŒãŠããŸãã éåžžããã®çµæžã¯ãã¹ãŠWebpackãŸãã¯Rollupã®ããŒããŒã«åºã¥ããŠããŸãã Svelteã«ãåã話ããããŸããsvelte-loaderãšrollup-plugin-svelteããããŸãã svelte-cliã䜿çšããŠããã€ã§ãã³ã³ããŒãã³ããçŽç²ãªJSã«ã³ã³ãã€ã«ããããšãã§ããŸãã
ãããã£ãŠãSvelteã³ã³ããŒãã³ãã¯ã次ã®æ§é ãæã€ããšãã§ããåãªãhtmlãã¡ã€ã«ã§ãã
<!-- html --> <h1>Hello {{name}}!</h1> <!-- component scoped --> <style> h1 { color: red; } </style> <!-- , ES6 --> <script> export default { }; </script>
ã©ã®èŠçŽ ãå¿ èŠãããŸããã ãããã£ãŠãã¹ã¯ãªããã¿ã°ããŸã£ãã䜿çšããã«ãåçŽãªã¹ããããŒã³ã³ããŒãã³ãã次ã®ããã«èšè¿°ã§ããŸãã
<!-- stepper.html --> <button on:click="set({ count: count - 1 })">-</button> <input bind:value="count" readonly /> <button on:click="set({ count: count + 1 })">+</button>
Svelteèªäœã¯éåžžã«ãããã«ã§ãã ãã ããåæã«ãå®éã«ã¯Webã¢ããªã±ãŒã·ã§ã³ã®éçºã«å¿ èŠãªãã¹ãŠãå«ãŸããŠããŸãã
ã³ã³ããŒãã³ããšæ§æ
ã³ã³ããŒãã³ãã®åœä»€åã€ã³ã¹ã¿ã³ã¹åã¯æ¬¡ã®ããã«ãªããŸãã
import MyComponent from './MyComponent.html'; const component = new MyComponent({ target: document.querySelector( 'main' ), data: {} });
åœç¶ãã³ã³ããŒãã³ãã®æ§æãšå±æ§ãä»ããå€ã®è»¢éããããŸãã
<div class='widget-container'> <Widget foo="static" bar="{{dynamic}}" /> </div> <script> import Widget from './Widget.html'; export default { data () { return { dynamic: 'this can change' } }, components: { Widget } }; </script>
ã¹ãããã䜿çšããããŒã¯ã¢ããã€ã³ãžã§ã¯ã·ã§ã³ããããŸãïŒhi VueïŒïŒ
// Box component <div class='box'> <slot><!-- content is injected here --></slot> </div> // parent component <Box> <h2>Hello!</h2> <p>This is a box. It can contain anything.</p> </Box>
ããŒã¿ãšèšç®ãããå°éå ·
Svelteã³ã³ããŒãã³ãã«ã¯å éšç¶æ ããããããã¯ãdataãããããã£ã§èª¬æãããPOJOãªããžã§ã¯ãã§ãªããã°ãªããŸããã RactiveãVueãšåæ§ã«ãSvelteã³ã³ããŒãã³ãã¯ä»ã®ãªã¢ã¯ãã£ãããŒã¿ã«å¿ããŠå°éå ·ãèšç®ã§ããŸãã
<p> The time is <strong>{{hours}}:{{minutes}}:{{seconds}}</strong> </p> <script> export default { data () { return { time: new Date() }; }, computed: { hours: time => time.getHours(), minutes: time => time.getMinutes(), seconds: time => time.getSeconds() } }; </script>
Svelteã§èšç®ãããããããã£ã®å¯äžã®ãã€ãã¹ã¯ããããã®ã»ãã¿ãŒãèšå®ã§ããªãããšã§ãã èšç®ãããããããã£ã¯ãå€ãååŸãããšãã«ã®ã¿æ©èœããŸãã
ç¶æ ãæäœããããã«ãSvelteã³ã³ããŒãã³ãã®ã€ã³ã¹ã¿ã³ã¹ã«ã¯çµã¿èŸŒã¿ã¡ãœããããããŸãã
component.set({ time: new Date() }); component.get('time');
setïŒïŒã¡ãœããã䜿çšããŠã³ã³ããŒãã³ãããŒã¿ãå€æŽãããšãå€æŽã¯ãã¹ãŠã®äŸåããèšç®ãããããããã£ãšDOMã«äºåŸçã«é©çšãããŸãã
ãªãã¶ãŒããŒãšã©ã€ããµã€ã¯ã«ããã¯
å ã»ã©èšã£ãããã« ã Svelteã¯æå°éã§ããããã oncreateãšondestroyã® 2ã€ã®ã©ã€ããµã€ã¯ã«ããã¯ã®ã¿ãæäŸããŸãã ããŒã¿ã®å€æŽã¯ããªãã¶ãŒããŒã®å©ããåããŠè¿œè·¡ã§ããŸãã
<script> export default { oncreate () { const observer = this.observe('foo', (newVal, oldVal) => {}); this.on('destroy', () => observer.cancel()); } }; </script>
ã€ãã³ã
Svelteã«ã¯ããããã·ã€ãã³ãïŒDOMã€ãã³ããããã·ïŒãšã«ã¹ã¿ã ã€ãã³ãïŒã«ã¹ã¿ã ã€ãã³ãïŒã®å®å šãªã·ã¹ãã ããããã³ã³ããŒãã³ãã«ãé©çšã§ããŸãã
<!-- CategoryChooser.html --> <p>Select a category:</p> {{#each categories as category}} <button on:click="fire('select', { category })">select {{category}}</button> {{/each}} <script> export default { data() { return { categories: [ 'animal', 'vegetable', 'mineral' ] } } }; <!-- parent component --> <CategoryChooser on:select="doSomething(event.category)"/> </script>
ããã§ã¯ããã¿ã³ã®ã¯ãªãã¯ããµãã¹ã¯ã©ã€ãããDOMã¯ãªãã¯ã€ãã³ãããonselectãã³ã³ããŒãã³ãã®ã«ã¹ã¿ã ã€ãã³ãã«å€æããŸãã ããã«ã芪ã³ã³ããŒãã³ãã¯ããã®ã³ã³ããŒãã³ãã®onselectã€ãã³ãããµãã¹ã¯ã©ã€ãã§ããŸãã ã€ãŸããã«ã¹ã¿ã ã€ãã³ãã¯ãããªã³ã°ã®æ¹æ³ãç¥ã£ãŠããŸãã ãã¹ãŠããã€ãéãã§ããïŒïŒïŒ
ã€ãã³ãAPIãæå°éã§ãã
const listener = component.on( 'thingHappened', event => { console.log( `A thing happened: ${event.thing}` ); }); // some time later.. listener.cancel(); component.fire( 'thingHappened', { thing: 'this event was fired' });
ãã³ãã¬ãŒããšãã£ã¬ã¯ãã£ã
Svelteãã³ãã¬ãŒãã®æ§æã¯ãå£ã²ããã«éåžžã«äŒŒãŠããŸãããå®éã«ã¯ããã§ã¯ãããŸããã
<!-- , --> <h1 style="color: {{color}};">{{color}}</h1> <p hidden="{{hideParagraph}}">You can hide this paragraph.</p> <!-- --> {{#if user.loggedIn}} <a href='/logout'>log out</a> {{else}} <a href='/login'>log in</a> {{/if}} <!-- --> <ul> {{#each list as item}} <li>{{item.title}}</li> {{/each}} </ul>
ïŒå°ãªããšãä»ã®ãšããïŒSvelteã«ã¯ã«ã¹ã¿ã ãã£ã¬ã¯ãã£ãã¯ãããŸããããããã«äœ¿çšã§ããããã€ãã®ã¿ã€ãã®ãã£ã¬ã¯ãã£ãããããŸãã
<!-- Event handlers --> <button on:click="set({ count: count + 1 })">+1</button> <!-- Two-way binding --> <input bind:value="count" /> <!-- Refs (like Vue) --> <canvas ref:canvas width="200" height="200"></canvas> <!-- Transitions --> <div transition:fly="{y:20}">hello!</div>
ã«ã¹ã¿ã ãã£ã¬ã¯ãã£ãããŸã£ãã衚瀺ããããã©ããã¯ããããŸããã ããã§ãããã®ãAngularJSã¹ã¿ã€ã«ãã®ã¢ãããŒãã¯åŸã ã«æ代é ãã«ãªã£ãŠããããã§ãã
ã«ã¹ã¿ã ã¡ãœãããšãã«ããŒ
ãã³ãã¬ãŒãã®ã³ã³ããŒãã³ãã€ã³ã¹ã¿ã³ã¹ã¡ãœãããšãã«ããŒé¢æ°ã¯ã次ã®ããã«å®çŸ©ã§ããŸãã
<script> export default { helpers: { toUppeCase: (str) => {} }, methods: { toast: (msg) => {} } }; </script>
ãã©ã°ã€ã³
ã©ãããSvelteã«ã¯ããã©ã°ã€ã³ã·ã¹ãã ã«ããã€ãã®éçºããããŸãã 確ãã«ãããã¥ã¡ã³ãã¯ããã«ã€ããŠãŸã æ²é»ããŠããŸãã åããã©ã³ãžã·ã§ã³ãåå¥ã®ã¢ãžã¥ãŒã«ãšããŠå®è£ ãããåå¥ã®svelte-transitionsããã±ãŒãžã«çµã¿èŸŒãŸããŸãã ãã¡ãããç¬èªã®ãã©ã³ãžã·ã§ã³ãäœæã§ããŸãã
ã³ã³ããŒãã³ãã€ã³ã¹ã¿ã³ã¹çšã®è¿œå ã¡ãœããïŒ svelte-extras ïŒãåããåå¥ã®ããã±ãŒãžããããåå¥ã«ããŒãããŠãSvelte APIãåãRactiveã«è¿œå ã§ããŸãã
ractive.set('list.3.name', 'Rich'); // set() svelte.setDeep('list.3.name', 'Rich');
äžè¬ã«ããã©ã°ã€ã³ã·ã¹ãã ã¯ãŸã ããŸãéçºãããŠããªããããããã«ããŠãããã¥ã¡ã³ãã«èšèŒãããŠããŸãã åŸ ã£ãŠããŸãã
SSR
ãµãŒããŒåŽã®ã¬ã³ããªã³ã°ã䜿çšã§ããŸãããåãRactiveãšæ¯èŒãããšéåžžã«å¥åŠã«åäœããŸãïŒ
// Ractive const html = ractive.toHTML(); // Svelte require( 'svelte/ssr/register' ); const html = svelte.render( data ); // css const styles = svelte.renderCss();
ç¶æ 管ç
Svelteã«ã¯ç¬èªã®ã¹ãã¬ãŒãžã¡ã«ããºã ã®è§£éããããäžæ¹ã§Redux / Vuexãšããã€ãã®é¡äŒŒç¹ããããŸãããããã«å€ãã®éãããããŸãã ããã¥ã¡ã³ãã§è©³çŽ°ãèªãããšãã§ããŸãããäž»ãªéãã¯ãSvelte Storeã¯ç¶æ ãå€æŽããã¡ã«ããºã ïŒå ç«ãäžæ¹åã®ããŒã¿ãããŒãªã©ïŒã§ã¯ãªããã³ã³ããŒãã³ãéã®ç¶æ ãå ±æïŒå ±æïŒããã¡ã«ããºã ã«çŠç¹ãåœãŠãŠããããšã§ãã ããšãã°ãæäžäœã³ã³ããŒãã³ãã§ãããŒã¿ãã®ä»£ããã«ãã¹ãã¢ãã䜿çšãããšããã¹ãŠã®åã³ã³ããŒãã³ãã§ã¹ãã¬ãŒãžããŒã¿ãèªåçã«å©çšå¯èœã«ãªããŸãã æ£çŽãªãšãããç§ã¯ãŸã ãã®ã¡ã«ããºã ã䜿çšããæ©äŒããããŸããã§ããããç解ããŠããéããããã¯ã¢ããªã±ãŒã·ã§ã³å šäœã§ã¯ãªããã³ã³ããŒãã³ãã®åãéå±€å ã®ã°ããŒãã«ãªç¶æ ã®ãããªãã®ã§ãã
ãŸããSvelte Storeã«ã¯ã¢ã¯ã·ã§ã³ãšã³ãããã¯ãããŸããã ãã ãããã®ãããªã¢ã¯ã»ã¹å¶åŸ¡ã¡ã«ããºã ãå¿ èŠãªå Žåã¯ãStoreã¯ã©ã¹ãæ¡åŒµããŠãã®ãããªããžãã¯ãå®è£ ã§ããŸãã
ããŒãã¹
äžèšã§ã¯ãSvelteã®äž»ãªæ©èœã«ã€ããŠç°¡åã«èª¬æããŸããã ãã®ããããªãºã ãšãå®éã«çµã¿èŸŒãŸãããããªãŒã·ã§ãŒãã³ã°ãïŒå®éã«äœ¿çšããããã®ã®ã¿ãåžžã«ã³ã³ãã€ã«ãããïŒãèãããšãSvelteã®æ©èœã¯ããã»ã©æªãã¯ãããŸããã
ãã ããç¹å¥ãªæ³šæãæãå¿ èŠãããã¯ãŒã«ãªãã®ãããã€ããããŸãã
éåæãµããŒã
ç§ã®ãæ°ã«å ¥ãã§ãããçŽæã«åºã¥ãéåæå€ã®ãã€ãã£ããµããŒãããå§ããŸãã 次ã®ããã«ãªããŸãã
{{#await promise}} <p>loading...</p> {{then data}} <p>got data: {{data.value}}</p> {{catch err}} <p>whoops! {{err.message}}</p> {{/await}}
ããã¯é©ãã»ã©äººçãç°¡çŽ åããŸãã Ractiveã§ãåæ§ã®ããšãã§ããŸããããã®ããã«ã¯ç¹å¥ãªPromise-adapterã䜿çšããå¿ èŠããããŸãã Svelteã¯ãã®ãŸãŸäœ¿çšã§ããŸãã
åå空é
ç§ãä»ã®ã©ãã«ãèŠãããšããªãããš-åå空éã®å©ããåããŠãã³ã³ããŒãã³ãã®ã¹ã³ãŒãã決å®ã§ããŸãã ããšãã°ãã³ã³ããŒãã³ããsvgã¿ã°å ã§ã®ã¿äœ¿çšã§ããå Žåããããæå®ã§ããŸãã
<g transform='translate({{x}},{{y}}) scale({{size / 366.5}})'> <circle r="336.5" fill="{{fill}}"/> <path d="m-41.5 298.5c-121-21-194-115-212-233v-8l-25-1-1-18h481c6 13 10 27 13 41 13 94-38 146-114 193-45 23-93 29-142 26z"/> </g> <script> export default { namespace: 'svg' }; </script>
èå³æ·±ãæ©äŒã§ãã ãããã©ãã»ã©åœ¹ç«ã€ãã¯ãŸã æããã§ã¯ãããŸãããã確å®ã«èŠèŸŒã¿ããããŸãã
<ïŒSelf>ã¿ã°
ãŸããçããæ©èœã¯ãã³ã³ããŒãã³ããååž°çã«å«ããããšã§ãïŒ
{{#if countdown > 0}} <p>{{countdown}}</p> <:Self countdown='{{countdown - 1}}'/> {{else}} <p>liftoff!</p> {{/if}}
ã«ãŠã³ãããŠã³ã«ãŠã³ã¿ãŒã®äºæ³å€ã®å®è£ ã§ã¯ãããŸãããã ïŒïŒïŒ
<ïŒWindow>ã¿ã°
éåžžã«çãããæ©èœã§ãããä»ã®ã©ãã«ãäŒã£ãããšã¯ãããŸããã ãã®ã¿ã€ãã®ã¿ã°ã䜿çšãããšããŠã£ã³ããŠã§å®£èšçã«ã€ãã³ãããã³ã°ãããããšãã§ããŸãã
<:Window on:keydown='set({ key: event.key, keyCode: event.keyCode })'/>
ãµãããŒ
æšæ¥ããã®ãããžã§ã¯ãã«ã€ããŠåŠã³ãŸããã ãã®ãããžã§ã¯ãã¯ã¢ã€ãã¢ã®æŠèŠã«ãããŸããããRichã¯Next.js / Nuxt.jsã®é¡äŒŒç©ã®ãããªããšãããããã§ãã ãã¹ãŠãããŸãããã°ãã¢ããã°ã¯ãªããã®åºæã®çšåºŠã®åæ§ã§äœããããšç¢ºä¿¡ããŠããŸãã
ãšãããŒã°
æåŸãŸã§èªãã§ããããã¹ãŠã®äººã«æè¬ããŸãã 圌ããèšãããã«ãç§ã®ãã£ã³ãã«ã奜ãã§è³ŒèªããŠãã ããããããŠãã©ãŒã¹ãããªããšäžç·ã«æ¥ããããããŸããïŒ
çå£ã«ãç§ã¯ã¹ãã«ãã®ãããªèå³æ·±ãçŸè±¡ãäžè¬çãªçšèªã§æŠèª¬ã§ãããšæããŸãã ç§ããã¯ã2ã€ã®ãããžã§ã¯ãã§ã®Svelteã®äœ¿çšãå®å šã«ææãäžãããšä»ãå ããããšãã§ããŸãã å人çã«ã¯ãRactiveã®æ©èœã®è±ããã«å°ãæ¬ ããŠããŸãããSvelteã®ä»äºã®åçãšåæ§ã«ãããããªãºã ã¯ãããããã«äœ¿ãããã«ç§ãã¡ã倧ãã«è³briããŸãã çŸåšãç§ã¯åœŒãæ°ãããããªã倧ããªãããžã§ã¯ãã«åå ããããšãçå£ã«èããŠããŸãããããŠæéãçµã€ã«ã€ããŠãRactiveããSvelteã«å®å šã«ç§»è¡ããããšãå¯èœã«ãªããŸãã
SvelteãçºèŠããŠãã ããã é 匵ã£ãŠ
æŽæ°ïŒ
è¿œå ããŠãããserjogaã«æè¬ããŸãã StencilJSã¯ã Svelteãšåããã¹ããã©ã£ãŠããããã§ãããããè€éãªãAngular2ã¹ã¿ã€ã«ãã®æ§æãšJSXãããããŸããã
æŽæ°2ïŒ
Svelteã«èå³ãããããã®éçºããã©ããŒãããæ¹-ãã·ã¢èªã®é»å ±ãã£ãã«SvelteJSãžãããã ã ãããããé¡ãããŸãïŒ