ããªãå¥åŠã§ããããããŸã§ã®ãšãããå°ãªããšãããã«ã€ããŠéåžžã«èå³æ·±ãéçºããŒã«ã«é¢ããHabréã«é¢ããèšäºã¯ãããŸããã§ããã ãããããããã¯ããã®ãã¬ãŒã ã¯ãŒã¯ãéåžžã«æ°ãããšããäºå®ãšããã®åºç€ãšãªãã¢ã€ãã¢ã«ãããã®ã§ãã ãããã¯ãéèŠãªã®ã¯ããããã°3ãããã³ããšã³ãã«ãŸã€ããæ°žç¶çãªèªå€§åºåã«ããã代æ¿ãœãªã¥ãŒã·ã§ã³ã®æŠèŠãéããããšã§ãã 確ãã§ã¯ãããŸãããããã®èšäºã§ã¯ãã®èª€ç®ãä¿®æ£ããããšããŸãã åãæ¿ããªãã§ãã ããã
è€éãªå£ã«ã¶ã€ãããªãéããããã©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ãã¡ã€ã«ã§ãã
<h1>Hello {{name}}!</h1> <style> h1 { color: red; } </style> <script> export default { }; </script>
ã©ã®èŠçŽ ãå¿
èŠãããŸããã ãããã£ãŠãã¹ã¯ãªããã¿ã°ããŸã£ãã䜿çšããã«ãåçŽãªã¹ããããŒã³ã³ããŒãã³ãã次ã®ããã«èšè¿°ã§ããŸãã
<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></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ã€ãã³ããããã·ïŒãšã«ã¹ã¿ã ã€ãã³ãïŒã«ã¹ã¿ã ã€ãã³ãïŒã®å®å
šãªã·ã¹ãã ããããã³ã³ããŒãã³ãã«ãé©çšã§ããŸãã
<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' ] } } }; <CategoryChooser on:select="doSomething(event.category)"/> </script>
ããã§ã¯ããã¿ã³ã®ã¯ãªãã¯ããµãã¹ã¯ã©ã€ãããDOMã¯ãªãã¯ã€ãã³ãããonselectãã³ã³ããŒãã³ãã®ã«ã¹ã¿ã ã€ãã³ãã«å€æããŸãã ããã«ã芪ã³ã³ããŒãã³ãã¯ããã®ã³ã³ããŒãã³ãã®onselectã€ãã³ãããµãã¹ã¯ã©ã€ãã§ããŸãã ã€ãŸããã«ã¹ã¿ã ã€ãã³ãã¯ãããªã³ã°ã®æ¹æ³ãç¥ã£ãŠããŸãã ãã¹ãŠããã€ãéãã§ããïŒïŒïŒ
ã€ãã³ãAPIãæå°éã§ãã
const listener = component.on( 'thingHappened', event => { console.log( `A thing happened: ${event.thing}` ); });
ãã³ãã¬ãŒããšãã£ã¬ã¯ãã£ã
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ã«ã¯ã«ã¹ã¿ã ãã£ã¬ã¯ãã£ãã¯ãããŸããããããã«äœ¿çšã§ããããã€ãã®ã¿ã€ãã®ãã£ã¬ã¯ãã£ãããããŸãã
<button on:click="set({ count: count + 1 })">+1</button> <input bind:value="count" /> <canvas ref:canvas width="200" height="200"></canvas> <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');
äžè¬ã«ããã©ã°ã€ã³ã·ã¹ãã ã¯ãŸã ããŸãéçºãããŠããªããããããã«ããŠãããã¥ã¡ã³ãã«èšèŒãããŠããŸãã åŸ
ã£ãŠããŸãã
SSR
ãµãŒããŒåŽã®ã¬ã³ããªã³ã°ã䜿çšã§ããŸãããåãRactiveãšæ¯èŒãããšéåžžã«å¥åŠã«åäœããŸãïŒ
ç¶æ
管ç
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ãžãããã ã ãããããé¡ãããŸãïŒ