Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Riot.jsでSPAを作る

khdd-mks
December 13, 2018

 Riot.jsでSPAを作る

Riot.jsの基礎とRiot.jsでSPAを作るときの基礎です

khdd-mks

December 13, 2018
Tweet

More Decks by khdd-mks

Other Decks in Programming

Transcript

  1. 自己紹介 ・北島久資 (@khdd-mks) ・オープンストリーム所属 アーキテクト ・ fun-tech 運営 ・ Scala

    が好きですが 仕事では Golang, Python, javascript とかやってます …
  2. Riot.js ・ Web 上の UI コンポーネントを作るためのライブラリ ・要するに React.js や Vue.js

    と同じような領域のライブラリ ・ React.js や Vue.js よりも軽量でシンプルなのが特徴
  3. 基本 1. カスタムタグファイルを作る 2. HTML で Riot.js のスクリプトを読み込む ( コンパイラ含む

    ) 3. HTML 内にカスタムタグのマウント場所を用意する 4. HTML でカスタムタグファイルを読み込み、マウントする
  4. 基本 1. カスタムタグファイルを作る 2. HTML で Riot.js のスクリプトを読み込む ( コンパイラ含む

    ) 3. HTML 内にカスタムタグのマウント場所を用意する 4. HTML でカスタムタグファイルを読み込み、マウントする
  5. <todo> <h3>{ opts.title }</h3> <ul> <li each={ item, i in

    items }>{ item }</li> </ul> <form onsubmit={ add }> <input ref="input"> <button>Add #{ items.length + 1 }</button> </form> <!-- 本当はこの辺りにcss(<style>~</style>)を指定 --> <script> this.items = [] add(e) { e.preventDefault() var input = this.refs.input this.items.push(input.value) input.value = '' } </script> </todo>
  6. <todo> <h3>{ opts.title }</h3> <ul> <li each={ item, i in

    items }>{ item }</li> </ul> <form onsubmit={ add }> <input ref="input"> <button>Add #{ items.length + 1 }</button> </form> <!-- 本当はこの辺りにcss(<style>~</style>)を指定 --> <script> this.items = [] add(e) { e.preventDefault() var input = this.refs.input this.items.push(input.value) input.value = '' } </script> </todo> 全体をカスタムタグ名で囲む
  7. <todo> <h3>{ opts.title }</h3> <ul> <li each={ item, i in

    items }>{ item }</li> </ul> <form onsubmit={ add }> <input ref="input"> <button>Add #{ items.length + 1 }</button> </form> <!-- 本当はこの辺りにcss(<style>~</style>)を指定 --> <script> this.items = [] add(e) { e.preventDefault() var input = this.refs.input this.items.push(input.value) input.value = '' } </script> </todo> HTMLを記述する 変数の埋め込みとかあるけど 何となく分かる感じ
  8. <todo> <h3>{ opts.title }</h3> <ul> <li each={ item, i in

    items }>{ item }</li> </ul> <form onsubmit={ add }> <input ref="input"> <button>Add #{ items.length + 1 }</button> </form> <!-- 本当はこの辺りにcss(<style>~</style>)を指定 --> <script> this.items = [] add(e) { e.preventDefault() var input = this.refs.input this.items.push(input.value) input.value = '' } </script> </todo> CSSを記述する 普通に <style> h3 { font-size: 14px; } </style> みたいな感じで記述
  9. <todo> <h3>{ opts.title }</h3> <ul> <li each={ item, i in

    items }>{ item }</li> </ul> <form onsubmit={ add }> <input ref="input"> <button>Add #{ items.length + 1 }</button> </form> <!-- 本当はこの辺りにcss(<style>~</style>)を指定 --> <script> this.items = [] add(e) { e.preventDefault() var input = this.refs.input this.items.push(input.value) input.value = '' } </script> </todo> 処理を記述する thisでカスタムタグ自身にアクセスできる メソッドを定義してHTML側のイベントハンドラ に指定する等が可能
  10. <todo> <h3>{ opts.title }</h3> <ul> <li each={ item, i in

    items }>{ item }</li> </ul> <form onsubmit={ add }> <input ref="input"> <button>Add #{ items.length + 1 }</button> </form> <!-- 本当はこの辺りにcss(<style>~</style>)を指定 --> <script> this.items = [] add(e) { e.preventDefault() var input = this.refs.input this.items.push(input.value) input.value = '' } </script> </todo> カスタムタグに関する内容が 全て同じ場所に記述されているので 分かりやすい
  11. 基本 1. カスタムタグファイルを作る 2. HTML で Riot.js のスクリプトを読み込む ( コンパイラ含む

    ) 3. HTML 内にカスタムタグのマウント場所を用意する 4. HTML でカスタムタグファイルを読み込み、マウントする
  12. <html> <head> <title>Hello Riot.</title> </head> <body> <todo></todo> <script type="riot/tag" src="todo.tag"></script>

    <script src="https://cdn.jsdelivr.net/npm/[email protected]/riot+compiler.min.js"></script> <script>riot.mount('todo')</script> </body> </html>
  13. <html> <head> <title>Hello Riot.</title> </head> <body> <todo></todo> <script type="riot/tag" src="todo.tag"></script>

    <script src="https://cdn.jsdelivr.net/npm/[email protected]/riot+compiler.min.js"></script> <script>riot.mount('todo')</script> </body> </html> コンパイラ付のRiot.js クライアント側でカスタムタグをjavascriptに変換して実行す る
  14. 基本 1. カスタムタグファイルを作る 2. HTML で Riot.js のスクリプトを読み込む ( コンパイラ含む

    ) 3. HTML 内にカスタムタグのマウント場所を用意する 4. HTML でカスタムタグファイルを読み込み、マウントする
  15. <html> <head> <title>Hello Riot.</title> </head> <body> <todo></todo> <script type="riot/tag" src="todo.tag"></script>

    <script src="https://cdn.jsdelivr.net/npm/[email protected]/riot+compiler.min.js"></script> <script>riot.mount('todo')</script> </body> </html> カスタムタグ名そのままのタグを用 意するのが簡単 マウント方法が若干変わるが divタグ等でも可能
  16. 基本 1. カスタムタグファイルを作る 2. HTML で Riot.js のスクリプトを読み込む ( コンパイラ含む

    ) 3. HTML 内にカスタムタグのマウント場所を用意する 4. HTML でカスタムタグファイルを読み込み、マウントする
  17. <html> <head> <title>Hello Riot.</title> </head> <body> <todo></todo> <script type="riot/tag" src="todo.tag"></script>

    <script src="https://cdn.jsdelivr.net/npm/[email protected]/riot+compiler.min.js"></script> <script>riot.mount('todo')</script> </body> </html> カスタムタグファイルは普通にスクリプト タグで読み込めばいい riot.mount(‘todo’) で <todo></todo>にtodoタグの内容が埋 め込まれる
  18. ビルドシステムを使用する場合 ・ webpack であれば riot-tag-loader 等の loader を使えば問題ない ・仮に他のビルドシステムを使用しており、そのビルドシステム用のものが 存在しなかったとしても

    $ riot --esm [カスタムタグのあるディレクトリ] [出力先のディレクトリ] でESモジュールに変換できるので、変換後のファイルを使用すればいい
  19. ビルドシステムを使用する場合 // エントリポイントのjavascriptファイル import riot from 'riot'; require('./tags/todo.tag'); riot.mount('todo'); Riot.jsは内部的に

    カスタムタグ名とその内容を対応付けて管理している (のでマウント時にカスタムタグ名しか指定していない) → ESモジュールに変換しても何もexportしないのでimportで はなくrequire
  20. 基本 1. カスタムタグファイルを作る 2. HTML で Riot.js のスクリプトを読み込む ( コンパイラ含む

    ) 3. HTML で Riot-Router のスクリプトを読み込む 4. HTML 内に各ページ用のカスタムタグのマウント場所を用意する 5. HTML でカスタムタグファイルを読み込むが、直接マウントしない 6. Riot-Route の設定を行い、ルーティングを開始する
  21. 基本 1. カスタムタグファイルを作る 2. HTML で Riot.js のスクリプトを読み込む ( コンパイラ含む

    ) 3. HTML で Riot-Router のスクリプトを読み込む 4. HTML 内に各ページ用のカスタムタグのマウント場所を用意する 5. HTML でカスタムタグファイルを読み込むが、直接マウントしない 6. Riot-Route の設定を行い、ルーティングを開始する
  22. import riot from 'riot'; import route from 'riot-route'; import todoRoute

    from './router/todo'; import todo2Route from './router/todo2'; import todo3Route from './router/todo3'; require('./tags/menu.tag'); riot.mount('menu'); route.base('/'); // ホスト名以下の部分を #hoge -> /hoge で表示するのに必要 const subRoutes = [todoRoute, todo2Route, todo3Route]; for (const subRoute of subRoutes) { subRoute('div#main'); } route('', () => { route('/todo'); }) route.start(true); 普通にnpm install --save riot-route
  23. 基本 1. カスタムタグファイルを作る 2. HTML で Riot.js のスクリプトを読み込む ( コンパイラ含む

    ) 3. HTML で Riot-Router のスクリプトを読み込む 4. HTML 内に各ページ用のカスタムタグのマウント場所を用意する 5. HTML でカスタムタグファイルを読み込むが、直接マウントしない 6. Riot-Route の設定を行い、ルーティングを開始する
  24. <html lang="ja"> <head> <meta charset="utf-8"> <title>Hello Riot.</title> <script src="js/app.js" defer></script>

    </head> <body> <menu></menu> <div id="main"></div> </body> </html> 複数のタグ(各ページ用のタグ)を マウントするため divタグで定義
  25. 基本 1. カスタムタグファイルを作る 2. HTML で Riot.js のスクリプトを読み込む ( コンパイラ含む

    ) 3. HTML で Riot-Router のスクリプトを読み込む 4. HTML 内に各ページ用のカスタムタグのマウント場所を用意する 5. HTML でカスタムタグファイルを読み込むが、直接マウントしない 6. Riot-Route の設定を行い、ルーティングを開始する
  26. import riot from 'riot'; import route from 'riot-route'; import todoRoute

    from './router/todo'; import todo2Route from './router/todo2'; import todo3Route from './router/todo3'; require('./tags/menu.tag'); riot.mount('menu'); route.base('/'); // ホスト名以下の部分を #hoge -> /hoge で表示するのに必要 const subRoutes = [todoRoute, todo2Route, todo3Route]; for (const subRoute of subRoutes) { subRoute('div#main'); } route('', () => { route('/todo'); }) route.start(true); // ./router/todo.js import riot from 'riot'; import route from 'riot-route'; require('../tags/todo.tag'); // 直接マウントはしない export default function(mainSelector) { const todoRoute = route.create(); todoRoute('/todo', () => { riot.mount(mainSelector, 'todo'); }); return todoRoute; }
  27. 基本 1. カスタムタグファイルを作る 2. HTML で Riot.js のスクリプトを読み込む ( コンパイラ含む

    ) 3. HTML で Riot-Router のスクリプトを読み込む 4. HTML 内に各ページ用のカスタムタグのマウント場所を用意する 5. HTML でカスタムタグファイルを読み込むが、直接マウントしない 6. Riot-Route の設定を行い、ルーティングを開始する
  28. import riot from 'riot'; import route from 'riot-route'; import todoRoute

    from './router/todo'; import todo2Route from './router/todo2'; import todo3Route from './router/todo3'; require('./tags/menu.tag'); riot.mount('menu'); route.base('/'); // ホスト名以下の部分を #hoge -> /hoge で表示するのに必要 const subRoutes = [todoRoute, todo2Route, todo3Route]; for (const subRoute of subRoutes) { subRoute('div#main'); } route('', () => { route('/todo'); }) route.start(true); // ./router/todo.js import riot from 'riot'; import route from 'riot-route'; require('../tags/todo.tag'); export default function(mainSelector) { const todoRoute = route.create(); todoRoute('/todo', () => { // URLが /todo のとき riot.mount(mainSelector, 'todo'); // div#main にtodoタグをマウント }); return todoRoute; }
  29. import riot from 'riot'; import route from 'riot-route'; import todoRoute

    from './router/todo'; import todo2Route from './router/todo2'; import todo3Route from './router/todo3'; require('./tags/menu.tag'); riot.mount('menu'); route.base('/'); // ホスト名以下の部分を #hoge -> /hoge で表示するのに必要 const subRoutes = [todoRoute, todo2Route, todo3Route]; for (const subRoute of subRoutes) { subRoute('div#main'); } route('', () => { route('/todo'); }) route.start(true); ルーティング開始