webpack 4って何? ハンズオンを通してさらっと理解する
webpack 4ハンズオン
webpackって何?
webpackとは、複数のjsファイルをまとめるためのモジュールバンドラーです
モジュールバンドラーって何?
モジュールは部品です。 部品同士を1つにまとめ上げるためのものです。ドラえもんのメカ・メーカーみたいですね。
どうしてwebpackを使うの?
HTTP/1.1接続では、ウェブサーバーとブラウザの同時接続数が限られているため、多くのファイルを読み込むと時間がかかります。
そこでwebpackで複数のjsファイルを1つにまとめることで転送量を少なくします。
webpackは複数のjsをまとめる(ES modulesという仕組み)だけではなく、es2015を使ったモダンなjsの書き方を理解し、レガシーな記述へコンパイルしてくれたりもしてくれます。(アロー関数を、ちゃんとfunctionに直してくれたりです。)
さらにCSSや画像もjsファイルとしてまとめることができます!
webpackハンズオン
webpackの導入
最初に作業する場所を用意して下さい。
コマンド
cd /Users/MyName/myproject
続いてpackage.jsonを作りましょう
コマンド
cd myproject // myprojectへ移動
npm init -y
このようになりました。
続いてwebpackをインストールします。
コマンド
npm i -D webpack webpack-cli
* i は install の命令です。-Dはインストール先をdevDependenciesに指定するものです。
devDependenciesにwebpackが追加されたかと思います。
はい、これだけでwebpackを資料できる環境が整いました。
webpackを使ってみる
webpackを使って複数のjsをまとめてみましょう。
index.jsと、sub.js作成し、下のjsを書いて下さい。
index.js
// import 文を使って sub.js ファイルを読み込む。
import { hello } from "./sub";
// sub.jsに定義されたJavaScriptを実行する。
hello();
sub.js
export function hello() {
alert("hello");
}
exportというのは、どこかで呼び出されて使われることを前提とするという決まり文句です。これがないとimportしても呼び出せません。*
export defaultって何?
それでは動かしましょう
コマンド
npx webpack
コンパイルに失敗しましたか?
この状態ではエラーとなると思います
src ディレクトリを作成し、index.jsとsub.jsを移動して下さい。
もう一度npx webpackして下さい、成功したかと思います!
distディレクトリが自動的に作られ、main.jsが誕生しました。そのjsの中にindex.jsの内容とsub.jsの内容が1つとなっています。
適当なhtmlファイルを作成し、読み込んでみましょう
アラートが出れば成功です。
今回は小さなモジュールとしてsub.jsを用意しました。
こういった小さなモジュールを作成することで、管理やテストもしやすいのがwebpackの利点の1つです。
package.jsonをカスタマイズ
では続いて、package.jsonファイルをカスタマイズし、npm scriptsとして実行してみましょう。
package.jsonに下記を追加して下さい。
"scripts": {
"build": "webpack"
},
"private": true,
こんな感じです。
そしてこのコマンドを叩いてみましょう。
コマンド
npm run build
同じようにwebpackがビルドできましたか?
webpack.config.jsをカスタマイズ
次にwebpack.config.jsを用いて、webpackの動作をカスタマイズしてみましょう。
コマンド
touch webpack.config.js
まずは entryとoutputを設定します、この2つは必ず理解して下さい。
これはメインとなるJavaScriptファイルと出力先を意味します。
webpack.config.jsに書き加えましょう
module.exports = {
// メインとなるJavaScriptファイル(エントリーポイント)
entry: `./src/index.js`,
// ファイルの出力設定
output: {
// 出力ファイルのディレクトリ名
path: `${__dirname}/dist`,
// 出力ファイル名
filename: "main.js"
}
};
この設定は、webpack.config.jsを用意しない、デフォルトの挙動を書き記したものです。
webpackを起動しても出力されるものには何も影響はありません。
それでは試しに、filenameをmain.jsから違うものに変更し、npm run buildコマンドを叩くとどうなるか確認しましょう。
コードの圧縮とソースマップ
開発中にjsファイルが圧縮された状態だと、元のソースファイルとの関連性がわかりにくい状態です。
そんな時は開発モードとして圧縮せずにバンドルしてみましょう。
webpack.config.jsに1行追加して下さい。
module.exports = {
mode: "development" , // 追加した
entry: `./src/index.js`,
:
:
};
この状態で npm run build すると、先ほどまで圧縮されていたmain.jsファイルが非圧縮の状態でコンパイルされたことが確認できるはずです。
違いは明らかですね。
Jsの書き換えによって自動的にwebpackを動作させよう
jsを変更して毎回 npm run build と入力するのはかなり面倒です。
ファイルの変更を検知(watch)して、webapckを自動的に動作させましょう。
まずは webpack-dev-server を手に入れます。
コマンド
npm i -D webpack-dev-server
package.jsonにwebpack-dev-serverが加わりました
続いて、webpack-dev-serverを動かすためのコマンドも\*\*package.jsonファイル\*\*に用意しましょう。
{
"scripts": {
"build": "webpack",
"start": "webpack-dev-server",
:
:
続いて、webpack.config.jsに下記を加えます。
module.exports = {
mode: "development" , // 追加した
entry: `./src/index.js`,
:
:
//distディレクトリのindex.htmlを見るようになる
devServer: {
contentBase: "dist",
open: true
}
};
distディレクトrにindex.jsを入れてmain.jsを読み込んでください。
そして npm run start にてwebpackを起動させます。
このようになり、http://localhost:8080/が自動的に立ち上がります。
それではsub.jsの中身にあるalertを変更してみて下さい。どうですか?変更を検知してブラウザが更新されましたか?
まとめ
いかがでしたでしょうか、今回はタイトルにもありますようにハンズオンを通してさらっと理解する事を目的としてこのエントリーを描きました。
開発の現場では、
- jsの複数出力したい!
- scssを使いたい
- リリース用のファイルを作る時はソースマップ不要
といったような様々な要望があるかと思います。
これら全てできます!
また別の記事にてその辺りはご紹介します。
それでは今回は以上です。