Node.js基本认识
基本介绍
环境配置(node nvm,cnpm)
REPL 环境(命令行) 运行js代码
js文件执行
nodemon实时监听
模块/包与commonjs 规范
内置
第三方
自定义
内置模块详解
Url
url 介绍
parse: 将url字符转成url对象
iii.format: 将url对象转成url字符
iv. resolve: url路径的拼接,替换
Query String
parse
stringfly
escape
unescape
Http(爬虫)
get
requst
cheerio
Event
Fs 文件操作
Stream
什么是node
Node.js 是一个基于Chrome V8 引擎的JavaScript运行环境 *****
Node.js使用了一个事件驱动、非阻塞式I/O的模型,使其轻量又高效
事件驱动: 任务执行,发布者,订阅者,事件驱动 ( on emit )
非阻塞: 执行某一个任务的同时也可以执行其他任务
阻塞: 执行某一个任务,这个任务如果没有执行完成,其他任务必须等待
同步
异步
I/O: 输入/输出( 数据库操作,文件系统操作等 )
非阻塞I/O模型: 当我们使用Node.js来实现数据库操作、文件系统等操作时,要进行的异步操作,异步操作的核心传统实现方式就是回调函数
Node.js的包管理工具npm,是全球最大的开源库生态系统
第三方: 国外的
建议: 切换国内的, 淘宝国内镜像源
nrm
安装cnpm
$ npm install -g cnpm --registry=https://registry.npm.taobao.org
查看是否cnpm安装成功
cnpm -v
官网 http://nodejs.cn/
npm 插件官网:https://www.npmjs.com/
环境的配置
安装包安装
官网下载对应的安装包
一路next
nvm安装(有一个类似的工具:nvm)
Node Version Manager(Node版本管理工具)
由于以后的开发工作可能会在多个Node版本中测试,而且Node的版本也比较多,所以需要这么款工具来管理 +
默认安装结束之后,默认路径: C:\Users\xxx\AppData\Roaming\nvm
nvm安装教程博客:https://blog.csdn.net/qq_32682137/article/details/82684898
问题: 如果有的同学,任意目录不能使用nvm,只有在nvm安装目录下才能使用,那么就是环境变量有问题?
在高级环境变量中的系统变量中创建两个变量
- NVM_HOME
变量名: NVM_HOME 变量值: nvm安装目录路径 - NVM_SYMLINK
变量名: NVM_SYMLINK 变量值: Node.js的安装目录
前端模块化
模块化: 是具有特定功能的一个对象( 广义理解 )
模块定义的流程:
1.定义模块(对象)
2.导出模块
3.引用模块
好处:可以存储多个独立的功能块,复用性高
种类:
AMD( require.js)
CMD ( sea.js )
Common.js
CommonJs用在服务器端,AMD和CMD用在浏览器环境
三者的一个详细介绍:https://www.jianshu.com/p/d67bc79976e6
AMD定义一个模块:使用define来定义,用require来使用模块
目录
admDir
a.js
index.js
// AMD定义 a.js
define ({
a: 1,
b: 2,
add: function(){}
})
// AMD引用 index.js
require([./a.js],function( moduleA ){
//moduleA指的就是定义来的对象
})
CMD定义模块:使用define来定义,用require来使用模块
/*
目录结构
b.js
index.js
*/
// 模块定义 b.js
define(function(require, exports, module) {
// 模块代码
});
//模块引用 index.js
require('./b.js',function( moduleB ){
//moduleB就是b模块中导出的内容
})
Common.js:
Node.js使用了Common.js的规范
易错的理解:
common.js是属于node的 ×
node属于common.js ×
//common.js
/*
目录结构:
name.js
index.js
*/
//模块的定义 name.js
const nameObj = {
name: 'Gabriel Yan '
}
//模块的导出 name.js
module.exports = nameObj
//模块的引用
const nameObj = require('./name.js')
Node.js中Common.js规范的使用有三种类型:
第一种:内置模块( 内置模块指的是挂载在Node.js全局对象身上的api )
第二种:自定义模块
1.模块的定义
const student = {
id: 1,
name: ‘Gabriel Yan’
}
const fn = function(){}
2.模块的导出
(1). module.exports = student // 安全性不高 默认导出一个
(2). module.exports = { //批量导出,按需引用
student,fn
}
3.模块的引用
// 这种引用对应第一种导出
const student = require(’./xxx.js’)
// 这种引用对应第二种导出
const { student , fn } = require( './xxx.js ’ )
模块的上传
自定义模块的上传( http://www.npmjs.com )
-
创建package.json文件
$ npm init -y
-
在http://www.npmjs.com 这个网站注册一个账号
注意:第一次登陆会发送一个邮件给你的邮箱( 这个发送是手动的 ),然后大家登陆邮箱激活
-
检查你的电脑的源是不是npm源
$ nrm ls
如果是,就不会理会
如果不是,那么切换到npm源
-
命令行登录npmjs仓库
$ npm adduser
-
创建模块并导出模块
-
查看你的包名称是否已经被使用
-
发布包
$ npm publish
模块上传失败可能的原因
1. 邮箱没有激活 ( 最多的 )
2. npm源没有切换
3. 整个电脑的npm就不能使用
express
1.认识express
express是Node.js的核心框架
express可以帮助我们快速构建web服务器 / api服务器
express提供了一个快速生成工具 express-generator
----快速生成工具: 帮助我们快速创建一个项目的工具
2.安装express-generator
全局安装(终端安装)
$ npm i express-generator -g
$ cnpm i express-generator -g
$ yarn add express-generator global
如果你的npm版本 在 5.2+以上,那么你可以不使用全局安装,使用npx就可以了
格式:$ npx express 模板配置 项目名称
//举例
$ npx express -e express_demo
// -e 指的是我们使用一个叫做ejs的模板 index.ejs 可以兼容html标签,
//可以书写js语法
3.项目目录结构
bin ( www 启动了一个静态服务器( web服务器 ))
node_modules 真个项目的依赖包
public 静态资源文件
routes 路由文件夹
view(xxx.ejs 项目的模板)
app.js 整个项目的入口文件
package.json 真个项目的依赖配置文件
4.app.js文件代码解读
app对象的功能
是为了使用一些具有特定功能的函数( 这些函数我们给起了一个名字 , 叫做中间件 )
我们通过app.use 来使用这些中间件
中间件分类
应用级中间件 cors
路由中间件 app.get( '/', function ( req,res,next ) {})
错误处理中间件 function ( err , req,res,next ) {}
5.在express中创建一个页面出来
前端异步流程工具
1.传统原生异步:
+回调函数
+事件
2.使用异步流程工具( 别人封装好的东西 )
-es6 Promise
Promise 是异步编程的一种解决方案,比传统的解决方案–回调函数和事件--更合理和更强大。它由社区最早提出和实现,ES6将其写进了语言标准,统一了语法,原生提供了Promise
所谓Promise ,简单说就是一个容器,里面保存着某个未来才回结束的事件(通常是一个异步操作) 的结果。从语法上说,Promise是一个对象,从它可以获取异步操作的消息。
Promise 对象的状态不受外界影响
三种状态:
pending:进行中
fulfilled :已经成功
rejected 已经失败
状态改变:
Promise对象的状态改变,只有两种可能:
从pending变为fulfilled
从pending变为rejected。
这两种情况只要发生,状态就凝固了,不会再变了,这时就称为resolved(已定型)
举例
const p1 = new Promise( (resolve,reject ) => {
resolve('任务一')
}).then ( data => {
console.log( data )
})
const p3 = new Promise( ( resolve,reject ) => {
setTimeout( () => {
resolve('任务三')
},2000)
}).then ( data => {
console.log(data)
})
const p2 = new Promise( (resolve,reject) => {
setTimeout( () => {
resolve('任务二')
},1000 )
}).then ( data => {
console.log(data)
})
console.log('主线程任务')
// 主线程任务
// 任务一
// 任务二
// 任务三
(执行顺序)
4. -es6 generator函数
在function关键字后面加一个* 这样定义的函数就叫做generator函数
通过yield关键字来定义任务
通过fn().next() 来执行任务
value表示yield关键字后任务执行的结果
done表示当前定义的所有的任务是否执行完成的一个状态
理解:
多任务的定义,多任务执行
让自己定义的多个任务依次执行,上一个任务如果没有完成,下一个任务就不会开始
举例:
function* fn () {
yield '任务一'
yield '任务二'
yield '任务三'
return '任务'
}
const a = fn ()
console.log( a.next() )
console.log( a.next() )
console.log( a.next() )
console.log( a.next() )
console.log('主线程任务')
// { value: '任务一', done: false }
// { value: '任务二', done: false }
// { value: '任务三', done: false }
// { value: '任务', done: true }
// 主线程任务
5.-es6( 7 ) async 函数
配合关键字await使用,await 表示,等待,任务一执行结束之后,才会执行任务二
async function fn () {
const result = await '任务一'
console.log( result )
console.log('任务二')
}
fn()
const fn1 = async () => {
const res = await '任务3'
console.log( res )
console.log( '任务四' )
}
fn1()
// 任务一
// 任务二
// 任务3
// 任务四
6. -node.js中的 nextTick setImmudiate
nextTick > 回调函数 > setImmediate
nextTick()的回调函数执行的优先级要高于setImmediate();
process.nextTick()属于idle观察者,setImmediate()属于check观察者.在每一轮循环检查中,idle观察者先于I/O观察者,I/O观察者先于check观察者.
在具体实现上,process.nextTick()的回调函数保存在一个数组中,
setImmediate()的结果则是保存在链表中.
在行为上,process.nextTick()在每轮循环中会将数组中的回调函数全部执行完.
而setImmediate()在每轮循环中执行链表中的一个回调函数.
express创建api服务器(打造接口)
1.api服务器需要使用测试用具来测试,不能用浏览器展示
总结: api服务器就是给前端打造接口
注意: 后端工程师给前端工程师发送的接口数据类型时一个json类型的字符串
前端工程师需要用 JSON.parse() 转换
2.restful api 规则 ( 暴露接口的规则 )
举例: http://localhost:3000/product ( 商品接口)
要求: 删除商品中的一条
http://localhost:3000/product/delete 删除一条商品的接口
要求: 添加一条商品
http://localhost:3000/product/add 添加一条商品接口
要求: 修改一条商品的信息
http://localhost:3000/product/change 修改一条商品接口
上面这种做法对后端压力比较大
对一个的数据的操作,接口太多了
为了解决上面的冗余
我们使用了restful api的规则
什么是restful api ?
一个接口用不同数据请求方式来暴露
将来接口只有一个,但是数据请求方式有多个
http://localhost:3000/product
get
post
delete
put
options
head
ejs 模板语法
ejs模板语法
<%'脚本' 标签,用于流程控制,无输出。
<%= 输出数据到模板(输出是转义 HTML 标签) ( 不会编译html标签)
<%- 输出非转义的数据到模板( 会编译html标签 )
什么是流程控制?
条件判断--------if
循环控制
-------- for
--------forEach ...
--------while
--------do...while
后端渲染
后端通过一个模板( 兼容html ) + 后端模板语法 ----》 html ----> 发送到前台
这种类型项目我们叫它 ‘ 前后端不分离的项目’
如果将来你遇到这种类型项目:
java: 先找java在你的电脑搭建java运行环境