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常见的错误
-
Uncaught TypeError: undefined is not a promise 如果在控制台中收到 Uncaught TypeError: undefined is not a promise 错误,则请确保使用 new Promise() 而不是 Promise()。
-
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 服务器
- const http = require('http') //导入模块
- const port = 3000 // 定义端口号
- http.createServer((req, res) => {})创建http服务器
- res.statusCode = 200 表明响应成功
- res.setHeader('Content-Type', 'text/plain')设置 Content-Type 响应头
- res.end('你好世界\n') 结束并关闭响应,将内容作为参数添加到 end():
- server.listen(port,()=>{}) 监听端口