为了给出一些背景信息,我有兴趣学习如何优化在Google Cloud Function上运行的Node.js Express应用程序的冷启动时间。
到目前为止,我已经了解到冷靴的最大损失是使用require语句加载依赖项。作为一名软件工程师,科学头脑告诉我它将基于文件数量,文件大小,依赖数量,缓存。然而,也许优化更像是一门艺术,而不是科学,所以任何来自你自己经验的指针或反馈都是最受欢迎的。
我的问题是
如果我用两个const x = require('x')
语句包围process.hrtime()
并测量时差,我会测量整个包加载时间'x'的加载时间吗?
如果是这样,是否包含此软件包中所有文件的加载?这个包所需的依赖性如何 - 它们何时加载(这导致我的第三个问题3)。
如果require语句在条件块内,例如if (condition) { const x = require('x'); }
,它在什么时候被“加载”,'加载'究竟意味着什么(即在内存,解析,执行等)?它是否会在运行时“加载”到达(或不到达)语句,或者require
是否会在程序开始执行时发生?
答案 0 :(得分:2)
是的,require
只是一个正常的函数,如果它在内存中则返回模块,如果不在则加载它,这意味着读取文件,解析并执行它(当然它可能涉及要求其他依赖)。
基准测试没有问题(只需确保测量文件的首先要求,因为模块已缓存)。
如果您的文件中有require
但未执行(例如因为它位于if
语句后面),那么它的效果将不会超过您的文件文件。并且在到达声明之前不会发生加载。