Riot 2 からのマイグレーション
はじめに
Riot 3は以前のリリースで見つかったイシューについての大きな改善です。詳細についてはリリースノートを確認してください。
いろいろな問題を解決しましたが、以前のコードベースでは修正できなかったため、新しいメジャーバージョンのリリースを必要としました。ですが、Riot 2からのマイグレーションは簡単であるべきです。以下に、知っておくべき主な互換性のない変更(breaking change)を挙げておきます。
互換性のない変更
riot-tag
の廃止
属性riot-tag
は廃止されて、data-is
に変わります。
<!-- not supported -->
<div riot-tag="my-tag"></div>
<!-- good -->
<div data-is="my-tag"></div>
なお、data-is
はネストしたタグでも使え、動的なテンプレート変数(expression)にも対応しました。
<my-tag>
<div data-is={ subComponent }></div>
<script>
this.subComponent = 'child-tag'
</script>
</my-tag>
name
とid
によるDOM参照の廃止
もう、name
とid
属性から、自動的にDOMへの参照を作成することはありません。
代わりにref
属性を使用してください。
Warning: refs
オブジェクトは mount
イベント の発火後でなければ設定されません 。
<my-tag>
<p ref="paragraph">Hello</p>
<script>
console.log(this.refs.paragraph) // => p node
</script>
</my-tag>
オブジェクトループ
オブジェクトのループの文法が変わります。以前はkey, value in object
でしたが、value, key in object
に変更されます。
関連イシューはこちら
riot.route
をコアから削除
riot.route
はRiotのコアから削除されました。今後はニーズに合ったルータを好きに組み合わせて使えます。
riot-route
の開発は今後も続きます。スタンドアローンのライブラリとして、Riotとあるいは別のライブラリと合わせて使うことができるでしょう。
mount
の前にupdate
とupdated
イベントは起きない
以前のRiotではupdate
とupdated
イベントがmount
イベントの前にトリガーされていました。
今後、タグをマウント前に調整したい場合は、before-mount
かmount
イベントが使えます。update
とupdated
イベントはタグのアップデートを実行した時のみに、発生します。
自動preventDefault
の廃止
Riotはタグで発生するイベントで、自動的にevent.preventDefault()
を実行していましたが、この挙動は適切でないと判断し、廃止することにしました。
<my-tag>
<form onsubmit={ ajaxSubmit }>
<input>
</form>
<script>
ajaxSubmit(event) {
// in riot2 this was not needed
event.preventDefault()
}
</script>
</my-tag>
子タグで発生したイベントで、親タグをアップデートしない
Riot 2では、イベントがループ内の子カスタムタグで発生すると、親タグでもイベントがトリガーされていました riot/1319。Riot 3でイベントがループ内の子カスタムタグから親タグのアップデートをしたい場合は、明示的にする必要があります。
イベント名の複数指定できない (riot.observable
)
riot.observable
を以前のバージョンから6倍高速にしましたが、このパフォーマンス改善のため、スペース区切りでイベント名を複数指定する機能を削除する必要がありました。
var el = riot.observable()
// not supported
el.on('start stop', function() { /* */ })
el.trigger('start stop')
// use this instead
function cb() {}
el
.on('start', cb)
.on('stop', cb)
el
.trigger('start')
.trigger('stop')
jQueryのDOMイベントとは非互換に
Riot 2では、jQueryを使い$('.my-element').trigger('click')
といった方法で、Riotのイベントハンドラをトリガできました。Riot 2は古い形式のDOMイベントモデル(レベル2)を採用しており、これがjQueryのイベントAPIと完全互換だったため、こうしたことが可能だったのです。しかし、Riot 3ではを内部イベントハンドラを今後の標準となる(そしてjQueryのDOMイベントAPIがサポートしていない)新しい形式のDOMイベントモデル(レベル3)へと刷新しました。これによって、ダミーのイベントのシミュレートには(今までのやり方ではなく)別の方法を使わなければならなくなりました。この件については、こちらのイシュー(英語)をご確認ください。
Scoped CSSがデフォルトに
Riot 3では、全てのCSSはデフォルトで「scoped」になります。もう、<style>
要素にscoped
属性をいちいち追加する必要はありません。
babel
5.8にはもう対応しない
es6
パーサーは最新版のbabel
を使います (詳しくはこちら)。どうしても古いバージョンのbabel
を使いたい場合、es6
用のパーサを独自設定することは可能です。
なお、babel
だけでなく、bublé
にも対応しました。
テンプレートエラーの出力
Riot 2では、タグ内のテンプレートのエラーをキャッチするためには自分で関数をセットする必要がありました。Riot 3では、タグ内の全てのテンプレートエラーはconsole.error
から出力されます。(console
APIが利用可能な場合)