[JP] Svelteで天気確認アプリを作ってみましょう
--
Svelteはすごく簡単で軽いUIフレームワークと聞いたことがあります。それで簡単なプロジェクトを通じてsvelteを勉強してみようと思いました。
Change Log
- 2020.02.18 環境変数からAPIキーを獲得するように変更しました。
事前準備
node 12.13.1 バージョンを使用しました。
天気情報を取得するためにOpenWeatherMap API
を使うつもりです。下のサイトに会員登録して得られるAPIキーを覚えておいてください。
APIの使い方が詳しいない方はMDN web docs about Fetch APIを参考してください。
プロジェクトを始まる前に
僕は各セクションの一番最後にhash値を書いておくつもりです。セクションが終わった時のソースコードが必要な方は下記のコマンドを叩いてください。
テンプレート利用して新しいプロジェクト生成
Svelteは新しいプロジェクトを生成する時に使えるテンプレートを提供しています。たった1行のコマンドでテンプレートソースコードを使うことができます。
テンプレートコードを実行するとHello Worldが実行されます。確認してみたいという方々はプロジェクトのルートディレクトリーから下記のコマンドを実行し、ブラウザーからhttp://localhost:5000
にアクセスしてみてください。
hash value: be32f0e
簡単なアプリ設計
実際にコードを作成する前に簡単にアプリを設計してみましょう。ただ数行の設計があるとプロジェクトを進行する時にその方向性を失う可能性をなくすことができるので、設計するのは本当に重要だと思います。
- 都市名を入力するために使われる1つのinputフォームがあります。
- 天気カードを追加する時に使われる1つのbuttonがあります。
- 都市名、天気アイコン、現在気温が天気カードに表示されます
- 1.5秒以上天気カードをクリックしている場合、削除のためのUIが表示されます。
- Deleteを選択した場合、天気カードは削除されます。
下のイメージはアプリを作る前に簡単に描いてみたUI図です。
SASSプリプロセッサインストール
sassプリプロセッサではsvelte-preprocess-sassを使おうとしました。
このパッケージを使うため、/rollup.config.js
ファイルを修正する必要があります。
この修正を通じてscss文法がコンポーネントのスタイル部分で使えるようになりました。
SASSプリプロセッサの動作確認のため/src/App.svelte
ファイルを修正してみました。
ブラウザーからフォントの色が変わったことが確認できましたら、SASSプリプロセッサが正しく動作しているということです。
hash value: cdae25d
ヘッダー追加
アプリのヘッダーを追加する前、/public/global.css
ファイルを修正しました。
/src/Header.svelte
コンポーネントを生成します。
コンポーネントを生成した後、/src/App.svelte
からコンポーネントを使用してみましょう。
import
文を通じて簡単にコンポーネントが使えます。
hash value: a865e3d
Store追加
公式ドキュメントではsvelte/store
モジュールを次のように定義しています。
A store is an object that allows reactive access to a value via a simple store contract.
あるコンポーネントからある値にアクセスするためにはStoreを追加する必要があります。Storeを使用するために/src/store.js
ファイルを追加しましょう。
subscriptionを通じて値を読んだり、修正したりするためにwritable
をインポートしました。writable
은データを操作するために3つのメソッドを持っています。
1つ目のメソッドはsubscribe
です。このメソッドはsubscriberたちに値の変化を知らせるために使われます。2つ目のメソッドはset
です。このメソッドはStoreの値をセットするために使われます。このメソッドはStoreの値を完全にリプレイスするため、単純にnew_value
だけを引数として受け入れます。3つ目のメソッドはupdate
です。このメソッドもStoreの値を設定するためのメソッドです。しかしこのメソッドは関数を引数として受け入れるため、Storeの値を一部変更する必要がある時にはupdate
メソッドを使用しなければなりません。
/src/store.js
ファイルをもう一回確認してください。weatherList
をエクスポートし、ファイルの内部には3つのメソッドが実装されています。1つ目のメソッドはsubscirbe
で、このメソッドがどんなことをするのかは先をど説明したので省略します。2つ目のメソッドはadd
で、天気情報を追加するために利用されるメソッドです。3つ目のメソッドはremove
で都市名を利用してStoreから天気情報を削除するために使用されます。僕はupdate
メソッドを利用してadd
とremove
メソッドを実装しました。
hash value: e10b3b5
検索フォーム追加
検索フォームを作る前にOpenWeatherMap API
のキーをアプリに追加しましょう。
キーをjsファイルを利用してアプリに追加しました。 (2020.02.18 時点のアプリでは環境変数からキーを呼び出すように変更しました。その方法に対してはこの記事の一番下の方に記録しておきました。)
/src/key.js
ファイルを生成してください。
キーファイルを生成した後には/src/Search.svelte
ファイルを追加してください。 このファイルは天気カードをアプリに追加するための検索コンポーネントを定義するためのファイルです。ファイル内部には都市名を入力して天気情報を呼び出す時に使われるinput
とbutton
要素を追加しました。.
コンポーネントからStoreを使うためにweatherList
をインポートしました。その後、Storeに天気情報を追加するための関数を定義しました。このファイルからは次の点に対して確認してください。
cityName
変数をinput
要素の値にバインドするためにはbind:value={cityName}
という文法を使用しました。addWeatherInfo
変数をbutton
要素のクリックイベントにバインドさせるためにはon:click={addWeatherInfo}
という文法を使用しました。- Storeの値をアップデートするために
addWeatherInfo
変数内部からweatherList.add
メソッドを使用しました。
Search
コンポーネントを/src/App.svelte
から使ってみましょう。
hash value: ba5925e
Store 修正(Store定義時に誤りがありました。)
WeatherCard
を実装しながら前に設計したweatherList.remove
メソッドが不適切だと気づきました。なぜ適切ではないでしょうか?index値を得るために計算する必要がなかったからです。なのでremove
メソッドを次のように修正しました。
hash value: 2dc0b3d
天気カードの追加
input
要素に都市名を入力しbutton
要素をクリックすると天気情報を取得することができます。この情報はjson
タイプのデータなので天気カードにデータを表示させるのはとても簡単です。
データは下のような構造です。
天気カードのリストを表示させるためのBoardコンポーネントを作りましょう。/src/Board.svelte
ファイルを確認してください。
/src/App.svelte
ファイルにコンポーネントを追加しました。
都市の天気情報を検索すると、文字列になった天気情報がBoardコンポーネントに表示されます。表示される情報を天気カードコンポーネントで表示させるために/src/WeatherCard.svelte
コンポーネントを追加しました。
このファイルではマウスイベントに対して詳しくみておいてください。最初の設計を実装するため、マウスイベントを作っておいたからです。
クリックイベントが発生した時間を測定し、その時間が1.5秒を超えた瞬間削除のためのUIが表示されます。
天気カードコンポーネントを生成した後には/src/Board.svelte
を修正する必要があります。
プロパティーの名を書かなかったことを確認してください。Svelteは短い構文をサポートしています。{weather}
という構文はweather={weather}
構文と完全に一致します。
僕の初めてのSvelteアプリケーションが完成されました!
hash value: e3a9f85
2020.02.18 環境変数からAPIキーを獲得するように変更しました。
ファイルでAPIキーを管理するのはとても危ないことですね。もしGitHubなどにAPIキーをプッシュでもした瞬間、僕のAPIキーを全ての人々に公開され、誰でもそのキーを使うことができるからです。
そんな危険性があったので、僕のコードは修正しなければならないと思いました。(実は会社の上司のコードレビューからこれを指摘されました。)
replace
プラグインを追加しましょう。このプラグインはファイルに含まれている文字列を設定した文字列に置換してくれるプラグインです。
npm install @rollup/plugin-replace --save-dev
その後、src/key.js
ファイルを修正しましょう。
export const key = 'API_KEY';
最後に/rollup.config.js
ファイルに追加したプラグインを使用するための設定を追加しましょう。
import replace from '@rollup/plugin-replace';
...plugins: [
replace({
'API_KEY': process.env.API_KEY
}),
],
...
これから、環境変数を利用してアプリが実行できるようになりました。下記のコマンドを入力して実行してみましょう。
API_KEY=<api-key> npm run dev
hash value: a212007
結論
Svelteはすごくシンプルですし、公式ドキュメントはSvelteを身につくために必要な情報が丁寧に書いてあります。もうちょと勉強したくなるUIフレームワークです。