-
Notifications
You must be signed in to change notification settings - Fork 269
Description
From a crazy long investigation in Marak/colors.js#151
In parse/index.js
:
function addParent(obj, parent) {
var isNode = obj && typeof obj.type === 'string';
var childParent = isNode ? obj : parent;
for (var k in obj) {
var value = obj[k];
if (Array.isArray(value)) {
value.forEach(function(v) { addParent(v, childParent); });
} else if (value && typeof value === 'object') {
addParent(value, childParent);
}
}
if (isNode) {
Object.defineProperty(obj, 'parent', {
configurable: true,
writable: true,
enumerable: false,
value: parent || null
});
}
return obj;
}
Look at var value = obj[k];
...
If obj
is a String
(such as a selector), its keys will be iterated over unnecessarily. If require('colors')
is being used in the codebase, the keys will also include all colors
getter methods such as bold
, yellow
, and most dangerously, the terrifying zalgo
. All these getters are being invoked for every string. zalgo
uses Math.random()
which causes a huge slow down.
This showed up in a CPU profile I was running to debug my slow webpack compile, while using bootstra-loader
, and resolve-url-loader
which depends on rework
.
Removing zalgo
sped up my compile from 14s to 7s.
Fix should be simple. Check if its a String
and skip it in the for loop.
This should give an instant huge speed up to any webpack
and bootstrap-loader
users. Dependants are all using semver properly.