Webpack4とBabel7とnode-sassによるWebページ作成環境を構築する
ちょっとしたWebサイトの開発にWebpack4とBabel7とnode-sassの 環境を整えたのでメモします。
ディレクトリ構造
ディレクトリ構造は次のとおりです。
├─ dist
├─ src
│ ├─ script
│ │ └─ main.js
│ └─ style
│ └─ style.scss
├─ .babelrc
├─ .browserslistrc
├─ .eslintrc.js
├─ package.json
└─ webpack.config.js
src
以下が開発用ディレクトリでdist
が出力用ディレクトリです。
パッケージのインストール
Webpack
JavaScriptのバンドル用にWebpackをインストールします。
npm install -D webpack webpack-cli
Babel
Babel本体と、WebpackでBabelを扱うためにbabel-loader
をインストールします。
@babel/preset-env
の他にOptional Chainingも使いたいので入れます。
npm install -D @babel/core @babel/preset-env @babel/plugin-proposal-optional-chaining babel-loader
npm install @babel/polyfill
Sass
WebpackでSassをコンパイル及びバンドルすることもできますが、
jsファイル内にCSSのimport
を書く必要があって気持ち悪いのでnode-sass
および
postcss-cli
をnpm scripts
内で直接使うことにします。
Webpackはjsのバンドル専用とします。
node-sass
でScssのコンパイルを行います。
その後PostCSSのautoprefixerでprefixの付与をし、
postcss-cleanでcssを圧縮します。
npm install -D node-sass postcss-cli autoprefixer postcss-clean
ESLint
ESLintをインストールします。
BabelのパーサをESLintで利用するためにbabel-eslint
をインストールします。
npm install -D eslint babel-eslint
その他
npm scripts
を便利にするためnpm-run-all
を入れます。
その他、ファイルの変更の監視とオートリロードのためにwatch
とbrowser-sync
を入れます。
npm install -D npm-run-all browser-sync watch
設定ファイル
webpack.config.js
const path = require('path')
module.exports = {
entry: './src/script/main.js',
output: {
filename: 'bundle.js',
path: path.join(__dirname, 'dist')
},
module: {
rules: [
{
test: /\.js$/,
use: {
loader: 'babel-loader'
}
}
]
}
}
mode
はcliの引数で渡します。
.babelrc
{
"presets": [
[
"@babel/env",
{
"useBuiltIns": "usage"
}
]
],
"plugins": ["@babel/plugin-proposal-optional-chaining"]
}
useBuiltIns
を"usage"
にすることで必要なものだけpolyfillを読み込んでくれるそうです。
.browserslistrc
last 1 version
not dead
Babelのpreset-env
とautoprefixer
で使われます。
基本的に最新版と1つ前のバージョンまで対応します。
使用率が極端に低いものと公式サポートが切れているものは除いています。
.eslintrc.js
eslint --init
でコンフィグファイルを作成します。
必要なパッケージのインストールも行ってくれる便利なやつです。
npx eslint --init
Babelのパーサを使うためにコンフィグファイルを修正します。
module.exports = {
parser: 'babel-eslint',
extends: 'standard'
}
StandardJSスタイルにしました。
npm scripts
npm script
は次のとおりにします。
{
"scripts": {
"build:scss": "node-sass src/style/style.scss -o tmp/",
"build:postcss": "postcss tmp/*.css -u autoprefixer -d dist",
"build:style": "npm-run-all -s build:scss build:postcss",
"build:js": "webpack --mode=development",
"build": "npm-run-all -p build:js build:style",
"watch:style": "watch \"npm run build:style\" ./src/style/",
"watch:js": "watch \"npm run build:js\" ./src/script/",
"watch:server": "browser-sync start --server dist --files dist/*",
"watch": "npm-run-all -p watch:*",
"release:scss": "node-sass src/style/style.scss -o tmp/",
"release:postcss": "postcss tmp/*.css -u autoprefixer postcss-clean -d dist --no-map",
"release:style": "npm-run-all -s release:scss release:postcss",
"release:js": "webpack --mode=production",
"release": "npm-run-all -p release:js release:style"
}
}
開発時のbuild
と本番用のrelease
があります。
また、開発時用にwatch
も用意してあります。
build:scss
でスタイルは最初にtmp/
へScssをコンパイルし出力します。
build:postcssで
PostCSSのautoprefixer
をかけています。
build:style
ではこの2つをnpm-run-all
でまとめています。
build:js
でwebpack
をdevelopment
Modeで実行しています。
build
でbuild:js
とbuild:style
を並列に実行します。
watch:style
ではscssファイルの変更をwatch
で監視し、
変更があった際にはbuild:style
を実行しています。
watch:js
ではjsファイルの変更をwatch
で監視し、
変更があった際にはbuild:js
を実行しています。
watch:server
でbrowser-sync
を起動しています。
watch
でwatch:style
とwatch:js
、watch:server
を起動しています。
release
ではbuild
とほとんど同じで、追加でCSSにpostcss-clean
をかけて
Webpackをproduction
Modeで実行しています。
package.json全文
package.jsonは次のとおりになります。
{
"name": "project",
"version": "1.0.0",
"dependencies": {
"@babel/polyfill": "^7.0.0",
"babel-loader": "^8.0.1"
},
"devDependencies": {
"@babel/core": "^7.0.0",
"@babel/plugin-proposal-optional-chaining": "^7.0.0",
"@babel/preset-env": "^7.0.0",
"autoprefixer": "^9.1.3",
"babel-eslint": "^9.0.0",
"browser-sync": "^2.24.7",
"eslint": "^5.5.0",
"eslint-config-standard": "^12.0.0",
"eslint-plugin-import": "^2.14.0",
"eslint-plugin-node": "^7.0.1",
"eslint-plugin-promise": "^4.0.0",
"eslint-plugin-standard": "^4.0.0",
"node-sass": "^4.9.3",
"npm-run-all": "^4.1.3",
"postcss-clean": "^1.1.0",
"postcss-cli": "^6.0.0",
"watch": "^1.0.2",
"webpack": "^4.17.1",
"webpack-cli": "^3.1.0"
},
"scripts": {
"build": "npm-run-all -p build:js build:style",
"build:js": "webpack --mode=development",
"build:postcss": "postcss tmp/*.css -u autoprefixer -d dist",
"build:scss": "node-sass src/style/style.scss -o tmp/",
"build:style": "npm-run-all -s build:scss build:postcss",
"release": "npm-run-all -p release:js release:style",
"release:js": "webpack --mode=production",
"release:postcss": "postcss tmp/*.css -u autoprefixer postcss-clean -d dist --no-map",
"release:scss": "node-sass src/style/style.scss -o tmp/",
"release:style": "npm-run-all -s release:scss release:postcss",
"watch": "npm-run-all -p watch:*",
"watch:js": "watch \"npm run build:js\" ./src/script/",
"watch:server": "browser-sync start --server dist --files dist/*",
"watch:style": "watch \"npm run build:style\" ./src/style/"
}
}