day3-node.js
1-包管理配置文件
-
运行npm install 命令安装包的时候,npm包管理工具会自动把包的名称和版本号,记录到package.json中
-
package.json文件中,有一个dependencies节点,专门用来记录您使用 npm install 命令安装了那些包
1.1-快速创建package.json
// 快速创建package.json命令
npm init -y
- 上述命令只能在纯英文的目录下运行,所以,项目文件夹的名称一定要使用英文命名,不要使用中文,不能出现空格
1.2-卸载指定的包
// 快速卸载指定的包命令
npm uninstall 包的完整名称
1.3-安装所以的依赖包
// 安装所以的依赖包命令
npm install(或 npm i)
-
执行 npm install 命令时,npm 包管理工具会优先读取 package.json 中的 dependencies节点
-
读取到记录的所有依赖包名称和版本号之后,npm 包管理工具会把这些包一次性下载到项目中
1.4-卸载指定的包
// 卸载指定的包命令
npm uninstall
- 注意:npm uninstall 命令执行成功后,会把卸载的包,自动从 package.json 的 dependencies 中移除掉
1.5-devDependencies节点
-
如果某些包只在项目开发阶段会用到,在项目上线之后不会用到,则建议把这些包记录到devDependencies 节点中。
-
与之对应的,如果某些包在开发和项目上线之后都需要用到,则建议把这些包记录到dependencies 节点中。
// 完整命令
npm install 包名 --save-dev
// 简写命令
2-解决下包缓慢问题
2.1-更改包镜像源
// 查看当前的下包镜像源
npm config get registry
// 将下包的镜像源切换为淘宝镜像源
npm config set registry=https://registry.npmmirror.com/
//检查镜像源是否下载成功
npm config get registry
2.2-nrm工具
-
为了更方便的切换下包的镜像源,我们可以安装nrm这个小工具,利用nrm提供的终端命令,可以快速查看和切换下包的镜像源。
-
通过npm包管理器,将nrm安装为全局可用的工具
// 安装 nrm 工具命令
npm i nrm -g
// 查看所有可用的镜像源
nrm ls
// 将下包的镜像源切换为taobao镜像
nrm use taobao
3-包的分类&规范的包结构
3.1-项目包
-
那些被安装到项目的node_modules目录中的包,都是项目包。
-
开发依赖包(被记录到devDependencies节点中的包,只在开发期间会用到)
-
核心依赖包(被记录到dependencies节点中的包,在开发期间和项目上线之后都会用到)
// 开发依赖包(会被记录到devDependencies节点下)
npm i 包名-D
// 核心依赖包(会被记录到dependencies节点下)
npm i 包名
3.2-全局包
-
在执行npm install命令时,如果提供了-g参数,则会把包安装为全局包。
-
全局包会被安装到C\Users\用户目录VAppData\Roaming\npm\node_modules目录下
// 全局安装指定的包
npm i 包名-g
// 卸载全局安装的包
npm uninstall包名-g
注意:
-
只有工具性质的包,才有全局安装的必要性。因为它们提供了好用的终端命令。
-
判断某个包是否需要全局安装后才能使用,可以参考官方提供的使用说明即可。
3.3-i5ting_toc工具
- i5ting_toc是一个可以把 md文档转为 html页面的小工具
// 将 i5ting _toc 安装为全局包
npm install -g i5ting_toc
- 调用i5ting_toc,轻松实现md 转 html 的功能
// md 转 html 命令
i5ting_toc -f 要转换的md文件路径 -o
3.4-规范的包结构
一个规范的包,它的组成结构,必须符合以下3点要求:
-
包必须以单独的目录而存在
-
包的顶级目录下要必须包含package.json这个包管理配置文件
-
package.json 中必须包含name,version,main这三个属性,分别代表包的名字、版本号、包的入口。
注意:
-
以上3点要求是一个规范的包结构必须遵守的格式
-
关于更多的约束,可以参考网址 https://yarnpkg.com/zh-Hans/docs/package-json
3.5-登录npm账号
- npm 账号注册完成后,可以在终端中执行 npm login 命令,依次输入用户名、密码、邮箱后,即可登录成功。
3.6-发布&删除包
发布包
- 将终端切换到包的根目录之后,运行 npm publish 命令,即可将包发布到 npm 上(注意:包名不能雷同)。
// 发布包命令
npm publish 要发布的包名称
删除包
- 运行 npm unpublish 包名 --force 命令,即可从 npm 删除已发布的包。
// 删除包命令
npm unpublish 包名--force
注意:
-
npm unpublish 命令只能删除72小时以内发布的包
-
npm unpublish 删除的包,在24小时内不允许重复发布
-
发布包的时候要慎重,尽量不要往npm上发布没有意义的包
3.7-编写一个完整的包
构建完整的文件夹 itheima-tools
-
编写 index.js 文件
//这是包的入口文件 const date = require('./src/dateFormat') const escape = require('./src/htmlEscape') //向外暴露需要的成员 module.exports = { //利用扩展运算符展开对象进行挂载 ...date, ...escape }
-
编写 package.json 文件
{ "name": "itheima-tools", "version": "1.0.0", "main": "./index.js", "description": "提供了格式化时间、HTMLEscape相关的功能", "keywords": ["itheima","dateFormat","escape"], "license": "ISC" }
-
编写 README.md 文件
在 itheima-tools 文件目录下创建 src文件并编写功能文件
-
编写 dateFormat.js
//定义格式化时间函数 function dateFormat(dateStr) { const dt = new Date(dateStr) const y = dt.getFullYear() const m = padZero(dt.getMonth() + 1) const d = padZero(dt.getDate()) const hh = padZero(dt.getHours()) const mm = padZero(dt.getMinutes()) const ss = padZero(dt.getSeconds()) return `${y}-${m}-${d} ${hh}:${mm}:${ss}` } //定义一个补零的函数 function padZero(n) { return n > 10 ? n : '0'+n } module.exports = { dateFormat }
-
编写 htmlEscape.js
//定义转义html字符的函数 function htmlEscape(htmlstr) { return htmlstr.replace(/<|>|"|&/g,(match)=>{ switch (match) { case '<': return '<' case '>': return '>' case '"': return '"' case '&': return '&' } }) } //定义还原html字符串函数 function htmlUnEscape(str) { return str.replace(/<|>|"|&/g,(match)=>{ switch (match) { case '<': return '<' case '>': return '>' case '"': return '"' case '&': return '&' } }) } module.exports = { htmlEscape, htmlUnEscape }
4-模块的加载机制
-
模块在第一次加载后会被缓存。这也意味着多次调用require(不会导致模块的代码被执行多次。
-
注意:不论是内置模块、用户自定义模块、还是第三方模块,它们都会优先从缓存中加载,从而提高模块的加载效率。
4.1-内置模块加载机制
- 内置模块是由Node.js 官方提供的模块,内置模块的加载优先级最高。
4.2-加载自定义模块
-
使用require()加载自定义模块时,必须指定以.或…开头的路径标识符。在加载自定义模块时,如果没有指定.或…这样的路径标识符,则 node会把它当作内置模块或第三方模块进行加载。
-
在使用require()导入自定义模块时,如果省略了文件的扩展名,则Node.js 会按顺序分别尝试加载以下的文件:按照确切的文件名进行加载
补全.js扩展名进行加载补全
补全.json扩展名进行加载补全
补全.node扩展名进行加载
加载失败终端报错
4.3-第三方模块的加载机制
- 如果传递给require()的模块标识符不是一个内置模块,也没有以"./“或”."开头,则Nodejs 会从当前模块的父目录开始,尝试从/node_modules文件夹中加载第三方模块。
4.4-目录作为模块
当把目录作为模块标识符,传递给require)进行加载的时候,有三种加载方式:
-
在被加载的目录下查找一个叫做package.json 的文件,并寻找 main属性,作为 require(加载的入口)
-
如果目录里没有package.json文件,或者main 入口不存在或无法解析,则Node.js将会试图加载目录下的index.js 文件。
-
如果以上两步都失败了,则Node.js 会在终端打印错误消息,报告模块的缺失:Error:Cannot find module ‘xoo’
5-Express
5.1-概念
-
官方给出的概念:Express是基于Node.js 平台,快速、开放、极简的Web开发框架。
-
通俗的理解: Express 的作用和Node.js 内置的 http模块类似,是专门用来创建Web 服务器的。
-
Express的本质:就是一个npm 上的第三方包,提供了快速创建Web服务器的便捷方法。
-
Express的中文官网: http://www.expressjs.com.cn/
-
安装:Express
npm i express@4.17.1
5.2-使用express创建web基本服务器
-
导入 express
const express = require('express')
-
创建 web 服务器
const app = express()
-
启动 web 服务器
app.listen(8080,() => { console.log('express server running at http://127.0.0.1:8080') })
5.3- get() & post() 方法
通过app.get()方法(app.post()与之类似),可以监听客户端的GET请求,具体的语法格式如下:
-
参数1:客户端请求的URL地址
-
参数2:请求对应的处理函数
req:请求对象(包含了与请求相关的属性与方法)
res:响应对象(包含了与响应相关的属性与方法)
app.get('请求URL',function(req,res){/*处理函数*/ })
res.send()方法 & req.query对象
-
通过res.send()方法,可以把处理好的内容,发送给客户端
//4.监听客户端的 get 和 post 请求,并向客户端响应具体内容 app.get('/user',(req,res)=>{ //调用expres 提供的 res.send() 方法,向客户端响应一个 JSON 对象 res.send({name:'zs',age:20,gender:'男'}) }) app.post('/user',(req,res)=>{ //调用express 提供的 res.send() 方法,向客户端响应一个文字字符串 res.send('请求成功') })
-
通过req.query对象,可以访问到客户端通过查询字符串的形式,发送到服务器的参数
req.query默认是一个空对象
客户端以 ?name=zs&age=20 这种查询字符串形式,发送到服务器的参数,可以通过req. query对象访问到
例如:req.query.name req.query.age
app.get('/',(req,res) => { //通过 req.query 可以获取到客户端发送过来的 查询参数 //注意:req.query默认是一个空对象 console.log(req.query) res.send(req.query) })
5.4-获取 URL中的动态参数
-
通过req.params对象,可以访问到URL中,通过:匹配到的动态参数:
-
URL地址中,可以通过:参数名的形式,匹配动态参数值
-
req.params默认是一个空对象
//注意:这里的 :id 是一个动态的参数 app.get('/user/:ids/:name',(req,res) => { //req.params 是动态匹配到的 url 参数 //req.params默认是一个空对象 console.log(req.params) res.send(req.params) })
5.5-express-静态资源处理
-
express.static(),通过它,我们可以非常方便地创建一个静态资源服务器,
//在这里,调用express.static()方法,快速对外提供静态资源 app.use(express.static('./clock')) app.use(express.static('./files')) //如果希望在托管的静态资源访问路径之前,挂载路径前缀,则可以使用如下的方式: app.use('./clock',express.static('./clock'))
注意:
-
Express在指定的静态目录中查找文件,并对外提供资源的访问路径。因此,存放静态文件的目录名不会出现在URL中。
-
如果要托管多个静态资源目录,请多次调用express.static()函数:
-
访问静态资源文件时,express.static()函数会根据目录的添加顺序查找所需的文件。
5.6-nodemon工具
-
在终端中,运行如下命令,即可将nodemon安装为全局可用的工具
// 将nodemon安装为全局可用的工具命令 npm install -g nodemon
在使用nodemon时发生错误nodemon
- 无法加载文件 C:\Program Files\nodejs\node_global\nodemon.ps1,因为在此系统上禁止运行脚本。
解决办法
-
以管理员身份运行vscode(选中图标,右键)
-
在vscode终端输入
get-ExecutionPolicy
,如果返回Restricted
,表示状态是禁止的。 -
在vscode终端输入
set-ExecutionPolicy RemoteSigned
,便可以使用nodemon