构建时间,运行时,执行时间...在JavaScript中是什么“时间”?
#javascript #webperf #intermediate #senior

上个月,我正在努力为“为什么我不能仅将.scss文件插入链接元素的href并进行开发工作?来自静态文件中相邻项目的node_modules.css文件?”

这样做的一个至关重要的原因是由于JS框架依赖多次跨性和捆绑过程的方式。

在本地开发环境中,热模块重新加载(HMR)的快速视觉反馈会使我们忘记,即将发出的应用程序代码不会以相同的方式处理文件!

运行时与建立时间

我们无法在没有提及的情况下讨论“构建”在JavaScript应用程序中的含义:

  • 运行时
  • 建立时间
  • 解析和执行时间

注意:我省略了编译时间,因为JS是interpreted language

运行

当软件执行时,运行时会发生。这可以是当应用程序提出请求和服务器端口计算过程后响应时。

运行时也指运行代码的实际工具:例如NodeDeno。*

我们在命令中使用nodenpm的事实进一步混淆了运行在本地开发环境中的运行时。 ð

tldr:npmyarn是包装管理人员。

节点和DENO是runtimes,它为您编写的代码创建环境,以执行,构建甚至部署。

在开发时,运行时间允许您访问后端,输入环境变量 - 所有位置都在同一位置而无需浏览器。

*如果您想拆开头发,浏览器可以说是JavaScript文件的运行时环境。

建立时间

构建时间包括以下过程:

汇编/移动

Compiling and build processes in React
乔纳斯·邦迪(Jonas Bondi)。 Angular vs. React: Compilers,中等,2017年。

当您编写现代JavaScript应用程序时,通常需要使用像Babel或TypeScript这样的转板器配备项目,以将JavaScript编译为ES5或COMPORJS,这是Node最初引入的JavaScript的一种形式,所有浏览器都可以解析。

对于像Sass这样的CSS预处理器的情况,它正在编译为CSS。使用PostCSS,可能会生成独特的类并进行三个。

缩小

将所有代码合并到一个文件中,并删除所有过多的间距,使其紧凑,捆绑和运行速度更快。

代码

块和将代码分离到相关的.js文件 - 使得您只能导入与按钮组件相关的文件,而不是整个库。

运行npm run build时,上面提到的所有过程都开始准备准备的JavaScript,CSS和HTML(通常带有源地图)的生产捆绑包,这些捆绑会准备好用于生产部署。

开发模式

在开发模式下,构建工具WebPack的Hot Module Replacement (HMR)功能允许应用程序在运行时方便地重建。

在大多数情况下,构建了应用程序代码的本地缓存文件夹,随后的更改不断重建,以使开发人员在开发时快速反馈最终用户的体验... 但是 all那些新鲜的构建不出现在您的输出(dist/)文件夹中。

今天,有很多精美的功能优化了能够预览您在JS框架中编写的代码的经验(咳嗽 Ahead-Of-Time compiling in angular in Angular,incremental builds,gatsby和Next,Incremental Static Regeneration在DEV和服务器中使用此类缓存来减少其静态生成视图的重建时间。)

随着新一代的构建工具和用Rust和Go编写的捆绑机的兴起,构建时间大大降低了。

执行时间处理时间

执行发生在浏览器中。在单页应用程序中,从服务器返回的缩小文件通过发生的after you type the URL into the browser

Illustration Figure 2.1. The lifecycle of a client-side web application starts with the user specifying a website address (or clicking a link) and ends when the user leaves the web page. It’s composed of two steps: page building and event handling. from "Secrets of the Javascript Ninja Second Edition"

图2.1客户端Web应用程序的生命周期从用户指定网站地址(或单击链接)开始,并在用户离开网页时结束。它由两个步骤组成:页面构建和事件处理。
"Secrets of the Javascript Ninja, Second Edition"撰写的John Resig,Bear Bibault,Josip Maras,2016年8月。

在Web 1.0次中,将通过解析HTML文件创建一个DOM树。如今,JS功能(如React.createElement())创建并附加了这些节点。

initial load上,JS被读取(解析)一次至底部一次,并以第一对开的方式为每个函数调用设置相关的执行上下文。随着会话的继续,将功能以最后的优势调用。

Illustration of execution context stack
Sukhjinder Arora,"Understanding Execution Context and Execution Stack in Javascript",中,2018年。

除了加载时间外,脚本时间还构成了事件听众的注册和会话期间的动态内容。

很多foundational resources封面JavaScript执行,但是我们很少连接所有类型的“时间”以查看它们的位置!


您在2023年对哪种构建工具感到兴奋?

您在编程职业中很难找到什么概念?

在评论中让我知道。

感谢@naismith Shreya DahalChang,Jimmy Jansen,Matt Mackay帮助我澄清了我的心理模型!


相关阅读

丹·阿布拉莫夫(Dan Abramov)。 "How does the development mode work?"过度反应。 2019年8月4日。

休·哈沃思。 "Comparing the New Generation of Build Tools" css-Tricks ,2021年4月8日(2022年1月5日更新)

i"State of JS 2021: Build Tools",JS州。 2022。

Marico Kakaka。 "Inside look at modern web browser (part 3)" Chrome开发人员,2020年8月18日。