素のフロントエンド JavaScript プロジェクトを作成する手順 - 2021 ver -
- 素の JavaScript プロジェクトを作成して
npm start
でローカルで動かせるところまで試した手順のメモ
ディレクトリを作成
mkdir myapp && cd myapp
npm の準備
npm init --yes
npm-init | npm Docs
https://docs.npmjs.com/cli/v7/commands/npm-init
html, js ファイルを作成
mkdir ./src
touch index.html ./src/app.js
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Getting Started</title>
</head>
<body>
<h1>Hello!</h1>
<script src="main.bundle.js"></script>
</body>
</html>
app.js
console.log("Hello!");
webpack 関連のパッケージインストール
npm install --save-dev webpack webpack-cli copy-webpack-plugin webpack-dev-server
npm-install | npm Docs
https://docs.npmjs.com/cli/v7/commands/npm-install
- webpack: https://webpack.js.org/
- js, css などのアセットの依存関係を解決して bundle したファイルを作成してくれるツール
- webpack-cli: https://webpack.js.org/api/cli/
- webpack のコマンドラインツール
- copy-webpack-plugin: https://webpack.js.org/plugins/copy-webpack-plugin/
- webpack のプラグインの 1つ
- 既に存在しているファイルやディレクトリをビルドディレクトリにコピーしてくれる
- webpack-dev-server: https://webpack.js.org/configuration/dev-server/
- アプリケーションを素早く開発ために使用できる Web サーバーツール
- https://webpack.js.org/guides/development/
webpack セットアップ
touch webpack.config.js
webpack.config.js
const CopyWebpackPlugin = require('copy-webpack-plugin');
const webpack = require('webpack');
const path = require('path');
module.exports = {
mode: 'development',
entry: './src/app.js',
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist')
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/
}
]
},
devServer: {
contentBase: './dist',
overlay: true,
hot: true
},
plugins: [
new CopyWebpackPlugin({
patterns: ['index.html']
}),
new webpack.HotModuleReplacementPlugin()
]
};
module.exports
- CommonJS の syntax
- https://nodejs.org/api/modules.html#modules_module_exports
- オブジェクトを外部からロード可能にする
- 今回の場合、設定したオブジェクトが webpack によって使用される
mode
- https://webpack.js.org/configuration/mode/
- webpack の最適化オプション
entry
- https://webpack.js.org/configuration/entry-context/#entry
- アプリケーションのバンドリ処理を開始するポイント
- 配列で複数のアイテムを指定することも可能
- 1つ の HTML ページにつき 1つ のエントリーポイント
- そのため SPA を作るならエントリーポイントは 1つ となる
output
- https://webpack.js.org/configuration/output/
- バンドル、アセット、その他 webpack でバンドルやロードしたものを出力する設定
filename
- https://webpack.js.org/configuration/output/#outputfilename
- 出力されるバンドルファイル名
path
- https://webpack.js.org/configuration/output/#outputpath
- バンドルファイルの出力先となるディレクトリの絶対パス
module
- https://webpack.js.org/configuration/module/
rules
- https://webpack.js.org/configuration/module/#modulerules
- https://webpack.js.org/configuration/module/#rule
- bundle を行うルールの配列
test
exclude
devServer
- https://webpack.js.org/configuration/dev-server/
- 開発用サーバー
contentBase
- https://webpack.js.org/configuration/dev-server/#devservercontentbase
- devServer でホストするディレクトリ
overlay
- https://webpack.js.org/configuration/dev-server/#devserveroverlay
- コンパイラでエラーや警告が発生した際に、ブラウザにオーバーレイで表示を行うか否か
hot
- https://webpack.js.org/configuration/dev-server/#devserverhot
- Hot Module Replacement (HMR) を有効化するか否か
- https://webpack.js.org/concepts/hot-module-replacement/
- いわゆるホットリロード
- アプリケーション実行中にフルリロードすることなく、モジュールの交換・追加・削除を行う
- ソースコード内の CSS/JS に変更が行われた場合、ブラウザを即座に更新する
plugins
- https://webpack.js.org/configuration/plugins/
- webpack のプラグイン設定
new CopyWebpackPlugin
- https://webpack.js.org/plugins/copy-webpack-plugin/
- 既存のファイルやディレクトリをビルドディレクトリにコピーするプラグイン
patterns
- https://webpack.js.org/plugins/copy-webpack-plugin/#patterns
- コピーリソースのパターン指定
new webpack.HotModuleReplacementPlugin
- https://webpack.js.org/plugins/hot-module-replacement-plugin/
- HMR を有効化するプラグイン
package.json の scrips をセットアップする
{
...
"scripts": {
"start": "webpack && webpack serve --mode development",
"build": "webpack"
}
}
package.json の scripts
- https://docs.npmjs.com/cli/v7/using-npm/scripts
- 定義したコマンドを
npm run xxx
というスタイルで実行可能となるスクリプト
webpack
- webpack のコマンドライン実行
webpack serve
- webpack cli から
webpack-dev-server
を実行する - https://webpack.js.org/configuration/dev-server/
--mode development
- https://webpack.js.org/api/cli/#flags
- webpack の mode 指定
- webpack cli から
動作確認
npm run start
- http://localhost:8080 にアクセスして Web サイトが表示されるか確認
- app.js や index.html を変更してみて、ホットリロードされるか確認
github repository
https://github.com/noid11/my-js-app
この記事を試した環境
% sw_vers
ProductName: macOS
ProductVersion: 11.4
BuildVersion: 20F71
% npm --version
7.20.1
package.json
{
"name": "my-js-app",
"version": "1.0.0",
"description": "- my javascript app initialize template",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "webpack && webpack serve --mode development",
"build": "webpack"
},
"repository": {
"type": "git",
"url": "git+https://github.com/noid11/my-js-app.git"
},
"keywords": [],
"author": "",
"license": "ISC",
"bugs": {
"url": "https://github.com/noid11/my-js-app/issues"
},
"homepage": "https://github.com/noid11/my-js-app#readme",
"devDependencies": {
"copy-webpack-plugin": "^9.0.1",
"webpack": "^5.46.0",
"webpack-cli": "^4.7.2",
"webpack-dev-server": "^3.11.2"
}
}