Skip to content

Commit a451223

Browse files
fix: reduce runtime (#685)
1 parent 07fcf6b commit a451223

File tree

9 files changed

+616
-10
lines changed

9 files changed

+616
-10
lines changed

src/index.js

+17-10
Original file line numberDiff line numberDiff line change
@@ -265,20 +265,25 @@ class MiniCssExtractPlugin {
265265

266266
compilation.hooks.contentHash.tap(pluginName, (chunk) => {
267267
const { outputOptions, chunkGraph } = compilation;
268-
const { hashFunction, hashDigest, hashDigestLength } = outputOptions;
269-
const hash = createHash(hashFunction);
268+
const modules = isWebpack4
269+
? Array.from(this.getChunkModules(chunk, chunkGraph)).filter(
270+
(module) => module.type === MODULE_TYPE
271+
)
272+
: chunkGraph.getChunkModulesIterableBySourceType(chunk, MODULE_TYPE);
273+
274+
if (modules) {
275+
const { hashFunction, hashDigest, hashDigestLength } = outputOptions;
276+
const hash = createHash(hashFunction);
270277

271-
for (const m of this.getChunkModules(chunk, chunkGraph)) {
272-
if (m.type === MODULE_TYPE) {
278+
for (const m of modules) {
273279
m.updateHash(hash, { chunkGraph });
274280
}
275-
}
276-
277-
const { contentHash } = chunk;
278281

279-
contentHash[MODULE_TYPE] = hash
280-
.digest(hashDigest)
281-
.substring(0, hashDigestLength);
282+
// eslint-disable-next-line no-param-reassign
283+
chunk.contentHash[MODULE_TYPE] = hash
284+
.digest(hashDigest)
285+
.substring(0, hashDigestLength);
286+
}
282287
});
283288

284289
const { mainTemplate } = compilation;
@@ -465,6 +470,7 @@ class MiniCssExtractPlugin {
465470
const CssLoadingRuntimeModule = require('./CssLoadingRuntimeModule');
466471

467472
set.add(webpack.RuntimeGlobals.publicPath);
473+
468474
compilation.addRuntimeModule(
469475
chunk,
470476
new webpack.runtime.GetChunkFilenameRuntimeModule(
@@ -483,6 +489,7 @@ class MiniCssExtractPlugin {
483489
new CssLoadingRuntimeModule(set, this.runtimeOptions)
484490
);
485491
};
492+
486493
compilation.hooks.runtimeRequirementInTree
487494
.for(webpack.RuntimeGlobals.ensureChunkHandlers)
488495
.tap(pluginName, handler);

test/cases/runtime/async.js

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
// eslint-disable-next-line no-console
2+
console.log('HERE');
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
body {
2+
background: red;
3+
}
4+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
/******/ (function(modules) { // webpackBootstrap
2+
/******/ // install a JSONP callback for chunk loading
3+
/******/ function webpackJsonpCallback(data) {
4+
/******/ var chunkIds = data[0];
5+
/******/ var moreModules = data[1];
6+
/******/ var executeModules = data[2];
7+
/******/
8+
/******/ // add "moreModules" to the modules object,
9+
/******/ // then flag all "chunkIds" as loaded and fire callback
10+
/******/ var moduleId, chunkId, i = 0, resolves = [];
11+
/******/ for(;i < chunkIds.length; i++) {
12+
/******/ chunkId = chunkIds[i];
13+
/******/ if(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {
14+
/******/ resolves.push(installedChunks[chunkId][0]);
15+
/******/ }
16+
/******/ installedChunks[chunkId] = 0;
17+
/******/ }
18+
/******/ for(moduleId in moreModules) {
19+
/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {
20+
/******/ modules[moduleId] = moreModules[moduleId];
21+
/******/ }
22+
/******/ }
23+
/******/ if(parentJsonpFunction) parentJsonpFunction(data);
24+
/******/
25+
/******/ while(resolves.length) {
26+
/******/ resolves.shift()();
27+
/******/ }
28+
/******/
29+
/******/ // add entry modules from loaded chunk to deferred list
30+
/******/ deferredModules.push.apply(deferredModules, executeModules || []);
31+
/******/
32+
/******/ // run deferred modules when all chunks ready
33+
/******/ return checkDeferredModules();
34+
/******/ };
35+
/******/ function checkDeferredModules() {
36+
/******/ var result;
37+
/******/ for(var i = 0; i < deferredModules.length; i++) {
38+
/******/ var deferredModule = deferredModules[i];
39+
/******/ var fulfilled = true;
40+
/******/ for(var j = 1; j < deferredModule.length; j++) {
41+
/******/ var depId = deferredModule[j];
42+
/******/ if(installedChunks[depId] !== 0) fulfilled = false;
43+
/******/ }
44+
/******/ if(fulfilled) {
45+
/******/ deferredModules.splice(i--, 1);
46+
/******/ result = __webpack_require__(__webpack_require__.s = deferredModule[0]);
47+
/******/ }
48+
/******/ }
49+
/******/
50+
/******/ return result;
51+
/******/ }
52+
/******/
53+
/******/ // The module cache
54+
/******/ var installedModules = {};
55+
/******/
56+
/******/ // object to store loaded and loading chunks
57+
/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched
58+
/******/ // Promise = chunk loading, 0 = chunk loaded
59+
/******/ var installedChunks = {
60+
/******/ 0: 0
61+
/******/ };
62+
/******/
63+
/******/ var deferredModules = [];
64+
/******/
65+
/******/ // script path function
66+
/******/ function jsonpScriptSrc(chunkId) {
67+
/******/ return __webpack_require__.p + "" + ({}[chunkId]||chunkId) + ".js"
68+
/******/ }
69+
/******/
70+
/******/ // The require function
71+
/******/ function __webpack_require__(moduleId) {
72+
/******/
73+
/******/ // Check if module is in cache
74+
/******/ if(installedModules[moduleId]) {
75+
/******/ return installedModules[moduleId].exports;
76+
/******/ }
77+
/******/ // Create a new module (and put it into the cache)
78+
/******/ var module = installedModules[moduleId] = {
79+
/******/ i: moduleId,
80+
/******/ l: false,
81+
/******/ exports: {}
82+
/******/ };
83+
/******/
84+
/******/ // Execute the module function
85+
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
86+
/******/
87+
/******/ // Flag the module as loaded
88+
/******/ module.l = true;
89+
/******/
90+
/******/ // Return the exports of the module
91+
/******/ return module.exports;
92+
/******/ }
93+
/******/
94+
/******/ // This file contains only the entry chunk.
95+
/******/ // The chunk loading function for additional chunks
96+
/******/ __webpack_require__.e = function requireEnsure(chunkId) {
97+
/******/ var promises = [];
98+
/******/
99+
/******/
100+
/******/ // JSONP chunk loading for javascript
101+
/******/
102+
/******/ var installedChunkData = installedChunks[chunkId];
103+
/******/ if(installedChunkData !== 0) { // 0 means "already installed".
104+
/******/
105+
/******/ // a Promise means "currently loading".
106+
/******/ if(installedChunkData) {
107+
/******/ promises.push(installedChunkData[2]);
108+
/******/ } else {
109+
/******/ // setup Promise in chunk cache
110+
/******/ var promise = new Promise(function(resolve, reject) {
111+
/******/ installedChunkData = installedChunks[chunkId] = [resolve, reject];
112+
/******/ });
113+
/******/ promises.push(installedChunkData[2] = promise);
114+
/******/
115+
/******/ // start chunk loading
116+
/******/ var script = document.createElement('script');
117+
/******/ var onScriptComplete;
118+
/******/
119+
/******/ script.charset = 'utf-8';
120+
/******/ script.timeout = 120;
121+
/******/ if (__webpack_require__.nc) {
122+
/******/ script.setAttribute("nonce", __webpack_require__.nc);
123+
/******/ }
124+
/******/ script.src = jsonpScriptSrc(chunkId);
125+
/******/
126+
/******/ // create error before stack unwound to get useful stacktrace later
127+
/******/ var error = new Error();
128+
/******/ onScriptComplete = function (event) {
129+
/******/ // avoid mem leaks in IE.
130+
/******/ script.onerror = script.onload = null;
131+
/******/ clearTimeout(timeout);
132+
/******/ var chunk = installedChunks[chunkId];
133+
/******/ if(chunk !== 0) {
134+
/******/ if(chunk) {
135+
/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type);
136+
/******/ var realSrc = event && event.target && event.target.src;
137+
/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')';
138+
/******/ error.name = 'ChunkLoadError';
139+
/******/ error.type = errorType;
140+
/******/ error.request = realSrc;
141+
/******/ chunk[1](error);
142+
/******/ }
143+
/******/ installedChunks[chunkId] = undefined;
144+
/******/ }
145+
/******/ };
146+
/******/ var timeout = setTimeout(function(){
147+
/******/ onScriptComplete({ type: 'timeout', target: script });
148+
/******/ }, 120000);
149+
/******/ script.onerror = script.onload = onScriptComplete;
150+
/******/ document.head.appendChild(script);
151+
/******/ }
152+
/******/ }
153+
/******/ return Promise.all(promises);
154+
/******/ };
155+
/******/
156+
/******/ // expose the modules object (__webpack_modules__)
157+
/******/ __webpack_require__.m = modules;
158+
/******/
159+
/******/ // expose the module cache
160+
/******/ __webpack_require__.c = installedModules;
161+
/******/
162+
/******/ // define getter function for harmony exports
163+
/******/ __webpack_require__.d = function(exports, name, getter) {
164+
/******/ if(!__webpack_require__.o(exports, name)) {
165+
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
166+
/******/ }
167+
/******/ };
168+
/******/
169+
/******/ // define __esModule on exports
170+
/******/ __webpack_require__.r = function(exports) {
171+
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
172+
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
173+
/******/ }
174+
/******/ Object.defineProperty(exports, '__esModule', { value: true });
175+
/******/ };
176+
/******/
177+
/******/ // create a fake namespace object
178+
/******/ // mode & 1: value is a module id, require it
179+
/******/ // mode & 2: merge all properties of value into the ns
180+
/******/ // mode & 4: return value when already ns object
181+
/******/ // mode & 8|1: behave like require
182+
/******/ __webpack_require__.t = function(value, mode) {
183+
/******/ if(mode & 1) value = __webpack_require__(value);
184+
/******/ if(mode & 8) return value;
185+
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
186+
/******/ var ns = Object.create(null);
187+
/******/ __webpack_require__.r(ns);
188+
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
189+
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
190+
/******/ return ns;
191+
/******/ };
192+
/******/
193+
/******/ // getDefaultExport function for compatibility with non-harmony modules
194+
/******/ __webpack_require__.n = function(module) {
195+
/******/ var getter = module && module.__esModule ?
196+
/******/ function getDefault() { return module['default']; } :
197+
/******/ function getModuleExports() { return module; };
198+
/******/ __webpack_require__.d(getter, 'a', getter);
199+
/******/ return getter;
200+
/******/ };
201+
/******/
202+
/******/ // Object.prototype.hasOwnProperty.call
203+
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
204+
/******/
205+
/******/ // __webpack_public_path__
206+
/******/ __webpack_require__.p = "";
207+
/******/
208+
/******/ // on error function for async loading
209+
/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; };
210+
/******/
211+
/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || [];
212+
/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray);
213+
/******/ jsonpArray.push = webpackJsonpCallback;
214+
/******/ jsonpArray = jsonpArray.slice();
215+
/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);
216+
/******/ var parentJsonpFunction = oldJsonpFunction;
217+
/******/
218+
/******/
219+
/******/ // run deferred modules from other chunks
220+
/******/ checkDeferredModules();
221+
/******/ })
222+
/************************************************************************/
223+
/******/ ([]);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
body {
2+
background: red;
3+
}
4+

0 commit comments

Comments
 (0)