Vue jsでアプリケーションがブラウザから見れない時

ボイラーテンプレートで、yarn devなどをすると次のようなメッセージが出てきます。

Your application is running here: http://localhost:8080

ただこれでも見れない時があります。

思いつく原因をいくつか並べて見ます。

ポート番号が被っている

このパターンの場合、そもそも開発サーバーが立ち上がらないはずです。

もしくはよしなに違うポートにバインドしてくれることもあります。

例えば、8080で起動しようとしたが、既に使われていたので8081で変わり起動するなど。

ブラウザのキャッシュが残っている

あんまり考えられないですが、シークレットモードやキャッシュクリアで見れる可能性があります。

回避策

本番環境とは違い、開発環境なので、回避できればなんでも良いわけです。

ポートを占有してみる

勝手に8080で立ち上がるなら、まずは簡易的なサーバーを立ち上げてポートを占有してみたらどうなるのか見てみます。

何でもいいですが、phpでやるならこんな感じです。

php -S localhost:8080

そのあと、nodeを立ち上げてみます。

yarn dev

これでエラーが出れば切り分けができますし、出なければ違う方法を試します。

ポート番号を変更する

何かわからないけれども起動しない。

そんなときはポート番号を変えたほうが早いかもしれません。

ボイラーテンプレートによって違うかもしれませんが、envの設定を変更してみましょう。

次のようキーワードが目安になります。

process.env.PORT

これを変更している値を8081などに上書きして

yarn dev

を実行してみます。

大概これで解決します。

Vue jsでpackage.jsonの情報を読み込む

難しく考えず、requireすれば手っ取り早いです。

例としてはこんな感じ。

<template>
  <div>
    <h1>ホーム</h1>
    <p>Version {{ version }}</p>
  </div>
</template>

<script>
  export default {
    name: 'home',
    data () {
      return {
        version: require('../../../package.json').version
      }
    }
  }
</script>

elecrton-vueでweb用にbuildする

ビルドのコマンドは以下の通りです。
package.jsonに記載があります。

yarn build:web

ビルドされたソースはdis/webに作られます。

ただこのままだと

Uncaught ReferenceError: process is not defined

が発生します。

動作に問題はないのですが、不要なエラーが出ているのが気になるところです。

解決方法としてはindex.htmlの以下の部分を削除します。


参考:
https://github.com/SimulatedGREG/electron-vue/issues/195

解決策は提示されてますが、electron用のテンプレートなので、特に対応しようという感じではないようですね。

Vuexでstateのデータを初期化する方法

動的にstateのプロパティを設定したいことは多々あります。

ただし、Vue.jsは最初に宣言しておかなければリアクティブになりません。

データの設定をする3つの方法書いてみたいと思います。

すべて列記しておく

一番シンプルです。
全く動的ではありませんが、一番最初に思いつく方法でしょう。

const state = {
  somethingData: [
      'data1', 'data2'
    ]
} 

配列だけ作っておく

先に配列だけ作っておき、どこかのタイミングでcommitで値をセットします。

メリットとしては、初期化のタイミングを決められることです。

逆にデメリットとして、初期化の処理をどこかで呼び出さなければなりません。

const state = {
  somethingData: []
} 

const mutations = {
  initSomethingData (state, data) {
      for (let i = 0; i < data.length; i++) {
          state.somethingData.push(data[i])
        }
    }
}

即時関数を使う

jsonなどの外部のデータに頼る場合は即時関数が便利です。

const state = {
  somethingData: (function () {
      return require('somethinData.json')
    }())
}

可読性が下がると思うのであれば、変数に入れ直すといいかもしれません。

let initSomethingData = function () {
    return require('somethinData.json')
}

const state = {
  somethingData: initSometingData()
}