解决包下载速度慢的问题
原因:在使用npm 下包的时候,默认从国外的 https://registry.npmjs.org/服务器进行下载,此时,网络数据的传输需要经过漫长的海底光缆,因此下包速度会很慢。
淘宝NPM镜像服务器
淘宝在国内搭建了一个服务器,专门把国外官方服务器上的包同步到国内的服务器,然后在国内提供下包的服务。从而极大的提高了下包的速度。
扩展:
镜像(Mirroring)是一种文件存储形式,一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本即为镜像。
切换npm的下包镜像源
方法一:
方法二:为了更方便的切换镜像源,我们可以安装nrm这个小工具
包的分类
项目包
那些被安装到项目的node_modules目录中的包,都是项目包。
项目包又分为两类,分别是:
- 开发依赖包(被记录到devDependencies 节点中的包,只在开发期间会用到)
- 核心依赖包(被记录到dependencies节点中的包,在开发期间和项目上线之后都会用到)
全局包
在执行npm install命令时,如果提供了-g参数,则会把包安装为全局包。
全局包会被安装到C:\Users\用户目录AppData\Roaming\npm\node_modules目录下。注意:
- 只有工具性质的包,才有全局安装的必要性。因为它们提供了好用的终端命令。
- 判断某个包是否需要全局安装后才能使用,可以参考官方提供的使用说明即可。
开发一个属于自己的包
需要实现的功能有三个:
- 格式化日期
- 转义HTML中的特殊字符
- 还原HTML中的特殊字符
初始化包的基本结构
初始化package.json
写入json文件中:
注意:main中储存的是导入这个包时引入的js文件
{
"name": "heima-Ly",
"version": "1.0.0",
"main": "index.js",
"description": "小妍发布的第一个包",
"keywords": [
"heima",
"dateFormat",
"escape"
],
"license": "ISC"
}
在index.js中定义我们需要实现的功能所需要的方法
//这是包的入口文件
//定义格式化时间的函数
function dateFormat(dateStr) {
const dt = new Date(dateStr);
const y = padZero(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 > 9 ? n : "0" + n;
}
//定义一个转义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(/<|>|"|&/, (match) => {
switch (match) {
case "<":
return "<";
case ">":
return ">";
case """:
return '"';
case "&":
return "&";
}
});
}
//导出这三个方法
module.exports = {
dateFormat,
htmlEscape,
htmlUnEscape
};
另外新建一个测试文件来引入上述自定义模块:
const heima_Ly=require('./index')
const dtStr=heima_Ly.dateFormat(new Date())
console.log(dtStr)//2022-09-07-14-39-31
const htmlStr='<h1>这是h1标签</h1>'
const str=heima_Ly.htmlEscape(htmlStr)
console.log(str)
const str2=heima_Ly.htmlUnEscape(str)
console.log(str2)
注意:我们在导入自定义模块的时候,只给文件的根目录也可以,会自动寻找文件中的package.json文件
将不同的功能进行模块化拆分
模块的加载机制
- 优先从缓存中加载:模块在第一次加载后会被缓存。这也意味着多次调用require()不会导致模块的代码被执行多次。
- 注意:不论是内置模块、用户自定义模块、还是第三方模块,它们都会优先从缓存中加载,从而提高模块的加载效率。
- 内置模块是由Node.js官方提供的模块,内置模块的加载优先级最高。
- 使用require()加载自定义模块时,,必须指定以/或../开头的路径标识符。在加载自定义模块时,如果没有指定/或../这样的路径标识符,则 node 会把它当作内置模块或第三方模块进行加载。
- 加载自定义模块时,如果省略了文件的扩展名,会按如下顺序进行加载
- 如果传递给require()的模块标识符不是一个内置模块,也没有以‘/”或‘./”开头,则Node.,js 会从当前模块的父目录开始,尝试从/node_modules文件夹中加载第三方模块。如果没有找到对应的第三方模块,则移动到再上一层父目录中,进行加载,直到文件系统的根目录。
当把目录作为模块标识符,传递给require()进行加载的时候,有三种加载方式:
- 在被加载的目录下查找一个叫做package.json的文件,并寻找 main 属性,作为require()加载的入口
- 如果目录里没有package.json文件,或者main入口不存在或无法解析则Node.js将会试图加载目录下的index.js文件。
- 如果以上两步都失败了,则Node.,js 会在终端打印错误消息,报告模块的缺失:Error: Cannot find module 'xxx’
Express
什么是Express?
官方给出的概念:Express是基于Node.js平台,快速、开放、极简的Web开发框架。
Express的作用和Node.js内置的http模块类似,是专门用来创建Web服务器的。
Express的本质:就是一个npm 上的第三方包,提供了快速创建Web 服务器的便捷方法。
Express能做什么
对于前端程序员来说,最常见的两种服务器,分别是:
Web网站服务器:专门对外提供 Web 网页资源的服务器。
API接口服务器:专门对外提供API接口的服务器。
使用Express,我们可以方便、快速的创建Web 网站的服务器或API接口的服务器。
创建一个基本的Express服务器
首先:安装express这个第三方模块
在项目所处的目录中,运行如下的终端命令,即可将express安装到项目中使用:
npm i express@4.17.1
新建一个js文件:
// 导入express
const express=require('express')
// 创建web服务器
const app=express()
// 启动web服务器
app.listen(80,()=>{
console.log('express server running at http:///127.0.0.1')
})
监听客户端的请求,并向客户端响应内容
// 导入express
const express=require('express')
// 创建web服务器
const app=express()
// 监听客户端的get和post请求,并向客户端响应具体的内容
app.get('/user',(req,res)=>{
//调用res.send()方法,向客户端响应一个json字符串
res.send({name:'zs',age:20,gender:'男'})
})
app.post('/user',(req,res)=>{
//调用res.send()方法,向客户端响应一个文本字符串
res.send('请求成功')
})
// 启动web服务器
app.listen(80,()=>{
console.log('express server running at http:///127.0.0.1')
})
通过req.query对象,可以访问到客户端通过查询字符串的形式,发送到服务器的参数
通过req.params对象,可以访问到URL中,通过:匹配到的动态参数:
托管静态资源
express提供了一个非常好用的函数,叫做express.static(),通过它,我可以非常方便地创建一个静态资源服务器,
const express=require('express')
const app=express()
//需要使用use来调用express.static()方法
//clock这个文件夹的名字不会出现在访问路径中
app.use(express.static('./clock'))
app.listen(80,()=>{
console.log('express server running at http:///127.0.0.1')
})
注意:Express在指定的静态目录中查找文件,并对外提供资源的访问路径。因此,存放静态文件的目录名不会出现在URL中。
如果要托管多个静态资源目录,多次调用express.static()函数即可
挂载路径前缀
如果希望在托管的静态资源访问路径之前,挂载路径前缀,则可以使用如下的方式:
app.use('/clock',express.static('./clock'))
通常我们不会随意挂载一个前缀,而是以目录文件夹的名字作为前缀,加了前缀后,我们访问目录中的任何一个文件都要加上这个挂载前缀。
nodemon
在编写调试Node,js项目的时候,如果修改了项目的代码,则需要频繁的手动close掉,然后再重新启动,现在我们可以使用nodemon这个工具,它能够监听项目文件的变动,当代码被修改后,nodemon会自动帮我们重启项目,极大方便了开发和调试。
nodemon的安装
在终端中运行如下命令,即可将nodemon安装为全局可用的工具
如何使用nodemon