Node.js-第一章基础篇

163 阅读3分钟

一、Node.js定义

什么是Node.js?

在Node.js里运行Javascript跟在Chrome里运行JavaScript有什么不同?

  • Chrome浏览器用的是同样的JavaScript引擎和模型。 其实,在Node.js里写JS和在Chrome里写JS,几乎没有不一样!\

在Node.js里写JS和在Chrome里写JS 哪里不一样呢?

(1)API不同

  • Node.js没有浏览器API,即document,window等;
  • 加了很多Node.js APi。如process-进程等 (2)控制对象不同 对于开发者来说,Node.js:
  • 你在Chrome里写JavaScript控制浏览器
  • Node.js让你用类似的方式,控制整个计算机

简单了解Node.js

// 建立index.js模块
// 浏览器和Node.js公有的
console.log(Math);
console.log(Date);
console.log(setTimeout);
console.log(setInterval);
console.log(setImmediate);

// Node特有的变量
// 文件操作很有用
console.log(__filename); // 主要用以获取当前模块的文件名
console.log(__dirname); // 主要用以获取当前模块的目录

// 进程对象,记录进程信息
console.log(process); // 打印出来看下里面有那些重要的,例如argv-用户启动node时,敲击时怎么样的、env-环境变量、kill()、exit()杀进程等

切换到index.js所在目录,执行node index.js

二、模块规范-CommonJs

CommonJs模块规范是什么?

  • JavaScript社区发起,在Node.js上应用并推广
  • 后续也影响到了浏览器端JavaScript

关键词

  • 引用方require
  • 被引用方 module.exports或exports

注意点

  • exports对象和lib是同一个引用,因此改变lib则会改变exports
  • exports = module.exports
// 入口index.js
const lib = require('./lib.js'); // 加载lib.js并运行,lib一个{} 对象
console.log(lib); // exports对象和lib是同一个引用,因此改变lib则会改变exports
console.log(lib.foo(1,2));
// 被依赖lib.js
exports.hello = 'hell'; // exports是一个对象,可以挂任何暴露出的内容
exports.foo = function (a, b) {
    return a + b;
}
// exports = module.exports,下面的赋值导致exports失效了,lib是个函数了
module.exports = function minus(a, b) {
    return Math.min(a, b);
}

三、包管理工具-NPM

npm是什么

Node.js的包管理工具

包是什么

别人写的Node.js模块

npm init 声明自己工程是npm包,才好去用别人的npm包
npm服务器在国外,下载慢,可使用镜像

package.json

xxx

npmrc是什么

npmrc 是 npm runtime config 的意思,可以通过这个文件在命令行环境中为 npm 提供环境变量。

查看项目里的镜像地址:npm get registry 。

npm 默认的源为registry.npmjs.org/我们可以通过修改 npmrc 文件来修改项目默认的 registry 地址

代码块

registry=http://r.npm.xxx.com
disturl=http://npm.xxx.com/mirrors/node/

作用:

  • .npmrc文件的作用,配置npm源。
  • .yarnrc文件的作用,配置yarn源。
  • 执行yarn 指令时 ,会先读取.yarnrc(有的话),后读取,npmrc(有的话)。所以项目里只配置.npmrc 是完全可以的,yarn是读取这个文件的。

四、Node.js 内置模块

内置模块:nodejs.cn/api/cli.htm… 观察者模式:解决2个对象之间通信问题,往外抛一个事件出去。

五、Express服务

核心功能

  • 路由
  • request/response 简化 - request: pathname、query - response: send()、json()、jsonp()等

问题

洋葱模型有问题,处理异步有问题,只能处理同步,只要有异步,洋葱模型就被打破。

Koa

核心功能

  • 精简内核,所有功能都放到中间件里实现
  • 请求和返回的处理
  • 路由放到中间件里去做了,koa不会带任何中间件了,需要自己去实现。

image.png

洋葱模型(中间件)

image.png 执行顺序: 1 4 3 2 在koa的中间件中,通过next函数,将中间件分成了两部分,next上面的一部分会首先执行,而下面的一部分则会在所有后续的中间件调用之后执行。

为什么要使用洋葱模型

koa洋葱模型可以将中间件级联执行,由用户决定是否向下级中间件执行。
当我们使用koa进行开发的时候,因为读取数据库或是http请求等都是异步请求,所以我们为了保证洋葱模型会使用号称异步终极解决方案的async/await。利用洋葱模型,对后续中间件返回的结果进行处理