node.js

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安装目录下才能使用,那么就是环境变量有问题?
在高级环境变量中的系统变量中创建两个变量

  1. NVM_HOME
    变量名: NVM_HOME 变量值: nvm安装目录路径
  2. 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

  1. 创建package.json文件

    $ npm init -y
    
  2. 在http://www.npmjs.com 这个网站注册一个账号

    注意:第一次登陆会发送一个邮件给你的邮箱( 这个发送是手动的 ),然后大家登陆邮箱激活

  3. 检查你的电脑的源是不是npm源

    $ nrm ls
    

    如果是,就不会理会

    如果不是,那么切换到npm源

  4. 命令行登录npmjs仓库

    $ npm adduser
    
  5. 创建模块并导出模块

  6. 查看你的包名称是否已经被使用

  7. 发布包

    $ 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运行环境





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值