Skip to content

Commit 2bb95a3

Browse files
committed
Refactor addModule to keep Module instances between rebuilds
1 parent 081ad5d commit 2bb95a3

File tree

1 file changed

+111
-132
lines changed

1 file changed

+111
-132
lines changed

lib/Compilation.js

Lines changed: 111 additions & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -226,8 +226,14 @@ class Compilation extends Tapable {
226226

227227
addModule(module, cacheGroup) {
228228
const identifier = module.identifier();
229-
if(this._modules.get(identifier)) {
230-
return false;
229+
const alreadyAddedModule = this._modules.get(identifier);
230+
if(alreadyAddedModule) {
231+
return {
232+
module: alreadyAddedModule,
233+
issuer: false,
234+
build: false,
235+
dependencies: false
236+
};
231237
}
232238
const cacheName = (cacheGroup || "m") + identifier;
233239
if(this.cache && this.cache[cacheName]) {
@@ -244,16 +250,27 @@ class Compilation extends Tapable {
244250
this.modules.push(cacheModule);
245251
cacheModule.errors.forEach(err => this.errors.push(err));
246252
cacheModule.warnings.forEach(err => this.warnings.push(err));
247-
return cacheModule;
253+
return {
254+
module: cacheModule,
255+
issuer: true,
256+
build: false,
257+
dependencies: true
258+
};
248259
}
249-
module.unbuild();
260+
cacheModule.unbuild();
261+
module = cacheModule;
250262
}
251263
this._modules.set(identifier, module);
252264
if(this.cache) {
253265
this.cache[cacheName] = module;
254266
}
255267
this.modules.push(module);
256-
return true;
268+
return {
269+
module: module,
270+
issuer: true,
271+
build: true,
272+
dependencies: true
273+
};
257274
}
258275

259276
getModule(module) {
@@ -371,6 +388,7 @@ class Compilation extends Tapable {
371388
addModuleDependencies(module, dependencies, bail, cacheGroup, recursive, callback) {
372389
let _this = this;
373390
const start = _this.profile && Date.now();
391+
const currentProfile = _this.profile && {};
374392

375393
asyncLib.forEach(dependencies, (item, callback) => {
376394
const dependencies = item.dependencies;
@@ -420,14 +438,6 @@ class Compilation extends Tapable {
420438
}
421439
};
422440

423-
const iterationDependencies = depend => {
424-
for(let index = 0; index < depend.length; index++) {
425-
const dep = depend[index];
426-
dep.module = dependentModule;
427-
dependentModule.addReason(module, dep);
428-
}
429-
};
430-
431441
if(err) {
432442
semaphore.release();
433443
return errorOrWarningAndCallback(new ModuleNotFoundError(module, err, dependencies));
@@ -436,94 +446,83 @@ class Compilation extends Tapable {
436446
semaphore.release();
437447
return process.nextTick(callback);
438448
}
439-
if(_this.profile) {
440-
if(!dependentModule.profile) {
441-
dependentModule.profile = {};
442-
}
449+
if(currentProfile) {
443450
afterFactory = Date.now();
444-
dependentModule.profile.factory = afterFactory - start;
451+
currentProfile.factory = afterFactory - start;
445452
}
446453

447-
const newModule = _this.addModule(dependentModule, cacheGroup);
448-
449-
if(!newModule) { // from cache
450-
dependentModule = _this.getModule(dependentModule);
451-
452-
iterationDependencies(dependencies);
453-
454-
if(_this.profile) {
455-
if(!module.profile) {
456-
module.profile = {};
457-
}
458-
const time = Date.now() - start;
459-
if(!module.profile.dependencies || time > module.profile.dependencies) {
460-
module.profile.dependencies = time;
461-
}
454+
const iterationDependencies = depend => {
455+
for(let index = 0; index < depend.length; index++) {
456+
const dep = depend[index];
457+
dep.module = dependentModule;
458+
dependentModule.addReason(module, dep);
462459
}
460+
};
463461

464-
semaphore.release();
465-
_this.waitForBuildingFinished(dependentModule, callback);
466-
return;
467-
}
462+
const addModuleResult = _this.addModule(dependentModule, cacheGroup);
463+
dependentModule = addModuleResult.module;
464+
iterationDependencies(dependencies);
468465

469-
if(newModule instanceof Module) {
470-
if(_this.profile) {
471-
newModule.profile = dependentModule.profile;
466+
const afterBuild = () => {
467+
if(currentProfile) {
468+
const afterBuilding = Date.now();
469+
currentProfile.building = afterBuilding - afterFactory;
472470
}
473471

474-
newModule.issuer = module;
475-
dependentModule = newModule;
476-
477-
iterationDependencies(dependencies);
472+
if(recursive && addModuleResult.dependencies) {
473+
_this.processModuleDependencies(dependentModule, callback);
474+
} else {
475+
return callback();
476+
}
477+
};
478478

479-
if(_this.profile) {
480-
const afterBuilding = Date.now();
481-
module.profile.building = afterBuilding - afterFactory;
479+
if(addModuleResult.issuer) {
480+
if(currentProfile) {
481+
dependentModule.profile = currentProfile;
482482
}
483483

484-
semaphore.release();
485-
if(recursive) {
486-
return process.nextTick(_this.processModuleDependencies.bind(_this, dependentModule, callback));
487-
} else {
488-
return process.nextTick(callback);
484+
dependentModule.issuer = module;
485+
} else {
486+
if(_this.profile) {
487+
if(module.profile) {
488+
const time = Date.now() - start;
489+
if(!module.profile.dependencies || time > module.profile.dependencies) {
490+
module.profile.dependencies = time;
491+
}
492+
}
489493
}
490494
}
491495

492-
dependentModule.issuer = module;
496+
if(addModuleResult.build) {
497+
_this.buildModule(dependentModule, isOptional(), module, dependencies, err => {
498+
if(_this === null) return semaphore.release();
493499

494-
iterationDependencies(dependencies);
500+
if(err) {
501+
semaphore.release();
502+
return errorOrWarningAndCallback(err);
503+
}
495504

496-
_this.buildModule(dependentModule, isOptional(), module, dependencies, err => {
497-
if(_this === null) return semaphore.release();
505+
if(currentProfile) {
506+
const afterBuilding = Date.now();
507+
currentProfile.building = afterBuilding - afterFactory;
508+
}
498509

499-
if(err) {
500510
semaphore.release();
501-
return errorOrWarningAndCallback(err);
502-
}
503-
504-
if(_this.profile) {
505-
const afterBuilding = Date.now();
506-
dependentModule.profile.building = afterBuilding - afterFactory;
507-
}
508-
511+
afterBuild();
512+
});
513+
} else {
509514
semaphore.release();
510-
if(recursive) {
511-
_this.processModuleDependencies(dependentModule, callback);
512-
} else {
513-
return callback();
514-
}
515-
});
516-
515+
_this.waitForBuildingFinished(dependentModule, afterBuild);
516+
}
517517
});
518518
});
519519
}, err => {
520520
// In V8, the Error objects keep a reference to the functions on the stack. These warnings &
521521
// errors are created inside closures that keep a reference to the Compilation, so errors are
522-
// leaking the Compilation object. Setting _this to null workarounds the following issue in V8.
523-
// https://bugs.chromium.org/p/chromium/issues/detail?id=612191
524-
_this = null;
522+
// leaking the Compilation object.
525523

526524
if(err) {
525+
err.stack = err.stack;
527526
return callback(err);
528527
}
529528

@@ -533,6 +532,7 @@ class Compilation extends Tapable {
533532

534533
_addModuleChain(context, dependency, onModule, callback) {
535534
const start = this.profile && Date.now();
535+
const currentProfile = this.profile && {};
536536

537537
const errorAndCallback = this.bail ? (err) => {
538538
callback(err);
@@ -567,81 +567,60 @@ class Compilation extends Tapable {
567567

568568
let afterFactory;
569569

570-
if(this.profile) {
571-
if(!module.profile) {
572-
module.profile = {};
573-
}
570+
if(currentProfile) {
574571
afterFactory = Date.now();
575-
module.profile.factory = afterFactory - start;
572+
currentProfile.factory = afterFactory - start;
576573
}
577574

578-
const result = this.addModule(module);
579-
if(!result) {
580-
module = this.getModule(module);
575+
const addModuleResult = this.addModule(module);
576+
module = addModuleResult.module;
581577

582-
onModule(module);
578+
onModule(module);
583579

584-
dependency.module = module;
585-
module.addReason(null, dependency);
580+
dependency.module = module;
581+
module.addReason(null, dependency);
586582

587-
if(this.profile) {
583+
const afterBuild = () => {
584+
if(currentProfile) {
588585
const afterBuilding = Date.now();
589-
module.profile.building = afterBuilding - afterFactory;
586+
currentProfile.building = afterBuilding - afterFactory;
590587
}
591588

592-
this.semaphore.release();
593-
this.waitForBuildingFinished(module, err => {
594-
if(err) return callback(err);
595-
callback(null, module);
596-
});
597-
return;
598-
}
599-
600-
const moduleReady = () => {
601-
this.semaphore.release();
602-
this.processModuleDependencies(module, err => {
603-
if(err) {
604-
return callback(err);
605-
}
606-
589+
if(addModuleResult.dependencies) {
590+
this.processModuleDependencies(module, err => {
591+
if(err) return callback(err);
592+
callback(null, module);
593+
});
594+
} else {
607595
return callback(null, module);
608-
});
596+
}
609597
};
610598

611-
if(result instanceof Module) {
612-
if(this.profile) {
613-
result.profile = module.profile;
599+
if(addModuleResult.issuer) {
600+
if(currentProfile) {
601+
module.profile = currentProfile;
614602
}
615-
616-
module = result;
617-
618-
onModule(module);
619-
620-
dependency.module = module;
621-
module.addReason(null, dependency);
622-
623-
moduleReady();
624-
return;
625603
}
626604

627-
onModule(module);
605+
if(addModuleResult.build) {
606+
this.buildModule(module, false, null, null, err => {
607+
if(err) {
608+
this.semaphore.release();
609+
return errorAndCallback(err);
610+
}
628611

629-
dependency.module = module;
630-
module.addReason(null, dependency);
612+
if(currentProfile) {
613+
const afterBuilding = Date.now();
614+
currentProfile.building = afterBuilding - afterFactory;
615+
}
631616

632-
this.buildModule(module, false, null, null, err => {
633-
if(err) {
634617
this.semaphore.release();
635-
return errorAndCallback(err);
636-
}
637-
638-
if(this.profile) {
639-
const afterBuilding = Date.now();
640-
module.profile.building = afterBuilding - afterFactory;
641-
}
642-
643-
moduleReady();
644-
});
618+
afterBuild();
619+
});
620+
} else {
621+
this.semaphore.release();
622+
this.waitForBuildingFinished(module, afterBuild);
623+
}
645624
});
646625
});
647626
}

0 commit comments

Comments
 (0)