一、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不会带任何中间件了,需要自己去实现。
洋葱模型(中间件)
执行顺序: 1 4 3 2
在koa的中间件中,通过next函数,将中间件分成了两部分,next上面的一部分会首先执行,而下面的一部分则会在所有后续的中间件调用之后执行。
为什么要使用洋葱模型
koa洋葱模型可以将中间件级联执行,由用户决定是否向下级中间件执行。
当我们使用koa进行开发的时候,因为读取数据库或是http请求等都是异步请求,所以我们为了保证洋葱模型会使用号称异步终极解决方案的async/await。利用洋葱模型,对后续中间件返回的结果进行处理