Damon

Damon

nodejs笔记1

(nodejs)[http://nodejs.cn/learn/how-to-exit-from-a-nodejs-program]

运行nodejs

=> 输入 node app.js 执行node

退出nodejs程序

=> 控制台中使用ctrl+c => 编程退出方式:process.exit(1) 启动一个HTTP服务器,这个程序永远不会结束。 这种情况下,使用SIGTERM信号。

process.on('SIGTERM', () => {
  server.close(() => {
    console.log('进程已终止')
  })
})

也可以从程序内部另一个函数中发送此信号

process.kill(prosess.pid,'SIGTERM)

process属于nodejs核心模块,不需要引入自动可用

process.env.NODE_ENV  // development

该环境变量默认情况下被设置为 development。 在脚本运行之前将其设置为 "production",则可告诉 Node.js 这是生产环境。

可以设置自定义变量,访问方式相同

express需要下载和导入

如果在控制台直接输入node执行,会是运行评估打印循环模式。输入要执行的操作返回一个结果

TAB键可以自动补全,比如输入Number.按下TAB。 REPL 终端上会打印可以在该类上访问的虽有属性和方法。

计算耗时

console.time() console.timeEnd()

npm install chalk为控制台上色

import chalk from 'chalk'; https://github.com/chalk/chalk console.log(chalk.blue('Hello world!'));

npm install progress在控制台中创建进度条

导入导出nodejs文件

const car = {
  brand: 'Ford',
  model: 'Fiesta'
}

module.exports = car

//在另一个文件中

const car = require('./car')

npm将软件包安装到哪里

npm install lodash 会被安装到当前文件树中的 node_modules 子文件夹下。 npm install -g lodash 安装到全局 npm root -g 命令会告知其在计算机上的确切位置。

package.json

  • version 表明了当前的版本。
  • name 设置了应用程序/软件包的名称。
  • description 是应用程序/软件包的简短描述。
  • main 设置了应用程序的入口点。
  • private 如果设置为 true,则可以防止应用程序/软件包被意外地发布到 npm。
  • scripts 定义了一组可以运行的 node 脚本。
  • dependencies 设置了作为依赖安装的 npm 软件包的列表。
  • devDependencies 设置了作为开发依赖安装的 npm 软件包的列表。
  • engines 设置了此软件包/应用程序在哪个版本的 Node.js 上运行。
  • browserslist 用于告知要支持哪些浏览器(及其版本)。

版本号规则

"version": "1.0.0"

第一个数字是主版本号,第二个数字是次版本号,第三个数字是补丁版本号。

  • 当进行不兼容的 API 更改时,则升级主版本。
  • 当以向后兼容的方式添加功能时,则升级次版本。
  • 当进行向后兼容的缺陷修复时,则升级补丁版本。

package-lock.json

  • packge-lock记录依赖确切版本,以便产品可以以相同的方式被 100% 复制。
  • package-lock.json 文件需要被提交到 Git 仓库,以便被其他人获取(如果项目是公开的或有合作者,或者将 Git 作为部署源)。

查看 npm 包安装的版本

  • npm list 本地宝版本
  • npm list -g 全局包版本
  • npm list packageName 查看指定包版本
  • npm view cowsay version 查看软件包在npm仓库上最新的可用版本,cowsay为包名

安装 npm 包的旧版本

  • npm install @
  • npm install cowsay@1.2.0
  • npm install -g webpack@4.16.4
  • npm view cowsay versions 列出软件包所有的以前的版本

版本前缀符号含义

  • ^: 只会执行不更改最左边非零数字的更新。 如果写入的是 ^0.13.0,则当运行 npm update 时,可以更新到 0.13.1、0.13.2 等,但不能更新到0.14.0 或更高版本。 如果写入的是 ^1.13.0,则当运行 npm update 时,可以更新到 1.13.1、1.14.0 等,但不能更新到 2.0.0 或更高版本。
  • ~: 如果写入的是 〜0.13.0,则当运行 npm update 时,会更新到补丁版本:即 0.13.1 可以,但 0.14.0 不可以。
  • >: 接受高于指定版本的任何版本。
  • >=: 接受等于或高于指定版本的任何版本。
  • <=: 接受等于或低于指定版本的任何版本。
  • <: 接受低于指定版本的任何版本。
  • =: 接受确切的版本。
  • -: 接受一定范围的版本。例如:2.1.0 - 2.6.2。
  • ||: 组合集合。例如 < 2.1 || > 2.6。
  • 无符号: 仅接受指定的特定版本(例如 1.2.1)。
  • latest: 使用可用的最新版本。

卸载npm包(<>实际暗转不需要尖括号)

  • npm uninstall 生产
  • npm uninstall -S 生产
  • npm uninstall -D 开发
  • npm uninstall -g 卸载全局

npm 依赖与开发依赖

  • 当添加了 -D 或 --save-dev 标志时,则会将其安装为开发依赖项(会被添加到 devDependencies 列表)。
  • 开发依赖是仅用于开发的程序包,在生产环境中并不需要。 例如测试的软件包、webpack 或 Babel。
  • 当投入生产环境时,如果输入 npm install 且该文件夹包含 package.json 文件时,则会安装它们,因为 npm 会假定这是开发部署。
  • 需要设置 --production 标志(npm install --production),以避免安装这些开发依赖项。

如果你需要比宏任务和微任务更早执行

了解 process.nextTick()

process.nextTick(() => {
  //做些事情
  // 此处会比promise.then和setTimeout更早执行
})

当要异步地(但要尽可能快)执行某些代码时

setImmediate(() => {
  //运行一些东西
})

Promise 如何运作

当 promise 被调用后,它会以处理中状态开始。 这意味着调用的函数会继续执行,而 promise 仍处于处理中直到解决为止,从而为调用的函数提供所请求的任何数据。 被创建的 promise 最终会以被解决状态或被拒绝状态结束,并在完成时调用相应的回调函数(传给 then 和 catch)。

链式 promise

  • Promise 可以返回到另一个 promise,从而创建一个 promise 链。
  • 链式 promise 的一个很好的示例是 Fetch API,可以用于获取资源,且当资源被获取时将 promise 链式排队进行执行。
  • Fetch API 是基于 promise 的机制,调用 fetch() 相当于使用 new Promise() 来定义 promsie。

编排 promise

  • Promise.all() 在所有 promise 都被解决后执行一些操作。
  • Promise.race() 当传给其的首个 promise 被解决时,则 Promise.race() 开始运行,并且只运行一次附加的回调(传入第一个被解决的 promise 的结果)。

Promise常见的错误

  1. Uncaught TypeError: undefined is not a promise 如果在控制台中收到 Uncaught TypeError: undefined is not a promise 错误,则请确保使用 new Promise() 而不是 Promise()。

  2. UnhandledPromiseRejectionWarning 这意味着调用的 promise 被拒绝,但是没有用于处理错误的 catch。 在 then 之后添加 catch 则可以正确地处理。

具有 Async 和 Await 的现代异步 JavaScript

它们使代码看起来像是同步的,但它是异步的并且在后台无阻塞。

Promise 所有事情

在任何函数之前加上 async 关键字意味着该函数会返回 promise。 即使没有显式地这样做,它也会在内部使它返回 promise。

调试 promise 很难,因为调试器不会跳过异步的代码。 Async/await 使这非常容易,因为对于编译器而言,它就像同步代码一样。

Node.js 事件触发器 类似浏览器端的事件

(http://nodejs.cn/learn/the-nodejs-event-emitter)[http://nodejs.cn/learn/the-nodejs-event-emitter]

搭建 HTTP 服务器

  1. const http = require('http') //导入模块
  2. const port = 3000 // 定义端口号
  3. http.createServer((req, res) => {})创建http服务器
  4. res.statusCode = 200 表明响应成功
  5. res.setHeader('Content-Type', 'text/plain')设置 Content-Type 响应头
  6. res.end('你好世界\n') 结束并关闭响应,将内容作为参数添加到 end():
  7. server.listen(port,()=>{}) 监听端口