スクリプトのお勉強

Vue.js 導入編

投稿日:

1.はじめに

近年、web関係で「クライアントサイドJavaScript」というのがトレンドになっているそうです。

「クライアントサイドJavaScript」と、従来のWebアプリケーションとの違いは、ブラウザ側での動作が中心となることです。

従来のWebアプリケーションでは、Webサーバでの処理が中心でしたが、「クライアントサイドJavaScript」では、ブラウザ側での処理が中心となってきて、かつ、ユーザの使い勝手の良さが重要になってきます。

仕事でちょうど簡単なweb画面を1からつくる機会があり、クライアントサイドJavaScriptを使うことにしました。

現在使われているクライアントサイドJavaScriptは以下のようなものがあります。

  • AngularJS
  • React.js
  • Vue.js

この中でも一番簡単そうなVue.jsを使用してみました。

1.1 Vue.jsとは

Vue.jsとは、以下のようなJavaScript用ライブラリです。

  • View のみ
  • リアクティブデータバインディング
  • HTMLの各タグとデータを自動的に結び付ける
  • コンポーネントベース
  • 簡単なAPI

お手軽ライブラリのようなので、入門的に導入してみました。

ここでは、Vue.jsを素で扱うのではなく、[Nuxt.js]を使用しようと思います。

1.2 Nuxt.jsとは

Vue.jsは比較的簡単に使用できますが、それでも、なんらかの準備は必要です。
Nuxt.jsとは、その準備を一通りやってくれるフレームワークと思えばいいでしょう。

主な特徴は以下の通りです。

  • Vue ファイルで記述できる
  • サーバーサイドレンダリング
  • ES6/ES7 のトランスパイレーション
  • モジュール構造で拡張できる

Vue.jsで実装する、vueファイルを追加するだけでいいので、Vue.jsだけを使用するより手軽に実装できます。

2.Nuxt.jsの導入

まず、Nuxt.jsを試す環境を導入してみます。

前提環境

  • OS: Ubuntu 16.04
  • Nuxt.js 2.4.3
  • node 9.4.0
  • npm 6.0.0

環境構築

Nuxt.jsをインストールします。

$ sudo npm i -g vue-cli
$ vue init nuxt/starter todo
$ cd todo
$ npm install
### package.jsonを修正
"dependencies": {
  "nuxt": "^1.4.0",
$ npm update

3.Nuxt.jsサンプル(TODO)の作成

上記で、Nuxt.jsを書ける環境が整ったので、サンプルを作成してみます。

サンプルは、[nuxtjs-sample-todo]に置いてあります。

ディレクトリ構成

インストール直後のディレクトリ構成は以下の感じです。

assets/
components/
layouts/
node_modules/
middleware/
nuxt.config.js
package.json
pages/
plugins/
static/
store/

todo vueコンポーネントの作成

todo用のvueコンポーネントは以下の通りです。

  • 「v-model=”newTodo」「v-for=”(todo, index) in todos”」がデータバインディング
    • 画面上のinputを変更すると、「newTodo」変数が変更されます。
    • 「todos」を変更すると、画面上のリスト表示が変更されます。
  • 「@keyup.enter」や「@click」がイベント受信
    • enterや、クリックすることでVueモデルの処理に移行します。

以下をpages/todo/index.vueとして格納します。
追加するファイルはこの一つだけというのが、Nuxt.jsのいいところです。

<template>
    <div>
        <input v-model="newTodo" @keyup.enter="addTodo" />
        <ul>
        <li v-for="(todo, index) in todos" :key="todo.id">
            <span>{{ todo.text }}</span>
            <button @click="removeTodo(index)">X</button>
        </li>
        </ul>
    </div>
</template>

<script>

export default {
    data () {
        return {
            newTodo: '',
            todos: [
                { text: 'TODOを追加してください' }
            ]
        }
    },
    methods: {
        addTodo () {
            var text = this.newTodo.trim()
            if (text) {
                this.todos.push({ text: text })
                this.newTodo = ''
            }
        },
        removeTodo (index) {
            this.todos.splice(index, 1)
        }
    }
}
</script>

ほぼ見ての通りですが、一つだけ注意する必要があるのは、todosが配列で定義されているため、push/spliceを使う必要がある点です(時々、はまったりします)直接配列に代入すると画面が変更されません。

起動

別ホストからアクセスできるように、package.jsonに以下を追加します。

"scripts": {
  "dev": "HOST=0.0.0.0 PORT=8888 nuxt"
}

起動方法は以下の通りです。

$ npm run dev
(中略)

そして、以下にブラウザでアクセスすると、簡易TODOアプリにアクセスできます。192.168.132.128は環境によって変更してください。

http://192.168.132.128:8888/todo

3. コード整形/lintツールの設定/起動

3.1 設定方法

以下のツールを設定しておきます。

以下でインストールします。

$ npm install babel-eslint eslint eslint-config-prettier eslint-loader eslint-plugin-vue eslint-plugin-prettier prettier

.eslintrc.jsを以下にします。

module.exports = {
  root: true,
  env: {
    browser: true,
    node: true
  },
  parserOptions: {
    parser: 'babel-eslint'
  },
  extends: [
    "eslint:recommended",
    "plugin:vue/recommended",
    "plugin:prettier/recommended"
  ],
  // *.vue files を lint にかけるために必要
  plugins: [
    'vue'
  ],
  // ここにカスタムルールを追加します。
  rules: {
    "semi": [2, "never"],
    "no-console": "off",
    "vue/max-attributes-per-line": "off",
    "prettier/prettier": ["error", { "semi": false }]
  }
}

packages.jsonに以下を追加します。

"scripts": {
  "lintfix": "eslint --fix --ext .js,.vue --ignore-path .gitignore ."
}

3.2 起動方法

lintfixをすると、prettierを使用してソースを修正します。

$ npm run lintfix

> todo@1.0.0 lintfix /home/tanino/script-plactice/practice_the_script/nuxtjs/todo
> eslint --fix --ext .js,.vue --ignore-path .gitignore .

$ npm run lint

> todo@1.0.0 lint /home/tanino/script-plactice/practice_the_script/nuxtjs/todo
> eslint --ext .js,.vue --ignore-path .gitignore .

4.おわりに

導入は、あっさり終わりました。

次はもう少し実用的な内容として、コンポーネントを利用して実装しようと思います。

5.参考

https://ja.nuxtjs.org/guide/development-tools/

-スクリプトのお勉強

執筆者:

関連記事

gradleのcommandLineでリダイレクト

gradleというビルドツールがあります。なぜかRPMを作成するのに使ってます。Ansibleも使ってるんですがね。。 それはともかく、ここの通りなのですが、例えばls -lRの出力を、プロジェクトデ …

Nuxt.jsのFormで入力/確認/完了フォームを作成してみた(その1)

背景 今回は、Webアプリケーションの、フロントエンド系のお話です。ほとんどの場合、バックエンドなのですが、時々フロントエンドもするんですよね。。 私の派遣先では、入力フォームを以下のように分ける要望 …

Python3/ある日付から日付までの月/日/時間ごとの時刻を算出する

小ネタです。 要するに、時刻A と 時刻B を指定したときの、各時間間隔での時刻取得したかったです。 当初はdateutilを使う方法でなく、自前で実装しようと思ったのですが、面倒なことに気づきました …

Mojolicious XML-RPC Pluginの開発(2)

はじめに 「Mojolicious XML-RPC Pluginの開発」のその2です。 本内容では、前回の内容を踏まえ、XML-RPC実装を、Mojoliciousのプラグイン機能を使用して実装しよう …

言語別ログイン機能パスワード保存処理方針

ちょっと前に、ログイン機能を作成した際、パスワードを暗号化するか、という議論を目にしたことがありました。 昔だと、「パスワードを暗号化しない」方で実装していましたが、最近はセキュリティが当たり前になっ …