[解決済み] Webpack 4 "サイズが推奨限度を超えています(244 KiB)"
質問
以下のような600バイト(.6kb)以下のファイルが2つあります。
では、どうして私の app.bundle.js はこんなに大きいのでしょうか (987kb)、さらに重要なことに、どのようにしてそのサイズを管理するのでしょうか。
srcファイル index.js
import _ from 'lodash';
import printMe from './print.js';
function component() {
var element = document.createElement('div');
var btn = document.createElement('button');
// Lodash, now imported by this script
element.innerHTML = _.join(['Hello', 'webpack'], ' ');
btn.innerHTML = 'click and check console';
btn.onclick = printMe;
element.appendChild(btn);
return element;
}
document.body.appendChild(component());
srcファイル print.js
export default function printMe() {
consoe.log('Called from print.js');
}
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'
},
devtool: 'inline-source-map',
plugins: [
new CleanWebpackPlugin(['dist']),
new HtmlWebpackPlugin({
title: 'Output Management'
})
],
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist')
}
};
パッケージ.json
{
"name": "my-webpack-4-proj",
"version": "1.0.0",
"description": "",
"main": "index.js",
"mode": "development",
"scripts": {
"dev": "webpack --mode development",
"build": "webpack --mode production",
"watch": "webpack --watch",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"clean-webpack-plugin": "^0.1.19",
"css-loader": "^0.28.11",
"csv-loader": "^2.1.1",
"file-loader": "^1.1.11",
"html-webpack-plugin": "^3.0.6",
"style-loader": "^0.20.3",
"webpack": "^4.1.1",
"webpack-cli": "^2.0.12",
"xml-loader": "^1.2.1"
},
"dependencies": {
"express": "^4.16.3",
"lowdash": "^1.2.0"
}
}
警告メッセージです。
サイズ制限の警告: 次のアセットが推奨サイズ (244 KiB) を超えています。 推奨サイズ制限 (244 KiB) を超えています。これは、Web のパフォーマンスに影響を与える可能性があります。 アセット: app.bundle.js (964 KiB)
どのように解決するのですか?
これは、webpackがあなたのコードの依存関係をすべてバンドルしているために起こります。そして、あなたはlodashを使っているので、lodashのminifiedバージョンがあなたのソースコードに追加されます。さらに、ソースマップも含まれます。
devtool: 'inline-source-map',
デバッグ用には問題ないでしょうが、Prodビルドにソースマップを含める理由はないでしょう。そこで、バンドル サイズを減らすためにできることがいくつかあります。
- webpack の設定に mode: フラグを適切に設定すること。mode: 'development' または mode: 'production' のいずれかを指定します。これは webpack がどのようなビルドを行っているかを示すもので、適切な警告を出すことができます。
- prod ビルドではソースマップを含めないようにします。
- 必要のない外部依存を使いすぎないようにし、makeする。
これらのことをしてもバンドルサイズが 244kb 以下にならないことがあります。このような場合にできることは、バンドルを分割して論理的なチャンクを使用し始めることです。 まず、js とスタイルシートを簡単に分離するために mini css extract プラグイン .
もう一つのテクニックとして、動的インポートがあります。
動的インポート。モジュール内のインライン関数呼び出しによるコードの分割
これにより、コードを画面に関連付けられたモジュールに論理的に分割し、必要なライブラリのみを読み込むことができます。動的インポートの詳細については、公式ドキュメントを参照してください。 https://webpack.js.org/guides/code-splitting/
関連
-
[解決済み】Passport.js - エラー: ユーザーのセッションへのシリアライズに失敗しました。
-
[解決済み] Expectアサーションの型エラー -> expect(...).toExistは関数ではない
-
[解決済み] Npmエラー - Windows NT - 解決方法
-
[解決済み] S3 Bucket に何かを送信しようとすると、AWS Missing credentials が表示される (Node.js)
-
[解決済み] NodeJsのSequelizeでautoIncrementはどのように動作するのですか?
-
[解決済み] エラーです。Cannot find module 'ejs'
-
[解決済み] node.jsのセットアップウィザードが途中で終了してしまう
-
[解決済み] エラーです。Ionic使用中にモジュール '../lib/utils/unsupported.js' が見つかりません。
-
[解決済み] Macでポート3000をロックしているプロセスを見つける(そして殺す)【終了
-
[解決済み] Express.js req.bodyが未定義です。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Discord.js が特定のチャンネルにメッセージを送信する場合
-
[解決済み] エラー: nodejs の get 呼び出しで getaddrinfo ENOTFOUND が発生しました。
-
[解決済み】MongoDBのデータ/DBが見つからない
-
[解決済み] Node.jsのホスト名/IPが証明書のaltnamesと一致しない
-
[解決済み] AWS lambda function error - Unable to import module 'index': エラー
-
[解決済み] のエラーが発生しました。これはおそらくnpmの問題ではありません。上に追加のログ出力があると思われます
-
[解決済み] ExpressJS : res.redirect()が期待通りに動作しない?
-
[解決済み] NodeJsのSequelizeでautoIncrementはどのように動作するのですか?
-
[解決済み] エラーです。Cannot find module 'ejs'
-
[解決済み] DynamoDBで一括削除するにはどうしたらいいですか?