O código subjacente do Firefox DevTools, que é escrito em JavaScript e HTML, é um aplicativo complexo. Devido à complexidade e à quantidade de trabalho em andamento, a equipe do DevTools fez todo o possível para carregar o mínimo possível. Além disso, a equipe tem um sistema de importação e inicialização preguiçosa de objetos quando eles são necessários. Eu dediquei um pouco de tempo para reduzir o inicializador, vamos dar uma olhada!
O sistema se baseia em aproveitar as vantagens do Object.defineProperty
‘s get
para inicializar um objeto quando necessário:
// Lazily initializes an object's property until it's used function lazyGet(hostObj, name, initializer) { let defined = false; Object.defineProperty(hostObj, name, { get: function () { // If not already defined, define it by executing // its initializer and setting it as value if (!defined) { defined = true; // Overrides the original property definition // which is the initializer Object.defineProperty(hostObj, name, { configurable: true, enumerable: true, value: initializer.apply(hostObj), writable: true, }); return hostObj[name]; } }, configurable: true, enumerable: true }); }
Com a função lazyGet
a propriedade que o senhor deseja só é inicializada e processada quando seu getter é chamado:
// Don't define window.myProp until someone tries to use it // Thus, if it's never used, it's never initialized lazyGet(window, "myProp", () => { return { message: "Hello!" }; }); // window.myProp is now undefined, since it hasn't been requested yet // Use it for something, which triggers initialization and returns its value console.log(window.myProp.message); // Using it again doesn't initialize again, since it was already created console.log(window.myProp.message); // And it can be reassigned later on: window.myProp = null;
O inicializador do Mozilla é muito mais complexo, pois também atua como um carregador, mas o senhor entendeu a ideia. Sempre pensamos em carregar recursos de forma preguiçosa, mas também é bom pensar em inicializar propriedades, pois elas podem não ser necessárias! Mantenha uma pegada pequena se puder!