82 votes

Webpack 4 "la taille dépasse la limite recommandée (244 KiB)"

J'ai deux fichiers qui sont combinés sous 600 octets (.6kb) comme ci-dessous.

Alors, comment se fait-il que mon app.bundle.js soit si gros (987kb) et, plus important encore, comment peut-on en gérer la taille ?

fichier 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());

fichier 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')
  }
};

paquet.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"
  }
}

Message d'avertissement :

AVERTISSEMENT concernant la limite de taille des actifs : Le(s) actif(s) suivant(s) dépassent la limite de taille recommandée (244 KiB). Cela peut avoir un impact sur les performances du site Web. Actifs : app.bundle.js (964 KiB)

1 votes

El print.js a été renommée il y a quelque temps en print-js . Vous devez changer cela dans votre projet pour obtenir les dernières versions de la librairie.

5 votes

Je laisserais bien un commentaire mais je n'ai pas encore assez de réputation. Je voulais signaler que la suggestion de Riyad de faire "performance : { hints : false, maxEntrypointSize : 512000, maxAssetSize : 512000 } ```Ne résout pas le problème sous-jacent, elle désactive juste l'avertissement que vous voyez. Si des utilisateurs novices de webpack trouvent cette solution et constatent que les avertissements disparaissent. Sachez que vous ne supprimez pas réellement l'avertissement, vous le désactivez simplement.

0 votes

Quelqu'un sait-il comment faire cela avec des projets utilisant 'vue-cli-service' ? La documentation de vue.config.js n'explique pas en détail comment définir "devtool : false".

58voto

Riyadh Ahmed Points 215

Il suffit d'utiliser le code ci-dessous dans webpack.config.js :

 performance: {
    hints: false,
    maxEntrypointSize: 512000,
    maxAssetSize: 512000
}

ou suivre

Vous pouvez créer plusieurs fichiers de configuration pour (développement, production). Dans le fichier de configuration de développement, utilisez devtool ou d'autres outils nécessaires à la configuration de développement et vice versa.

vous devez utiliser webpack-merge package et config package.json scripts code comme

"scripts": {
 "test": "echo \"Error: no test specified\" && exit 1",
 "start": "webpack --open --config webpack.dev.js",
 "dev": "webpack-dev-server --mode development --open",
 "build": "webpack --config webpack.prod.js"
 },

Par exemple :

créer un fichier webpack.common.js

// webpack.common.js

  use your common configuration like entry, output, module, plugins,

Créer webpack.dev.js

// webpack.dev.js
const merge = require('webpack-merge');
const common = require('./webpack.common.js');

module.exports = merge(common, {
mode: 'development',
devtool: 'inline-source-map',
devServer: {
    contentBase: './dist'
 }
});

Créer webpack.prod.js

const merge = require('webpack-merge');
const common = require('./webpack.common.js');

module.exports = merge(common, {
    mode: 'production',
    performance: {
        hints: false,
        maxEntrypointSize: 512000,
        maxAssetSize: 512000
    }
});

1 votes

Excellente solution, merci !!!

2 votes

Je devais faire const { merge } = require('webpack-merge') . Sinon, il est dit que la fusion n'est pas une fonction.

54voto

Cela se produit parce que webpack regroupe toutes les dépendances de votre code. Et comme vous utilisez lodash, la version réduite de lodash sera ajoutée à votre code source. De plus, vous incluez les cartes sources :

devtool: 'inline-source-map',

Bien que cela puisse convenir pour le débogage, il n'y a aucune raison d'inclure vos cartes sources dans une construction Prod. Il y a donc des choses que vous pouvez faire pour réduire la taille de votre bundle.

  1. Assurez-vous de définir correctement le drapeau mode : dans votre configuration webpack. Vous pouvez mettre soit mode : 'development', soit mode : 'production'. Cela indiquera à webpack le type de construction que vous faites, et il vous donnera les avertissements appropriés.
  2. Assurez-vous de ne pas inclure les cartes sources dans votre build prod.
  3. Évitez de surutiliser des dépendances externes dont vous n'avez pas besoin et que vous ne faites pas.

Parfois, même ces mesures ne suffisent pas à ramener la taille de votre paquet à moins de 244 Ko. Dans ce cas, vous pouvez diviser votre paquet et commencer à utiliser des morceaux logiques. Tout d'abord, vous pouvez facilement séparer vos js de vos feuilles de style en utilisant la fonction le mini plugin d'extraction de css .

Les importations dynamiques sont une autre technique que vous pouvez utiliser.

Importations dynamiques : Division du code par des appels de fonctions en ligne dans les modules

Cela vous permettra de décomposer logiquement votre code en modules liés aux écrans, de sorte que seules les bibliothèques requises seront chargées. Pour plus d'informations sur les importations dynamiques, vous pouvez consulter la documentation officielle. https://webpack.js.org/guides/code-splitting/

1 votes

Question car je suis nouveau dans le domaine de webpack. J'ai cru comprendre qu'il était suffisamment intelligent pour ne pas regrouper les paquets non nécessaires.

0 votes

Pas nécessairement, vous devez lui dire que vous voulez qu'il divise le code correctement. Consultez le lien sur la division du code. Quoi qu'il en soit, je pense que dans votre cas, la suppression des cartes sources en ligne résoudra le problème.

0 votes

Bonjour, j'ai mis en place cette solution, mais mon erreur n'a pas disparu :( pouvez-vous regarder ici ? stackoverflow.com/questions/52723381/

13voto

Alee Points 367

J'ai eu le même problème. Mon fichier bundle faisait (1.15 MiB). Dans mon webpack.config.js, en remplaçant :

devtool: 'inline-source-map'

par cette ligne :

devtool: false,

fait passer la taille de mon fichier groupé de 1.15 MiB a 275 Kib .

Ou créer 2 fichiers de configuration webpack séparés. Un pour dev et un pour prod. Dans le fichier de configuration de webpack prod, supprimez l'élément devtool option.

0 votes

Ne fonctionne pas pour moi... en utilisant cette ligne `devtool : isProduction ? false : 'cheap-module-source-map', il reste dans la même taille

0 votes

Comment construisez-vous ? Si vous utilisez le client webpack, vous devez spécifier le mode production : webpack --mode=production

8voto

Varun Kumar Points 260

Mettre l'indicateur de mode sur développement/production dans webpack.config.js . Exemple :

var mode = process.env.NODE_ENV || 'development';
module.exports = {
    ...
    devtool: (mode === 'development') ? 'inline-source-map' : false,
    mode: mode,
    ...
}

2voto

Goran7777 Points 71

Le principal problème est devtool: 'inline-source-map' dans le fichier webpack.common.js dans votre cas, dans mon cas j'utilise en développement 'cheap-module-eval-source-map' , ce devtool est très bien pour le mode développement mais fait que mon bundle.js fait 4.2MiB, donc, en mode production dans le fichier webpack.prod.js je change devtool comme ceci module.exports = merge(common, { mode: 'production', performance: { hints: false }, devtool: 'source-map' });' et maintenant de 4.2mb j'ai 732KiB de bundle.js. Ce devtool ralentira le processus de bundle pendant quelques secondes de plus mais réduira remarquablement la taille du fichier, dans mon exemple de 4.18 MiB à 732 KiB.

1 votes

MiB n'est pas mégaoctet

1 votes

@atilkan . . . Et à proprement parler, mb n'est pas MB. MB = mégaoctet, mb = millibit.... Mais "millibit" est ridicule, bien sûr. Comme si on voulait juste une fraction d'un atome. Je pourrais donc accepter que mb signifie aussi mégaoctet ;) Mais... 'Mb' signifierait en fait 'megabit' au lieu de 'megabyte' !

1 votes

Si ce que vous dites est correct, je trouve cela déroutant. Je me demande d'où vient cette norme.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X