Riot.js で外部の jsonファイルを読み込む

この記事は約 6 分で読めます。

現在勉強中の Riot.js という Javascript のライブラリを使ったSPA(シングルページアプリケーション)で、外部にあるJsonファイルを読み込むやり方を記します。

jsonファイルを利用する前のソース

以下は私が作成した九九アプリWindows10のローカル環境でChromeの検証モードを使って表示した内容です。

Riot Jsonファイルを読み込む前

見て分かる通り、今はソースに直書きされたルビ(振り仮名)配列を利用して画面に表示しています。

これを外部ファイルの Jsonファイルに定義、それを読み込んで表示するように修正します。

Jsonファイルに定義

今回はJsonファイルを作成するのに以下サイトを利用しました。

オンライン上でJSONを確認できるwebサービス。jqコマンド、整形、ソート、フィルター、ユニコード...

ソースに直書きされたルビ(振り仮名)配列をコピペして、サイトにペタリ。

JSON Pretty Linter Ver3

コピー用の領域をクリックしたら自動でコピーがされました。とても使い勝手が良いです。

次はテキストエディターを起動、私はフリーソフトのサクラエディタを利用しました。

コピーされた内容を張り付けます。

九九のルビをjsonファイルで定義

保存する際、文字コードと改行コードに注意しましょう。

  • 文字コード:UTF-8
  • 改行コード:LF
  • 保存先パス:<ドキュメントルート/assets/json/rubi.json>

Jsonファイルの読み込み

修正前のソースはこんな感じです。

<br />
    // 次の問題<br />
    self.observer.on('next-question', function(param) {<br />
      self.leftValue = param.leftVal<br />
      self.rightValue = param.rightVal<br />
      self.rubiText = getRubiText(self.leftValue, self.rightValue)<br />
      self.update()<br />
    })</p>
<p>    // ルビ文字列を取得<br />
    function getRubiText(left, right) {<br />
      if (self.rubis.length == 0) {<br />
        self.rubis = [<br />
          {&quot;key&quot;: &quot;1-1&quot;, &quot;val&quot;: &quot;いん いち が いち&quot;}<br />
          {&quot;key&quot;: &quot;1-2&quot;, &quot;val&quot;: &quot;いん に が に&quot;},<br />
          {&quot;key&quot;: &quot;1-3&quot;, &quot;val&quot;: &quot;いん さん が さん&quot;},<br />
          {&quot;key&quot;: &quot;1-4&quot;, &quot;val&quot;: &quot;いん し が し&quot;},<br />

12行目からがソースに直書きされたルビ(振り仮名)配列を設定している部分になります。

これを作成したJsonファイルから読み込むようにソースを修正します。

Riot Jsonファイルの読み込み後

修正後のソースは以下の通りです。

<br />
    // 次の問題<br />
    self.observer.on('next-question', function(param) {<br />
      self.leftValue = param.leftVal<br />
      self.rightValue = param.rightVal<br />
      self.rubiText = getRubiText(self.leftValue, self.rightValue)<br />
      self.update()<br />
    })</p>
<p>    // マウント時<br />
    self.on('mount', function() {<br />
      // ルビが未設定の場合<br />
      if (self.rubis.length == 0) {<br />
        // jsonファイルのルビを読み込み<br />
        fetch('/assets/json/rubi.json')<br />
        .then(function(data) {<br />
          return data.json()<br />
        })<br />
        .then(function(json) {<br />
          self.rubis = json<br />
        })<br />
      }<br />
    })</p>
<p>    // ルビ文字列を取得<br />
    function getRubiText(left, right) {<br />
//      if (self.rubis.length == 0) {<br />
//        self.rubis = [<br />
//          {&quot;key&quot;: &quot;1-1&quot;, &quot;val&quot;: &quot;いん いち が いち&quot;},<br />

タグファイルがマウントされたタイミングで定義したJsonファイルを読み込んで設定するようにし、配列を設定していたところをコメントアウトしました。

なぜマウント時?

最初はルビ文字列を取得する箇所にJsonファイルを読み込む処理を書いていたのですが、Fetch APIは非同期処理のため、表示するタイミングで呼び出すと取得が間に合わないんですね。

ということで、タグファイルがマウントされるタイミングでJsonファイルを読み込むようにしてあります。

通信障害などで取得に時間がかかる場合は、それでも間に合わないかもしれません。

不安な場合は何かしらの対策は必要そうです。

例えば、読み込み完了するまでロード中のアイコンだして操作を受け付けないとか。

とりあえず今回はそこまで頑張りませんでした。

Fetch API とは?

HTML の新しい標準仕様です。

XMLHttpRequest と似たものですが、より強力で柔軟な操作が可能になります。

これからは外部リソースの取得やAPIの呼び出しなど、Fetch API を利用することが一般的になってくると思ってます。

まとめ

今回は Fetch API を使って外部のJsonファイルを読み込んで画面に表示する対応を行いました。

一見、「なんの意味があるの?

外部ファイルから取得する必要なんてなくない?

と思われるかもしれませんが

これが海外の方に利用してもらう事になった場合、ルビも英語にする必要があります。

そんな時に外部ファイルとしてリソースを管理しておくと、Jsonファイルの内容を英語化することで対応できたりと応用がきくんですね。

また、外部ファイルから取得するのではなく、API で取得するように変更したい。

となった場合、修正がとても楽です。

Fetch API なら Jsonファイルを読み込むのも API で取得するのも、同じような感じで利用できます。

API 化すれば、ルビの修正もDB側のメンテナンスだけで事足りますしね。

ということで、実際にルビの取得方法をJsonファイルからAPIに切り替えてみました。

以上、『riot で外部の jsonファイルを読み込む』方法の説明でした。

The following two tabs change content below.
会社員Shira
IT系の会社員。1978年生まれ。個人開発でAndroidのアプリをリリース、総ダウンロード数は96万くらい。36歳で初めての転職、未経験のweb業界で日々悪戦苦闘してます。
最新記事 by 会社員Shira (全て見る)

当記事がお役に立ちましたらシェアして頂けると嬉しいです。

フォローする