Redux(react-redux)における適切な配列要素の更新
2021年8月23日…
2019年9月16日追記:
記事の内容が古くなりました。vue-cliやNuxtを使うことを推奨します
環境変化により、WebPackを一から設定を記述してJavaScriptアプリケーションを開発することも少なくなってきたように思えます。この記事の内容も古くなっており、現環境ではvue-cliやNuxt.jsを使い、必要であればそれらの設定をさらに自身で変更する、のようなやり方が現実的だと思われます。
Reactなど、他JavaScriptフレームワーク(ライブラリ)を製品レベルの開発をやってた人からすると、さっさとESLintやwebpackのコンフィグ書いて、ファイルごとにコンポーネントを分割し(単一コンポーネント)、SPAを早く書きたい。そういった、製品にVueを導入する前提の環境設定を行う適切なチュートリアルがまとまっていなかったので(webpackの設定が単一コンポーネントでは動かない設定であったり、ESLintの設定をスキップしていたり…)、本記事でそれを手っ取り早く実現する方法を紹介する。
本記事では、Vueの基本的な書き方はサンプルコードの掲載に終わっている。Vue自体に触れるというよりかは、開発にVueを導入しようとするJavaScript開発者が、時短のために製品レベルの環境設定のサンプルを学習し、より早くVueを製品へ導入するための勘所を得るために読む記事である。あくまで、Vueの環境構築が目的の記事なので、Vue自体のシンタックスの学習であったり、Vue自体に触れることが目的の場合、vue-cliを使えば目的を達成できるはずだ(Reactでいうところのcreate-react-appの位置付けのツール)。
本チュートリアルはNode.js v8以上、yarn 1.6以上がインストールされていることが前提である。また、エディタの設定はVisual Studio Codeを対象としている。また、Linuxコマンドを打つので、WindowsではBashが動作する環境を推奨するか、コマンドを一部読み変えて実施する。
推奨条件
- Node.js v8以上がインストールされていること
- yarnがインストールされていること
- Visual Studio Codeがインストールされていること
- Visual Studio CodeなどのエディタにESLintプラグインがインストールされていること
適当なディレクトリ下において、下記コマンドを実行する。
$ mdkdir vue_tutorial $ cd vue_tutorial
本チュートリアルに必要なnpmパッケージをインストールする。インストール内容な下記、package.json
の内容を参照し、作成する。内容物的には、ESLint、webpackでの実際のVue開発で必要な、ほとんど最低限のnpmパッケージをインストールするような内容となっている(※ESLintの設定はAirbnbとしてある)。プロジェクトのルート直下にて、package.json
を作成する(npm init
のほうが行儀が良いが、設定をコピーするため今回はpackage.json
を手動にて作成)。
$ touch package.json
package.json
の内容は下記のようにする。
{ "name": "vue-tutorial", "version": "1.0.0", "description": "Vue tutoriai", "main": "index.js", "scripts": { "build": "webpack", "build:server": "webpack-dev-server --hot --host 0.0.0.0" }, "author": "Your name", "license": "No license", "dependencies": { "vue": "^2.5.16" }, "devDependencies": { "babel-core": "^6.26.3", "babel-eslint": "^8.2.3", "babel-loader": "^7.1.4", "babel-preset-env": "^1.7.0", "css-loader": "^0.28.11", "eslint": "^4.19.1", "eslint-config-airbnb": "^16.1.0", "eslint-plugin-import": "^2.12.0", "eslint-plugin-jsx-a11y": "^6.0.3", "eslint-plugin-react": "^7.9.1", "eslint-plugin-vue": "^4.5.0", "vue-loader": "^15.2.4", "vue-style-loader": "^4.1.0", "vue-template-compiler": "^2.5.16", "webpack": "^4.12.0", "webpack-cli": "^3.0.8", "webpack-dev-server": "^3.1.4" } }
package.json
を作成したら、下記コマンドでパッケージをインストールする。
$ yarn install
yarn
がインストールされていない場合、npm install
を実行する。
ESLintの設定を行う。プロジェクトのルート直下に.eslintrc*
(アスタリスク以下は、拡張子なし、もしくは.js,.jsonなど)を作成し、設定内容を記述する。今回は、実際の開発で使うことを想定したために、JavaScriptファイルにはAirbnbの設定を継承し、Vueの単一コンポーネントファイルには公式リポジトリの「eslint-plugin-vue」を適用している。eslint-plugin-vueのLintの強度については、GitHubの公式リポジトリのドキュメントを参照し、適宜設定する。
module.exports = { extends: [ 'airbnb', 'plugin:vue/recommended' ], rules: { // Rules write here }, }
また、エディタによっては.Vueファイルを検知しない設定になっていることがあるので、適宜設定を行う。Visual Studio Codeの場合は、設定ファイルのESLintの項目に、下記のハイライトされた箇所を書き加える。
"eslint.validate": [ "javascript", "javascriptreact", "javascript", { "language": "vue", "autoFix": true } ]
エディタにてLintが機能しているかは、後ほど設定全般が完了してから確認をする。
webpackの設定ファイルを記述する。vue-loader公式ドキュメントの設定をベースに、下記のような設定を記述したwebpack.config.js
を作成する。
const VueLoaderPlugin = require('vue-loader/lib/plugin'); module.exports = { mode: 'development', entry: `${__dirname}/app/index.js`, output: { path: `${__dirname}/build`, filename: 'bundle.js', }, module: { rules: [{ test: /\.vue$/, loader: 'vue-loader', }, { test: /\.js$/, exclude: /node_modules/, use: { loader: 'babel-loader', options: { presets: [ 'env', ], }, }, }, { test: /\.css$/, use: [ 'vue-style-loader', 'css-loader', ], }, ], }, plugins: [ new VueLoaderPlugin(), ], devServer: { contentBase: `${__dirname}/build`, port: 8081, }, };
Vueファイルを作成し、webpackにてコンパイルを実行する。
webpack.config.json
では、Vueの開発ディレクトリが/app
となっている。そのため、/app
ディレクトリをプロジェクトのルート直下に作成する。
$ mkdir app
/app
直下に、index.js
を作成し、下記のような内容とする。これは、Vueアプリケーションのエントリーポイントである。
import Vue from 'vue'; import App from './App.vue'; new Vue({ el: '#app', render: h => h(App), });
次に、`/app`直下に、`index.js`にてマウントされる`App.vue`を作成する。
<template> <div> <p>{{ message }}</p> </div> </template> <script> module.exports = { data: function () { return { message: 'Hello from App component!' } } } </script> <style> p { color: cadetblue; font-weight: bold; font-size: 3.0rem; text-align: center; } </style>
この時、使用エディタにて.vue
ファイルのLintが実行されているかを確認する。
次に、package.json
に下記設定が追加されていることを確認する。
"scripts": { "build": "webpack", "build:server": "webpack-dev-server --hot --host 0.0.0.0" },
確認できたら、Webpackでのビルドを実行する。プロジェクト内にて下記コマンドを実行する。
$ yarn build
yarn
がインストールされていない場合cは、npm run build
と実行する。
ビルドが成功すると、プロジェクトのルート直下に/build
ディレクトリが生成され、配下にbundle.ls
が生成されている。これでビルドが完了である。しかし、実際に動く様子がこのままでは確認ができないので(Vueコンポーネントのマウント先がない)、App.vue
をマウントするための簡単なHTMLファイルを作成する。下記のようなHTMLファイルを/build
直下にindex.html
とし、作成する。
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Index page</title> </head> <body> <div id="app"></div> <script src="bundle.js"></script> </body> </html>
このHTMLファイルの要点としては、bodyタグ内部にて、App.vueコンポーネントのマウント対象のdivファイルが定義されていることと、body内部にてwebpackにてビルドされたbundle.js
がロードされていることである。
index.html
が作成できたら、下記のコマンドを実行する
$ yarn build:server
これは、webpackのビルドコマンドを監視サーバ化したものだ。ビルドコマンドとは異なり、現状の設定ではオンメモリによる変更のみで、`bundle.js`は出力されない。ブラウザでhttp://0.0.0.0:8081/にアクセスをして、画面に「Hello from App component!」と表示されたら正常に動作している。
webpackのビルドサーバは、この先においても使用するので、このままwebpackサーバを立ち上げたままにする。
ここはどちらかというとAppendixのようなもので、既にVueに理解があれば特に読む必要はない。`App.vue`にて呼び出す子コンポーネントを、作成する。`/app`直下に`/components`を作成し、`/components`直下に`Child.vue`を作成する
# プロジェクトのルート直下での実行を想定 $ mkdir ./app/components $ touch ./app/components/Child.vue
`Child.vue`を下記のように記述する。
<template> <p>Hi! I'm child component.</p> </template> <style scoped> p { color: palevioletred; font-size: 2.0rem; } </style>
次に、App.vue
からChild.vue
を読み込み、Childコンポーネントをマウントする。App.vue
を下記のように変更する。変更箇所は、templateタグの内部とscriptタグの内部である。
<template> <div> <p>{{ message }}</p> <child></child> </div> </template> <script> import Child from './components/Child.vue'; module.exports = { data: function () { return { message: 'Hello from App component!' } }, components: { child: Child }, }; </script> <style> p { color: cadetblue; font-weight: bold; font-size: 3.0rem; text-align: center; } </style>
変更が完了したら、ブラウザでhttp://0.0.0.0:8081/にアクセスをし、「Hello from App component!」と表示された直下に「Hi! I’m child component.」と表示されれば、Vueアプリケーションは正常に動作している。
これで、チュートリアルは完了だ。終わったらCtrl + C
でwebpackのサーバを落としてあげるのと、最終的な成果物を保持するために、yarn build
を実行しておく。
Vue Loader | Getting Started
https://vue-loader.vuejs.org/guide/vuejs/eslint-plugin-vue: Official ESLint plugin for Vue.js
https://github.com/vuejs/eslint-plugin-vuevscode-eslint doesn’t work on .vue files · Issue #281 · Microsoft/vscode-eslint
https://github.com/Microsoft/vscode-eslint/issues/281
プログラムを書きながらTranceを聴くのが良いですね。みなさんも聴いたほうがいいですよ、Trance。EDMよりハードトランスでしょ。
Discussion about this post