webpack/examples/http2-aggressive-splitting
Tobias Koppers d0b358d108 update examples 2020-05-20 23:26:51 +02:00
..
README.md update examples 2020-05-20 23:26:51 +02:00
build.js refactoring and aggressive-splitting plugin 2016-07-13 11:03:14 +02:00
example.js refactoring and aggressive-splitting plugin 2016-07-13 11:03:14 +02:00
template.md docs(http2-aggressive-splitting): improve template.md 2020-03-22 12:00:28 +05:30
webpack.config.js change output from examples for js/ to dist/ 2018-01-04 21:39:29 +01:00

README.md

This example demonstrates the AggressiveSplittingPlugin for splitting the bundle into multiple smaller chunks to improve caching. This works best with an HTTP2 web server, otherwise, there is an overhead for the increased number of requests.

AggressiveSplittingPlugin splits every chunk until it reaches the specified maxSize. In this example, it tries to create chunks with <50kB raw code, which typically minimizes to ~10kB. It groups modules by folder structure, because modules in the same folder are likely to have similar repetitive text, making them gzip efficiently together. They are also likely to change together.

AggressiveSplittingPlugin records its splitting in the webpack records. When it is next run, it tries to use the last recorded splitting. Since changes to application code between one run and the next are usually in only a few modules (or just one), re-using the old splittings (and chunks, which are probably still in the client's cache), is highly advantageous.

Only chunks that are bigger than the specified minSize are stored into the records. This ensures that these chunks fill up as your application grows, instead of creating many records of small chunks for every change.

If a module changes, its chunks are declared to be invalid and are put back into the module pool. New chunks are created from all modules in the pool.

There is a tradeoff here:

The caching improves with smaller maxSize, as chunks change less often and can be reused more often after an update.

The compression improves with bigger maxSize, as gzip works better for bigger files. It's more likely to find duplicate strings, etc.

The backward compatibility (non-HTTP2 client) improves with bigger maxSize, as the number of requests decreases.

var path = require("path");
var webpack = require("../../");
module.exports = {
	// mode: "development || "production",
	cache: true, // better performance for the AggressiveSplittingPlugin
	entry: "./example",
	output: {
		path: path.join(__dirname, "dist"),
		filename: "[chunkhash].js",
		chunkFilename: "[chunkhash].js"
	},
	plugins: [
		new webpack.optimize.AggressiveSplittingPlugin({
			minSize: 30000,
			maxSize: 50000
		}),
		new webpack.DefinePlugin({
			"process.env.NODE_ENV": JSON.stringify("production")
		})
	],
	recordsOutputPath: path.join(__dirname, "dist", "records.json")
};

Info

Unoptimized

Hash: 0a1b2c3d4e5f6a7b8c9d
Version: webpack 5.0.0-beta.16
                  Asset      Size
407aff58e6b1ca379c9a.js   118 KiB  [emitted] [immutable]  [id hint: vendors]
c9d5339df313a5d6a02b.js  20.4 KiB  [emitted] [immutable]  [name: main]
e684ff3ecaf2754af9cb.js  7.21 KiB  [emitted] [immutable]
Entrypoint main = c9d5339df313a5d6a02b.js
chunk c9d5339df313a5d6a02b.js (main) 8.8 KiB (javascript) 4.24 KiB (runtime) [entry] [rendered]
    > ./example main
 ../../node_modules/object-assign/index.js 2.06 KiB [built]
 ../../node_modules/react/cjs/react.production.min.js 6.52 KiB [built]
 ../../node_modules/react/index.js 190 bytes [built]
 ./example.js 42 bytes [built]
     + 5 hidden chunk modules
chunk e684ff3ecaf2754af9cb.js 6.45 KiB [rendered]
    > react-dom ./example.js 2:0-22
 ../../node_modules/react-dom/index.js 1.33 KiB [built]
 ../../node_modules/scheduler/cjs/scheduler.production.min.js 4.92 KiB [built]
 ../../node_modules/scheduler/index.js 198 bytes [built]
chunk 407aff58e6b1ca379c9a.js (id hint: vendors) 116 KiB [rendered] [recorded] aggressive splitted, reused as split chunk (cache group: defaultVendors)
    > react-dom ./example.js 2:0-22
 ../../node_modules/react-dom/cjs/react-dom.production.min.js 116 KiB [built]

Production mode

Hash: 0a1b2c3d4e5f6a7b8c9d
Version: webpack 5.0.0-beta.16
                              Asset       Size
            33fc105596f0ad773952.js   8.47 KiB  [emitted] [immutable]  [name: main]
33fc105596f0ad773952.js.LICENSE.txt  295 bytes  [emitted]
            4b2f50aca0f61171332b.js    114 KiB  [emitted] [immutable]  [id hint: vendors]
4b2f50aca0f61171332b.js.LICENSE.txt  247 bytes  [emitted]
            9eb90b095fa7f3282f24.js   4.92 KiB  [emitted] [immutable]
9eb90b095fa7f3282f24.js.LICENSE.txt  246 bytes  [emitted]
Entrypoint main = 33fc105596f0ad773952.js
chunk 33fc105596f0ad773952.js (main) 8.8 KiB (javascript) 4.24 KiB (runtime) [entry] [rendered]
    > ./example main
 ../../node_modules/object-assign/index.js 2.06 KiB [built]
 ../../node_modules/react/cjs/react.production.min.js 6.52 KiB [built]
 ../../node_modules/react/index.js 190 bytes [built]
 ./example.js 42 bytes [built]
     + 5 hidden chunk modules
chunk 9eb90b095fa7f3282f24.js 6.45 KiB [rendered]
    > react-dom ./example.js 2:0-22
 ../../node_modules/react-dom/index.js 1.33 KiB [built]
 ../../node_modules/scheduler/cjs/scheduler.production.min.js 4.92 KiB [built]
 ../../node_modules/scheduler/index.js 198 bytes [built]
chunk 4b2f50aca0f61171332b.js (id hint: vendors) 116 KiB [rendered] [recorded] aggressive splitted, reused as split chunk (cache group: defaultVendors)
    > react-dom ./example.js 2:0-22
 ../../node_modules/react-dom/cjs/react-dom.production.min.js 116 KiB [built]

Records

{
  "aggressiveSplits": [
    {
      "hash": "407aff58e6b1ca379c9aa5f6e6df20cc",
      "id": 2,
      "modules": [
        "../../node_modules/react-dom/cjs/react-dom.production.min.js"
      ],
      "size": 118737
    }
  ],
  "chunks": {
    "byName": {
      "main": 0
    },
    "bySource": {
      "0 ./example.js react-dom": 2,
      "0 main": 0,
      "1 ./example.js react-dom": 1
    },
    "usedIds": [
      0,
      1,
      2
    ]
  },
  "modules": {
    "byIdentifier": {
      "../../node_modules/object-assign/index.js": 3,
      "../../node_modules/react-dom/cjs/react-dom.production.min.js": 5,
      "../../node_modules/react-dom/index.js": 4,
      "../../node_modules/react/cjs/react.production.min.js": 2,
      "../../node_modules/react/index.js": 1,
      "../../node_modules/scheduler/cjs/scheduler.production.min.js": 7,
      "../../node_modules/scheduler/index.js": 6,
      "./example.js": 0
    },
    "usedIds": [
      0,
      1,
      2,
      3,
      4,
      5,
      6,
      7
    ]
  }
}