webpack 〜導入編〜
category:web
webpack導入の備忘録
必要最低限の環境構築を目指す。
initからpackege.json作成、webpackインストール
node.jsインストール済みが前提。
package.jsonファイルを生成
npm init -y
webpackをdevDependenciesにインストール
npm i -D webpack webpack-cli
package.jsonの中身の整理
{ "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "devDependencies": { "webpack": "^5.65.0", "webpack-cli": "^4.9.1" }, "private": true }
webpack.config.jsと最低限のファイルを用意
├ /dist │ ├ main.js │ └ index.html ├ /src │ └ index.js │ └ webpack.config.js
pathを呼べるようにインストールしておく
npm i -D path
dev-serverも使うのでインストール
npm i -D webpack-dev-server
webpack.config最初はこんな感じに。
const path = require('path') module.exports = { entry: `./src/index.js`, mode: "development", output: { path: path.resolve(__dirname, 'dist'), filename: "main.js" }, devServer: { static: "dist", open: true } };
package.jsonにbuild, serve, watch コマンドを追記しておく
{ "main": "index.js", "scripts": { "build": "webpack", "start": "webpack serve", "watch": "webpack --watch" }, "devDependencies": { "path": "^0.12.7", "webpack": "^5.65.0", "webpack-cli": "^4.9.1", "webpack-dev-server": "^4.6.0" }, "private": true }
トランスパイラのBabelを使っておきたい
ECMAScript 2015に対応してないブラウザがまだなくなったわけではないので、Babelでトランスパイルする構成を作っておく。
npmモジュールのインストール
npm install -D babel-loader @babel/core @babel/preset-env
webpack.config.jsにbabelのruleを追記する
const path = require('path') module.exports = { entry: `./src/index.js`, mode: "development", output: { path: path.resolve(__dirname, 'dist'), filename: "main.js" }, module: { rules: [ { test: /\.js$/, use: [ { loader: "babel-loader", options: { presets: [ "@babel/preset-env", ], }, }, ], }, ], }, target: ["web", "es5"], devServer: { static: "dist", open: true } };
style(sass)もコンパイルしたい
cssバンドル、sassコンパイル、Autoprefixerを使うためのpostcssと、それぞれ必要なモジュールをインストール
npm i -D style-loader css-loader sass sass-loader postcss postcss-loader autoprefixer
webpack.config.jsに .scss
ファイルに対しての設定を追記
const path = require('path') const MODE = "production"; const sourceMap = MODE === "development" module.exports = { entry: `./src/index.js`, mode: MODE, output: { path: path.resolve(__dirname, 'dist'), filename: "main.js" }, module: { rules: [ { test: /\.js$/, use: [ { loader: "babel-loader", options: { presets: [ "@babel/preset-env", ], }, }, ], }, { test: /\.scss/, use: [ "style-loader", { loader: "css-loader", options: { url: false, sourceMap: sourceMap, importLoaders: 2 } }, { loader: "postcss-loader", options: { postcssOptions: { plugins: [ ["autoprefixer", { grid: true }], ], }, }, }, { loader: "sass-loader", options: { sourceMap: sourceMap }, }, ], }, ], }, target: ["web", "es5"], devServer: { static: "dist", open: true } };
package.jsonにも対象ブラウザの指定を追記しておく
"browserslist": [ "last 2 version", "ie >= 11" ]
テンプレートエンジンやその他asettsの扱い方などはまた続きで。