通过在Node.js上发布
本指南
的翻译的
第一部分 ,我们决定了解听众对我们是否应继续从事该项目的意见,并进行了一次小型调查。 事实证明,大约94%的投票者支持我们的倡议。 因此,请参阅Node.js教程的第二部分。

今天,我们将讨论为了有效地为Node.js平台开发应用程序所需的JS知识,讨论浏览器和服务器端JavaScript代码之间的区别,并讨论JS引擎和Node.js开发的一些技术。
Node.js开发需要什么样的JS知识?
假设您刚刚开始编程。 您需要学习JavaScript多深才能成功掌握Node.js? 当初学者对自己的专业技能获得足够的信心时,很难达到这样的水平。 另外,在学习编程时,您可能会觉得不太了解浏览器JavaScript的结束位置以及Node.js的开发开始位置。
如果您是JavaScript程序员的起步之初,我建议您在编写Node.js之前,精通以下语言概念:
- 词汇构造。
- 表达式。
- 类型。
- 变数
- 功能介绍
- 这个关键词。
- 箭头功能
- 周期数
- 范围。
- 数组
- 模板字符串。
- 应用分号。
- 在严格模式下工作。
实际上,该列表还在继续,但是如果您掌握了所有内容,则意味着您将为JavaScript高效的客户端和服务器开发奠定良好的基础。
以下语言概念对于理解异步编程的思想也非常重要,异步编程是Node.js的基本部分之一。 特别是,我们在谈论以下内容:
- 异步编程和回调函数。
- 计时器。
- 承诺。
- 异步/等待构造。
- 短路。
- 事件周期。
有许多JavaScript资料可让初学者学习该语言。 例如,
这是本指南的作者培训课程,这是MDN中非常有用的部分,
这是 javascript.ru
的教程。 您可以在
freecodecamp.com上学习基本的JavaScript机制。
上面,我们讨论了初学者可能如何关注服务器和客户端JavaScript开发之间的界限在哪里的问题。 让我们来谈谈。
Node.js平台和浏览器之间的区别
Node.js的JS开发与浏览器编程有何不同? 这些环境之间的相似之处在于,那里和那里都使用相同的语言。 但是,开发旨在在浏览器中运行的应用程序与开发服务器应用程序有很大不同。 尽管使用相同的语言,但是仍然存在一些关键区别,这两种类型的开发都变成了完全不同的活动。
应该注意的是,如果以前使用前端学习来启动Node.js的人,由于他将使用他已经知道的语言进行编写,因此他有非常认真的机会快速掌握所有必要的知识。 如果增加了学习新环境的需要并且学习了新语言,那么任务将更加复杂。
因此,客户端和服务器之间的主要区别在于您必须为其编程的环境,在这些环境的生态系统中。
在浏览器中,大部分工作涉及通过DOM对Web文档进行的各种操作,以及其他Web平台API的使用,例如使用cookie的机制。 当然,Node.js拥有所有这些。 没有
document
对象,
window
对象以及浏览器提供的其他对象。
反过来,浏览器没有Node.js环境中可用的那些软件机制,而是以可以连接到应用程序的模块的形式存在。 例如,这是用于访问文件系统的API。
JS客户端和服务器开发之间的另一个区别是,在Node.js环境中工作时,开发人员可以完全控制该环境。 除非您正在开发可以在任何地方运行的开源应用程序,否则您将确切地知道,例如,您的项目将在哪个版本的Node.js上运行。 与必须在用户浏览器中运行代码的客户端环境相比,这非常方便。 此外,这意味着您可以使用语言的最新功能而不必担心问题。
由于JavaScript的发展速度非常快,因此浏览器根本没有足够的时间快速实施其所有创新。 此外,并非所有用户都使用最新版本的浏览器。 结果,想要在程序中使用某些新内容的开发人员被迫考虑到这一点,并注意其应用程序与使用的浏览器的兼容性,这可能导致需要放弃现代JavaScript功能。 当然,您可以使用Babel传输器将代码转换为与所有浏览器都支持的EcmaScript 5标准兼容的格式,但是在使用Node.js时就不需要此格式。
Node.js与浏览器之间的另一个区别是Node.js使用
CommonJS模块系统,而在浏览器中,您可以看到ES模块标准实施的开始。 实际上,这意味着当前在Node.js中,
require()
构造用于连接外部代码,并
import
浏览器代码。
V8和其他JavaScript引擎
V8是Google Chrome浏览器中使用的JavaScript引擎的名称。 在Internet上工作时,由他负责执行进入浏览器的JavaScript代码。 V8提供了JavaScript的运行时。 浏览器提供DOM和其他Web平台API。
JS引擎独立于其运行的浏览器。 正是这一事实使Node.js平台的出现和开发成为可能。 V8在2009年被选作Node.js的引擎。 由于受欢迎程度的爆炸性增长,Node.js V8最终成为一种引擎,现在负责执行大量服务器端JS代码。
Node.js的生态系统非常庞大。 因此,V8也可以通过
Electron等项目用于开发桌面应用程序。
应该注意的是,除了V8之外,还有其他引擎:
JS引擎的列表不限于此。
这些引擎执行ECMA-262规范,也称为ECMAScript。 正是此规范使JavaScript标准化。 可在
此处找到该标准的最新版本。
▍JS引擎开发与性能理想
V8引擎是用C ++编写的,并且一直在不断改进。 它可以在许多系统上运行,尤其是Mac,Windows和Linux。 这里我们将不讨论V8的实现细节。 关于它们的信息可以在其他出版物中找到,包括在
V8的
官方网站上 。 它们会随着时间变化,有时会非常严重。
V8不断发展,其他引擎也是如此。 这尤其导致Web浏览器和Node.js平台的性能提高。 浏览器引擎的制造商一直在为代码执行的速度而战,这已经持续了很多年。 所有这些对用户和程序员都是有益的。
▍解释与汇编
JavaScript被认为是一种解释性语言,但是现代引擎远非仅解释JS代码。 他们编译它。 从2009年开始观察到这种趋势,当时在Firefox 3.5中添加了JavaScript编译器,此后其他引擎和浏览器制造商都采用了这种想法。
V8编译JavaScript以提高代码性能。 自2004年Google Maps问世以来,JavaScript已经发展成为一种语言,为了实现Web应用程序的交互功能,通常将它们写成几十行,而后写成由数千甚至数百个浏览器应用程序构成的语言。一千行代码。 这样的应用程序可以在浏览器中运行数小时,这与旧的JS使用场景非常不同,例如,上面的代码只能用于验证输入到表单中的数据的正确性。 在现代条件下,编译代码非常有意义,因为尽管执行此步骤可能会延迟代码启动的时间,但是编译后的代码比解释器专门处理的代码生产力更高,运行速度更快,但运行速度更慢。
现在,在讨论了有关JS引擎,代码的解释和编译的一些规定之后,让我们继续实践。 即,让我们谈谈如何关闭Node.js应用程序。
退出Node.js应用程序
有几种关闭Node.js应用程序的方法。
因此,在控制台中执行程序时,可以使用键盘快捷键
ctrl+c
结束其工作。 但是我们对关闭应用程序的软件方法更感兴趣。 也许我们将从最粗鲁的命令开始退出程序,正如您现在所了解的,最好不要使用它。
内核
process
模块提供了一种方便的方法,该方法允许您以编程方式退出Node.js应用程序。 看起来像这样:
process.exit()
当Node.js在代码中遇到这样的命令时,将导致其过程立即结束的事实。 这意味着该程序所做的所有操作绝对会很粗鲁并且无条件地中断。 我们谈论的是不请自来的回调,发布时正在执行的网络请求,文件操作,
stdout
或
stderr
写操作。
如果这种情况适合您,则可以使用此方法。 调用它时,可以为它传递一个整数,操作系统将其视为程序的退出代码。
process.exit(1)
默认情况下,此代码设置为0,表示成功完成。 其他退出代码具有不同的含义,这对于在您自己的系统中使用它们以建立某些程序与其他程序之间的交互作用可能很有用。
有关程序关闭代码的详细信息,请参见
此处 。
您还可以将退出代码分配给
process.exitCode
属性。 看起来像这样:
process.exitCode = 1
程序终止后,Node.js将将此代码返回给系统。
应该注意的是,程序在执行程序中指定的所有动作后自然会自行结束。 但是,对于Node.js,通常有一些程序在理想条件下可以无限期地运行。 例如,我们谈论的是这样的HTTP服务器:
const express = require('express') const app = express() app.get('/', (req, res) => { res.send('Hi!') }) app.listen(3000, () => console.log('Server ready'))
从理论上讲,如果什么都没有发生,那么这样的程序将永远有效。 在这种情况下,如果调用
process.exit()
,则在调用此命令时由它执行的操作将被中断。 这很不好。
要完成此类程序的工作,您需要使用
SIGTERM
信号并使用适当的处理程序执行必要的操作。
请注意,使用
process
对象时,不需要使用
require
进行任何连接,因为默认情况下该对象可用于Node.js应用程序。
考虑以下示例:
const express = require('express') const app = express() app.get('/', (req, res) => { res.send('Hi!') }) app.listen(3000, () => console.log('Server ready')) process.on('SIGTERM', () => { app.close(() => { console.log('Process terminated') }) })
什么是信号? 信号是POSIX标准(便携式操作系统接口)中的过程之间进行交互的一种方式。 它们是发送给流程的通知,以通知他某些事件。
例如,
SIGKILL
信号告诉进程它需要立即关闭。 理想情况下,它就像
process.exit()
。
SIGTERM
信号告诉该进程需要执行正常的关闭过程。 此类信号是从流程管理器(例如
upstart
或
supervisord
)以及许多其他对象发送的。
您可以使用以下命令从程序本身发送此类信号:
process.kill(process.pid, 'SIGTERM')
要成功完成这样的命令,您需要知道计划完成
PID
过程的
PID
。
从Node.js读取环境变量
process
内核模块具有
env
属性,该属性可访问在进程启动时设置的所有环境变量。
这是使用环境变量
NODE_ENV
,默认情况下将其设置为
development
:
process.env.NODE_ENV
如果在运行脚本之前将其设置为
production
,这将告诉Node.js程序正在生产环境中运行。
同样,您可以使用其他环境变量,例如您自己设置的环境变量。
总结
今天,我们探讨了基于JavaScript的基于浏览器和服务器端的编程,讨论了JS引擎,如何关闭服务器应用程序以及如何从Node.js程序中读取环境变量。 下次,我们将讨论托管Node.js应用程序,如何在REPL模式下使用Node.js,如何使用可在调用脚本时传递给脚本的参数,如何与控制台进行交互以及如何将代码设计为模块。
亲爱的读者们! 您会为初学者推荐哪些JavaScript教程?
