Node.js总结

  • 初识

Node.js就是js的运行环境

  • 模块:

  1. fs模块、操作文件的模块:require('fs')后,fs.readFile() 方法,用来读取指定文件中的内容,fs.writeFile() 方法,用来向指定的文件中写入内容。

  1. path模块、处理路径的模块:path.join() 方法,用来将多个路径片段拼接成一个完整的路径字符串,path.basename() 方法,用来从路径字符串中,将文件名解析出来。

  1. http模块、创建 web 服务器的模块

作用:服务器和普通电脑的区别在于,服务器上安装了 web 服务器软件,例如:IIS、Apache 等。通过安装这些服务器软件,就能把一台普通的电脑变成一台 web 服务器。在 Node.js 中,我们不需要使用 IIS、Apache 等这些第三方 web 服务器软件。因为我们可以基于 Node.js 提供的http 模块,通过几行简单的代码,就能轻松的手写一个服务器软件,从而对外提供 web 服务

  • 服务器相关概念

  1. IP地址:互联网上每个电脑的唯一地址,互联网中每台 Web 服务器,都有自己的 IP 地址,可以在 Windows 的终端中运行 ping www.baidu.com 命令,即可查看到百度服务器的 IP 地址。

  1. 域名和域名服务器:由于IP地址不直观不易记住,所以有了域名,即字符型的地址方案。域名和IP地址是一一对应的关系存放在域名服务器中,使用者只需通过好记的域名访问对应的服务器即可,对应的转换工作由域名服务器实现。因此,域名服务器就是提供 IP 地址和域名之间的转换服务的服务器。 127.0.0.1 对应的域名是 localhost,它们都代表我们自己的这台电脑。

  1. 端口号:每个 web 服务都对应一个唯一的端口号。客户端发送过来的网络请求,通过端口号,可以被准确地交给对应的 web 服务进行处理。

  1. 对于前端程序员来说,最常见的两种服务器,分别是:

Web 网站服务器:专门对外提供 Web 网页资源的服务器。

API 接口服务器:专门对外提供 API 接口的服务器。

  • 创建一个最基本的web服务器

  1. 导入http模块

  1. 创建web服务器实例

  1. 为服务器实例绑定request事件,监听客户端的请求

  1. 启动服务器

代码如下:

const http = require('http')
//调用 http.createServer() 方法,即可快速创建一个 web 服务器实例
const server = http.createServer()
server.on('request',(req,res)=>{
    //req是请求对象,包含与客户端相关的数据和属性 如:req.url是客户端请求的URL地址,req.method是客户端的method请求类型
    console.log('只要有客户端请求自己的服务器就会触发request事件从而调用这个事件处理函数')
})
serve.listen(80,()=>{
    console.log('http server running at http://127.0.0.1')
})
  • 模块化

Node.js 中根据模块来源的不同,将模块分为了 3 大类,分别是:

  1. 内置模块(内置模块是由 Node.js 官方提供的,例如 fs、path、http 等)

  1. 自定义模块(用户创建的每个 .js 文件,都是自定义模块)

  1. 第三方模块(由第三方开发出来的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要先下载)

  • npm与包

  1. 由于 Node.js 的内置模块仅提供了一些底层的 API,导致在基于内置模块进行项目开发的时,效率很低。

包是基于内置模块封装出来的,提供了更高级、更方便的 API,极大的提高了开发效率。

包和内置模块之间的关系,类似于 jQuery 和 浏览器内置 API 之间的关系。

  1. npm, Inc. 公司提供了一个包管理工具 Node Package Manager(简称 npm 包管理工具),这个包管理工具随着 Node.js 的安装包一起被安装到了用户的电脑上。在终端中执行 npm -v 命令可以查看自己电脑上所安装的 npm 包管理工具的版本号。初次装包完成后,在项目文件夹下多一个叫做 node_modules 的文件夹和 package-lock.json 的配置文件。一般做项目拉代码后可以运行 npm install 命令(或 npm i)一次性安装所有的依赖包。node_modules 文件夹用来存放所有已安装到项目中的包。require() 导入第三方包时,就是从这个目录中查找并加载包。

package-lock.json 配置文件用来记录 node_modules 目录下的每一个包的下载信息,例如包的名字、版本号、下载地址等。

  1. 注意:程序员不要手动修改 node_modules 或 package-lock.json 文件中的任何代码,npm 包管理工具会自动维护它们。被安装到项目的 node_modules 目录中的包,都是项目包。项目包又分为两类,分别是:开发依赖包(被记录到 devDependencies 节点中的包,只在开发期间会用到)、 核心依赖包(被记录到 dependencies 节点中的包,在开发期间和项目上线之后都会用到。

  • Express

是基于 Node.js 平台,快速、开放、极简的 Web 开发框架,本质上就是一个npm上的第三方包,提供快速创建Web服务器的便捷方法。Express就是基于node内原生http内置模块进一步封装过来的。

  • Web开发模式

  • 基于服务端渲染的传统 Web 开发模式:

优点:前端耗时少,有利于SEO

缺点:占用服务器端资源,不利于前后端分离,开发效率低

身份认证:推荐使用Session认证机制。现实生活中的会员卡身份认证在Web开发中专业术语叫做Cookie(是键值对组成的字符串,不同域名下是独立的,自动发送、域名独立、过期时限、4KB限制、不安全、不支持跨域)。

  • 基于前后端分离的新型 Web 开发模式:依赖于 Ajax 技术的广泛应用

优点:开发体验好、用户体验好,减轻了服务器端的渲染压力。

缺点:不利于 SEO。因为完整的 HTML 页面需要在客户端动态拼接完成,所以爬虫对无法爬取页面的有效信息。(解决方案:利用 Vue、React 等前端框架的 SSR (server side render)技术能够很好的解决 SEO 问题!)

身份认证:推荐使用JWT认证机制。(最流行的跨域认证解决方案)

用户的信息通过 Token 字符串的形式,保存在客户端浏览器中。服务器通过还原 Token 字符串的形式来认证用户的身份。

  • 不谈业务场景而盲目选择使用何种开发模式都是耍流氓。

比如企业级网站,主要功能是展示而没有复杂的交互,并且需要良好的 SEO,则这时我们就需要使用服务器端渲染;

而类似后台管理页面,交互性比较强,不需要 SEO 的考虑,那么就可以使用前后端分离的开发模式。

另外,具体使用何种开发模式并不是绝对的,为了同时兼顾了首页的渲染速度和前后端分离的开发效率,一些网站采用了

首屏服务器端渲染,即对于用户最开始打开的那个页面采用的是服务器端渲染,而其他的页面采用前后端分离开发模式。

  • ES模块化和异步编程高级

  • 事件循环机制Event Loop

event loop它的执行顺序:

  1. 一开始整个脚本作为一个宏任务执行

  1. 执行过程中同步代码直接执行,宏任务进入宏任务队列,微任务进入微任务队列

  1. 当前宏任务执行完出队,检查微任务列表,有则依次执行,直到全部执行完

  1. 执行浏览器UI线程的渲染工作

  1. 检查是否有Web Worker任务,有则执行

  1. 执行完本轮的宏任务,回到2,依此循环,直到宏任务和微任务队列都为空

async/await、promise和setTimeout 执行顺序

  • await/async

正常情况下,async中的await命令是一个Promise对象,返回该对象的结果。但如果不是Promise对象的话,就会直接返回对应的值,相当于Promise.resolve()

第一个await之前的代码会同步执行,后面的都异步执行、只要是new一个promis实例,里面function做同步执行。

  • 同步任务和异步任务:为防止程序假死问题单线程的js把执行任务分类

  1. 同步:只有前一个任务完毕才能执行后一个任务。

  1. 异步:由js委托给宿主环境执行完成后又通知js主线程执行异步任务的回调函数。

  1. 执行过程:

  • 宏任务和微任务

异步任务又分为:宏任务和微任务

宏任务:异步Ajax请求、setTimeout、setInterval、文件操作……

微任务:Promise.then .catch .finally 、process.nextTick……

执行顺序:交替执行,比如

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值