Nodejs为什么选择javascript为载体语言


Posted in NodeJs onJanuary 13, 2015

我们先来看看NodeJS官网上的介绍:

Nodejs为什么选择javascript为载体语言

其特点为:

1,它是一个Javascript运行环境

2,依赖于Chrome V8引擎进行代码解释

3,事件驱动

4, 非阻塞I/O

5, 轻量、可伸缩,适于实时数据交互应用

6,单进程,单线程

(1),Nodejs为什么选择javascript为载体语言

事实上,在实现 Node.js 之初,作者 Ryan Dahl 并没有选择 JavaScript,他尝试过 C、Lua,皆因其欠缺一些高级语言的特性,如闭包、函数式编程,致使程序复杂,难以维护。

而 JavaScript 则是支持函数式编程范型的语言,很好地契合了 Node.js 基于事件驱动的编程模型。加之 Google 提供的 V8 引擎,使 JavaScript 语言的执行速度大大提高。

最终呈现在我们面前的就成了 Node.js,而不是 Node.c,Node.lua 或其他语言的实现。

(2),Node.js不是JS应用、而是JS运行平台

看到Node.js这个名字,初学者可能会误以为这是一个Javascript应用,事实上,Node.js采用C++语言编写而成,是一个Javascript的运行环境。

Node.js采用了Google Chrome浏览器的V8引擎,性能很好,同时还提供了很多系统级的API,如文件操作、网络编程等。

以下是NodeJS所涉及的全部模块:

Nodejs为什么选择javascript为载体语言Nodejs为什么选择javascript为载体语言

浏览器端的Javascript代码在运行时会受到各种安全性的限制,对客户系统的操作有限。

相比之下,Node.js则是一个全面的后台运行时,为Javascript提供了其他语言能够实现的许多功能。

(3),Node.js的特点

Node.js在设计上也是比较创新,它以单进程,单线程模式运行(这和Javascript的运行方式是一致的),

事件驱动机制是Node.js通过内部单线程高效率地维护事件循环队列来实现的,没有多线程的资源占用和上下文切换,这意味着面对大规模的http请求,Node.js凭借事件驱动搞定一切,

习惯了传统语言的网络服务开发人员可能对多线程并发和协作非常熟悉,但是面对Node.js,我们需要接受和理解它的特点。

二,重要概念

1,什么是 Event Loop ?(很重要的概念)

Event Loop 是一个很重要的概念,指的是计算机系统的一种运行机制。

想要理解Event Loop,就要从程序的运行模式讲起。运行以后的程序叫做进程(Process),一般情况下,一个进程一次只能执行一个任务。

如果有很多任务需要执行,不外乎三种解决方法。

(1),排队。因为一个进程一次只能执行一个任务,只好等前面的任务执行完了,再执行后面的任务。

(2),新建进程。使用fork命令,为每个任务新建一个进程。

(3),新建线程。因为进程太耗费资源,所以如今的程序往往允许一个进程包含多个线程,由线程去完成任务。

以JavaScript语言为例,它是一种单线程语言,所有任务都在一个线程上完成,即采用上面的第一种方法。一旦遇到大量任务或者遇到一个耗时的任务,网页就会出现"假死",因为JavaScript停不下来,也就无法响应用户的行为。

你也许会问,JavaScript为什么是单线程,难道不能实现为多线程吗?

这跟历史有关系:

JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊。

JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。

比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?

所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。

为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。

所以,这个新标准并没有改变JavaScript单线程的本质。

回到EventLoop:

单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。

如果排队是因为计算量大,CPU忙不过来,倒也算了,但是很多时候CPU是闲着的,因为IO设备(输入输出设备)很慢(比如Ajax操作从网络读取数据),不得不等着结果出来,再往下执行。

JavaScript语言的设计者意识到,这时主线程完全可以不管IO设备,挂起处于等待中的任务,先运行排在后面的任务。等到IO设备返回了结果,再回过头,把挂起的任务继续执行下去。

于是,所有任务可以分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,

才能执行后一个任务;异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。

如下图:

Nodejs为什么选择javascript为载体语言

 只要主线程空了,就会去读取"任务队列",这就是JavaScript的运行机制。这个过程会不断重复。

三,实例讲解

好了,“废话”不多说了,马上开始我们第一个NodeJS应用:“Hello 大熊”。

打开你最喜欢的编辑器,创建一个HelloWorld.js文件。

代码如下:

1 var http = require("http") ;2 http.createServer(function(request,response){3 response.writeHead(200,{4 "Content-Type" : "text/plain"5 }) ;6 response.write("Hello,大熊 !") ;7 response.end() ;8 }).listen(8888) ;

我们来运行并且测试这段代码。首先,用Node.js执行你的脚本:

打开命令行工具CMD,切换到你的工作目录,运行命令“node HelloWorld.js”

接下来,打开浏览器访问http://localhost:8888/,你会看到一个写着 “Hello,大熊 !” 的网页。

一点小的扩展知识:

如下图所示,这是NodeJS中的http.js部分源码,createServer是一个对用户很友好的接口,内部实现采用了单例模式,这样做的好处是,把实例的创建和初始化任务进行有效的分离,职责专一,降低耦合度,这是大家平时编程时可以借鉴的思想。

Nodejs为什么选择javascript为载体语言

哈哈哈,是不是很有意思,这只是一次短暂的体验,后面会陆续讲解很多的知识点,大家慢慢体会O(∩_∩)O哈哈~

四,总体概述

1,它是一个Javascript运行环境

2,依赖于Chrome V8引擎进行代码解释

3,事件驱动

4, 非阻塞I/O

5, 轻量、可伸缩,适于实时数据交互应用

6,单进程,单线程

最后我想说的话是:这篇的例子不是很多,但是这些概念相当重要,一定要有一个清晰的理解,这样为以后的NodeJS学习会打下牢固的基础的,朋友们加油一起努力。

哈哈哈,本篇结束,未完待续,希望和大家多多交流够沟通,共同进步。。。。。。呼呼呼……(*^__^*)

NodeJs 相关文章推荐
PHPStorm 2020.1 调试 Nodejs的多种方法详解
Sep 17 NodeJs
nodejs win7下安装方法
May 24 NodeJs
NodeJS创建基础应用并应用模板引擎
Apr 12 NodeJs
nodejs加密Crypto的实例代码
Jul 07 NodeJs
nodejs实现发出蜂鸣声音(系统报警声)的方法
Jan 18 NodeJs
nodejs socket实现的服务端和客户端功能示例
Jun 02 NodeJs
使用vs code开发Nodejs程序的使用方法
Sep 21 NodeJs
NodeJS实现视频转码的示例代码
Nov 18 NodeJs
nodejs基于WS模块实现WebSocket聊天功能的方法
Jan 12 NodeJs
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
May 30 NodeJs
NodeJs实现简易WEB上传下载服务器
Aug 10 NodeJs
使用nodeJS中的fs模块对文件及目录进行读写,删除,追加,等操作详解
Feb 06 NodeJs
NodeJS中Buffer模块详解
Jan 07 #NodeJs
Nodejs中读取中文文件编码问题、发送邮件和定时任务实例
Jan 01 #NodeJs
Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例
Jan 01 #NodeJs
nodejs中实现路由功能
Dec 29 #NodeJs
NodeJS制作爬虫全过程(续)
Dec 22 #NodeJs
NodeJS制作爬虫全过程
Dec 22 #NodeJs
nodejs中操作mysql数据库示例
Dec 20 #NodeJs
You might like
自制汽车收音机天线:收听广播的技巧和方法
2021/03/02 无线电
模板引擎Smarty深入浅出介绍
2006/12/06 PHP
php 数组的合并、拆分、区别取值函数集
2010/02/15 PHP
PHP删除指定目录中的所有目录及文件的方法
2015/02/26 PHP
用js判断用户浏览器是否是XP SP2的IE6
2007/03/08 Javascript
jQuery源码中的chunker 正则过滤符分析
2012/07/31 Javascript
js自动生成对象的属性示例代码
2013/10/28 Javascript
jquery操作cookie插件分享
2014/01/14 Javascript
javascript进行四舍五入方法汇总
2014/12/16 Javascript
JavaScript中的ParseInt("08")和“09”返回0的原因分析及解决办法
2016/05/19 Javascript
js实现四舍五入完全保留两位小数的方法
2016/08/02 Javascript
几句话带你理解JS中的this、闭包、原型链
2016/09/26 Javascript
浅谈js函数中的实例对象、类对象、局部变量(局部函数)
2016/11/20 Javascript
微信小程序 122100版本更新问题解决方案
2016/12/22 Javascript
微信小程序 特效菜单抽屉效果实例代码
2017/01/11 Javascript
react-native之ART绘图方法详解
2017/08/08 Javascript
浅谈Angular HttpClient简单入门
2018/05/04 Javascript
小程序实现短信登录倒计时
2019/07/12 Javascript
使用xampp将angular项目运行在web服务器的教程
2019/09/16 Javascript
使用vue制作滑动标签
2019/09/21 Javascript
countUp.js实现数字滚动效果
2019/10/18 Javascript
javascript 原型与原型链的理解及实例分析
2019/11/23 Javascript
javascript实现倒计时提示框
2021/03/02 Javascript
[43:35]EG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python基础教程之基本数据类型和变量声明介绍
2014/08/29 Python
使用Python的Twisted框架构建非阻塞下载程序的实例教程
2016/05/25 Python
python+selenium实现京东自动登录及秒杀功能
2017/11/18 Python
python retrying模块的使用方法详解
2019/09/25 Python
postman和python mock测试过程图解
2020/02/22 Python
python3发送request请求及查看返回结果实例
2020/04/30 Python
tensorflow模型的save与restore,及checkpoint中读取变量方式
2020/05/26 Python
python导入库的具体方法
2020/06/18 Python
如何教少儿学习Python编程
2020/07/10 Python
基于ccs3的timeline时间线实现方法
2020/04/30 HTML / CSS
2014年党建工作汇报材料
2014/10/27 职场文书
领导干部学习十八届五中全会精神心得体会
2016/01/05 职场文书