参考资料:http://nodejs.cn/learn/how-to-exit-from-a-nodejs-program
一.Node.js简介
Node.js 是一个开源与跨平台的 JavaScript 运行时环境。 它是一个可用于几乎任何项目的流行工具!
Node.js 在浏览器外运行 V8 JavaScript 引擎(Google Chrome 的内核)。 这使 Node.js 表现得非常出色。Node.js 中的库通常是使用非阻塞的范式编写的
当 Node.js 执行 I/O 操作时(例如从网络读取、访问数据库或文件系统),Node.js 会在响应返回时恢复操作,而不是阻塞线程并浪费 CPU 循环等待。除了客户端代码之外还可以编写服务器端代码,而无需学习完全不同的语言。可以通过更改 Node.js 版本来决定要使用的 ECMAScript 版本
npm 的简单结构有助于 Node.js 生态系统的激增,现在 npm 仓库托管了超过 1,000,000 个可以自由使用的开源库包。
二.历史
2009-2020
三.需要了解的JS知识
- 词汇结构
- 表达式
- 数据类型
- 变量
- 函数
- this
- 箭头函数
- 循环
- 作用域
- 数组
- 模板字面量
- 分号
- 严格模式
- ECMAScript 6、2016、2017
-
以下概念也是理解异步编程的关键,异步编程是 Node.js 的基本组成部分:
- 异步编程与回调
- 定时器
- Promise
- Async 与 Await
- 闭包
- 事件循环
四.V8 JavaScript 引擎
(1)V8 是为 Google Chrome 提供支持的 JavaScript 引擎的名称。 当使用 Chrome 进行浏览时,它负责处理并执行 JavaScript。
(2)V8 提供了执行 JavaScript 的运行时环境。 DOM 和其他 Web 平台 API 则由浏览器提供。
(3)JavaScript 引擎独立于托管它的浏览器
(4)V8 使用 C++ 编写,并且不断地被改进。 它是可移植的,且可运行于 Mac、Windows、Linux 和其他一些系统。
五.编译
(1)JavaScript 通常被认为是一门解释型的语言,但是现代的 JavaScript 引擎不再只是解释 JavaScript,也会对其进行编译。
(2)JavaScript 是由 V8 在其内部编译的,使用了即时(JIT)编译以加快执行速度。
(3)编译 JavaScript 非常有意义,因为尽管可能需要多花费一点时间来为 JavaScript 做准备,但是一旦完成,则它会比纯解释型的代码具有更高的性能。
六.nodejs命令行运行和退出
(1)运行
运行 Node.js 程序的常规方法是,运行全局可用的 node
命令(已安装 Node.js)并传入要执行的文件的名称。
node test.js
(2)退出
[1]ctrl-C
[2]process
核心模块提供了一种便利的方法,可以以编程的方式退出 Node.js 程序:process.exit()
。可以传入一个整数,向操作系统发送退出码:
process.exit(1)
也可以设置 process.exitCode
属性:
process.exitCode = 1
[3]nodejs启动HTTP服务器
const express = require('express')
const app = express()
app.get('/', (req, res) => {
res.send('你好')
})
app.listen(3000, () => console.log('服务器已就绪'))
这个程序永远不会结束。 如果调用 process.exit()
,则任何当前等待中或运行中的请求都会被中止。 这不太友好。在这种情况下,需要向该命令发送 SIGTERM 信号,并使用进程的信号处理程序进行处理:
const express = require('express')
const app = express()
app.get('/', (req, res) => {
res.send('你好')
})
const server = app.listen(3000, () => console.log('服务器已就绪'))
process.on('SIGTERM', () => {
server.close(() => {
console.log('进程已终止')
})
})
信号是一个 POSIX 内部通信系统:发送通知给进程,以告知其发生的事件。
SIGKILL
是告诉进程要立即终止的信号,理想情况下,其行为类似于 process.exit()
。
SIGTERM
是告诉进程要正常终止的信号。它是从进程管理者(如 upstart
或 supervisord
)等发出的信号。
可以从程序内部另一个函数中发送此信号:
process.kill(process.pid, 'SIGTERM')
七.nodejs读取环境变量
process.env.NODE_ENV // "development"
八.nodejs输出信息到控制台
const x = 'x'
const y = 'y'
console.log(x, y)
输出打印消息.
console.clear()
会清除控制台(其行为可能取决于所使用的控制台)。
console.count()
是一个便利的方法。
console.trace()
打印函数的调用堆栈踪迹很有用
console.error
会打印到 stderr
流。
可以使用 console.time()
和 console.timeEnd()
轻松地计算函数运行所需的时间
九.nodejs导入模块
Node.js 具有内置的模块系统。
Node.js 文件可以导入其他 Node.js 文件公开的功能。
const library = require('./library')
可以导入存在于当前文件夹中的 library.js
文件中公开的功能。
在此文件中,必须先公开功能,然后其他文件才能将其导入。
默认情况下,文件中定义的任何其他对象或变量都是私有的,不会公开给外界。
这就是 module
系统提供的 module.exports
API 可以做的事。
当将对象或函数赋值为新的 exports
属性时,这就是要被公开的内容,因此,可以将其导入应用程序的其他部分或其他应用程序中。
(1)将对象赋值给 module.exports
(这是模块系统提供的对象),这会使文件只导出该对象:
const car = {
brand: 'Ford',
model: 'Fiesta'
}
module.exports = car
//在另一个文件中
const car = require('./car')
(2)将要导出的对象添加为 exports
的属性。这种方式可以导出多个对象、函数或数据:
const car = {
brand: 'Ford',
model: 'Fiesta'
}
exports.car = car
(3)直接导出
exports.car = {
brand: 'Ford',
model: 'Fiesta'
}
十. 导入使用
const items = require('./items')
items.car
const car = require('./items').car