Node.js is “an asynchronous event driven JavaScript runtime.” Let me break down that definition. Node.js reads, or interprets, your JavaScript code. You write code in JavaScript and then use your version of Node.js to run the code. How does that process work, exactly?
Web开发,Web应用程序的内部工作原理
异步
事件驱动
When a JavaScript application is launched, all the code in that application is loaded into memory.
当一个javascript应用程序启动时,该应用程序中的所有代码都被加载到内存中。无论代码是否立即执行,每个变量、函数和代码块对应用程序来说都已经是可访问可用的了。为什么某些代码不能立即运行?尽管定义和分配一个全局变量可能会在应用程序启动时给该变量一个值,但并非所有函数都会运行,除非它们有理由这样做。其中一些函数以事件监听器的形式出现---函数对象,当一个有着匹配名字的事件被触发的时候才运行的回调函数。
这些函数都不会被执行直到事件触发器触发事件监听器运行该回调函数。
通过这种方式,node.js可以以一种特别快速、高效的方式运行应用程序。
相比其他语言或者平台在每次执行命令时都需要重新编译或者运行所有的代码,nodejs只加载代码一次,然后只有当事件驱动的时候才会触发相应的函数。
node.js只需要一个执行线程(由事件循环使用),只有在较大的任务需要时才可以使用其他线程。因此,node.js应用程序需要较少的处理能力来创建和运行要完成的任务,因为不必为每个传入的任务分配专门的计算机资源。
以亚马逊为例子,node.js可能使用其主线程来处理您的请求,以处理订单、发送信息以进行验证,并继续处理其他用户加载网页的请求。当你的订单被处理时,会发出一个事件,触发主线程,让您知道订单已成功下达。换句话说,node.js使用异步运行部分任务,并在一个任务完成之前继续执行其他任务。node.js不会等待一个操作从开始到结束,而是注册事件监听器,当发送的任务完成时调用事件监听器。最后,node.js为您提供了一种不使用Web浏览器编写JavaScript代码的方法,您可以使用此环境设计所有类型的应用程序。大多数node.js应用程序都是Web应用程序,它们使用异步、事件驱动的特性来提供快速加载、响应的Web内容。
The web server is the backbone of your web application, as it handles incoming requests for data to be processed and outgoing responses. Web服务器是Web应用程序的主干,因为它处理要处理的数据的传入请求和传出响应。
关于Node.js
因为node.js是用Google Chrome的javascript引擎(一个用来将javascript语言解释成有意义的计算机命令的工具)构建的,所以它被认为是强大的,并且能够支持将javascript作为服务器端语言。Javascript既可用于帮助网页(客户端)交互,也可用于处理传入的应用程序数据和数据库通信。(后一种工作通常保留在诸如C、Java、Python和Ruby等语言中)。开发人员现在可以只掌握JavaScript来构建一个完整的Web应用程序,而不必掌握多种语言来完成相同的任务。
客户端v.s.服务器端
客户端(前端)是指您编写的代码,它会让用户Web浏览器中看到某些内容。客户端代码通常包括一些用来与用户交互的javascript代码。服务器端(后端)是指用于应用程序逻辑(如何组织数据并将其保存到数据库)的代码。服务器端代码负责对登录页面上的用户进行身份验证,运行预定的任务,甚至确保客户端代码到达客户端。
下图中,客户端是浏览器,用户可以再浏览器中看到你的应用。服务器端是你的应用运行的地方,它会处理用户提交的数据。通常情况下,服务器端会渲染(render)客户想要的用户界面。
[图片上传中...(image.png-88356b-1570191009297-0)]
node.js使用单个线程操作事件循环(event loop)。线程是执行编程任务所需的计算能力和资源的集合。通常,一个线程负责启动和完成一个任务;同时运行的任务越多,需要的线程就越多。在大多数其他软件中,多个任务由计算机可以同时提供的线程池进行匹配和处理。但是,node.js一次只处理一个任务,并且只对主线程无法处理的任务使用更多线程。
这个过程听起来可能有点违反直觉,但在大多数不需要计算密集型任务(需要计算机大量处理能力的任务)的应用程序中,这个线程可以快速管理和执行所有任务。请参见图0.1中事件循环的简化图。当任务准备运行时,它们进入一个队列,会在事件循环的某个特定阶段进行处理。
image.png
- 应用程序将准备应用程序和配置的上下文
- 随着任务的累积,它们将排队并进入轮询阶段进行处理。
- 队列中的回调函数在这个阶段执行。此处创建的其他回调将返回到队列中。
- 在循环结束时,指定要立即运行的操作将在此处运行。
- 在时间间隔或超时中设置的任务将在此阶段进行评估。
cycles forever in a loop, listening for JavaScript events triggered by the server to notify of some new task or another task’s completion. As the number of tasks increases, tasks line up in a queue to be incrementally processed by the event loop. You don’t code with this fact in mind, though. You write your code by using asynchronous conventions, and the Node.js architecture schedules task handling for you behind the scenes. As a result, Node.js has become popular for creating real-time applications that persistently listen for data being sent back and forth.
Node.js的事件循环永远循环,监听由服务器触发的javascript事件以通知某个新任务或另一个任务的完成。随着任务数量上涨,任务将会排在队列中逐渐被事件循环执行。因此,node.js在创建监听数据进进出出的实时应用中非常流行。
The office manager’s role is to handle incoming messages, job assignments, and office-related tasks. The office manager could have a long list of tasks to complete, from delegating the creation of complete financial reports to answering the phone and putting up the office-party decorations. Because some tasks take more time than others, the office manager isn’t obligated to complete any individual task before handling a new one. If she’s setting up for a party and the phone rings, for example, she can stop setting up to answer the call. Better yet, she can answer the call and transfer the caller to another employee so that she can go back to decorating.
您可以将事件循环看作是一个办公室主任。办公室主任的主要职责是处理传入的信息,任务分配和办公室相关的工作。这个办公室主任可能有一长串要完成的任务,从授权创建完整的财务报告到接听电话和布置办公室宴会装饰。由于某些任务比其他任务耗时更多,办公室经理没有义务在处理新任务之前完成任何单个任务。更好的是,她可以接听电话并将来电者转接给另一位员工,这样她就可以重新开始布置办公室宴会装饰了。
Similarly, the event loop handles a series of tasks, always working on one task at a time and using the computer’s processing power to offload some larger tasks while the event loop shortens the list of tasks. On most other platforms, incoming tasks are assigned to new processes, creating a new event loop for each task. Increasing the number of tasks, however, is like increasing the number of employees in a finite space. You start to run into new issues such as cost, computing power, and shared resources. (What would you do if two employees need to use the phone at the same time, for example?)
相似地,事件循环处理一系列任务,总是一次处理一个任务,并使用计算机的处理能力卸载一些较大的任务,这样事件循环就缩短了任务列表。在大多数其他平台上,传入任务被分配给新进程,为每个任务创建一个新的事件循环。然而,增加任务的数量,就像增加有限空间中的员工数量。您开始遇到新的问题,如成本、计算能力和共享资源。(例如,如果两名员工同时想使用电话,你会怎么做?)
进程和线程
It’s important to note that the Node.js event loop relies on a single thread to manage all its tasks, but it doesn’t necessarily use that thread only to run each task to completion. In fact, Node.js is designed to pass larger tasks to the host computer, and the computer may create new threads and processes to operate those tasks.
需要注意的是,node.js事件循环依赖于一个线程来管理所有任务,但它不一定只使用该线程来完成每个任务。实际上,node.js的设计目的是将更大的任务传递给主机,主机可以创建新的线程和进程来操作这些任务。
A thread is an allocated bundle of computer resources used to run a series of instructions in a task. Usually, the tasks handled by threads are simple and fast. For this reason, the Node.js event loop needs only one thread to act as the manager of all other tasks. Threads are made available through computer processes, and some more-intensive tasks require their own process to run.
线程是分配的计算机资源束,用于在任务中运行一系列指令。通常,线程处理的任务简单而快速。因此,node.js事件循环只需要一个线程作为所有其他任务的管理器。计算机进程使得线程可用,一些更密集的任务需要运行自己的进程。
A process is also a bundle of computing power and resources used for a task’s execution, though usually for larger tasks than those handled by threads. A process must exist to create a thread, which implies that each Node.js application runs on its own process.
一个进程也是用于执行任务的计算能力和资源束,尽管通常比线程处理更大的任务。为了创建一个线程前提是要
在一个进程上,这意味着每个node.js应用程序都在自己的进程上运行。
Even though Node.js may be single-threaded, you can have multiple instances of processes running in parallel and processing incoming requests and tasks. For this reason, Node.js scales well; it schedules tasks asynchronously, using additional threads and processes only when necessary instead of generating new processes for every task. As more processes are needed to handle your task list, demand on your computer increases. Node.js works best to minimize the number of concurrent processes.
尽管node.js可能是单线程的,但是可以有多个进程实例并行运行,并处理传入的请求和任务。因此,node.js可以很好地扩展;它异步地调度任务,只在必要时使用额外的线程和进程,而不是为每个任务生成新的进程。为了处理任务列表需要更多的进程,对计算机的需求也会增加。node.js可以最大限度地减少并发进程的数量。
学习或者用Node.js的好处:
- 只用掌握js语言就好
- 如果你想连续传输数据或拥有一些聊天功能,node.js比其他平台更加突出。
- node.js由Google的V8 javascript解释器提供支持,这意味着它得到了广泛的支持,并有望在性能和功能方面有所增长,而且不会很快消失。
- 在Web开发社区中,node.js得到了广泛的应用。您可能会遇到其他开发人员,他们可能已经使用node.js开发了5年。此外,现在正在为node.js构建支持性更强的开源工具。
网友评论