fs 全称为 file system
,称之为 文件系统
,是 Node.js 中的 内置模块
,可以对计算机中的磁盘进行操作。
本章节会介绍如下几个操作:
1. 文件写入
2. 文件读取
3. 文件移动与重命名
4. 文件删除
5. 文件夹操作
6. 查看资源状态
文件写入就是将 数据
保存到 文件
中,我们可以使用如下几个方法来实现该效果
方法 | 说明 |
---|---|
writeFile | 异步写入 |
writeFileSync | 同步写入 |
appendFile / appendFileSync | 追加写入 |
createWriteStream | 流式写入 |
语法:fs.writeFile(file, data[, options], callback)
参数说明:
(可选)
返回值:undefined
代码示例:
// require 是 Node.js 环境中的'全局'变量,用来导入模块
const fs = require('fs');
//将 『三人行,必有我师焉。』 写入到当前文件夹下的『座右铭.txt』文件中
fs.writeFile('./座右铭.txt', '三人行,必有我师焉。', err => {
//如果写入失败,则回调函数调用时,会传入错误对象,如写入成功,会传入 null
if(err){
console.log(err);
return;
}
console.log('写入成功');
});
语法:fs.writeFileSync(file, data[, options])
参数与 fs.writeFile
大体一样,只是没有 callback
参数
返回值:undefined
try{
fs.writeFileSync('./座右铭.txt', '三人行,必有我师焉。');
}catch(e){
console.log(e);
}
Node.js 中的磁盘操作是由其他 线程 完成的,结果的处理有两种模式:
同步处理:javaScript 主线程 会等待 其他线程的执行结果,然后再继续执行主线的代码,效率较低。
异步处理:JavaScript 主线程 不会等待 其他线程的执行结果,直接执行后续的主线程代码,效率较好。
appendFile 作用是在文件尾部追加内容,appendFile 语法与 writeFile 语法完全相同
语法:
fs.appendFile(file,data[, options], callback)
fs.appendFileSync(file, data[, options])
返回值:二者都为 undefined
实例代码:
fs.appendFile('./座右铭.txt','择其善者而从之,其不善者而改之。', err => {
if(err) throw err;
console.log('追加成功')
});
fs.appendFileSync('./座右铭.txt','\r\n温故而知新, 可以为师矣');
语法:fs.createWriteStream(path[, options])
参数说明:
(可选)
返回值:Object
代码示例:
let ws = fs.createWriteStream('./观书有感.txt');
ws.write('半亩方塘一鉴开\r\n');
ws.write('天光云影共徘徊\r\n');
ws.write('问渠那得清如许\r\n');
ws.write('为有源头活水来\r\n');
ws.end();
程序打开一个文件是需要消耗资源的
,流式写入可以减少打开关闭文件的次数。
流式写入方式适用于大文件写入或者频繁写入
的场景,writeFile 适合于写入频繁较低的场景
文件写入
在计算机中是一个非常常见的操作,下面的场景都用到了文件写入
当需要持久化保存数据
的时候,应该想到文件写入
文件读取顾名思义,就是通过程序从文件中取出其中的数据,我们可以使用如下几种方式:
方法 | 说明 |
---|---|
readFile | 异步读取 |
readFileSync | 同步读取 |
createReadStream | 流式读取 |
语法:fs.readFile(path[, options], callback)
参数说明:
返回值:undefined
代码示例:
//导入 fs 模块
const fs = require('fs');
fs.readFile('./座右铭.txt', (err, data) => {
if(err) throw err;
console.log(data);
});
fs.readFile('./座右铭.txt', 'utf-8',(err, data) => {
if(err) throw err;
console.log(data);
});
语法:fs.readFileSync(path,[, options])
参数说明:
返回值:string | Buffer
代码示例:
let data = fs.readFileSync('./座右铭.txt');
let data2 = fs.readFileSync('./座右铭.txt', 'utf-8');
语法:fs.createReadStream(path[, options])
参数说明:
(可选)
返回值:Object
代码示例:
//创建读取流对象
let rs = fs.createReadStream('./观书有感.txt');
//每次取出 64k 数据后执行一次 data 回调
rs.on('data', data => {
console.log(data);
console.log(data.length);
});
//读取完毕后, 执行 end 回调
rs.on('end', () => {
console.log('读取完成')
})
在 Node.js 中,我们可以使用 rename
或 renameSync
来移动或重命名 文件或文件夹
语法:
fs.rename(oldPath, newPath, callback)
fs.renameSync(oldPath, newPath)
参数说明:
代码示例:
fs.rename('./观书有感.txt', './论语/观书有感.txt', (err) =>{
if(err) throw err;
console.log('移动完成')
});
fs.renameSync('./座右铭.txt', './论语/我的座右铭.txt');
在 Node.js 中,我们可以使用 unlink
或 unlinkSync
来删除文件
语法:
fs.unlink(path, callback)
fs.unlinkSync(path)
参数说明:
代码示例:
const fs = require('fs');
fs.unlink('./test.txt', err => {
if(err) throw err;
console.log('删除成功');
});
fs.unlinkSync('./test2.txt');
借助 Node.js 的能力,我们可以对文件夹进行 创建
、读取
、删除
等操作
方法 | 说明 |
---|---|
mkdir / mkdirSync | 创建文件夹 |
readdir / readdirSync | 读取文件夹 |
rmdir / rmdirSync | 删除文件夹 |
在 Node.js 中,我们可以使用 mkdir
或 mkdirSync
来创建文件夹
语法:
fs.mkdir(path[, options], callback)
fs.mkdirSync(path[, options])
参数说明:
(可选)
示例代码:
//异步创建文件夹
fs.mkdir('./page', err => {
if(err) throw err;
console.log('创建成功');
});
//递归异步创建
fs.mkdir('./1/2/3', {recursive: true}, err => {
if(err) throw err;
console.log('递归创建成功');
});
//递归同步创建文件夹
fs.mkdirSync('./x/y/z', {recursive: true});
在 Node.js 中,我们可以使用 readdir
或 readdirSync
来读取文件夹
语法:
fs.readdir(path[, options], callback)
fs.readdirSync(path[, options])
参数说明:
(可选)
示例代码:
//异步读取
fs.readdir('./论语', (err, data) => {
if(err) throw err;
console.log(data);
});
//同步读取
let data = fs.readdirSync('./论语');
console.log(data);
在 Node.js 中,我们可以使用 rmdir
或 rmdirSync
来删除文件夹
语法:
fs.rmdir(path[, options], callback)
fs.rmdirSync(path[, options])
参数说明:
(可选)
示例代码:
//异步删除文件夹
fs.rmdir('./page', err => {
if(err) throw err;
console.log('删除成功');
});
//异步递归删除文件夹
fs.rmdir('./1', {recursive: true}, err => {
if(err) {
console.log(err);
}
console.log('递归删除')
});
//同步递归删除文件夹
fs.rmdirSync('./x', {recursive: true})
在 Node.js 中,我们可以使用 stat
或 statSync
来查看资源的详细信息
语法:
fs.stat(path[, options], callback)
fs.statSync(path[, options])
参数说明:
(可选)
示例代码:
//异步获取状态
fs.stat('./data.txt', (err, data) => {
if(err) throw err;
console.log(data);
});
//同步获取状态
let data = fs.statSync('./data.txt');
结果值对象结构:
fs 模块对资源进行操作时,路径的写法有两种:
./座右铭.txt
当前目录下的座右铭.txt座右铭.txt
等效于上面的写法../座右铭.txt
当前目录的上一级目录中的座右铭.txtD:/Program Files windows
系统下的绝对路径/usr/bin
Linux 系统下的绝对路径相对路径中所谓的 当前目录
,指的是 命令行的工作目录
,而并非是文件的所在目录
所以当命令行的工作目录与文件所在目录不一致时,会出现一些 BUG
__dirname
与 require
类似,都是 Node.js 环境中的全局变量
__dirname
保存着 当前文件所在目录的绝对路径
,可以使用 __dirname
与文件名拼接成绝对路径
代码示例:
let data = fs.readFileSync(__dirname + '/data.txt');
console.log(data);
使用 fs 模块的时候,尽量使用 __dirname 将路径转化为绝对路径,这样可以避免相对路径产生的
Bug
path 模块提供了 操作路径
的功能,我们将介绍如下几个较为常用的几个 API:
API | 说明 |
---|---|
path.resolve | 拼接规范的绝对路径 常用 |
path.sep | 获取操作系统的路径分隔符 |
path.parse | 解析路径并返回对象 |
path.basename | 获取路径基础名称 |
path.dirname | 获取路径的目录名 |
path.extname | 获得路径的扩展名 |
代码示例:
const path = require('path');
//获取路径分隔符
console.log(path.sep);
//拼接绝对路径
console.log(path.resolve(__dirname, 'test'));
//解析路径
let pathname = 'D:/program file/nodejs/node.exe';
console.log(path.parse(pathname));
//获取路径基础名称
console.log(path.basename(pathname))
//获取路径的目录名
console.log(path.dirname(pathname));
//获取路径的扩展名
console.log(path.extname(pathname));
HTTP(hypertext transport protocol)协议:中文叫超文本传输协议
是一种基于 TCP/IP的应用层通信协议
这个协议详细规定了 浏览器
和万维网 服务器
之间互相通信的规则。
协议中主要规定了两个方面的内容
报文:可以简单理解为就是一堆字符串
http://www.baidu.com:80/index.html?a=100&b=200#logo
格式:『头名:头值』
常见的请求头有:
请求头 | 解释 |
---|---|
Host | 主机名 |
Connection | 连接的设置keep-alive(保持连接);close(关闭连接) |
Cache-Control | 缓存控制 max-age = 0(没有缓存) |
Upgrade-Insecure-Requests | 将网页中的http请求转化为https请求(很少用)老网站升级 |
User-Agent | 用户代理,客户端字符串标识,服务器可以通过这个标识来识别这个请求来自哪个客户端 ,一般在PC端和手机端的区分 |
Accept | 设置浏览器接收的数据类型 |
Accept-Encoding | 设置接收的压缩方式 |
Accept-Language | 设置接收的语言 q=0.7 为喜好系数,满分为1 |
请求体内容的格式是非常灵活的
(可以是空) ==> GET 请求
(也可以是字符串,还可以是 JSON) ==> POST请求
例如:
HTTP/1.1 200 OK
响应状态码和响应字符串关系是一一对应的。
Cache-Control:缓存控制 private 私有的,只允许客户端缓存数据
Connection 链接设置
Content-Type:text/html;charset=utf-8 设置响应体的数据类型以及字符集,响应体为html,字符集
utf-8
Content-Length:响应体的长度,单位为字节
使用 nodejs 创建 HTTP 服务
//1. 导入 http 模块
const http = require('http');
//2. 创建服务对象 create 创建 server 服务
// request 意为请求. 是对请求报文的封装对象, 通过 request 对象可以获得请求报文的数据
// response 意为响应. 是对响应报文的封装对象, 通过 response 对象可以设置响应报文
const server = http.createServer((request, response) => {
response.end('Hello HTTP server');
});
//3. 监听端口, 启动服务
server.listen(9000, () => {
console.log('服务已经启动, 端口 9000 监听中...');
});
http.createServer 里的回调函数的执行时机:当接收到 HTTP 请求的时候,就会执行
浏览器请求对应端口
http://127.0.0.1:9000
ctrl + c
停止服务必须重启服务才能生效
response.setHeader('content-type','text/html;charset=utf-8');
Error: listen EADDRINUSE: address already in use :::9000
使用较多
)如果端口被其他程序占用,可以使用资源监视器
找到占用端口的程序,然后使用任务管理器
关闭对应的程序
想要获取请求的数据,想要通过 request
对象
含义 | 语法 | 重点掌握 |
---|---|---|
请求方法 | request.method | * |
请求版本 | request.httpVersion | |
请求路径 | request.url | * |
URL 路径 | require(‘url’).parse(request.url).pathname | * |
URL 查询字符串 | require(‘url’).parse(request.url, true).query | * |
请求头 | request.headers | * |
请求体 | request.on(‘data’, function(chunk){}) / request.on(‘end’, function(){}); |
注意事项:
request.url
只能获取路径以及查询字符串,无法获取 URL 中的域名以及协议的内容/
』按照以下要求搭建 HTTP 服务
请求类型(方法) | 请求地址 | 响应体结果 |
---|---|---|
get | /login | 登录页面 |
get | /reg | 注册页面 |
//1、引入http模块
const http = require("http");
//2、建立服务
const server = http.createServer((request,response)=>{
let {url,method} = request; //对象的解构赋值
//设置响应头信息
//解决中文乱码
response.setHeader("Content-Type","text/html;charset=utf-8")
if(url == "/register" && method == "GET"){
response.end("注册页面");
}else if(url=="/login" && method == "GET"){
response.end("登录页面");
}else{
response.end("404 Not Found
")
}
})
//3、监听端口
server.listen(8000,()=>{
console.log('服务启动中....');
})
作用 | 语法 |
---|---|
设置响应状态码 | response.statusCode |
设置响应状态描述 | response.statusMessage ( 用的非常少 ) |
设置响应头信息 | response.setHeader(‘头名’, ‘头值’) |
设置响应体 | response.write(‘xx’) / response.end(‘xxx’) |
write 和 end 的两种使用情况:
//1. write 和 end 的结合使用 响应体相对分散
response.write('xx');
response.write('xx');
response.write('xx');
response.end(); //每一个请求,在处理的时候必须要执行 end 方法的
//2. 单独使用 end 方法 响应体相对集中
response.end('xxx');
搭建 HTTP 服务,响应一个 4 行 3 列的表格,并且要求表格有 隔行换色效果
,且 点击
单元格能 高亮显示
//导入 http 模块
const http = require('http');
//创建服务对象
const server = http.createServer((request, response) => {
response.end(`
Document
`); //设置响应体
});
//监听端口, 启动服务
server.listen(9000, () => {
console.log('服务已经启动....')
});
网页资源的加载都是循序渐进的,首先获取 HTML 的内容,然后解析 HTML 在发送其他资源的请求,如:CSS、JavaScript、图片等。理解了这个内容对于后续的学习与成长有非常大的帮助
静态资源是指 内容长时间不发生改变的资源
,例如:图片、视频、CSS文件、JS文件、HTML文件、字体文件等
动态资源是指 内容经常更新的资源
,例如:百度首页、网易首页、京东搜索列表页面等
HTTP 服务在哪个文件夹中寻找静态资源,那个文件夹就是 静态资源目录
,也称之为 网站根目录
网页中的 URL 主要分为两大类:相对路径与绝对路径
绝对路径可靠性强,而且绝对容易理解,在项目中运用较多
形式 | 特点 |
---|---|
http://atguigu.com/web | 直接向目标资源发送请求,容易理解。网站的外链会用到此形式 |
//atguigu.com/web | 与页面 URL 的协议拼接形成完整 URL 再发送请求。大型网站用的比较多 |
/web | 与页面 URL 的协议、主机名、端口拼接形成完整 URL 再发送请求。中小型网站 |
相对路径在发送请求时,需要与前页面 URL 路径进行 计算
,得到完整 URL 后,在发送请求,学习阶段用的较多
例如当前网页 url 为:http://www.atguigu.com/course/h5.html
形式 | 最终的 URL |
---|---|
./css/app.css | http://www.atguigu.com/course/css/app.css |
js/app.js | http://www.atguigu.com/course/js/app.js |
…/img/logo.png | http://www.atguigu.com/img/logo.png |
…/…/mp4/show.mp4 | http://www.atguigu.com/mp4/show.mp4 |
包括但不限于如下场景:
媒体类型(通常称为 Multipurpose Internet Mail Extensions 或 MIME 类型 )是一种标准,用来表示文档、文件或字节流的性质和格式。
mime 类型结构:[type] / [subType]
例如: text/html text/css image/jpeg image/png application/json
HTTP 服务可以设置响应头 Content-Type 来表明响应体的 MIME 类型,浏览器会根据该类型决定如何处理资源
下面是常见文件对应的 mime 类型
html: 'text/html',
css: 'text/css',
js: 'text/javascript',
png: 'image/png',
jpg: 'image/jpeg',
gif: 'image/gif',
mp4: 'video/mp4',
mp3: 'audio/mpeg',
json: 'application/json'
对于未知的资源类型,可以选择 application/octet-stream
类型,浏览器在遇到该类型的响应
时,会对响应体内容进行独立存储,也就是我们常见的 下载
效果
require('http').createServer((request,response)=>{
//获取请求的方法已经路径
let {url,method} = request;
//判断请求方式以及请求路径
if(method == "GET" && url == "/index.html"){
//需要响应文件中的内容
let data = require('fs').readFileSync(__dirname + '/index.html');
response.end(data);
}else if(method == "GET" && url == "/css/app.css"){
//需要响应文件中的内容
let data = require('fs').readFileSync(__dirname + '/public/css/app.css');
response.end(data);
}else if(method == "GET" && url == "/js/app.js"){
//需要响应文件中的内容
let data = require('fs').readFileSync(__dirname + '/public/js/app.js');
response.end(data);
}
else{
//404响应
response.statusCode = 404;
response.end("404 Not Found
");
}
}).listen(80,()=>{
console.log('80端口正在启动中....');
})
很明显上面的代码,当只要有一个请求路径就需要进行判断,显然这种方式不完美,那么我们需要封装
require('http').createServer((request,response)=>{
//获取请求的方法已经路径
let {url,method} = request;
//文件夹路径
let rootDir = __dirname + '/public';
//拼接文件路径
let filePath = rootDir + url;
//读取文件内容
fs.readFile(filePath,(err,data)=>{
//判断
if(err){
//如果出现错误,响应404状态码
response.statusCode = 404;
response.end('404 Not Found
');
}else{
//响应文件内容
response.end(data);
}
})
}).listen(80,()=>{
console.log('80端口正在启动中....');
})
GET 请求的情况:
POST 请求的情况:
GET 和 POST 是 HTTP 协议请求的两种方式。
将一个复杂的程序文件依据一定的规则(规范)擦分成多个文件的过程称之为 模块化
其中拆分出的 每个文件就是一个模块
,模块的内部数据是私有的,不过模块可以暴露内部数据以便其他模块使用
编码时是按照模块一个一个编码的,整个项目就是一个模块化的项目
下面是模块化的一些好处:
可以通过下面的操作步骤,快速体验模块化
me.js
//声明函数
function tiemo(){
console.log('贴膜....');
}
//暴露数据
module.exports = tiemo;
index.js
//导入模块
const tiemo = require('./me.js');
//调用函数
tiemo();
模块暴露数据的方式有两种:
module.exports = value
exports.name = value
使用时有几点注意:
1. module.exports 可以暴露任意数据
2. 不能使用 exports = value 的形式暴露数据,模块内部 module 与 exports 的隐式关系
exports = module.exports = {} ,require 返回的是目标模块中 module.exports 的值
在模块中使用 require 传入文件路径即可引入文件
const test = require(./me.js)
require
使用的一些注意事项:
相对路径
,且不能省略 ./
和 ../
js
和 json
文件导入时可以不用写后缀,c/c++编写的 node
扩展文件也可以不写后缀,但是一般用不到js
文件进行处理首先
检测该文件夹下 package.json
文件中 main
属性对应的文件main
属性不存在,或者 package.json
不存在,则会尝试导入文件夹下的 index.js
和 index.json
,node.js
内置模块时,直接 require
模块的名字即可,无需加 ./
和 ../
这里我们介绍以下 require
导入 自定义模块
的流程
arguments.callee.toString()
查看自执行函数module.exports
的值『包』英文单词是 package
,代表了一组特定功能的源码集合
管理『包』的应用软件,可以对「包」进行 下载安装
, 更新
, 删除
, 上传
等操作
借助包管理工具,可以快速开发项目,提升开发效率
包管理工具是一个通用的概念,很多编程语言都有包管理工具,所以 掌握好包管理工具非常重要
下面举例了前端常用的包管理工具
npm 全称 Node Package Manager
,翻译为中文意思是『Node 的包管理工具』
npm 是 node.js 官方内置的包管理工具,是 必须要掌握住的工具
node.js 在安装时会 自动安装 npm
,所以如果你已经安装了 node.js,可以直接使用 npm
可以通过 npm -v
查看版本号测试,如果显示版本号说明安装成功,反之安装失败
查看版本可能与上图版本号不一样,不过不影响正常使用
创建一个空目录,然后以此目录作为工作目录 启动命令行工具
,执行 npm init
npm init
命令的作用是将文件夹初始为一个『包』, 交互式创建 package.json 文件
package.json
是包的配置文件,每个包都必须要有 package.json
package.json
内容示例:
{
"name": "01_npm",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
属性翻译
{
"name": "1-npm", #包的名字
"version": "1.0.0", #包的版本
"description": "", #包的描述
"main": "index.js", #包的入口文件
"scripts": { #脚本配置
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "", #作者
"license": "ISC" #开源证书
}
初始化的过程中还有一些注意事项:
包名
)不能使用中文、大写,默认值是 文件夹的名称
,所以文件夹名称也不能使用中文和大写版本号
)要求 x.x.x
的形式定义,x
必须是数字,默认值是 1.0.0
package.json
可以手动创建与修改npm init -y
或者 npm init --yes
极速创建 package.json
搜索包的方式有两种
网站搜索
网址是https://www.npmjs.com/我们可以通过 npm install
和 npm i
命令安装包
# 格式
npm install <包名>
npm i <包名>
# 示例
npm install uniq
npm i uniq
运行之后文件夹下面增加两个资源
node_modules 文件夹
存放下载的包package-lock.json 包的锁文件
,用来锁定包的版本安装 uniq 之后,uniq 就是当前这个包的一个依赖包
,有时会简称为 依赖
比如我们创建一个包名字为 A,A 中安装了包名字是 B,我们就说 B 是 A 的一个依赖包
,也会说 A 依赖 B
开发环境是程序员 专门用来写代码
的环境,一般是指程序员的电脑,开发环境的项目一般 只能程序员自己访问
生产环境是项目 代码正式运行
的环境,一般是指正式的服务器电脑,生产环境的项目一般 每个客户都可以访问
我们可以在安装时设置选项来区分 依赖的类型
,目前分为两类:
类型 | 命令 | 补充 |
---|---|---|
生产依赖 | npm i -S uniq / npm i --save uniq |
-S 等效于 --save,-S 是默认选项 ,包信息保存在 package.json 中 dependencies 属性 |
开发依赖 | npm i -D less / npm i --save-dev less |
-D 等效于 --save-dev,包信息保存在 package.json 中 devDependencies 属性 |
举个例子方便大家理解,比如说蛋炒饭需要:大米、油、葱、鸡蛋、锅、煤气、铲子等
其中:锅、煤气、铲子属于开发依赖,只在制作阶段使用
而:大米、油、葱、鸡蛋属于生产依赖,在制作与最终食用都会用到
所以 开发依赖 是只在开发阶段使用的依赖包,而 生产依赖 是开发阶段和最终上线运行阶段都用到的依赖包
我们可以执行安装选项 -g
进行全局安装
npm i -g nodemon
全局安装完成之后就可以在命令行的任何位置运行 nodemon
命令
该命令的作用是 自动重启 node 应用程序
说明:
npm root -g
可以查看全局安装包的位置不是所有的包都适合全局安装
,只有全局类的工具才适合,可以通过 查看包的官方文档来确定安装方式
windows 默认不允许 npm 全局命令执行脚本文件,所以需要修改执行策略
Path 是操作系统的一个环境变量,可以设置一些文件夹的路径,在当前工作目录下找不到可执行文件时,就会在环境变量 Path 的目录中挨个的查找,如果找到则执行,如果没有找到就会报错
补充说明:
cmd 命令行
中执行 where nodemon
powershell 命令行
执行 get-command nodemon
在项目协作中有一个常用的命令就是 npm i
,通过该命令可以依据 package.json
和 package-lock.json
的依赖声明安装项目依赖
npm i
npm install
node_modules 文件夹大多数情况都不会存入版本库
项目中可能会遇到版本不匹配的情况,有时就需要安装指定版本的包,可以使用下面的命令的
## 格式
npm i <包名@版本号>
## 示例
npm i [email protected]
项目中可能需要删除某些不需要的包,可以使用下面的命令
## 局部删除
npm remove uniq
npm r uniq
## 全局删除
npm remove -g nodemon
通过配置命令别名可以更简单的执行命令
配置 package.json 中的 scripts
属性
{
.
.
.
"scripts": {
"server": "node server.js",
"start": "node index.js",
},
.
.
}
配置完成之后,可以使用别名执行命令
npm run server
npm run start
不过 start
别名比较特别,使用时可以省略 run
npm start
补充说明:
npm start
是项目中常用的一个命令,一般用来启动项目npm run
有自动向上级目录查找的特性,跟 require
函数也一样scripts
属性来参考项目的一些操作cnpm 是一个淘宝构建的 npmjs.com
的完整镜像,也称为『淘宝镜像』,网址https://npmmirror.com/
cnpm 服务器部署在国内 阿里云服务器上
,可以提高包的下载速度
官方也提供了一个全局工具包 cnpm
,操作命令与 npm 大体相同
我们可以通过 npm 来安装 cnpm 工具
npm install -g cnpm --registry=https://registry.npmmirror.com
功能 | 命令 |
---|---|
初始化 | cnpm init / cnpm init |
安装包 | cnpm i uniq / cnpm i -S uniq / cnpm i -D uniq / cnpm i -g nodemon |
安装项目依赖 | cnpm i |
删除 | cnpm r uniq |
用 npm 也可以使用淘宝镜像,配置的方式有两种
执行如下命令即可完成配置
npm config set registry https://registry.npmmirror.com/
使用 nrm
配置 npm 的镜像地址 npm registry manager
npm i -g nrm
nrm use taobao
npm config list
https://registry.npmmirror.com/
,如果 是
则表明成功补充说明:
建议使用第二种方式
进行镜像配置,因为后续修改起来会比较方便npm 的使用率还是高于 cnpm
yarn 是由 Facebook 在 2016 年推出的新的 Javascript 包管理工具,官方网址:https://yarnpkg.com/
yarn 官方宣称的一些特点
我们可以使用 npm 安装 yarn
npm i -g yarn
功能 | 命令 |
---|---|
初始化 | yarn init / yarn init -y |
安装包 | yarn add uniq 生产依赖 / yarn add less --dev 开发依赖 / yarn global add nodemon 全局安装 |
删除包 | yarn remove uniq 删除项目依赖包 / yarn global remove nodemon 全局删除包 |
安装项目依赖 | yarn |
运行命令别名 | yarn <别名> # 不需要添加 run |
这里有个小问题就是 全局安装的包不可用
,yarn 全局安装包的位置可以通过 yarn global bin
来查看
这个原因可能就需要手动去配置一下环境变量
可以通过如下命令配置淘宝镜像
yarn config set registry https://registry.npmmirror.com/
可以通过 yarn config list
查看 yarn 的配置项
大家可以根据不同的场景进行选择
那个根据都可以
,可以根据自己的喜好来选择通过锁文件判断项目的包管理工具
package-lock.json
yarn.lock
**包管理工具 不要混着用!!!
**
我们可以将自己开发的工具包发布到 npm 服务上,方便自己和其他开发者使用,操作步骤如下:
后续可以对自己发布的包进行更新,操作步骤如下
npm publish
执行如下命令删除包
npm unpublish --force
删除包需要满足一定的条件,https://docs.npmjs.com/policies/unpublish
nvm 全称 Node Version Manager
顾名思义它是用来管理 node 版本的工具,方便切换不同版本的 Node.js
nvm 的使用非常的简单,跟npm 的使用方法类似
首先先下载 nvm,下载地址https://github.com/coreybutler/nvm-windows/releases
选择 nvm-setup-exe
下载即可
命令 | 说明 |
---|---|
nvm list available | 显示所有可以下载的 Node.js 版本 |
nvm list | 显示已安装的版本 |
nvm install 18.12.1 | 安装 18.12.1 版本的 Node.js |
nvm install latest | 安装最新版的 Node.js |
nvm uninstall 18.12.1 | 删除某个版本的 Node.js |
nvm use 18.12.1 | 切换 18.12.1 的 Node.js |