cnpm
cnpm是淘宝构建的npmjs.com的完整镜像,也就是说,淘宝把npm对应的资源下载到国内服务器,使用cnpm指令时,访问国内服务器即可。
对于国内的网络来说,有时候npm指令会由于网络问题无法执行,因此可以使用国内镜像来避免这个问题。
安装cnpm:npm install -g cnpm --registry=https://registry.npmmirror.com
cnpm的指令和npm一样,只不过是把npm替换成cnpm
**通过npm指令访问淘宝的镜像地址:**除了使用cnpm可以到淘宝的服务器下载包以外,还可以使用npm指令来实现,在这种方式中,只需要修改npm对应指令的下载地址即可。
配置下载地址有两种方式:
1.通过配置指令直接配置:npm config set registry https://registry.npmmirror.com/
2.通过工具配置:
npm i -g nrm(下载工具nrm)
nrm use taobao(使用nrm配置npm命令对应的访问地址)
npm config list(这一步是查看配置项,如果registry是https://registry.npmmirror.com/,则说明配置成功)
需要注意,淘宝的镜像是无法上传包的,只能金下载。
yarn
yarn也是包管理工具之一。
yarn是facebook在2016年推出的新的javaScript包管理工具。
yarn特点:
yarn可以缓存下载过的包,当再次安装包时无需重复下载,同时利用并行下载最大化资源利用率,因此安装速度快
安全:在执行代码之前,yarn会通过算法校验每个安装包的完整性
可靠:yarn可以在不同系统上无差异的工作
安装:
npm i -g yarn
基础指令:
初始化 yarn init / yarn init -y
安装包 yarn add xxx(生产依赖) yarn add xxx -dev(开发依赖) yarn global add xxx(全局安装,但yarn的全局安装可能会失效,这是由于yarn全局安装路径不会默认配置到环境变量,这时需要自己查看对应的文件路径,然后把该路径添加到环境变量中)
删除包 yarn remove xxx(删除当前目录下的包)yarn global remove xxx(删除全局包)
安装项目依赖 npm
运行命令别名 yarn 别名(与npm不同的是,yarn不需要加run)
**yarn配置淘宝镜像:**yarn config set registry https://registry.npmmirror.com/
yarn config list(查看yarn配置项)
yarn的锁文件是yarn.lock,而npm的锁文件是package-lock.json,可以通过锁文件名判断当前项目的包管理工具是yarn还是npm。
npm发布包
除了下载别人写好的包,我们也可以自己写好一个功能包,然后上传,然后别人就可以下载并使用我们写好的包。
创建与发布:
1.创建文件夹,npm初始化工具包,在package.json中填写包的信息:
在包项目的文件夹下,敲npm init初始化包配置,在name里填写包名:

2.在文件夹下创建index.js(不一定非得是index.js,是要和package.json中的main保持一致),在index.js中声明函数,使用module.exports暴露方法

这里随便写了一个内容,因为是学习流程用的,就不写很复杂的了:

3.在https://www.npmjs.com/signup 注册账号
4.激活账号
5.确认本地npm对应的指令地址是npm官方地址(nrm use npm)
6.npm login填写用户信息
(3、4、5、6流程比较常规,这里就不写了)
7.npm publish提交包
然后publish就可以了:直接在终端命令行中npm publish即可,默认上传的就是当前文件夹下配置和写好的包。
包上传之后,通过npm i 包名,就可以下载刚才上传的包了。
更新包:
1.更新包在本地的代码
2.对更新后的代码进行测试
3.修改package.json中的版本号
4.更新 npm publish
删除包:
npm unpublish
npm unpublish --force(如果删除报错,可以使用--force强制删除)
对于删除操作,包的删除并不是可以自由进行的,而是需要满足一定的条件:1.你是包的作者 2.包发布时间小于24时可以删除 3.发布时间超过24小时时,需要满足没有其他包依赖、并且每周小于300下载量,且只有一个维护者时才可以删除
不同的包管理工具
之前学习过,包管理工具不是前端特有的,它是一个通识概念:
不同语言的包管理工具对照:
PHP:composer
Python:pip
Java:maven
Go:go mod
JavaScript:npm/yarn/cnpm/pnpm/...
Ruby:rubyGems
操作系统的包管理工具对照(操作系统的包管理工具管理的是软件包,也就是可以通过管理工具对软件进行下载、删除等):
Centos:yum
Ubuntu:apt
MacOS:homebrew
Windows:chocolatey
nvm
nvm(node version manager),是node版本管理工具。
在项目实际开发中,不同的项目可能需要不同的node版本才能启动,使用nvm管理当前node的版本,可以高效解决node版本的切换问题。
下载:https://github.com/coreybutler/nvm-windows/releases
进入网址,下载nvm-setup.exe
基础命令:
nvm list avaliable(查看所有的node版本号)
nvm list(查看当前电脑已经下载的node版本列表)
nvm install 版本号(下载对应版本的node)
nvm install latest(下载最新版本的node)
nvm uninstall 版本号(删除对应版本的node)
nvm use 版本号(把当前node版本切换成对应的版本)
express框架
虽然使用http服务也可以搭建服务器框架,给浏览器端返回响应结果,但是当编写复杂的逻辑时,http代码可能会比较繁琐。
express是一个基于node.js的极简、灵活的web应用开发框架。或者说,express是一个npm包,它封装了http搭建服务器的代码,可以帮助我们更有效率地进行服务器端开发。
官网:https://www.expressjs.com.cn/
下载
由于express是一个npm包,可以通过npm下载:npm i express
导入
const express = require('express')
基础使用
创建express对象:
const app = express()
创建路由:
app.get(URL地址,回调函数)
回调函数:(请求报文对象,响应报文对象)=>{ }

javascript
const express = require('express')
const app = express()
app.get('/test',(req, res)=>{
res.end('hello word')
})
设置服务器监听端口:
app.listen(监听端口,回调函数)
回调函数会在服务启动成功时自动调用(使用node xxx.js或者nodemon xxx.js启动服务时,会自动调用这个回调函数)
javascript
const express = require('express')
const app = express()
app.get('/test',(req, res)=>{
res.end('hello word')
})
app.listen(3000,()=>{
console.log('server start!')
})
路由:
路由确定了应用程序如何影响客户端对特定端点的请求。
路由由请求方法、路径和回调函数组成。
app.<method>(path,callback)
满足路由的请求会触发对应的回调。
对于一个网址的根目录,比如www.baidu.com,虽然com后面没有接后续内容,但是对于服务器来说,该地址的路径是'/'。
<method> get post delete put all(all表示所有的请求都可以匹配)
path: * 表示匹配所有的路径,path也可以使用属性路由参数,比如/:id.html,表示匹配/xxx.html路径,其中xxx的部分会被保存在id属性里。
获取路由参数:
路由参数是指URL路径中的参数。
通过req.params获取。比如/:id.html,其中的id可以通过req.params.id获取。
**例子:**根据路由参数响应学生信息。
URL访问格式:
javascript
/student/:studentId.html
学生信息参数:
javascript
{
"student":[
{
"id": "20260110",
"name": "张三",
"age": 20
},
{
"id": "20260111",
"name": "李雷",
"age": 20
},
{
"id": "20260112",
"name": "韩梅梅",
"age": 20
}
]
}
服务器端代码:
此处单纯为了练习,就直接把json数据写在本地了:
写在本地然后引入index.js

index.js
javascript
const express = require('express')
const app = express()
const student = require('./student.json')
app.get('/student/:studentId.html',(req, res)=>{
let { studentId } = req.params
let studentInformation = student.student
//在student学生信息中寻找URL中ID对应的信息
let result = studentInformation.find(item=>{
if(item.id == studentId){
return true
}
})
if(!result){
res.statusCode = 404
res.end(`<h1>404 not found</h1>`)
}
res.end(`
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div>
name:${result.name}
age:${result.age}
</div>
</body>
</html>
`)
})
app.listen(3002,()=>{
console.log('server start!')
})
效果:


获取请求报文参数
获取请求参数的方法存在于callback函数的req参数上。
获取报文的方式兼容原生HTTP模块的获取方式。与此同时,express还提供一些新的方法:
javascript
const express = require('express')
const app = express()
app.get('/test',(req, res)=>{
//兼容HTTP原生语法
console.log(req.method)
console.log(req.url)
console.log(req.httpVersion)
console.log(req.headers)
//express提供的新方法
console.log(req.path) //获取请求路径
console.log(req.query) //获取查询query
console.log(req.ip) //获取ip地址(获取发送请求终端的ip地址)
console.log(req.get('host')) //获取指定的请求头(这里获取host请求头)
// res.end('hello word')
})
app.listen(3002,()=>{
console.log('server start!')
})
`

设置响应: