警告内含需要插件
此插件目前为 实验 /然而不稳定,这说明它已被用在一个非常大的网络应用程序中,在减少该应用程序的运行时间启动时间方面非常成功.
快速使用
添加此优化器以运行 第一个 (在细化前),用于联署材料捆绑.
{
"optimizers": {
"*.js": ["@atlaspack/optimizer-inline-requires", "..."]
}
}
背景和动机
当Atlaspack以捆绑形式生产模块时,如果范围提升没有带来依赖性,它包括要求这些依赖性位于模块功能的顶端。 例如,在细化之前,一个模块可能看起来是这样的:
atlaspackRegister('abc123', function (require, module, exports) {
var $def456 = require('def456');
var $ghi789 = require('ghi789');
exports.someFunction = function () {
if ($def456.someOperation()) {
return $ghi789.anotherOperation();
}
return null;
};
});
当模块被初始化(即“模块工厂”被称作“模块工厂”)时,将获得 def456 财务报告和审定财务报表 ghi789 模块,立即呼叫他们的模块工厂,等等。 然而,两个模块直到 someFunction 导出被调用 。 例如,如果呼叫网站是这样的:
// other code..
var $abc123 = require('abc123');
element.addEventListener('click', () => {
element.innerText = $abc123.someFunction();
});
...然后代码在 abc123 可能直到很久以后才被调用,或者根本不被调用。 在规模足够大的应用中,所有这些工厂功能的评价/执行时间在应用的性能衡量尺度中都可以看到.
这个插件做的是,它把那些 require 调用“ 懒惰” 或“ 延迟” 的评价要求—— 也就是说, 工厂功能只有在模块首次使用时才会执行 。 第一个例子是,产生的代码(先去后去)将像这样:
atlaspackRegister('abc123', function (require, module, exports) {
var $def456;
var $ghi789;
exports.someFunction = function () {
if ((0, require('def456')).someOperation()) {
return (0, require('ghi789')).anotherOperation();
}
return null;
};
});
修饰器将删除未初始化的变量,它还将简化 (0, ...) 在可能情况下,序列表达式.
必须指出,Atlaspack只执行一次工厂职能。 下级呼叫 require 将返回原工厂返回的模块。 见 require 代码在 packages/packagers/js/src/helpers.js 对于如何运作.
洞穴
间接费用
所以这里的主要警告是,我们现在正在将一个简单的可变访问器变成一个函数调用,每当模块被引用的时候. 对于较小的应用来说,这种间接费用可能不值得权衡,但对于更大的应用来说可能并不值得。 这就是为什么这个插件是可选的,因为您需要尝试它来确定它是否适合您.
副作用
当模块关闭时(例如,在 window (例如,A/CN.9/WG.III/WP.III/WP.1号文件)。 对于Atlaspack已查明具有副作用的资产(是否通过) package.json sideEffects 这些模块将 没有 有他们的 require 电话延期.