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 相关文章推荐
nodejs URL模块操作URL相关方法介绍
Mar 03 NodeJs
nodejs和php实现图片访问实时处理
Jan 05 NodeJs
nodejs的压缩文件模块archiver用法示例
Jan 18 NodeJs
NodeJs下的测试框架Mocha的简单介绍
Feb 22 NodeJs
nodejs中向HTTP响应传送进程的输出
Mar 19 NodeJs
nodejs实现邮件发送服务实例分享
Mar 29 NodeJs
nodejs 子进程正确的打开方式
Jul 03 NodeJs
详解使用vscode+es6写nodejs服务端调试配置
Sep 21 NodeJs
nodejs实现连接mongodb数据库的方法示例
Mar 15 NodeJs
基于nodejs res.end和res.send的区别
May 14 NodeJs
nodejs一个简单的文件服务器的创建方法
Sep 13 NodeJs
Nodejs技巧之Exceljs表格操作用法示例
Nov 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
英雄试炼之肉山谷—引领RPG新潮流
2020/04/20 DOTA
PHP生成HTML静态页面实例代码
2008/08/31 PHP
php addslashes 函数详细分析说明
2009/06/23 PHP
Laravel框架查询构造器 CURD操作示例
2019/09/04 PHP
laravel Model 执行事务的实现
2019/10/10 PHP
javascript数组使用调用方法汇总
2007/12/08 Javascript
JS 巧妙获取剪贴板数据 Excel数据的粘贴
2009/07/09 Javascript
chrome原生方法之数组
2011/11/30 Javascript
用JavaScript仿PS里的羽化效果代码
2011/12/20 Javascript
JavaScript等比例缩放图片控制超出范围的图片
2013/08/06 Javascript
Javascript实现返回上一页面并刷新的小例子
2013/12/11 Javascript
jQuery Ajax使用实例
2015/04/16 Javascript
详解js中class的多种函数封装方法
2016/01/03 Javascript
js针对ip地址、子网掩码、网关的逻辑性判断
2016/01/06 Javascript
jQuery表格插件datatables用法汇总
2016/03/29 Javascript
BootStrap的select2既可以查询又可以输入的实现代码
2017/02/17 Javascript
JavaScript之Map和Set_动力节点Java学院整理
2017/06/29 Javascript
Vue Socket.io源码解读
2018/02/07 Javascript
nodejs连接mysql数据库及基本知识点详解
2018/03/20 NodeJs
js实现图片放大并跟随鼠标移动特效
2019/01/18 Javascript
基于js实现逐步显示文字输出代码实例
2020/04/02 Javascript
js+css实现扇形导航效果
2020/08/18 Javascript
Vue 实现可视化拖拽页面编辑器
2021/02/01 Vue.js
使用Kivy将python程序打包为apk文件
2017/07/29 Python
python多进程提取处理大量文本的关键词方法
2018/06/05 Python
Python中的单行、多行、中文注释方法
2018/07/19 Python
Python importlib模块重载使用方法详解
2020/10/13 Python
美国著名珠宝品牌之一:Jared The Galleria Of Jewelry
2016/10/01 全球购物
Veronica Beard官网:在酷、经典和别致之间找到了平衡
2018/01/11 全球购物
美国一站式电动和手动工具商店:International Tool
2020/11/26 全球购物
关于逃课的检讨书
2014/01/23 职场文书
2014年服务员个人工作总结
2014/12/23 职场文书
认识实习感想
2015/08/10 职场文书
80后创业总结的9条职场用人思想,记得收藏
2019/08/13 职场文书
Win11 Build 21996.1 Dev版怎么样? win11系统截图欣赏
2021/11/21 数码科技
MySql如何将查询的出来的字段进行转换
2022/06/14 MySQL