webpack はじめ方

## この内容について
この内容は、私が運営しているサイトに、より見やすく掲載しているので、よければそちらもご活用ください。
[【webpack】 導入手順 | コレワカ](https://korenarawakaru.com/tech/webpack/webpack-start)

今回紹介する内容には、Sassのバンドルも含めていますので、Sassを使いたい人にもおすすめです。

## webpackとは
オープンソースのJavaScriptモジュールバンドルのこと。
CSSやJavaScriptなどの複数のファイルを1つのファイルにまとめることが可能。

## webpackのメリット
多くのCSSやJavaScriptなどのファイルを1ページで読み込むとリクエスト数が増加してしまうため、
ページの表示速度が遅くなるなどのデメリットがあります。
それをwebpackを使って、1つのファイルにすることでリクエスト数が減り、ページ表示速度が速くなるなど
のメリットを得られます。
同時に最終的に1つにすれば良いので、開発時はファイルを分割して管理することも可能なので、開発効率の
アップにもつながります。

## はじめ方
### プロジェクトを作成する
好きな名前でフォルダを作成します。

```terminal:ターミナル
mkdir dir
```

![webpack1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/499806aa-6c85-adfd-2713-1bc297513603.png)

### フォルダ配下に移動
作成したフォルダ配下に移動します。

```terminal:ターミナル
cd dir
```

![webpack2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/ad94ab12-75b2-a1f2-ada4-2ec69e1e6312.png)

### npm初期化
npm管理下にする初期化処理のコマンドを実行します。

```terminal:ターミナル
npm init -y
```

![webpack3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/88fb33af-47a9-a5c4-193b-b7c39abde3d3.png)

### webpackインストール
webpackをインストールするコマンドを実行します。
今回はSassも使えるような構成です。
Sassを使わない場合は、sass-loader以降は記述しなくて良いです。

```terminal:ターミナル
npm i -D webpack webpack-cli sass-loader node-sass style-loader css-loader
```

![webpack4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/b395c1d2-034c-56a3-1786-5ec53a1597b4.png)

### configファイル作成
webpack.config.jsという名前でファイルを作成します。

```terminal:ターミナル
touch webpack.config.js
```

![webpack5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/cd617ce4-f905-cdfc-84e1-72241919227b.png)

### configファイルの中身の記述
webpack.config.jsの中身を記述します。
modeは'production'と'development'があり、
'production'は本番環境用のバンドル(よりコンパクトな記述)で、
'development'は開発用のバンドル(より見やすい記述)で使い分けできます。(今回は'development')
entryに、バンドルするエントリーポイントとなるJavaScriptファイルを指定します。
outputに、バンドルされたファイルを出力する場所を指定します。
moduleの部分で詳細な設定ができ、今回はSassファイル(SCSSファイル)のバンドルもできるようにしています。

```js:webpack.config.js
const path = require('path');
module.exports = {
  mode: 'development',
  entry: './src/js/entry.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'src')
  },
  module: {
    rules: [
      {
        test: /.scss$/,
        use: [
          "style-loader",
          "css-loader",
          "sass-loader"
        ]
      }
    ]
  }
};
```

![webpack6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/288c57ec-0c90-f858-8d20-1e77bdc96133.png)

### srcフォルダの作成
srcという名前でフォルダを作成します。

```terminal:ターミナル
mkdir src
```

![webpack7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/c2cde5e6-1af0-d877-5ec4-432acae31c0a.png)

### src配下に移動
作成したsrcフォルダ配下に移動します。

```terminal:ターミナル
cd src
```

![webpack8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/03fae86d-7a5e-2735-4a05-662a8cd85e1f.png)

### バンドルファイル作成
バンドルして出力されるファイルを作成します。

```terminal:ターミナル
touch bundle.js
```

![webpack9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/66b48b0e-0bd0-3562-8993-8ab6a7c2b797.png)

### js・stylesファイル作成
js・stylesという名前でフォルダを作成します。
jsフォルダ配下にjsファイルを置いて、stylesフォルダ配下にSassファイルを置きます。

```terminal:ターミナル
mkdir js styles
```

![webpack10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/dcff588a-6e83-32cc-0aeb-2a78dedfd064.png)

### js配下に移動
作成したjsフォルダ配下に移動します。

```terminal:ターミナル
cd js
```

![webpack11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/2a6b73eb-fbfd-99d9-3e81-f42e9ee4cc9c.png)

### バンドルの元となるファイルを作成
entry.jsという名前でファイルを作成します。

```terminal:ターミナル
touch entry.js
```

![webpack12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/6769e732-5f2e-61ab-4339-f3d1637e0576.png)

### バンドルの元となるファイルの中身の記述
entry.jsの中身を記述します。

```js:entry.js
// 〇〇の部分にバンドルしたいjsファイル名
import "./〇〇.js";
// 〇〇の部分にバンドルしたいSassファイル名
import "../styles/〇〇.scss";
```

![webpack13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/37dee869-fb45-b6bc-ab5b-1035be7c6514.png)

### package.jsonの書き換え
package.jsonファイルを開き、一部分を書き換えます。

```json:package.json
"scripts": {
  "test": "echo "Error: no test specified" && exit 1",
  "build": "webpack"
}
```

![webpack14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/ee10d39d-f8c5-4cae-7f8e-6065a2719d79.png)

### プロジェクトフォルダ配下に移動
プロジェクトフォルダ配下に移動します。

```terminal:ターミナル
cd ../..
```

![webpack15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/0cfcfa28-2c95-26e8-9130-3cb0bef9c23c.png)

### バンドルするコマンド実行
npm run buildのコマンドでwebpackコマンドを実行させます。

```terminal:ターミナル
npm run build
```

![webpack16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/ec8c5012-022c-51ae-4131-52229ea2154c.png)

### バンドルされたファイルを記述
バンドルされたjsファイル(bundle.js)を読み込みます。

```html:HTML
<script src="./src/bundle.js"><script>
```

![webpack17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/f21fd5fc-bd7d-3ff1-be64-d137013a7e20.png)

### 最終的なファイル構成

```
- index.html
- node_mudules
- package.json
- src
    - bundle.js
    - js
        - entry.js
        - 〇〇.js
    - styles
        - 〇〇.scss
- webpack.config.js
```

![webpack18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/473780/e8a8ee82-3069-7440-aae4-672fb718c662.png)

## まとめ
今回紹介した手順通りにやるだけで、webpackを使えるようになると思いますので、どんどん利用していきましょう。
webpackはTwitterなどでも利用されている技術で、フロントエンドエンジニアには必須だろうと個人的に思いますので、
この記事を活用しながら、是非使ってみてください(^^)

それから、webpackは、CSSやJavaScriptだけでなく、画像やFontawesomeなどのアイコンもバンドルすることが
できます。その手順に関しては、別記事にして紹介したいと思いますので、是非今後も僕の記事を読んでいただければと
思います(^^)

この記事が良いと思った方は、LGTMをしていただければ嬉しいです！
フォローも是非お願い致します(^^)