出于安全原因,像Chrome之类的浏览器是不允许直接调用本地的JS文件的;
所以只能把它放在Web服务器端,
通过Web服务器下载到本地,再运行这些程序;后续很多WebRTC案例,包括信令服务器,都是需要使用到Web服务器的;
Web服务器选型
- Nodejs
比较特殊,可以用js开发服务端程序;
有两份JS,
一份是用于控制服务器的,
一份是用于下载到客户端去运行的; - Nginx
性能上比Apache更好,灵活度等也优于Apache,
所以逐渐把Apache取代; - Apache
一开始出现的时候占服务器市场80%,
逐渐被Nginx取代;
Web服务工作原理
Nodejs工作原理
Application:
我们自己开发的JavaScript程序,
Application运行,首先输出给V8JS引擎;V8 JavaScript Engine【V8JS引擎 | 重点】
这个引擎是从Chrome项目中抽取出来的;
主要是对JS进行一些解析工作,解析完了之后生成二进制代码;
解析生成的二进制代码去调用 Nodejs的API【NODE.JS BINDINGS】,
随后【NODE.JS BINDINGS】会调用LIBUV【一个事件处理库】【LIBUV】
类似于Android的Handler消息机制;
JS解析过程
-
首先
V8引擎
会收到 JS源程序;
在服务端写服务的时候,
首先是用JS写一个小的脚本;脚本经过V8,
通过parser,解析成Abstract Syntax Tree,
最终交给解析器【interpreter】,
【interpreter】将其解析成bytecode【字节码,执行代码】;
也可能【interpreter】经过编译优化【optimizing compiler】,
形成优化后的代码【optimized code】,
最终再转化成bytecode;
Nodejs事件处理流程
Nodejs收到事件之后的大概的处理流程
首先是若干个Request,
请求到Node.js 应用上来;拿到请求之后,会生成请求对应的事件,
插入到事件队列【LIBUV中 的 Event Queue】中去,
【LIBUV】中的Event Loop会不断循环,
读取【Event Queue】队头的事件进行处理;简单的事件则直接【Callback】,返回一个【Response】
(如请求一个HTML简单页面的事件);还有复杂一点的事件,
可能需要调用数据库、做一些查询工作、做数据统计,
最终展示页面,
这个时候会从线程池【Thread Pool】取出一个线程【Thread】,
执行对应的【Function】,最后【Callback】,返回一个【Response】;
最后回收线程;以上两个步骤的【Callback】,
如果是最终结果,自然是直接返回一个【Response】,
如果只是中间结果,
可能还需要再次生成事件,插入【Event Queue】,
进行下一轮的事件处理;
两个V8引擎
我们说Nodejs比较特殊,
可以用js开发服务端程序;
有两份JS,
一份是用于控制服务器的,
一份是用于下载到客户端去运行的;-
那么 服务端、客户端 其实分别对应着一个V8引擎;
一般情况下,在客户端发送请求之前,
Nodejs
的服务
是要先运行
起来的【running】,
服务端有自己的JS,
经过(服务端 的)V8
解析、中间层LIBUV
处理,
然后先运行起来了;客户端
发送一个http请求
到Nodejs
服务端,
比如要请求【Request】某一个JS文件,
那【Request】生成对应的事件【Event】之后,
经过LIBUV
的事件处理机制
【上述流程】,
进行事件处理,操作磁盘,拿到对应JS文件,
然后Callback、Response返回给客户端【浏览器】;浏览器【客户端】收到
服务端
的JS文件
之后,
也将JS代码
交给【(浏览器/客户端
自己的)V8
】进行解析
;
解析得到执行代码【byteCode】
之后;
随后进行JS逻辑
对应的中间层、底层
操作;
参考自: