昨日の上記エントリへの追記
TODO
- htmlファイルをdist以下に作成していましたが、frontendのファイルはsrc以下に管理します。
- webpackでコンパイルしたらdist以下にhtmlファイルも出力させます
- html-webpack-pluginを使います
install
$ yarn add -D html-webpack-plugin $ yarn add -D html-loader
webpack.config.js
html-webpack-plugin と html-loader を加えてコンパイルの設定を更新する
const src = __dirname + "/src"; const dist = __dirname + "/dist" var webpack = require('webpack'); const UglifyJSPlugin = require('uglifyjs-webpack-plugin') const HtmlWebpackPlugin = require('html-webpack-plugin') module.exports = { context: src, entry: "./js/index.js", output: { path: dist, filename: "index.min.js" }, devServer: { contentBase: dist, port: 3000 }, module: { loaders: [ { test: /\.js$/, exclude:/node_modules/, loader: "babel-loader", query: { presets:[ ["env", { "targets": { "node": "current" } }] ] } }, { test: /\.html$/, loader: "html-loader" } ] }, plugins: [ new UglifyJSPlugin(), new HtmlWebpackPlugin({ template: "./html/index.html" }) ] };
ディレクトリの変更
- root
- src
- js
- index.js
- html
- index.html
- dist
- 出力先
index.htmlを作成する
src/html/index.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>test</title> </head> <body> hello world </body> </html>
コンパイルする
$ yarn run build
yarn run v1.1.0
$ yarn run --config webpack
Hash: 1c4cb048a83c8c452b7b
Version: webpack 3.6.0
Time: 577ms
Asset Size Chunks Chunk Names
index.min.js 814 bytes 0 [emitted] main
index.html 195 bytes [emitted]
[0] ./js/index.js 400 bytes {0} [built]
[1] ./js/person.js 171 bytes {0} [built]
Child html-webpack-plugin for "index.html":
1 asset
[0] ../node_modules/html-webpack-plugin/lib/loader.js!./html/index.html 168 bytes {0} [built]
✨ Done in 1.71s.
※ build は package.json で新しくscriptsに追加したカスタムビルドコマンド
生成された index.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>test</title> </head> <body> hello world <script type="text/javascript" src="index.min.js"></script></body> </html>
コンパイルした index.min.js が script タグに入ってちゃんと生成されている。
この状態で webpack-dev-server を動かしてちゃんと動作するかを確認する
おまけ
複数のhtmlファイルをコンパイルしたい
refs: https://github.com/jantimon/html-webpack-plugin#generating-multiple-html-files
SPAならindex.htmlだけ作成してそこにSPAの要素を追加していくのもありであるが、複数のhtmlファイルを出力したい場合がある。
そういう場合は html-webplack-plugin はデフォでは index.html しか出力しないが、別のファイルを新しくpluginで指定してfile名とコンパイル対象のtemplateを指定すれば良い。
// 略 plugins: [ // index new HtmlWebpackPlugin({ template: "./html/index.html" }), // その他 new HtmlWebpackPlugin({ filename: "admin.html", template: "./html/admin.html" }) ]
$ ls dist/ admin.html index.html
htmlファイルが複数出力されている
所感
webpack一発でフロントエンドの環境が構築されるっていうのはこういうことかってわかってきた。
今回はベタなhtmlをそのままコンパイルしているがテンプレ(ejsファイルとか)をコンパイルすることも可能