Node.js笔记
node是什么?
Node是一个基于Chrome V8引擎的JavaScript代码运行环境。
Node.js的组成
Node.js是由ECMAScript及Node环境提供的API组成。包括文件、网络、路径等API。
在浏览器中全局对象是window,在Node中全年局对象是global.
Node中全局对象有一下方法,可以在任何地方使用,golbal可以省略:
方法 | 说明 |
---|---|
console.log() | 在控制台中输出 |
setTimeout() | 设置超时定时器 |
clearTimeout() | 清除超时定时器 |
setInterval() | 设置间歇定时器 |
clearInterval | 清除间歇定时器 |
Node.js模块化开发
JavaScript开发弊端:存在文件依赖和命名冲突。
1. Node.js中模块化开发规范
- Node.js规定一个JavaScript文件就是一个模块。
- 模块内部定义的变量和函数默认情况下在外部无法得到,模块内部可以使用exports对象进行成员导出,使用require方法导入其他模块。
- 另一种导出方式:使用module.exports对象导出
exports是module.exports的别名(地址引用关系),最终导出以module.exports为准
2.系统模块
Node运行环境提供的API是以模块化的方式开发的,所以吧Node运行环境提供的API称为系统模块。
(1)文件操作fs:
读取文件内容: fs.reader(‘文件路径/文件名’, ‘文件编码’, 回调函数);
写入文件内容:fs.writeFile(‘文件路径/文件名’, ‘数据’, 回调函数)
(2)路径操作pah:
路径拼接操作: path.join(‘路径’, ‘路径’, …)
使用__dirname获取当前文件的绝对路径
3.第三方模块
别人写好的、具有特定功能的、可以直接使用的模块即为第三方模块,又称为包
第三方模块存在的方式:
- 以js文件形式存在,提供实现项目具体功能的的API接口
- 以命令行工具形式存在,辅助项目开发
获取第三方模块:npm(node package manager):node的第三方模块管理工具
有全局安装和本地安装两种,一般命令行工具全局安装,库文件本地安装
下载模块:
npm install 模块名
卸载模块:
npm uninstall 模块名
(1)第三方模块nodemon:
nodemon是一个命令行工具,用以辅助项目开发
在Node.js文件中,每次修改文件都要在命令行工具中重新执行该文件,非常繁琐。nodemon可以解决这个问题,每次保存后,自动执行该文件。
下载命令:
npm install nodemon -g
(2)第三方模块nrm:
nrm(node registry manager): npm下载的切换工具,npm默认的下载地址在国外,国内下载速度慢
下载命令:
npm install nrm -g
查询可用下载地址列表:
nrm ls
切换下载地址:
nrm use 下载地址名称
(3)第三方模块gulp:
gulp是一个基于node平台开发的前端构建的工具,将机械化操作编写成任务,然后在命行执行任务。
gulp能做什么:
- 项目上线,HTML、CSS、JS文件压缩合并
- 语法转换(es6, less, …)
- 公共文件抽离
- 修改文件浏览器自动刷新
下载glup库文件
npm install glup
下载gulp命令行工具,用来执行gulp任务
npm install gulp-cli -g
gulp提供的方法:
- gulp.src(): 获取任务要处理的文件
- gulp.dest(): 输出文件
- gulp.task(): 建立gulp任务
- gulp.watch(): 监视文件的变化
gulp的使用:
- 在项目根目录建立gulpfile.js文件
- 重构项目的文件夹src目录放置源代码文件,dist文件夹放置构建后的文件
- 在gulpfile.js文件中编写任务
// 使用gulp.task()建立任务
// 参数1为任务名称,参数2为任务回调函数
gulp.task('first', done => {
console.log('第一个gulp任务');
// 使用gulp.src()获取要处理的文件
gulp.src('./src/css/base.css', {allowEmpty: true})
// 输出文件
.pipe(gulp.dest('dist/css'));
done()
});
- 在命令行工具中执行gulp命令
gulp插件:
- gulp-htmlmin: 压缩html文件
- guip-file-include: 公共文件包含
- gulp-less: less语法转换
- gulp-csso: 压缩css
- gulp-babel: JavaScript语法转换
- gulp-uglify: 压缩混淆JavaScript
- browsersync: 浏览器实时同步
压缩HTML文件:
// html任务
gulp.task('htmlmin', done => {
gulp.src('./src/*.html')
// 抽取公共代码
.pipe(fileinclude())
// 压缩html文件的代码
.pipe(htmlmin({collapseWhitespace: true}))
.pipe(gulp.dest('dist'))
done()
})
4.package.json文件
项目描述文件,记录了当前项目的信息,例如项目名称、版本、作者、github地址、当前项目依赖了哪些第三方模块。使用 npm init -y 命令生成
(1)项目依赖:在项目开发阶段和运营阶段都需要的第三方依赖
使用 npm install 包名 命令下载的文件会默认被添加到package.json文件的dependencies字段中
(2)开发依赖:在项目开发阶段需要依赖,线上运营阶段不需要的依赖
使用 npm install 包名 --save-dev下载的文件,会添加到package.json文件的devDependencies字段中
使用 npm install 命令将下载所有依赖;使用 npm istall --production 命令将只下载项目依赖
(3)package-lock.json的作用:
- 锁定包的版本,确保下次下载时不会因为包版本不同而产生问题
- 加快下载速度,因为文件中已经记载了项目所依赖第三方包的树状结构和包的下载地址
服务器
1.服务器端基本概念
IP地址: 互联网协议地址,互联网中设备的唯一标识,例子:本机IP地址:127.0.0.1
域名: 网址,与IP地址对应,例子: 本机域名: localhost
URL: 统一资源定位符,是专为标识internet网上资源位置的的一种编码方式。组成: 传输协议://服务器IP地址或域名:端口号/资源所在位置标识
2.创建web服务器
创建web服务器:
// 引入http模块,用于创建网站服务器
const http = require('http')
// app为网站服务器对象
const app = http.createServer()
// 当客户端发来请求时
// 参数1:请求事件名称,参数2:时间处理函数
app.on('request', (req, res) => {
res.end('<h2>hello, sanyuan<//h2>')
})
// 监听端口,默认为3000
app.listen(3000)
console.log('网站服务器启动成功');
3.HTTP协议
HTTP协议:超文本传输协议,规定了如何从网站服务器传输超文本到本地服务器。基于C/S架构。
报文: 在HTTP请求和响应过程中传递的数据,包括要传送的数据和一些附加信息,并且遵守规定好的格式。
(1)请求报文:
请求方式: GET和POST,GET请求数据,POST发送数据
(2)响应报文:
HTTP状态码:
状态码 | 说明 |
---|---|
200 | 请求成功 |
404 | 请求资源没找到 |
500 | 服务器端错误 |
400 | 客户端请求有语法错误 |
内容类型:
- text/html
- text/css
- text/plain
- application/javascript
- image/jpg
- application/json
4.HTTP请求与响应处理
请求参数
GET请求参数:参数放在浏览器地址中,例如:http://localhost:3000/?name=sanyuan&age=24
POST请求参数
路由: 客户端请求地址与服务器端代码的对应关系
静态资源:
服务器不需要处理,可以直接响应给客户端的资源,例如CSS、JavaSCript、image文件。
Node.js异步编程
同步API按顺序执行,前面代码会阻塞后面代码的执行;异步API不会阻塞后续代码的执行
异步API不能从返回值中拿到API执行结果,异步API需要从回调函数中获取值。
回调函数: 自己定义的函数让别人调用
Promise: Promise出现的目的是解决Node.js异步编程中回调地狱问题
异步函数
异步函数是异步编程的终极解决方法,可以将异步代码写成同步代码的形式,让代码不再偶代码嵌套。
async关键字:
- 在普通函数前面加上async就变成了异步函数
- 异步函数默认的返回值是promise对象
- 在异步函数内部使用return关键字进行结果返回,结果被包裹在promise对象中,return关键字代替了resolve方法
- 在异步函数内部使用throw关键字进行错误的抛出
- 调用异步函数在链式调用then方法获取异步函数的结果
await关键字:
- 只能出现在异步函数中
- await关键字后面是promise对象
- 可以异步函数的调用,等待promise对象返回结果后在向下执行。