1.Node.js概述
1.1 为什么JavaScript可以在浏览器中被执行
(1)浏览器中有JavaScript 的解析引擎:
⚫ Chrome 浏览器 => V8
⚫ Firefox 浏览器 => OdinMonkey(奥丁猴)
⚫ Safri 浏览器
⚫ IE 浏览器
⚫ etc…
(2)其中,Chrome 浏览器的V8 解析引擎性能最好
1.2 为什么JavaScript可以操作DOM和BOM
每个浏览器中都内置了DOM、BOM 这样的API 函数,因此,浏览器中的JavaScript 可以调用它们
1.3 浏览器中的JavaScript运行环境
(1)解析引擎(V8)负责解析和执行JavaScript 代码。
(2)内置API(如BOM、DOM) 是由运行环境(指浏览器)提供的特殊接口,只能在所属的运行环境中被调用。
1.4 什么是Node.js
(1)浏览器是JavaScript 的前端运行环境;Node.js 是 JavaScript 的后端运行环境。脱离浏览器环境也可以运行JavaScript,只要有JavaScript引擎就可以
(2)Node.js是一个基于Chrome V8引擎的JavaScript运行环境,即:Node.js内置了Chrome的V8引擎,可以在Node.js环境中直接运行JavaScript程序
(3)Node.js通常会被作一个BFF层,即Backend For Frontend(服务于前端的后端),通俗的说是一个专门用于为前端业务提供数据的后端程序
1.5 在Node.js中写JavaScript和在Chrome浏览器中写JavaScript区别
(1)Node.js没有浏览器API,即document,window等。Node.js 中无法调用DOM 和BOM 等浏览器内置API。
(2)Node.js 没有浏览器安全级别的限制,提供很多系统级别的API,,文件的读写 (File System),进程的管理 (Process),网络通信 (HTTP/HTTPS)
1.6 Node.js 可以做什么
Node.js 作为一个 JavaScript 的运行环境,仅仅提供了基础的功能和API。然而,基于Node.js 提供的这些基础功能,出现了很多强大的工具和框架
①基于Express 框架可以快速构建Web 应用
②基于Electron框架可以构建跨平台的桌面应用
③基于restify框架可以快速构建API 接口项目
④读写和操作数据库、创建实用的命令行工具辅助前端开发
1.7 在 Node.js 环境中执行 JavaScript 代码
(1)打开终端
(2)进入js文件所在的目录,输入命令:node js文件
2.fs文件系统模块
(1)fs 模块是 Node.js 官方提供的、用来操作文件的模块。它提供了一系列的方法和属性,用来满足用户对文件的操作需求。
(2)如果要在JavaScript 代码中,使用fs 模块来操作文件,则需要使用如下的方式先导入它:
const fs = require('fs')
2.1 读取指定文件中的内容
(1)fs.readFile() 的语法格式
①参数1:必选参数,字符串,表示文件的路径。
②参数2:可选参数,表示以什么编码格式来读取文件。一般指定utf-8
③参数3:必选参数,文件读取完成后,通过回调函数拿到读取的结果。
函数中有两个参数err和dataStr分别表示读取失败和成功的结果
(2)示例
const fs = require('fs') fs.readFile('./test.txt','utf-8',function(err,dataStr){ console.log(dataStr) console.log(err) })
(3)如果读取成功,则err的值为null;如果读取失败,则err的值为错误对象,dataStr的值为undefined
2.2 向指定的文件中写入内容
(1)使用fs.writeFile() 方法,可以向指定的文件中写入内容,语法格式如下
①参数1:必选参数,需要指定一个文件路径的字符串,表示文件的存放路径。
②参数2:必选参数,表示要写入的内容。
③参数3:可选参数,表示以什么格式写入文件内容,默认值是utf8。
④参数4:必选参数,文件写入完成后的回调函数
(2)判断文件是否写入成功:
可以判断err 对象是否为null,从而知晓文件写入的结果
2.3 fs 模块- 路径动态拼接的问题
(1)在使用fs 模块操作文件时,如果提供的操作路径是以./ 或…/ 开头的相对路径时,很容易出现路径动态拼接错误的问题。
(2)原因:代码在运行的时候,会以执行node 命令时所处的目录,动态拼接出被操作文件的完整路径。
(3)解决方案:在使用fs 模块操作文件时,直接提供完整的路径,不要提供./ 或…/ 开头的相对路径,从而防止路径动态拼接的问题。
3.path路径模块
3.1 什么是path 路径模块
(1)path 模块是Node.js 官方提供的、用来处理路径的模块。它提供了一系列的方法和属性,用来满足用户对路径的处理
(2)如果要在JavaScript 代码中,使用path 模块来处理路径,则需要使用如下的方式先导入它:
3.2 path 路径模块的使用
(1)path.join()
①路径拼接,把多个路径片段拼接为完整的路径字符串
②语法格式使用path.join() 方法,可以把多个路径片段拼接为完整的路径字符串,语法格式如下:
③代码示例:
(2)path.basename()
①可以从一个文件路径中,获取到文件的名称部分
②语法:
a.path:必选参数,表示一个路径的字符串
b.ext:可选参数,表示文件扩展名。结果会只保留文件名,去掉扩展名
③代码示例
(3)path.extname()
①获取路径中的扩展名部分
②代码示例
4.http 模块
4.1 什么是http 模块
(1)在网络节点中,负责消费资源的电脑,叫做客户端;负责对外提供网络资源的电脑,叫做服务器。
(2)http 模块是 Node.js 官方提供的、用来创建web 服务器的模块。通过http 模块提供的http.createServer() 方法,就能方便的把一台普通的电脑,变成一台Web 服务器,从而对外提供Web 资源服务。
4.2 创建web服务器的基本步骤
(1)如果要希望使用http 模块创建Web 服务器,则需要先导入http 模块
(2)调用http.createServer() 方法,创建web服务器实例
(3)为服务器实例绑定request 事件,即可监听客户端发送过来的网络请求:
(4) 启动服务器:调用服务器实例的.listen() 方法,即可启动当前的web 服务器实例:
(5)使用node命令启动该js文件
4.3 req 请求对象和res 响应对象
(1)req 请求对象
只要服务器接收到了客户端的请求,就会调用通过server.on() 为服务器绑定的request 事件处理函数。
如果想在事件处理函数中,访问与客户端相关的数据或属性,可以使用如下的方式
(2) res 响应对象
在服务器的request 事件处理函数中,如果想访问与服务器相关的数据或属性,可以使用如下的方式:
(3)解决中文乱码问题
当调用res.end() 方法,向客户端发送中文内容的时候,会出现乱码问题,此时,需要手动设置内容的编码格式:
5. Node.js 模块化
(1)什么是模块化与模块 ?
①将一个复杂的程序文件依据一定规则拆分成多个文件的过程称之为 模块化
②其中拆分出的 每个文件就是一个模块 ,模块的内部数据是私有的,不过模块可以暴露内部数据以便其他
模块使用
(2)什么是模块化项目?
编码时是按照模块一个一个编码的,整个项目就是一个模块化的项目
(3)模块化好处
①防止命名冲突
②高复用性
③高维护性
5.1 Node.js 中模块的分类
Node.js 中根据模块来源的不同,将模块分为了3 大类,分别是:
⚫内置模块(内置模块是由Node.js 官方提供的,例如fs、path、http 等)
⚫自定义模块(用户创建的每个.js 文件,都是自定义模块)
⚫第三方模块(由第三方开发出来的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要先下载)
5.2 加载模块
注意:使用require() 方法加载其它模块时,会执行被加载模块中的代码
5.3 Node.js 中的模块作用域
(1)什么是模块作用域
和函数作用域类似,在自定义模块中定义的变量、方法等成员,只能在当前模块内被访问,这种模块级别的访问限制,叫做模块作用域。
(2)模块作用域的好处:防止了全局变量污染的问题
5.4 向外共享模块作用域中的成员
在每个.js 自定义模块中都有一个module 对象,它里面存储了和当前模块有关的信息,打印如下
5.4.1 模块初体验
(1)创建me.js
//声明函数 function tiemo(){ console.log('贴膜....'); } //暴露数据 module.exports = tiemo;
(2)创建index.js
//导入模块 const tiemo = require('./me.js'); //调用函数 tiemo();
5.4.2 暴露数据
模块暴露数据的方式有两种:
(1)module.exports = value
(2)exports.name = value
由于module.exports 单词写起来比较复杂,为了简化向外共享成员的代码,Node 提供了exports对象。默认情况下,exports 和module.exports 指向同一个对象。最终共享的结果,还是以module.exports指向的对象为准
(3)使用时有几点注意:
①module.exports 可以暴露 任意 数据
②不能使用 exports = value 的形式暴露数据,因为模块内部 module 与 exports 的隐式关系exports = module.exports = {} ,require 返回的是目标模块中 module.exports 的值
5.4.3 导入(引入)模块
在模块中使用 require 传入文件路径即可引入文件
const test = require('./me.js');
require 使用的一些注意事项:
(1)对于自己创建的模块,导入时路径建议写 相对路径,且不能省略 ./ 和 …/
(2)js 和 json 文件导入时可以不用写后缀,c/c++编写的 node 扩展文件也可以不写后缀,但是一
般用不到
(3)如果导入其他类型的文件,会以 js 文件进行处理
(4)如果导入的路径是个文件夹,则会 首先 检测该文件夹下 package.json 文件中 main 属性对应
的文件
①如果存在则导入,反之如果文件不存在会报错。
②如果 main 属性不存在,或者 package.json 不存在,则会尝试导入文件夹下的 index.js 和
index.json
③如果还是没找到,就会报错
(5)导入 node.js 内置模块时,直接 require 模块的名字即可,无需加 ./ 和 …/
5.5 Node.js 中的模块化规范
Node.js 遵循了 CommonJS 模块化规范,CommonJS 规定了模块的特性和各模块之间如何相互依赖。
CommonJS 规定:
① 每个模块内部,module 变量代表当前模块。
② module 变量是一个对象,它的exports 属性(即module.exports)是对外的接口。
③ 加载某个模块,其实是加载该模块的module.exports 属性。require() 方法用于加载模块
6. BFF
(1)BFF 解决什么问题
①一个前端页面向 Service A、Service B 以及 Service C发送请求,不同的微服务返回的值用于渲染页面中不同的组件。此时,每次访问该页面都需要发送 3 个请求。我们需要一个服务来聚合Service A、Service B 以及 Service C响应的数据,这个服务层叫做BFF。
②手机、平板端、PC机等用户终端都需要向每个Service,例如Service A发送请求。对于同一个功能,不同的终端需要的数据格式和内容会有不同。此时 Service A 的一个接口,不能同时满足三个客户端的不同需求。我们可以在Service A中开发三个接口,也可以增加一个数据裁剪服务,将数据按照不同终端的不同要求进行裁剪,这个服务层叫做BFF。
7.包管理工具
(1)包是什么
Node.js 中第三方模块和包指的是同一个概念,只不过叫法不同。包是基于内置模块封装出来的,提供了更高级、更方便的API,极大的提高了开发效率。
(2)包管理工具
①管理『包』的应用软件,可以对「包」进行 下载安装 ,更新,删除 ,上传 等操作
②借助包管理工具,可以快速开发项目,提升开发效率
③包管理工具是一个通用的概念,很多编程语言都有包管理工具,所以 掌握好包管理工具非常重要
(3)常用的包管理工具
下面列举了前端常用的包管理工具
①npm
②yarn
③cnpm
(4)包的来源
不同于Node.js 中的内置模块与自定义模块,包是由第三方个人或团队开发出来的,免费供所有人使用。
注意:Node.js 中的包都是免费且开源的,不需要付费即可免费下载使用
(5)一个规范的包,它的组成结构,必须符合以下3 点要求:
①包必须以单独的目录而存在
②包的顶级目录下要必须包含package.json 这个包管理配置文件
③package.json 中必须包含name,version,main这三个属性,分别代表包的名字、版本号、包的入口。
7.1 npm
(1)npm 全称 Node Package Manager ,翻译为中文意思是『Node 的包管理工具』
(2)npm 是 node.js 官方内置的包管理工具,是 必须要掌握住的工具
7.1.1 npm 的安装
(1)node.js 在安装时会 自动安装 npm ,所以如果你已经安装了 node.js,可以直接使用 npm
(2)可以通过 npm -v 查看版本号测试,如果显示版本号说明安装成功,反之安装失败
7.1.2 npm 基本使用
7.1.2.1 初始化(创建 package.json 文件)
(1)创建一个空目录,然后以此目录作为工作目录 启动命令行工具 ,执行 npm init
①npm init 命令可以将文件夹初始化为一个『包』, 交互式创建 package.json 文件
②package.json 是包的配置文件,每个包都必须要有 package.json。可用来记录项目中安装了哪些包。从而方便剔除node_modules 目录之后,在团队成员之间共享项目的源代码
注意:今后在项目开发中,一定要把node_modules文件夹,添加到.gitignore忽略文件中。
③package.json 内容示例:
{ "name": "1-npm", #包的名字 "version": "1.0.0", #包的版本 "description": "", #包的描述 "main": "index.js", #包的入口文件 "scripts": { #脚本配置 "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", #作者 "license": "ISC" #开源证书 }
(2)初始化的过程中还有一些注意事项:
①package name ( 包名 ) 不能使用中文、大写,默认值是 文件夹的名称 ,所以文件夹名称也不
能使用中文和大写
②version ( 版本号 )要求 x.x.x 的形式定义, x 必须是数字,默认值是 1.0.0
a.第1位数字:大版本
b.第2位数字:功能版本
c.第3位数字:Bug修复版本
版本号提升的规则:只要前面的版本号增长了,则后面的版本号归零。
③ISC 证书与 MIT 证书功能上是相同的,关于开源证书扩展阅读http://www.ruanyifeng.com/bl
og/2011/05/how_to_choose_free_software_licenses.html
④package.json 可以手动创建与修改
⑤使用 npm init -y
或者 npm init --yes
极速创建 package.json
(3)package.json 文件中,有一个dependencies 节点,专门用来记录您使用npm install 命令安装了哪些包
(4)devDependencies 节点
如果某些包只在项目开发阶段会用到,在项目上线之后不会用到,则建议把这些包记录到devDependencies节点中。与之对应的,如果某些包在开发和项目上线之后都需要用到,则建议把这些包记录到dependencies 节点中。
7.1.2.2 搜索以及下载安装包
(1)搜索包的方式有两种
a.命令行 『npm s/search 关键字』
b.网站搜索 网址是 https://www.npmjs.com/
(2)我们可以通过 npm install 和 npm i 命令安装包
# 格式 npm install <包名> npm i <包名> # 示例 npm install uniq npm i uniq
(3)运行之后文件夹下会增加两个资源
①node_modules: 文件夹,用来存放所有已安装到项目中的包
②package-lock.json: 包的锁文件 ,用来锁定包的版本。该配置文件用来记录 node_modules 目录下的每一个包的下载信息,例如包的名字、版本号、下载地址等。
注意:程序员不要手动修改node_modules 或package-lock.json文件中的任何代码,npm 包管理工具会自动维护它们
7.1.2.3 require 导入 npm 包基本流程
(1)在当前文件夹下 node_modules 中寻找同名的文件夹
(2)在上级目录中下的 node_modules 中寻找同名的文件夹,直至找到磁盘根目录
7.1.3 生产环境与开发环境,生产依赖与开发依赖
(1)开发环境是程序员 专门用来写代码 的环境,一般是指程序员的电脑,开发环境的项目一般 只能程序员自己访问
(2)生产环境是项目 代码正式运行 的环境,一般是指正式的服务器电脑,生产环境的项目一般 每个客户都可以访问
(3)我们可以在安装时设置选项来区分 依赖的类型 ,目前分为两类:
7.1.4 解决下包速度慢的问题
7.1.5 全局安装
(1)在执行npm install 命令时,如果提供了-g参数,则会把包安装为全局包。
(2)全局包会被安装到C:\Users\用户目录\AppData\Roaming\npm\node_modules 目录下
(3)说明:
①全局安装的命令不受工作目录位置影响
②可以通过 npm root -g
可以查看全局安装包的位置
③不是所有的包都适合全局安装 , 只有全局类的工具才适合,可以通过 查看包的官方文档来确定
安装方式
7.1.6 修改 windows 执行策略
windows 默认不允许 npm 全局命令执行脚本文件,所以需要修改执行策略
(1)以 管理员身份 打开 powershell 命令行
(2)键入命令 set-ExecutionPolicy remoteSigned
(3)如果不生效,可以尝试重启 vscode
7.1.7 安装包依赖(npm i)
(1)在项目协作中有一个常用的命令就是 npm i ,通过该命令可以依据 package.json 和 packagelock.json 的依赖声明一次性安装所有的依赖包:
(2)命令:
npm i或者npm install
(3)node_modules 文件夹大多数情况都不会存入版本库
7.1.8 安装指定版本的包、卸载包
(1)项目中可能会遇到版本不匹配的情况,有时就需要安装指定版本的包,可以使用下面的命令的
## 格式 npm i <包名@版本号> ## 示例 npm i jquery@1.11.2
(2)运行npm uninstall 命令,来卸载指定的包
注意:npm uninstall 命令执行成功后,会把卸载的包,自动从package.json 的dependencies 中移除掉。
7.1.9 删除依赖
项目中可能需要删除某些不需要的包,可以使用下面的命令
## 局部删除 npm remove uniq npm r uniq ## 全局删除 npm remove -g nodemon
7.1.10 配置命令别名
(1)通过配置命令别名可以更简单的执行命令
(2)配置 package.json 中的 scripts 属性
{ . . . "scripts": { "server": "node server.js", "start": "node index.js", }, . . }
(3)配置完成之后,可以使用别名执行命令
npm run server npm run start
(4)不过 start 别名比较特别,使用时可以省略 run
npm start
(5)补充说明:
①npm start 是项目中常用的一个命令,一般用来启动项目
②npm run 有自动向上级目录查找的特性,跟 require 函数也一样
③对于陌生的项目,我们可以通过查看 scripts 属性来参考项目的一些操作
7.2 cnpm
7.2.1 介绍
(1)cnpm 是一个淘宝构建的 npmjs.com 的完整镜像,也称为『淘宝镜像』,网址https://npmmirror.com/
(2)cnpm 服务部署在国内 阿里云服务器上 , 可以提高包的下载速度
(3)官方也提供了一个全局工具包 cnpm ,操作命令与 npm 大体相同
7.2.2 安装
我们可以通过 npm 来安装 cnpm 工具
npm install -g cnpm --registry=https://registry.npmmirror.com
2.2.3 操作命令
7.2.4 配置淘宝镜像
用 npm 也可以使用淘宝镜像,配置的方式有两种
(1)直接配置
(2)工具配置
7.2.4.1 直接配置
执行如下命令即可完成配置
npm config set registry https://registry.npmmirror.com/
7.2.4.2 工具配置
使用 nrm 配置 npm 的镜像地址 npm registry manager
(1)安装 nrm
npm i -g nrm
(2)修改镜像
nrm use taobao
(3)检查是否配置成功(选做)
npm config list
检查 registry 地址是否为 https://registry.npmmirror.com/ , 如果 是 则表明成功
补充说明:
(1)建议使用第二种方式 进行镜像配置,因为后续修改起来会比较方便
(2)虽然 cnpm 可以提高速度,但是 npm 也可以通过淘宝镜像进行加速,所以 npm 的使用率还
是高于 cnpm
7.3 yarn
7.3.1 yarn简介
(1)yarn 是由 Facebook 在 2016 年推出的新的 Javascript 包管理工具,官方网址:https://yarnpkg.com/
(2)yarn特点:
①速度超快:yarn 缓存了每个下载过的包,所以再次使用时无需重复下载。 同时利用并行下载以最大
化资源利用率,因此安装速度更快
②超级安全:在执行代码之前,yarn 会通过算法校验每个安装包的完整性
③超级可靠:使用详细、简洁的锁文件格式和明确的安装算法,yarn 能够保证在不同系统上无差异的工作
(3)yarn的安装
npm i -g yarn
7.3.2 yarn 常用命令
7.3.3 yarn 配置淘宝镜像
(1)可以通过如下命令配置淘宝镜像
yarn config set registry https://registry.npmmirror.com/
(2)可以通过 yarn config list 查看 yarn 的配置项
7.3.4 npm 和 yarn 选择
大家可以根据不同的场景进行选择
(1)个人项目
如果是个人项目, 哪个工具都可以 ,可以根据自己的喜好来选择
(2) 公司项目
如果是公司要根据项目代码来选择,可以 通过锁文件判断 项目的包管理工具
①npm 的锁文件为 package-lock.json
②yarn 的锁文件为 yarn.lock