webpackでHTMLのheadやbodyに要素を追加する

Webフロントエンドの実装をするときって React を使うことが多いんですが、その際の環境構築は create-react-app を使って開発に入っていました。

この間ふと webpack.config ~ を自分で書いてみたくなって、その中で HTML 側でやりたいことができて調べてやってみたのでその覚書です。

環境周り

  • webpack 4.43.0
  • webpack-cli 3.3.11

やりたかったこと(試したかったこと)

  • index.htmlには最低限だけ書いておく
  • JSファイルみたいな生成するものは、HTMLでの読み込みファイル名にクエリを付ける

まだできていないこと

  • reset CSS系のファイルはJSに入れないで、HTMLのheadタグ内に追加する

やったこと

html-webpack-plugin でほとんど達成できた。

html-webpack-plugin を plugins で指定して、オプションで inject と hash を入れた。
inject はそもそも要素を追加するか/しないかみたいな話と、追加する場合にどこにかっていう指定ができる。 (追加する順番まではわからない…)

const path = require('path')
const webpack = require('webpack')
const HtmlWebpackPlugin = require("html-webpack-plugin");


module.exports = {
  entry: './src/index.tsx',
  output: {
    path: path.resolve(__dirname, 'build'),
    publicPath: '/',
    filename: '[name].js'
  },
  :
  plugins: [
      new HtmlWebpackPlugin({
      template: path.resolve(__dirname, 'public/index.html'),
      inject: 'body',
      hash: true,
    })
  ]
}

public/index.html は以下のような内容。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Hello</title>
</head>
<body>
  <noscript>
    You need to enable JavaScript to run this app.
  </noscript>
  <div id="root"></div>
</body>
</html>

VSCodeのEmmet拡張でテンプレートを展開して root の要素を置いただけ。

ビルドすると、 <script src="/main.js?9f42faeda8e1663136f1"></script> みたいなハッシュクエリ付きの読み込み指定が入った script タグが追加されて、 build/index.html が生成される。

ejs 使う記事が結構出てくるんだけど、それはちょっとと思って避けたらこのプラグインだけでできた。

ただ、以下についてはまだ分かってなくて、とりあえず index.tsx で import かけてる。

reset CSS系のファイルはJSに入れないで、HTMLのheadタグ内に追加する

mini-css-extract-plugin でできそう
MiniCssExtractPlugin | webpack

やってみて

いじりだすと色々できるんだけど、本筋じゃないところで凝り始めそうなので、暇な時にガッと作って置いとくほうがいいかなーと思った。