Node学习笔记
什么是Node
Node是一个基于Chrome V8引擎的JavaScript代码运行环境。
注意:需要运行时,在某目录按下shift+鼠标右键
即可打开该目录的power shell
.
Node.js模块化开发
JavaScript在使用时存在两大问题,文件依赖和命名冲突。Node.js规定一个JavaScript文件就是一个模块,模块内部定义的变量和函数默认情况下在外部无法得到。模块内部可以使用exports
对象进行成员导出, 使用require
方法导入其他模块。
- 导出
1 | // a.js |
- 导入
1 | // b.js |
- 导出的另外一种方式
1 | module.exports.version = version; |
系统模块
- 系统模块
fs
文件操作
1 | const fs = require('fs'); |
系统模块
path
路径操作为什么要进行路径拼接?不同操作系统的路径分隔符不统一。
大多数情况下使用绝对路径,因为相对路径有时候相对的是命令行工具的当前工作目录。使用
__dirname
获取当前文件所在的绝对路径。
1 | //路径拼接语法 |
第三方模块安装
- 安装方法
1 | 下载:npm install 模块名称 (有末尾-g表示全局作用) |
nodemon
在Node.js中,每次修改文件都要在命令行工具中重新执行该文件,非常繁琐,该模块就可解决这一问题。
nrm
npm默认的下载地址在国外,国内下载速度慢,nrm使用国内cdn下载。
1
2
3使用npm install nrm –g 下载它
查询可用下载地址列表 nrm ls
切换npm下载地址 nrm use 下载地址名称Gulp
功能:项目上线,HTML、CSS、JS文件压缩合并,语法转换(es6、less …)…
使用:
- 使用
npm install gulp
下载gulp库文件 - 在项目根目录下建立
gulpfile.js
文件 - 重构项目的文件夹结构 src目录放置源代码文件 dist目录放置构建后文件
- 在gulpfile.js文件中编写任务
- 在命令行工具中执行gulp任务
方法:
- lgulp.src():获取任务要处理的文件
- lgulp.dest():输出文件
- lgulp.task():建立gulp任务
- lgulp.watch():监控文件的变化
样例:
1
2
3
4
5
6
7
8
9const gulp = require('gulp');
// 使用gulp.task()方法建立任务
gulp.task('first', done => {
// 获取要处理的文件
gulp.src('./src/css/base.css')
// 将处理后的文件输出到dist目录,.pipe为处理函数
.pipe(gulp.dest('./dist/css'));
done();
});需要安装插件才可运行上方文件:
npm install gulp-cli -g
运行:
gulp first
- 使用
Gulp使用
插件
- gulp-htmlmin :html文件压缩
- gulp-csso :压缩css
- gulp-babel :JavaScript语法转化
- gulp-less: less语法转化
- gulp-uglify :压缩混淆JavaScript
- gulp-file-include 公共文件包含
- browsersync 浏览器实时同步
安装及使用方法:https://www.npmjs.com/ (在网站搜索插件即可得到使用方法)
样例
gulp-htmlmin
1 | const gulp = require('gulp'); |
first
1 | const gulp = require('gulp'); |
- 构建任务
1 | // 同时执行多个任务 |
package.json文件
node_modules文件夹的问题
文件夹以及文件过多过碎,当我们将项目整体拷贝给别人的时候,,传输速度会很慢很慢.
复杂的模块依赖关系需要被记录,确保模块的版本和当前保持一致,否则会导致当前项目运行报错
package.json文件的作用
项目描述文件,记录了当前项目信息,例如项目名称、版本、作者、github地址、当前项目依赖了哪些第三方模块等。
使用npm init -y
命令生成。
项目依赖
在项目的开发阶段和线上运营阶段,都需要依赖的第三方包,称为项目依赖
使用
npm install 包名
命令下载的文件会默认被添加到 package.json 文件的 dependencies 字段中
1 | // 同时执行多个任务 |
开发依赖
在项目的开发阶段需要依赖,线上运营阶段不需要依赖的第三方包,称为开发依赖
使用
npm install 包名 --save-dev
命令将包添加到package.json文件的devDependencies字段中
1 | { |
package-lock.json文件的作用
锁定包的版本,确保再次下载时不会因为包版本不同而产生问题
加快下载速度,因为该文件中已经记录了项目所依赖第三方包的树状结构和包的下载地址,重新安装时只需下载即可,不需要做额外的工作
模块查找规则
当模块拥有路径但没有后缀时
- require方法根据模块路径查找模块,如果是完整路径,直接引入模块。
- 如果模块后缀省略,先找同名JS文件再找同名JS文件夹
- 如果找到了同名文件夹,找文件夹中的index.js
- 如果文件夹中没有index.js就会去当前文件夹中的package.json文件中查找main选项中的入口文件
- 如果找指定的入口文件不存在或者没有指定入口文件就会报错,模块没有被找到
当模块没有路径且没有后缀时
- Node.js会假设它是系统模块
- Node.js会去node_modules文件夹中
- 首先看是否有该名字的JS文件
- 再看是否有该名字的文件夹
- 如果是文件夹看里面是否有index.js
- 如果没有index.js查看该文件夹中的package.json中的main选项确定模块入口文件
- 否则找不到报错
创建web服务器
1 | // 引入必要模块 |
请求报文
请求方式
- GET 请求数据
- POST 发送数据
请求地址
- url
1 | app.on('request', (req, res) => { |
http状态码
200 请求成功
404 请求的资源没有被找到
500 服务器端错误
400 客户端请求有语法错误
内容类型
text/html
text/css
application/javascript
image/jpeg
application/json
1 | app.on('request', (req, res) => { |
GET请求
1 | app.on('request', (req, res) => { |
POST请求
1 | app.on('request', (req, res) => { |
路由
1 | // 1.引入系统模块 |
静态网站
1 | const fs = require('fs'); |
异步编程
- 同步API:只有当前API执行完成后,才能继续执行下一个API
- 异步API:当前API的执行不会阻塞后续代码的执行
- 同步API可以从返回值中拿到API执行的结果, 但是异步API是不可以的
Promise
- Promise出现的目的是解决Node.js异步编程中回调地狱的问题。
1 | const fs = require('fs'); |
异步函数
async
- 异步函数是异步编程语法的终极解决方案,它可以让我们将异步代码写成同步的形式,让代码不再有回调函数嵌套,使代码变得清晰明了。
- 普通函数定义前加async关键字 普通函数变成异步函数
- 异步函数默认返回promise对象
- 在异步函数内部使用return关键字进行结果返回 结果会被包裹的promise对象中 return关键字代替了resolve方法
- 在异步函数内部使用throw关键字抛出程序异常
- 调用异步函数再链式调用then方法获取异步函数执行结果
- 调用异步函数再链式调用catch方法获取异步函数执行的错误信息
1 | async function fn() { |
await
await关键字只能出现在异步函数中
await promise await后面只能写promise对象 写其他类型的API是不不可以的
await关键字可是暂停异步函数向下执行 直到promise返回结果
1 | async function f1() { |
改造readFile()函数
1 | const fs = require('fs'); |
全局对象global
Node中全局对象有以下方法,可在任何地方使用global可忽略。
- console.log() 控制台中输出
- setTimeout() 设置超时定时器
- clearTimeout() 清除超时定时器
- setInterval() 设置间歇定时器
- clearInterval() 清除间歇定时器