JavaScript代码是怎么在浏览器里面运行起来的?

news2025/8/4 1:27:09

JavaScript代码是怎么在浏览器里面运行的?下面简单探索一下

浏览器内核

浏览器内核(Rendering Engine),常见的叫法如:排版引擎、解释引擎、渲染引擎,现在流行称为浏览器内核。

浏览器内核说明
IETridentIE、猎豹安全、360极速浏览器、百度浏览器
FireFoxGecko可惜这几年已经没落了,打开速度慢、升级频繁、猪一样的队友flash、神一样的对手chrome。
SafariWebkit从Safari推出之时起,它的渲染引擎就是Webkit,一提到 webkit,首先想到的便是 chrome,可以说,chrome 将 Webkit内核 深入人心,殊不知,Webkit 的鼻祖其实是 Safari。
ChromeChromium/Blink在 Chromium 项目中研发 Blink 渲染引擎(即浏览器核心),内置于 Chrome 浏览器之中。Blink 其实是 WebKit 的分支。大部分国产浏览器最新版都采用Blink内核。二次开发
OperaBlink

浏览器渲染过程

  1. HTML首先会被浏览器内核中的HTML Parser解析,最终会构建成一颗DOM树

  2. CSS会被浏览器内核中的CSS Parser解析,形成CSS规则,CSS规则和DOM树结合形成一个渲染树,通过layout(布局)生成最终的渲染树。

为什么要有layout呢?因为要适配不同尺寸的屏幕。有了渲染树之后就可以绘制展现出来了。

常见的js引擎

  • SpiderMonkey:第一款js引擎,由Brendan Eich开发(js作者)。

  • Chakra:微软开发,由于IE浏览器。

  • JavascriptCore:webkit的js引擎,Apple公司开发。

  • V8:Google开发的强大js引擎,也帮助Chrome从众多浏览器中脱颖而出。

浏览器内核和js引擎的关系

这里用webkit为列,webkit最重要的两部分:

  1. WebCore: 负责HTML、CSS的解析、布局、渲染等相关工作;
  2. JavascriptCore:解析、执行js代码。

下面是Chromium的架构图

普通JavaScript引擎(笨重)

作用:javascript引擎帮助我们将js代码编译成CPU认识的指令集,最终被cpu执行。

普通JavaScript引擎除了编译之外还要负责执行以及内存管理。 js是解释形语言,由引擎直接读取源码,一边编译一边执行,这样效率相对较低,而编译形语言(如c++)是把源码直接编译成可直接执行的代码执行效率更高。

随着技术的发展,对JavaScript性能的要求越来越高,V8引擎就是在此背景下产生的,它产生的目的就是为了提高javascript执行的性能。

V8引擎(轻量)

V8引擎是一个JavaScript引擎实现,最初由一些语言方面专家设计,后被谷歌收购,随后谷歌对其进行了开源。

V8使用C++开发,在运行JavaScript之前,相比其它的JavaScript的引擎转换成字节码或解释执行,V8将其编译成原生机器码(IA-32, x86-64, ARM, or MIPS CPUs),并且使用了如内联缓存(inline caching)等方法来提高性能。

将javascript代码转换成AST

V8引擎会先将javascript代码转换成AST(抽象语法树),事实上所有的编程语言都会将源代码解析成抽象语法树(abstract syntax tree, AST)。

AST是计算机科学中很早的一个概念,不是V8特有的(只是V8在转换过程中做了非常多的优化),更不是javascript特有的。

AST的用途

AST的作用也不仅仅是用来在V8的编译上,比如我们常用的babel插件将 es6->es5 、ts->js 、死区分析、Dead Code、编译压缩打包、css预处理器、eslint等等,这些功能的实现都离不开AST。

AST编译过程

V8执行js的简易流程

  1. 浏览器内核将源码以流的方式交给v8引擎,v8引擎获取到源码并进行编码转换

  2. 词法分析Scanner,将代码转成tokens

  3. 语法分析Parser、Preparser,直接将tokens转换成AST树结构

  4. 字节码生成

  1. parser就是直接将tokens转换成AST树结构

  2. preParse称之为预解析,为什么需要预解析呢?

  • 这是因为并不是所有的js代码一开始就会被执行,如果对所有的js代码都进行解析,会影响网页运行效率。所以v8引擎就实现了延迟解析的方案,将不必要的函数进行预解析,也就是只解析暂时需要的内容,而对函数的全量解析是在函数被调用时才会进行

  • 比如我们在一个函数outer内部定义了另外一个函数inner,那么inner函数就会进行预解析

下面看一下在线解析AST的示例👇

浏览器内核与JS引擎本篇就简单聊这么多,先浅浅的了解一下。关于V8的东西很多,也有很多非常绝妙的设计,更多V8相关的戳这里,一步步解锁吧!

我是 甜点cc

微信公众号:【看见另一种可能】

热爱前端开发,也喜欢专研各种跟本职工作关系不大的技术,技术、产品兴趣广泛且浓厚。本号主要致力于分享个人经验总结,希望可以给一小部分人一些微小帮助。

希望能和大家一起努力营造一个良好的学习氛围,为了个人和家庭、为了我国的互联网物联网技术、数字化转型、数字经济发展做一点点贡献。数风流人物还看中国、看今朝、看你我。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/15835.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3415: 【提高】小 X 的佛光

3415: 【提高】小 X 的佛光 时间限制: 1.000 Sec 内存限制: 128 MB 提交: 14 解决: 7 [命题人:][下载数据: 110] 提交状态报告 题目描述 题目背景】 小 X 是远近闻名的学佛,平日里最喜欢做的事就是蒸发学水。 【题目描述】 小 X 所在的城市 X 城是一个含有 N…

XSS-labs靶场实战(二)——第4-6关

今天继续给大家介绍渗透测试相关知识,本文主要内容是XSS-labs靶场实战第4-6关。 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负! 再次强调:严禁对未…

Qt ARM+Linux平台调用一个库的时候,报错“Bus error”

Qt ARMLinux平台调用一个库的时候,报错“Bus error” 文章目录Qt ARMLinux平台调用一个库的时候,报错“Bus error”摘要1 字节对齐问题2内存溢出问题关键字: Bus error、 Qt、 Arm、 Linux、 Debian内容背景: 最近项目终于切到Li…

如何实现高效地扩展5G毫米波段?

如今的高频信号标准使用的是比以往更高的频率和更宽的带宽,经过多年的研究和测试,5G无线网络正在世界各地进行部署。5G利用比以前使用的频带高得多的频段和毫米波频率,实现了高速、宽带宽、低时延和极高的容量。 然而,这些高频信号…

赋能型细分定位该不该选择?—— FB推广

赋能型细分定位的作用: 赋能型细分定位可以使系统覆盖到比您在细分定位选项中定义的用户更为广阔的用户群体,从而帮助改善广告表现。(如果了解谷歌的话,可以理解为搜索网络合作伙伴) 如果您希望我们面向更多可能助您…

Nginx源码:内存池的实现

文章目录1、数据结构2、接口函数2.1、创建内存池2.2、内存分配2.2.1、小块内存分配2.2.2、大块内存分配2.3、内存释放2.3.1、大块内存释放2.3.2、内存池释放4、参考为什么需要对内存管理? 避免频繁的系统调用带来的开销。减少了频繁分配和释放小块内存产生的内存碎…

LeetCode刷题(python版)——Topic72. 编辑距离

一、题设 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符删除一个字符替换一个字符 示例 1: 输入:word1 "horse", word2 &q…

回溯算法的应用

基本思想: 回溯法从开始结点(根结点)出发,以深度优先方式搜索整个解空间。这个开始结点成为活结点,同时也成为当前的扩展结点。在当前扩展结点处,搜索向纵深方向移至一个新结点。这个新结点成为新的活结点,开成为当前扩展结点。如果在当前扩展结点处不能再向纵深方…

大数据技术基础实验十五:Storm实验——实时WordCountTopology

大数据技术基础实验十五:Storm实验——实时WordCountTopology 文章目录大数据技术基础实验十五:Storm实验——实时WordCountTopology一、前言二、实验目的三、实验要求四、实验原理1、Topologies2、Spouts3、Bolts五、实验步骤1、导入依赖jar包2、编写代…

ffmpeg编译so

1.第一个坑:/bin/bash^M: bad interpreter: No such file or directory shell脚本报错/bin/bash^M: bad interpreter: No such file or directory,通过查阅资料得知,shell脚本格式必须是unix才行,但我这个脚本是在windows上编写完…

如何批量创建word文档并重命名?

如何批量创建word文档并重命名?大家请注意,我这里抛出的问题是批量创建word文档并重命名,重点在批量,并不是我们平时遇到的单纯创建一个或者几个word文档,而是批量创建几十上百个甚至几百上千个word文档。创建几个word…

英国博士后招聘|约克大学—核磁共振监测催化

英国约克大学博士后职位—核磁共振监测催化 约克大学(University of York),建于1963年,是一所位于英国英格兰约克的研究型公立大学,英国罗素大学集团、世界大学联盟、N8大学联盟、白玫瑰大学联盟和江苏—英国高水平大学…

【开发心得】Java ftp开发注意事项

前言: 虽说已经2022年了,但是ftp上传方式还是有一定使用场景的,关于java的ftp上传下载实现,基本都指向了apache commont net 库。 代码实现可以参考:https://blog.csdn.net/tianshan2010/article/details/103690940 或者其他类似的文章&…

云服务--漏洞修复

1、Spring Security 身份认证绕过漏洞(CVE-2022-22978) Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。 Spring Security存在身份认证绕过漏洞 ,当Spring Security中使用RegexRequestMatcher进行权限配置&#…

汽车云算力“竞速”,个性化进阶成新风向

配图来自Canva可画 随着产业互联网的持续推进,云服务逐渐深入各行各业,云服务厂商也专门推出各种面向特定行业的专属云,比如金融云、零售云、政务云等等。如今云服务厂商正把焦点深入到汽车领域,围绕“汽车云”展开新的角逐。 今…

LeetCode[662]二叉树的最大宽度

难度:中等 题目: 给你一棵二叉树的根节点 root ,返回树的 最大宽度 。 描述: 树的 最大宽度 是所有层中最大的 宽度 。 每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长…

麦子-linux驱动策略与框架

一、linux内核同步和互斥 信号量(进程与进程) 当进程A执行共享资源先加锁执行down表示占用资源,进程B想执行就会被dowm,导致陷入睡眠 当进程A行完了就会up释放资源,我们其他线程执行这个共享资源就不会被dowm睡眠 自旋…

蓝桥杯入门即劝退(十)反转链表

----------持续更新蓝桥杯入门系列算法实例------------ 如果你也喜欢Java和算法,欢迎订阅专栏共同学习交流! 你的点赞、关注、评论、是我创作的动力! -------希望我的文章对你有所帮助-------- 前言:如果有一定链表基础&#…

【图像处理】基于形状提取和模式匹配组合的面部特征点提取方法(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

7天酒店斩获五洲钻石奖“年度投资价值酒店连锁品牌” 打造酒店投资极致性价比

近日,“2022文旅国际峰会暨第十五届世界酒店论坛”在海南隆重召开,300多位来自中外的业界精英和跨界企业家代表等受邀参加,齐聚行业盛会。同期,“第十四届五洲钻石奖”也正式揭晓,7天酒店在众多品牌中脱颖而出&#xf…