Webpack 4“大小超过了推荐的限制(244 KiB)”

Posted

技术标签:

【中文标题】Webpack 4“大小超过了推荐的限制(244 KiB)”【英文标题】:Webpack 4 "size exceeds the recommended limit (244 KiB)" 【发布时间】:2018-08-27 03:37:49 【问题描述】:

我有两个文件,它们组合在 600 字节 (.6kb) 下,如下所示。

那么我的 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')
  
;

package.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)。这会影响 Web 性能。 资产:app.bundle.js (964 KiB)

【问题讨论】:

print.js 库不久前已重命名为 print-js。您应该在项目中更改它以获取最新版本的库。 我会发表评论,但我还没有足够的声誉。我想指出,利雅得建议执行 ``` performance: hints: false, maxEntrypointSize: 512000, maxAssetSize: 512000 ``` 并不能解决根本问题,它只是禁用了您所看到的警告。如果有任何 webpack 新手用户找到该解决方案并看到它清除了警告。只要知道您实际上并没有清除警告,只是禁用它。 有谁知道如何对使用“vue-cli-service”的项目执行此操作? vue.config.js 文档没有深入探讨设置 'devtool: false'。 【参考方案1】:

对我来说,代码拆分和添加 'CompressionPlugin' 将 webpack 大小从 1.51 MiB 减少到 350 KiB

新的压缩插件( 文件名:“[路径][基础].br”, 算法:“brotliCompress”, 测试:/.(js|jsx|css|html|svg|png|jpg|jpeg)$/, 压缩选项: 参数: [zlib.constants.BROTLI_PARAM_QUALITY]:11, , , 阈值:10240, 最小比率:0.8, 删除原始资产:真, )

同时安装 zlib 库

【讨论】:

【参考方案2】:

这是因为 webpack 捆绑了你所有的代码依赖。由于您使用的是 lodash,因此 lodash 缩小版将添加到您的源代码中。另外,您还包括源地图:

devtool: 'inline-source-map',

虽然这对于调试应该没问题,但没有理由将源映射包含在 Prod 构建中。因此,您可以采取一些措施来减少捆绑包的大小。

    确保在 webpack 配置中正确设置 mode: 标志。您可以使用任一模式:“开发”或模式:“生产”。这将提示 webpack 您正在执行哪种构建,以便为您提供适当的警告。 确保不要在您的产品构建中包含源映射 避免过度使用不需要和制作的外部依赖项。

有时即使这些东西也不会使你的包大小低于 244kb,在这些情况下你可以做的是拆分你的包并开始使用逻辑块。 首先,您可以使用the mini css extract plugin 轻松地将您的js 与您的样式表分开。

您可以使用的另一种技术是动态导入。

动态导入:通过模块内的内联函数调用拆分代码

这将允许您在逻辑上将代码分解为与屏幕相关联的模块,以便仅加载所需的库。有关动态导入的更多信息,您可以查看官方文档。 https://webpack.js.org/guides/code-splitting/

【讨论】:

问题,因为我是 webpack 的新手。我的理解是它足够聪明,不会捆绑不需要的包 不一定,你需要告诉它你希望它正确拆分代码。检查代码拆分链接。无论如何,我相信在您的情况下,只需删除内联源映射即可解决问题 嗨,我已经实现了这个,但它并没有让我的错误消失:(你能看看这里吗?***.com/questions/52723381/… Webpack is 足够聪明,不会捆绑不需要的包。它的作用是遵循代码中的require(或import)语句,并确保您的require 包含在您的包中。因为你import _ from 'lodash' 它包括lodash。您可以做的一件事是不要导入所有的 lodash,而只导入您实际使用的位。 lodash 的结构有助于实现这一点。 我不同意关于不将源映射部署到生产的评论 - 您将很难调试仅生产问题,并且代码质量监控服务(如哨兵)需要源映射.io。 Sourcemaps 不会被客户端下载,除非他们打开 devtools>Sources>source file【参考方案3】:

对我来说,正如其他人所说,在生产中消除 devtool 解决了这个问题

webpack.config.js的代码

module.exports = (env, argv) => 
  const mode = argv.mode || 'development'

  const config = 
    entry: './src/index.js',
    output: 
      path: `$__dirname/lib`,
      filename: 'index.js',
      library: 'my-library',
      libraryTarget: 'umd',
    ,
    module: 
      rules: [
        
          test: /\.(js|jsx)$/,
          exclude: /node_modules/,
          use: ['babel-loader'],
        ,
      ],
    ,
    devtool: mode === 'development' ? 'cheap-module-eval-source-map' : false,
  
  return config

【讨论】:

【参考方案4】:

Nuxt 解决方案nuxt.config.js:

module.exports = 
 build: 
  extend(config,  isDev , isClient ) 
    if (isClient && !isDev) 
      config.optimization.splitChunks.maxSize = 250000
    
  
 

【讨论】:

您可以在 webpack 配置中正常定义它,但这无济于事,因为警告指的是组合资产大小,将其拆分为块不会减少它 这是旧 nuxt(检查日期:20 年 3 月 25 日 16:36),当时有关于此尺寸的错误。它不能作为一个整体修复网站速度或资产大小 - 只需将其适当地分割成您需要的内容(复制和粘贴解决方案高于其他方法)。修复其他想法更重要 - 这仅适用于没有其他文件的 nuxt 中的 webpack 设置【参考方案5】:

webpack.config.js 中将模式标志设置为开发/生产。示例:

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

【讨论】:

【参考方案6】:

在您的 vue.config.js 文件中添加以下行。这是因为尺寸。我们需要拆分成块。

configureWebpack:
    performance: 
      hints: false
    ,
    optimization: 
      splitChunks: 
        minSize: 10000,
        maxSize: 250000,
      
    

这可能对某人有所帮助。

【讨论】:

【参考方案7】:

在你的情况下,主要问题是 webpack.common.js 文件中的devtool: 'inline-source-map',在我的情况下,我在开发中使用'cheap-module-eval-source-map', 这个 devtool 非常适合开发模式,但是让我的 bundle.js 变成 4.2MiB,所以,在 webpack.prod.js 文件中的生产模式下,我像这样更改 devtool module.exports = merge(common, mode: 'production', performance: hints: false , devtool: 'source-map' );' 现在从 4.2mb 我得到了 732KiB 的 bundle.js。 这个开发工具会使捆绑过程再慢几秒钟,但会显着减小文件的大小,在我的示例中从 4.18 MiB 到 732 KiB。

【讨论】:

MiB 不是兆字节 @atilkan 。 . .严格来说,mb 不是 MB。 MB = 兆字节,mb = 毫比特?...但是“毫比特”当然是荒谬的。就像一个人只想要一个原子的一小部分。所以我也可以接受 mb 表示兆字节。 ;) 但是...“Mb”实际上意味着“兆位”而不是“兆字节”! 如果你说的是对的,我会感到困惑。想知道这个标准是从哪里来的。 @atikan 来自 webpack。【参考方案8】:

只需在 webpack.config.js 中使用以下代码:

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

或关注

您可以为(开发、生产)创建多个配置文件。在开发配置文件中使用 devtool 或其他必要的开发配置,反之亦然。

你必须使用 webpack-merge 包和配置 package.json 脚本代码,如

"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"
 ,

例如:

创建一个文件 webpack.common.js

// webpack.common.js

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

创建 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'
 
);

创建 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
    
);

【讨论】:

我不得不做const merge = require('webpack-merge')。否则它说合并不是一个函数。【参考方案9】:

我遇到了同样的问题。我的捆绑文件是 (1.15 MiB)。 在我的 webpack.config.js 中,替换:

devtool: 'inline-source-map'

通过这一行:

devtool: false,

将我的包文件大小从 1.15 MiB 变为 275 Kib

或者创建 2 个单独的 webpack 配置文件。一个用于开发,一个用于生产。在 prod webpack 配置文件中,删除 devtool 选项。

【讨论】:

不适用于我...使用此行 `devtool: isProduction ? false : 'cheap-module-source-map',它保持相同的大小 你建设得怎么样了?如果使用 webpack cli,必须指定生产模式:webpack --mode=production

以上是关于Webpack 4“大小超过了推荐的限制(244 KiB)”的主要内容,如果未能解决你的问题,请参考以下文章

webpack 3.1 升级webpack 4.0

webpack 4 + mockjs

使用 @ngtools/webpack 在 Angular 11 + Webpack 4 中实现 AOT

React/Webpack - 从 webpack 1 迁移到 4,配置对象无效

冲突的对等依赖关系:webpack@4.46.0 npm ERR!节点模块/webpack

从 Webpack 3 迁移到 Webpack 4