tag:crieit.net,2005:https://crieit.net/tags/clean-webpack-plugin/feed 「clean-webpack-plugin」の記事 - Crieit Crieitでタグ「clean-webpack-plugin」に投稿された最近の記事 2022-08-24T23:53:31+09:00 https://crieit.net/tags/clean-webpack-plugin/feed tag:crieit.net,2005:PublicArticle/18287 2022-08-24T23:45:46+09:00 2022-08-24T23:53:31+09:00 https://crieit.net/posts/clean-dist-folder-by-webpack 【JS/Webpack】ビルドしたフォルダの不要ファイルを削除する <p>こんにちは、しきゆらです。今回は、Webpackでビルドしたものが出力されるフォルダにできる不要ファイルを削除する方法を知ったのでメモしておきます。</p> <p>WebpackでJSのコードをビルドしていると、結構な頻度で不要なファイルができたりします。例えば、デバッグ用に生成したソースマップファイルがそのまま残っていたり、過去に設定を変えてあるところから出力しなくなったファイルが残っていたり等、ビルド先のdistフォルダの中はごちゃごちゃしがちです。これを何とかしたいなぁ、と思って調べたら簡単に解決できました。</p> <p>Webpackでこういうことできないかなぁと調べると大抵プラグインが出てきて追加しないといけないことが多く、今回もそのパターンでよくわからないものを追加しないといけないのかなぁ・・・と思っていたのですが、どうも標準機能として用意されているようでした。ということで結論。</p> <h2 id="結論: outputの中に[clean: true]を追加すればよい"><a href="#%E7%B5%90%E8%AB%96%3A+output%E3%81%AE%E4%B8%AD%E3%81%AB%5Bclean%3A+true%5D%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84">結論: outputの中に[clean: true]を追加すればよい</a></h2> <p>ドキュメントを読むことは大事ですね。しっかり記載がありました。</p> <p><a target="_blank" rel="nofollow noopener" href="https://webpack.js.org/guides/output-management/#cleaning-up-the-dist-folder">https://webpack.js.org/guides/output-management/#cleaning-up-the-dist-folder</a></p> <p>こちらによると、ビルドしたものを置くdistフォルダの中身をビルドのたびにきれいにしたい場合はoutput.cleanオプションを使え、とあります。ただし、この方法が使えるのはWebpack5以降のみなので注意してください。</p> <pre><code class="javascript">// webpack.config.jsの一部分 ~~~~~~ output: { filename: "output.js", path: path.resolve(__dirname, "dist"), clean: true // この1行を追加すればよい } </code></pre> <p>はい、たったこれだけ。1行追加するだけで、ビルドのたびにdistフォルダの中身をきれいにしてくれるので、過去にビルドした残骸が残ることはなくなりました。</p> <p>また、こちらのページには細かい設定方法もありました。</p> <p><a target="_blank" rel="nofollow noopener" href="https://v4.webpack.js.org/guides/output-management/#cleaning-up-the-dist-folder">https://v4.webpack.js.org/guides/output-management/#cleaning-up-the-dist-folder</a></p> <p>そして、前述の通りこの方法が使えるのはWebpack5以降のみとのことでした。Webpack4などを使っている方は、プラグインでの対応となるようです。</p> <h2 id="Webpack4を使っている方: clean-webpack-pluginを使う"><a href="#Webpack4%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E6%96%B9%3A+clean-webpack-plugin%E3%82%92%E4%BD%BF%E3%81%86">Webpack4を使っている方: clean-webpack-pluginを使う</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://v4.webpack.js.org/guides/output-management/#cleaning-up-the-dist-folder">https://v4.webpack.js.org/guides/output-management/#cleaning-up-the-dist-folder</a></p> <p>Webpack4版のドキュメントを見ると、同様の項目ですが対応方法が異なっていました。「clean-webpack-plugin」というプラグインを使えば削除できるので、導入・設定しましょうとのことでした。以下にドキュメントにあったサンプルを載せておきます。</p> <pre><code class="bash"># プラグインのインストール npm install --save-dev clean-webpack-plugin </code></pre> <p>webpack.config.jsはこんな感じ。</p> <pre><code class="javascript">// webpack.config.js const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); // プラグインを読み込む const { CleanWebpackPlugin } = require('clean-webpack-plugin'); module.exports = { entry: { app: './src/index.js', print: './src/print.js', }, plugins: [ new CleanWebpackPlugin(), // この行を追加する new HtmlWebpackPlugin({ title: 'Output Management', }), ], output: { filename: '[name].bundle.js', path: path.resolve(__dirname, 'dist'), }, }; </code></pre> <p>これにより、output.pathで指定したフォルダにある不要ファイルを削除したうえでビルドしてくれるとのことでした。さらに、Webpack5では細かい設定ができましたが、clean-webpack-pluginでも似たような設定はできそうです。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.npmjs.com/package/clean-webpack-plugin">https://www.npmjs.com/package/clean-webpack-plugin</a></p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>今回は、Webpackで過去にビルドした残骸をきれいに削除する方法をまとめました。不必要なプラグインを導入せずに、たった1行の設定追加だけでやりたかったことが実現できてとてもハッピーです。</p> <p>そして、Webpack5ではデフォルトでこの機能が入っていることを知りませんでした。過去に調べたときはプラグイン対応だったよなぁと思いつつ調べると、やはりプラグインを導入しろ、という記事が多く出てきました。とりあえずググるのは大事ですが、ドキュメントをさっくりと眺めておく、というのも必要ですね。</p> <p></p> しきゆら tag:crieit.net,2005:PublicArticle/16640 2021-01-21T00:22:56+09:00 2021-01-21T00:22:56+09:00 https://crieit.net/posts/webpack-clean-webpack-plugin-note-20210120 Webpack の clean-webpack-plugin のメモ <p>よんどころなき事情により Webpack で <code>clean-webpack-plugin</code> を使おうとしたのですが、過去の記事を見ていたら嵌まったのでメモしておきます。</p> <h2 id="経緯"><a href="#%E7%B5%8C%E7%B7%AF">経緯</a></h2> <p>処理中のフラグによって <code>.js</code> ファイルを複数出力(数はフラグにより増減)しようとしたのですが、減らすときは当然 output 先 (ここでは <code>dist/js</code> )は前の出力結果が残ってしまっているので、余計なゴミとして残ってしまうことに気付きました。</p> <p>そこで Webpack のビルド直前に output 先をクリーニングしようと考え、検索すると <code>clean-webpack-plugin</code> がヒットしたので、これを試そうとしました。</p> <p>なお、パッケージの指定は以下の通りです。</p> <pre><code> "devDependencies": { "webpack": "^5.15.0", "webpack-stream": "^6.1.1", "terser-webpack-plugin": "^5.1.1", "clean-webpack-plugin": "^3.0.0" }, "resolutions": { "webpack": "^5.15.0" }, </code></pre> <p>Gulp から <code>webpack-stream</code> 経由で Webpack を使用、という状況です。</p> <h2 id="現象"><a href="#%E7%8F%BE%E8%B1%A1">現象</a></h2> <p><code>clean-webpack-plugin</code> の使い方の記事を見ると、 <code>webpack.config.js</code> に以下のように書くケースが散見されました。</p> <pre><code class="javascript">const webpackTerser = require('terser-webpack-plugin'); const { CleanWebpackPlugin } = require('clean-webpack-plugin'); // require const path = require('path'); const glob = require('glob'); const entry = () => { const entries = glob .sync( '**/*.js', { cwd: 'src/js', ignore: [ '**/_*.js' ] } ) .map(function (key) { return [key, path.resolve('src/js', key)]; }); return Object.fromEntries(entries); }; const configs = { mode: 'development', entry: entry(), output: { filename: '[name]', }, devtool: 'inline-source-map', plugins: [ // plugin new CleanWebpackPlugin([ 'dist/js' // cleanup path ]), ], optimization: { minimizer: [ new webpackTerser({ extractComments: 'some', terserOptions: { compress: { drop_console: false, }, }, }), ], }, }; module.exports = configs; </code></pre> <p>今回引っかかったのは <code>CleanWebpackPlugin</code> インスタンスへの引数で「クリーニングしたいディレクトリのパスの配列」を指定する部分。</p> <pre><code>Error: clean-webpack-plugin only accepts an options object. See: https://github.com/johnagan/clean-webpack-plugin#options-and-defaults-optiona </code></pre> <p><code>clean-webpack-plugin</code> の引数はオブジェクトの形式ですって?</p> <p>散見される記事は配列でした。</p> <p>上記エラー文の通り、 Github を参照すると……確かに<strong>オブジェクトの形式</strong>で指定されています。</p> <p>これ以上は突っ込んでいませんが、どうやらどこかのバージョン (今回インストールした <code>clean-webpack-plugin</code> は <code>3.0.0</code> だったので、2系と3系で乖離があるのかもしれません) で仕様が変わったのかもしれません。</p> <p>これを受けて以下のように修正。</p> <pre><code class="javascript">const webpackTerser = require('terser-webpack-plugin'); const { CleanWebpackPlugin } = require('clean-webpack-plugin'); // require const path = require('path'); const glob = require('glob'); const entry = () => { const entries = glob .sync( '**/*.js', { cwd: 'src/js', ignore: [ '**/_*.js' ] } ) .map(function (key) { return [key, path.resolve('src/js', key)]; }); return Object.fromEntries(entries); }; const configs = { mode: 'development', entry: entry(), output: { filename: '[name]', }, devtool: 'inline-source-map', plugins: [ new CleanWebpackPlugin({ cleanOnceBeforeBuildPatterns: [ 'dist/js/**/*.js' // cleanOnceBeforeBuildPatterns キーの中に配列指定。また、ディレクトリパスの指定ではなく、 glob での指定 ], }), ], optimization: { minimizer: [ new webpackTerser({ extractComments: 'some', terserOptions: { compress: { drop_console: false, }, }, }), ], }, }; module.exports = configs; </code></pre> <p>変更点は以下の2つ。</p> <ol> <li>指定そのものを <code>cleanOnceBeforeBuildPatterns</code> キーに対する値として配列を記述するようにしたこと</li> <li>ディレクトリパスではなく glob 指定ということ (拡張子指定が不要な場合は <code>dist/js/**/*</code> というような形)</li> </ol> <p>これで意図した挙動になりました。</p> <h2 id="余談"><a href="#%E4%BD%99%E8%AB%87">余談</a></h2> <p>最初とりあえず試すだけ試そうとして</p> <pre><code class="javascript"> plugins: [ new CleanWebpackPlugin(), ], </code></pre> <p>途中試験のため <code>cwd</code> も抜いていたせいで、引数なしで <code>CleanWebpackPlugin</code> インスタンスを起こしたところ、プロジェクトルートからファイルを削除しようとして焦りました (デフォルトが <code>dry: false</code>(テストなし), <code>verbose: false</code>(削除するファイルをコンソールに出力しない), <code>cleanOnceBeforeBuildPatterns: ['**/*']</code>(ルートからの全てのファイル) という指定だったため)。</p> <p>うっかり走らせないこと。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/johnagan/clean-webpack-plugin#options-and-defaults-optional">johnagan/clean-webpack-plugin: A webpack plugin to remove your build folder(s) before building</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://chaika.hatenablog.com/entry/2019/06/18/083000">Webpack Babel + Pug + Stylus で ホットリロードできるSPA開発環境作った。 - かもメモ</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://stackoverflow.com/questions/64617228/cleanwebpackplugin-does-not-clean-in-webpack-5">CleanWebpackPlugin does not clean in Webpack 5 - Stack Overflow</a></li> </ul> <h3 id="(余談) エントリーポイントの ignore 指定"><a href="#%28%E4%BD%99%E8%AB%87%29+%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AA%E3%83%BC%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%81%AE+ignore+%E6%8C%87%E5%AE%9A">(余談) エントリーポイントの ignore 指定</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/masato_makino/items/7130bbe408ca929e7f0d">webpackのentryファイルを複数指定、globパッケージの使い方 - Qiita</a></li> </ul> arm-band