VueアプリをEXEする方法

準備するもの

・Vueアプリ

・npm

イントロ

今回はVueアプリをデスクトップアプリとして使えるようにするためにElectronJSを使います。

以前もElectronJSを紹介したことがありますが、何かしらの理由でVueのクライアントアプリをネットに公開したくない場合や、ローカルのPCからAPIにアクセスできるアプリを作成したい時に最適です。

準備

では、Vueのアプリを準備しましょう。まっさらな状態から作成する場合はVue cliやViteを使ってVueアプリを作成してもらって構いません。

もし、実際のアプリケーションで参考にしてみたい場合はこちらを使ってください。

https://github.com/TraitOtaku/VueApp/tree/4_AuthReady
git clone <URL>

cd /path/to/repo/

git branch -a

git checkout 4_AuthReady
npm i

npm run serve

とりあえずアプリが起動できるところまで確認してください。

バックエンドのDjangoのAPIもこちらからどうぞ。

https://github.com/TraitOtaku/djangoAPI/tree/8_AuthReady

ElectronJSのインストール

今回はVue-Electron Builderを使ってVue CLIのコマンドでElectronをインストールしていきます。

公式サイトをチェックしましょう。

https://nklayman.github.io/vue-cli-plugin-electron-builder/

Vue CLIがない人はこのコマンドでVueCLIをインストールしましょう。

npm install -g @vue/cli

ではVueのアプリにElectronを追加します。

vue add electron-builder

デベロプメントサーバーの起動の仕方

Yarnの場合

yarn electron:serve

NPMの場合

npm run electron:serve

アプリをExe化する

Yarnの場合

yarn electron:build

NPMの場合

npm run electron:build

Vue Routerを使っている場合

Vue Routerを使っている場合は下記のような警告が出ます。

 It is detected that you are using Vue Router. It must function in hash mode to work in Electron. Learn more at https://goo.gl/GM1xZG

この場合は、router内のindex.jsのCreateWebHistoryをcreateWebHashHistoryに変えてあげましょう。

const router = createRouter({

  history: createWebHashHistory(process.env.BASE_URL),

  routes

})

もしくはこのようなやり方でもできます。

const router = createRouter({

  history: process.env.IS_ELECTRON

    ? createWebHashHistory()

    : createWebHistory(),

  routes,

});

そうするとURLがこんな感じになります。

http://localhost:8080/#/

これはSEO対策としては悪いのでEXE化するときだけに変更するように覚えておいてください。

これをしないとElectronアプリが白い画面しか表示されないエラーが発生します。

APIフェッチがビルドの時だけエラーになる

ではElectron:Buildのコマンドでログイン画面に入ろうとしてもAxiosがNetworkエラーでログインできないことがあります。

さらに、Djangoのアプリ側では200で返ってくるので謎の現象のように見えます。

これはElectronアプリのセキュリティをCORSのヘッダーのエラーにより発生しています。

まずは、backend.jsのwebSecurityをfalseにします。

※注意!

これはあくまでも検証用として記載しております。

実際にプロダクションにする場合はより安全なやり方が下記のブログで紹介されているので参考にどうぞ。

https://pratikpc.medium.com/bypassing-cors-with-electron-ab7eaf331605
const win = new BrowserWindow({

    webPreferences: {

        webSecurity: false

    }

});

これで問題なくElectronからもAxiosが使えるようになりました。

お疲れ様です。

VueRouterでログインしていないユーザーをログイン画面に誘導する方法

準備するもの

・Vue3

・Vue-Router

イントロ

今日はVue3でログインしていないユーザーをログイン画面に飛ばす方法を紹介します。

この方法以外にもこの目的を達成できる方法が色々ありますがVue-Routerを使ったやり肩が簡単だと思ったので参考にしてみてください。

ユーザーを判断するシステムを作る

Vueアプリにアクセスしたユーザーを判断するシステムがないことにはユーザを振り分けることができませんね。

今回は、ログインしていないユーザーをどうやって判断するかを紹介します。

前回紹介した記事でトークン認証を使ったログインの仕方を紹介しました。

では、これを使って、トークンのないユーザーをはじき出しましょう。

localStrageについて

今回は単純にブラウザのローカルストレージにデータを保管していますが、もし複雑なデータをあるかうようでしたらVuexというState Managementシステムでも同じことができます。

Vue Routerについて

Vue-RouterはVueのライブラリでURLのルーティング、もしくはページのコンポーネントを担当するメカニズムの事です。

Metaについて

このコードを見て分かるようにそれぞれのルートにmetaを設定することができます。

今回は一番ふさわしいrequireAutrhというキーで名前を付けましたが、adminOnlyでも、firstTimeでも何でも良いです。

で、このキーに対してtrueの値を入れてあげます。

後からこのrequireAuthがtureのルーティングに対して更に条件を足していきます。

const routes = [

  {

    path: "/",

    name: "home",

    component: HomeView,

    meta: { requiresAuth: true },

  },

  {

    path: "/login",

    name: "login",

    component: LoginView,

  },

];

beforeEachでルーティングに制限をかける

VueRouterの公式のドキュメンテーションにもありますが、このmetaに対して条件を足す場合には下記のようにコードを書いていくことになります。

パラメータではto とfromが使えますが今回はtoだけを使います。つまりは行き先だけを指定して、どこのページから来ているかのfromは使わないという事ですね。

to.meta.requiresAuthでさっきのrequireAuthがtrueであることと、 localStorage.getItemのtokenがnull、つまり、NoValueで値がない場合にどうするか指示します。

今回はバックエンドのアプリからログインのトークンをもらっていない場合はloginのページに誘導することにしています。

router.beforeEach((to) => {

  if (to.meta.requiresAuth && localStorage.getItem("token") == null) {

    return { name: "login" };

  }

});

では、今日はこれくらいで。

Vueアプリでトークン認証のログインシステムを作る

準備するもの

・Django RESTとToken Authができている環境

・Vueのアプリ

アプリ紹介

今回は、フロントエンドがVueでバックエンドがDjangoでできているチケット管理システムのログインのシステムを作成します。

例として、従業員がお客様からの問い合わせに対してチケットを作成していくようなイメージです。

Vueがフロントエンド(クライアント側)でDjangoのAPIのエンドポイントからデータを発信しています。

しかし、このAPIが公共に垂れ流しの状態なのでURI(URL)にアクセスできる人誰でもこのデータにアクセスできてしまいます。

前回はDjango RESTFramewrokを使ってトークンAuthでこのトークンがある人だけデータにアクセスできる人だけAPIのリクエストにデータをリスポンスとして返すことができました。

今日はそれをVueのアプリから行っていきたいと思います。

アプリの準備

DjangoアプリはこちらのURLのGitHubからクローンしてください。

https://github.com/TraitOtaku/djangoAPI/tree/8_AuthReady

Vueのアプリはこちらからダウンロードしてください。

https://github.com/TraitOtaku/VueApp/tree/4_AuthReady

Gitのコマンドを使ったことがない人は面倒でも必須のスキルですので必ず覚えておくようにしましょう。

Gitのコマンドです。

git clone URL

cd /to/repo/

git branch -a

Git checkout <branch_name> 

Djangoの準備の仕方は他の動画でも説明しているので今回は飛ばします。

Vueもnpmかyarnでライブラリをインストールして準備完了です。

npm i

EventService.js

まずは、ログインする際にDjangoにユーザー名とパスワードをJSONファイルで送りつけます。この際POSTリクエストになっていることに注意しましょう。

で、正しいクレデンシャル(ログイン情報)が遅れた後にDjangoからTokenが返されます。

const loginClient = axios.create({

  baseURL: "http://127.0.0.1:8000/",

  withCredentials: false,

  headers: {

    Accept: "application/json",

    "Content-Type": "application/json",

  },

});
  submitLogin(logininfo) {

    return loginClient.post("api-token-auth/", logininfo);

  },

ちなみにapiClientというファンクションでDjangoのTokenAuthに必要なTokenをリクエストの際に送るヘッダーに付けてあげるようにしています。

const apiClient = axios.create({

  baseURL: "http://127.0.0.1:8000/api",

  headers: {

    Authorization: `Token ${localStorage.getItem('token')}`,

    "Content-Type": "application/json",

  },

});

では、このJavaScriptをエキスポートして、LoginView.vueのコンポーネントを作成します。

LoginView.vue

このページ(コンポーネント)でログインに関連するシステムを構築しています。

AntDesignのUIライブラリからコピペしたフォームと、そのサブミットボタンにクリックイベントを付けてます。

    const submitLogin = () => {

      EventService.submitLogin(toRaw(formState))

        .then((response) => {

          console.log(response.data);

          localStorage.setItem('token', response.data.token)

          router.push({ name: 'home' })



        })

        .catch((error) => {

          console.log("Error" + error);



        });

    }

で、ここで、Django から返ってきたトークンをブラウザのストレージにtokenというキーで保管しておきます。

これでログインができたらrouter.pushでホーム画面にジャンプするように設定しています。

本来なら、ログインしない限りhomeのページへのアクセスはできないようにするのがベストですが、今回は割愛しています。

もしするのであればv-ifとvuexでState managementを使うのがベストだと思います。

また、ログインのエラーがあった場合のロジックもここに追加できますね、。

では、ログインができたらHomeViewに行くのでそこにログアウトのボタンも作成しましょう。

HomeViews.vue

ログアウトのロジックは下記のようなコードでできます。

単純にlocalStorageに保管されているtokenアイテムを取り除き、router.pushのコマンドでログイン画面に誘導してあげます。

    const logOut = () => {

      localStorage.removeItem('token')

      router.push({ name: 'login' })

    }

まとめ

まあ、全体的に煩雑なコードですが、これでVueアプリからDjangoのToken AuthのAPIにアクセスすることができました。

バックエンドのテクノロジーとAuth(認証)のやり方によって、ヘッダーの書き方が変わることに注意しましょう。

あとはサインアップと、パスワードを忘れた際の再設定のロジックもDjango側と一緒に作成していけばプロダクションで使えそうですね。

お疲れ様です。

Vue + Axios | APIでビットコインの値段を取得しよう

準備するもの

・なにかしらのAPI

・Node JS, npm

イントロ

VueではAPIのハンドリングはJavaScriptのライブラリに全て任せており、特にビルトインのメソッド等はありません。理由としてはJavaScriptで既にAPIを扱うライブラリが多く存在しているからです。

Axiosとは

まずは公式サイトを見てみましょう。

https://axios-http.com/

あとGitHubのリポも見てみます。

https://github.com/axios/axios

  1. AxiosはAPIのエンドポイント(URL)にHTTPのリクエストを送る為のライブラリです。
  2. そのリクエストから返ってきたdataプロパティを使えるようになります。
  3. リクエストが成功した場合のステータスは200で、ステータステキストはOKです。
  4. 通常はAxiosがJSONデータに自動で変換されます。
  5. タイムアウト設定やリクエストのキャンセルの設定もできます。

Axiosのインストール

では、VueのアプリにAxiosをインストールしてきます。別にVueでなくてもReactでも要領は同じです。

コマンドライン

npm install axios

基本的なAxiosの使い方

ここではAxiosのベース的なイメージを紹介します。

スクリプト側

new Vue({

  el: '#app',

  data () {

    return {

      info: null

    }

  },

  mounted () {

    axios

      .get('https://api.coindesk.com/v1/bpi/currentprice.json')

      .then(response => (this.info = response))

  }

})

HTML側

<div id="app">

  {{ info }}

</div>

このように、infoという、空のオブジェクトをHTML側に投げておいて、AxiosがAPIで取得したデータをのっけるようなイメージです。

mounted() メソッドはVueのライフサイクルの一部で、Vueアプリが作成されて、id=”app”にマウントされたときに実行されるように指示しています。

おまけ

ライフサイクルの流れ(例はOptionsAPIですが、感覚は同じです)

Axiosの慣習的な使い方

では、コンポーネントごとにAxiosのリクエストのコードを書くと、煩雑になるので、ベースとなるJSファイルを作成し、そこから呼び出すようにしましょう。

まずは、src直下にpluginsというディレクトリを作成しましょう。(フォルダ名は何でもよいです。)その下にEventService.jsファイルを作成します。(これも名前は何でも良いです。)

EventService.js

import axios from 'axios'



const apiClient = axios.create({

  baseURL: 'https://api.coindesk.com/v1/bpi/currentprice.json',

  withCredentials: false,

  headers: {

    Accept: 'application/json',

    'Content-Type': 'application/json'

  }

})



export default {

  getCurrentPrice(){

    return apiClient.get('')

  },

}

では、このEventService.jsをコンポーネントから呼び出してみます。

src/components直下にCoinPrice.vueを作成します。

CoinPrice.vue

<template>

<h1>Coin Price</h1>

  <div>

    {{ coins }}

  </div>

</template>



<script>

import EventService from "../plugins/EventService.js";



export default {

  components: {},

  data() {

    return {

      coins: [],

    };

  },

  created() {

    EventService.getCurrentPrice()

      .then((response) => {

        this.coins = response.data;

      })

      .catch((error) => {

        console.log("There was an error:" + error.response);

      });

  },

};

</script>

では、これをApp.cueからレンダーします。

App.vue

<template>

  <CoinPrice />

</template>



<script>

import CoinPrice from "./components/CoinPrice.vue";

</script>

で、デベサーバーを起動すると。。。

問題なくAPIが使えるようになりました。

なので、今後もAPIのエンドポイントが増えた場合はこのEventService.jsにベースとなるコマンドを記載して、必要なコンポーネントから呼び出していけるようになりますね。

HTMLをキレイに

では、必要な情報だけをフィルターしていきましょう。

<template>

  <a-card size="small" title="ビットコインの値段" class="card" style="width:300px;">

    <div>{{ coins.time.updated }} 現在</div>

    <div>{{ coins.bpi.USD.rate }} USD</div>

    <a-button

      type="primary"

      href="https://api.coindesk.com/v1/bpi/currentprice.json"

      >APIデータを直で見る</a-button

    >

  </a-card>

</template>



<script>

import EventService from "../plugins/EventService.js";



export default {

  components: {},

  data() {

    return {

      coins: [],

    };

  },

  created() {

    EventService.getCurrentPrice()

      .then((response) => {

        this.coins = response.data;

        console.log(this.coins);

      })

      .catch((error) => {

        console.log("There was an error:" + error.response);

      });

  },

};

</script>

今回はUIライブラリのant Desginを使っていますがなくてもOKです。

でhじゃ、お疲れさまでした。

Vite + AntDesign でVue3を始めよう | VueのCSSライブラリ

イントロ

皆さん、CSSライブラリは使ったことがありますか?

もちろん、自身で全てのUIデザインを一から作ることができれば素晴らしいのですが、そんな時間はありません!

CSSライブラリで有名なのはBootstrapとかTailwindがありますね。

今日は、Vueのバージョン3に対応したAnt Designを使ってみます。

Vue3に対応していないCSSライブラリ

ここで2つ注目したいCSSライブラリを紹介しておきます。

これらはまだVue3に対応していないので今後のリリースが待ち遠しいですね。

Ant Designとは

Ant DesignはReactのUIデザインのライブラリを提供していることでも知られているCSSライブラリです。

特にVueに対応したライブラリは通常のBootstrapとかと違い、データの扱いが少し楽になっているので今日、それを試してみたいと思います。

公式サイト

https://www.antdv.com/docs/vue/introduce/

Ant Designのインストール

今日はWebデベロッパーから満足度の高いViteを使って環境を作ります。

ViteはVue Cliに代わるデベロップメントツールのことです。

特にBabelというコンパイラを除いたことでめちゃちゃ早くなりました。

その代わりに古いブラウザでのサポートができなくなるとかのデメリットもありますが、それはいたしかたないでしょう。

まずはVueアプリを作ります。

npm create vite@latest

では初期状態のVueアプリが起動できることを確認しましょう。

それから、Ant Designのライブラリをインストールします。

npm install ant-design-vue@next --save

では、後からエラーが出るのでこれも入れておきましょう。

エラーが見たい人は出たら入れてください。

npm i vite-plugin-components -D
http://localhost:3000/
npm run dev

ライブラリのインポート

ではmain.jsからライブラリをグローバルにインポートします。

コンポーネントからインポートしたい人はそのやり方も可能です。

import { DatePicker } from "ant-design-vue";

app.use(DatePicker);

CSSライブラリもインポートしましょう。

カレンダーをインポートしたい場合。

import DatePicker from "ant-design-vue/lib/date-picker"; // for js

import "ant-design-vue/lib/date-picker/style/css"; // for css

Viteのデベツールのコンフィグファイルを更新して使えるようになります。

import ViteComponents, { AntDesignVueResolver } from 'vite-plugin-components';



export default {

  plugins: [

    /* ... */

    ViteComponents({

      customComponentResolvers: [AntDesignVueResolver()],

    }),

  ],

};


Vue JSを始めよう!

準備しておくこと

・NodeJS Version 10~

今回使用するもの

・VueJS バージョン3

公式ドキュメンテーション

https://vuejs.org/guide/introduction.html

イントロ

VueJSはフロントエンドのJavaScriptフレームワークでユーザーインターフェースを作ることができます。

通常のHTML、CSS、JavaScriptに合わせてビルドでき、コンポーネントという概念で開発をより効率よくできます。

他の主要概念として、Declarative Rendering(宣言的レンダリング)やReactivity(反応性)などがありますが、まずは実際にVueJSを触りながら理解していきましょう。

ここでVueJSを開発するうえで2種類のAPIのスタイルがあることを簡単に説明します。この2つはOptionsAPIとCompositionAPIになりますが、CompositionAPIはOptionsAPIの上にできたものなので、まずはOptionsAPIから学ぶことをお勧めします。

ビルドツール

では、早速vueのアプリケーションを作成していきましょう。

Npmでもできますが、今日はvue cliというツールを使っていきます。他にvite(ヴィート)というビルドツールも人気が出てきましたね。色々選択肢が多くてほんと追いつけないっすね。

npmでインストールする方法

このコマンドです。

npm init vue@latest

Vue cliのインストール

npm install -g @vue/cli

# OR

yarn global add @vue/cli


Vue cliのバージョンを確認する

vue --version

Vue cliのバージョンを更新する

npm update -g @vue/cli
# OR

yarn global upgrade --latest @vue/cli

Vue CliでVueプロジェクトを作成する

vue create hello-world

#Helloe-worldの所は自分のプロジェクト名

ここでマニュアルで何をインストールしたいか選択できます。

また、これをプリセットとして保存して再度使う事もできるので便利ですね。

ファイル構成を見る

.gitはバージョンコントロールのGITファイルがあります。

Node_moduleにインストールしたパッケージが格納されます。

例えばBootstrapとか、ChartJSとかですね。

publicにはfav-iconとindex.htmlがあり、vueJSがこの中のid=”app”の部分にアプリをマウントすることになります。

Scrはソースフォルダです。

ここにコンポーネント、ルーティング、ビューのファイルが格納されます。

assetsはグローバルのCSSとか画像を保管するときに使います。

で、App.jsがVueの親のアプリのようなものです。

Main.jsがこの親アプリをどうするか指示するためのファイルになります。

では詳しいファイルの内容は動画で見てくださいね。

お疲れ様です。

Gitでサーバーのリポを更新しよう

準備するもの

・Ubuntuサーバー

・root権限

今日の課題

Gitは世界のどこのデベロッパーでも使っておきたいバージョンコントロールシステムのことです。

Gitを使ってコードをブランチに分けたり、前のバージョンに戻ったりできるプログラマーの親友です。

今日はGitを使ってサーバーに上げたリポジトリを更新する作業を行います。

サーバーにSSH接続

まずはサーバーにSSH接続しましょう。

私のお気に入りのSSHクライアントはmobaXtermです。他に自分で使っているのがあればそれで構いません。

では、サーバーには入れたらgitをインストールしましょう。

sudo apt install git-all

y/nで聞かれたらyesのy、でエンター。

ではgitをinit(イニシャライズ)したいファイルパスに行き、下記のコマンドを実行します。

.git前の名前は何でもいいです。

git init --bare github-hook.git

post-receive Hookを追加

Initした後に作成されたファイルを見てみましょう。

ではこの中のhooksに移動します。

ここではpost-receiveファイルを作成します。

nano post-receive
git --work-tree=/home/djangoboy/backendAPI/ --git-dir=/home/github-hook.git/ checkout -f

git –work-tree=/pushしたいディレクトリ/ –git-dir=/Gitの場所/ checkout -f

post-receiveを実行ファイルにする

さっき作成したpost-receieveファイルをexcecutableのファイルにします。

これがないとうまくいきません。

chmod +x post-receive

権限をみたい場合は
ls -all

ローカルサーバーでpushの行先を設定

git remote のコマンドでどこにpushするか教えてあげます。

これでローカルのPCで更新したコードをサーバーにpushできるようにします。

git remote add live ssh://root@104.248.231.241/var/repo/myproject.git

例2:git remote add live ssh://root@172.104.81.42/home/dan/ticketapi/github-hook.git

Liveの部分は名称なのでdeoployとかprod(プロダクションの略)とかに変えてもOKです。

でsshの次にサーバーのIPから、pushするパスまでを書きます。

git remote add live ssh://root@172.105.192.111/home/github-hook.git

Push!

git push live master

git push live

おまけ

現在の接続先をみたい場合

git remote -v