手机版

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

时间:2021-10-15 来源:互联网 编辑:宝哥软件园 浏览:

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

其特征在于:

1,这是一个Javascript运行环境。

2、依托Chrome V8引擎进行代码解读。

3、事件驱动。

4、非阻塞输入输出。

5、轻量级且可扩展,适合实时数据交互应用。

6、单流程、单线程。

(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使用谷歌Chrome浏览器的V8引擎,性能不错,还提供了很多系统级的API,比如文件操作、网络编程等。

以下是NodeJS中涉及的所有模块:

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

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

(3)节点的特点

Node.js在设计上也是比较有创新的,运行在单进程、单线程的模式下(与Javascript的运行模式一致)。

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

习惯于传统语言的Web服务开发人员可能对多线程并发和协作比较熟悉,但是面对Node.js,我们需要接受和理解它的特性。

第二,重要概念。

1、什么是事件循环?(一个非常重要的概念)

事件循环是一个非常重要的概念,它是指计算机系统的一种运行机制。

要理解事件循环,我们应该从程序的运行模式开始。运行后,程序被称为进程。通常,一个进程一次只能执行一个任务。

如果要执行的任务很多,那么只有三种解决方案。

(1)、排队。因为一个进程一次只能执行一个任务,所以在执行下一个任务之前,它必须等待前一个任务被执行。

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

(3)创建一个新线程。因为进程消耗太多的资源,今天的程序经常允许一个进程包含多个线程,并且线程完成任务。

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

你可能会问,为什么JavaScript是单线程的,不能实现为多线程?

这与历史有关:

JavaScript语言的特点之一是单线程,这意味着一次只能做一件事。那么为什么JavaScript不能有多线程呢?这样可以提高效率。

JavaScript是一个单线程,这与其用途有关。作为一种浏览器脚本语言,JavaScript主要用于与用户交互和操作DOM。这就决定了它只能是单线程,否则会带来复杂的同步问题。

例如,假设JavaScript同时有两个线程,一个线程向DOM节点添加内容,另一个线程删除节点。浏览器应该以哪个线程为标准?

因此,为了避免复杂性,JavaScript从诞生之日起就一直是单线程的,这已经成为这种语言的核心特性,未来也不会改变。

为了利用多核CPU的计算能力,HTML5提出了Web Worker标准,允许JavaScript脚本创建多个线程,但子线程完全由主线程控制,无法操作DOM。因此,这个新标准并没有改变JavaScript单线程的本质。

回到事件循环:

单线程意味着所有任务都需要排队,上一个任务完成后,下一个任务才会执行。如果前一个任务需要很长时间,那么后一个任务将不得不一直等待。

如果排队是因为计算量大,CPU太忙,那就算了,但大部分时间CPU都是空闲的,因为IO设备(I/O设备)非常慢(比如Ajax操作从网络读取数据),他们要等结果出来才能继续。

JavaScript的设计者意识到主线程可以挂起等待的任务,不管IO设备如何,先运行后面的任务。当IO设备返回结果时,返回并继续执行挂起的任务。

因此,所有的任务可以分为两种类型,一种是同步的,另一种是异步的。同步任务是指在主线程上排队等待执行的任务,只有前一个任务被执行。

执行后一项任务;异步任务是指不进入主线程但进入“任务队列”的任务。只有当“任务队列”通知主线程可以执行异步任务时,任务才会进入主线程执行。

下图:

只要主线程为空,就会读取‘任务队列’,这是JavaScript的运行机制。这个过程将会重复。

第三,举例说明。

好了,让我们停止谈论“废话”,开始我们的第一个NodeJS应用:“你好,小熊”。

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

代码如下:

复制代码如下:1 var http=require(' http ');2 http.createServer(函数(请求,响应){3 response.writeHead(200,{ 4 ' Content-Type ' : ' text/plain ' 5 });6.写信('你好,大熊!') ;7 response . end();8 }).听(8888);

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

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

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

一点延伸的知识:

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

哈哈,是不是很有意思?只是短暂的经历。很多知识点会陆续讲解,大家会逐渐体会到O(_)O哈哈~

四.概述。

1,这是一个Javascript运行环境。

2、依托Chrome V8引擎进行代码解读。

3、事件驱动。

4、非阻塞输入输出。

5、轻量级且可扩展,适合实时数据交互应用。

6、单流程、单线程。

最后我想说的是:本文的例子不多,但是这些概念非常重要,所以一定要有一个清晰的认识,这样才能为以后NodeJS的研究打下坚实的基础。朋友们会一起努力。

哈哈,这篇文章结束了,但不打算继续了。希望和大家多交流,一起进步。呜-呼.(* _ _ *)

版权声明:Nodejs为什么选择javascript作为载体语言?是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。