Slide 1

Slide 1 text

そろそろWebpackと 真剣に向き合ってみる。 NAO-BT

Slide 2

Slide 2 text

自己紹介 文系出身・プログラミング歴は約4年目 サーバーもフロントもやる人になってきてる。 ※できるとは言っていない。日々勉強中

Slide 3

Slide 3 text

JSに関しては 4年前 前の会社の研修でちょこっといじる。 約1年前 Angularの1.4系を前の会社の業務で利用。 徐々にJSの面白みを感じ、個人的にフレームワークを中心に 勉強をはじめる(Angular2,React) 現在 サーバーサイドはPHP(フレームワークはLaravel)、 フロントはVue.jsで業務システムのSPAを作っている。

Slide 4

Slide 4 text

JSのフレームワークで 毎回躓くところ。

Slide 5

Slide 5 text

ビルドまわりがよくわからん。

Slide 6

Slide 6 text

なんで必要なのかわかってないから フレームワークのチュートリアルをやるとき、 大体躓く。 グッタリ _(:3 」∠)_

Slide 7

Slide 7 text

でも最近、 おぜん立てしてもらえるので なんとかなる。 Vue-cli create-react-app Laravel-mix

Slide 8

Slide 8 text

なんとかなってしまった結果・・・ なんとなくわかった気になる。

Slide 9

Slide 9 text

いやいや!! 便利ツールによりかかってるだけで、 理解してないよね!? サポートおわったらどうすんの!?

Slide 10

Slide 10 text

ということで、 JSの知識が少しは身についた今、 もう一度 ビルドまわりと向き合ってみる。

Slide 11

Slide 11 text

とりあえず、 Webpackと向き合ってみる

Slide 12

Slide 12 text

Webpackは各CLIで使われている create-react-appのreact-script Vue-cli

Slide 13

Slide 13 text

そもそもなんで、WebPackを使うの?

Slide 14

Slide 14 text

★★★ Webアプリを効率よく開発するために 分割したモジュールの 名前解決・依存関係を整理してくれる。 ★ TypeScriptやJSXをトランスパイルする。

Slide 15

Slide 15 text

JSの役割がWebサイトの 簡単な装飾程度なら、 そんな必要はなかった。 1ファイルにまとめられる程度の量に収まる。

Slide 16

Slide 16 text

しかし、 非同期通信やDOM操作など 様々な機能をページに盛り込む SPAなサイトを作ろうとすると 大量のJSを書くことになる。 これを一つのファイルに 書き続けることは、かなりしんどい。

Slide 17

Slide 17 text

大量のJSのコードを モジュールごとにわける サブルーチンやデータ構造を役割ごとに分割したものをモジュールと言います。 モジュール同士の依存性を可能な限り減らし、 保守性を高めて再利用可能にすれば、開発もはかどる!

Slide 18

Slide 18 text

フレームワーク利用の利点には DOM操作や非同期通信を簡単に書ける! というのもありますが・・・、 それぞれの思想に沿って使えば 最適なモジュール構成になります。 ・MVVM ・コンポーネント指向

Slide 19

Slide 19 text

そもそも、Javascriptは 「Webのページにちょっと動きを与える言語」 という想定だったので、 言語仕様としてモジュールをサポートしていません。 ビルドツールを使わなければ モジュールパターンというコーディングのテクニックを 使っているにすぎない。 ただし・・・

Slide 20

Slide 20 text

そのまま、開発しようとすると タグがこんなことに・・・。

Slide 21

Slide 21 text

JSの悩ましいモジュールの実情 グローバルオブジェクト内の競合や 読み込む順番を間違えると、エラーが起きるので どんなモジュールがあるか開発者は把握していないといけない。 システムが大きくなればなるほど、 タグ内のリストが長くなる。

Slide 22

Slide 22 text

それを ビルドを通して解決する JS JS JS JS JS JS JS

Slide 23

Slide 23 text

ビルドとは 複数のソースコードを基に 組み合わせて 実行ファイルを生成する作業。 この中でモジュール間の 名前解決、依存関係の解決を行っている。

Slide 24

Slide 24 text

Webpackは まずはこれさえ、 分かれば怖くない。 Entry Output Loaders Plugins

Slide 25

Slide 25 text

Entry コンテキストルートとなるファイルの指定。 そのファイルから依存関係を追跡するようにwebpackに指示します。 Webpack.config.js entry.js module1.js

Slide 26

Slide 26 text

Output ビルド結果の出力に関する指定。 filenameはビルド後に出力されるファイル名、pathはそのファイルの出力先 Webpack.config.js Index.html

Slide 27

Slide 27 text

Loaders ビルドの際にモジュールのソースコードに適用される変換を指定します。 これの利用でJS以外の拡張子(jsx/vue/ts/css/img) のものもビルドできるようになります。 package.json 拡張子がcssのファイルをjsに 変換するためLoderを npm install する 拡張子がcssのファイルにインストールした Loaderを使うよう指定 Webpack.config.js

Slide 28

Slide 28 text

Loaders entry.js modulecss.css Index.html

Slide 29

Slide 29 text

Loadersではまったところ testってしないとビルドが通らない! Webpack.config.js package.jsonのscriptsみたいに自由に書き換えられるのかと思いきや・・・

Slide 30

Slide 30 text

Plugins ビルド時の設定を行います。 ビルドする際にファイルの圧縮をおこなったり(UglifyJsPlugin)、 コンパイルエラーが起きてもスキップする設定ができる(NoErrorsPlugin)。

Slide 31

Slide 31 text

Webpack 2になって変わったこと① Webpackはver2からES2015でjavascriptの新しい言語仕様に採用された import・exportが使えます。 このほかのES2015の仕様を利用したい場合は、LodersでBabelを使用する必要があります。 entry.js module1.js

Slide 32

Slide 32 text

Webpack 2になって変わったこと② TreeShakingという機能が加わり、 exportしているけどimportされていない モジュールはプロダクションビルドの際に 含まれなくなった。

Slide 33

Slide 33 text

まだまだ勉強が必要・・・ 「インストールしたフレームワークなどのライブラリーと 開発で作ったアプリケーションのコードはビルドの際には分けておいたほうがいい。」 と言われて、laravel-mix上ではできたんですが、素のwebpackではできなかった・・・。 他にも効率の良いビルドの設定の追求を目指し、お助けツールに頼ってばかりにならないよう チュートリアルを読み込みながら頑張りたい・・・

Slide 34

Slide 34 text

つたない発表ですみません。 ご清聴ありがとうございました。