安装
检查
node -v
npm -v
出现版本号则说明安装成功
npm
NPM(node package manager)是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题.
Npm作用和使用场景:
- 允许用户从NPM服务器下载别人编写的第三方包到本地使用。
- 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
- 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。
npm命令
npm init 初始化项目 (会有一系列的对话)
package name: (project) // 当前的包名是什么,(括号里面的是默认值);包名不要和现有的框架重名
version: (1.0.0) // 版本
description: // 描述
entry point: (index.js) // 项目的入口文件
test command: //测试命令
git repository: //git 仓库地址
keywords: // 项目的关键词
author: //作者
license: (ISC) //协议
package.json //是我们项目的描述文件 :入口文件,项目依赖,项目启动命令
安装依赖
npm install 模块名称
npm i 模块名称 // 简写
安装完成之后,会在package.json文件中加入如下字段
"dependencies": {
"jquery": "^3.6.0"
}
当前项目用到那里包(依赖)
安装方式:
- 本地安装:用来安装依赖 (项目用到哪些包就用本地安装的方式)
- 全局安装:一般用来安装工具类, 如:cnpm , pm2 vue-cli
全局安装方式:
npm i -g 模块名称
使用淘宝 NPM 镜像
大家都知道国内直接使用 npm 的官方镜像是非常慢的,这里推荐使用淘宝 NPM 镜像。
淘宝 NPM 镜像是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步。
设置:npm config set registry https://registry.npm.taobao.org
查看: npm config get registry
还原:npm config set registry https://registry.npmjs.org/
Ps:也可以使用淘宝定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm:
npm install -g cnpm
## 查看已安装
npm ls // 查看当前项目的安装
npm ls -g //查看全局的安装
开发环境的依赖
"devDependencies": {
"bootstrap": "^5.1.1"
}
项目复活
已经开发好的项目,如果需要拷贝,那么是不需要拷贝node_modules文件夹的,重新安装即可
npm i
版本号
使用NPM下载和发布代码时都会接触到版本号。NPM使用语义版本号来管理代码
Semantic-Versioning 语义化版本控制分为X.Y.Z三位,分别代表主版本号、次版本号和补丁版本号。当代码变更时,版本号按以下原则更新。
如果只是修复bug,需要更新Z位。
如果是新增了功能,但是向下兼容,需要更新Y位。
如果有大变动,向下不兼容,需要更新X位。
版本号有了这个保证后,在申明第三方包依赖时,除了可依赖于一个固定版本号外,还可依赖于某个范围的版本号。例如”argv”: “0.0.x”表示依赖于0.0.x系列的最新版argv。
一个标准的版本号必须是X.Y.Z的形式,X是主版本,Y是副版本,Z是补丁版本。.
X: 代表发生了不兼容的API改变
Y: 代表向后兼容的功能性变化
Z: 代表向后兼容bug fixes
语义化版本号规则
X.Y.Z - A.B.C 连字符范围
1.2.3 - 2.3.4 等价于 >=1.2.3 <=2.3.4 1.2.3 - 2 等价于 >=1.2.3 <3.0.0
~1.2.3 波浪线范围
~1.2.3 等价于 >=1.2.3 <1.(2+1).0 等价于="">=1.2.3 <1.3.0 ~1.2 等价于 >=1.2.0 <1.(2+1).0 等价于="">=1.2.0 <1.3.0 (Same as 1.2.x) ~1 等价于 >=1.0.0 <(1+1).0.0 等价于 >=1.0.0 <2.0.0 (Same as 1.x)
模块
导出
function add(a,b){
return a+b
}
var a = 10;
module.exports = {
add:add,
a:a
}
导入
var tool = require('./tool')
全局变量
dirname // 获取当前文件所在的路径
filename ////当前执行文件所在的路径
require()
Console
module
exports
setInterval setTimeout
path
路径的操作的内置库
后续项目中需要用到路径的都用这个库去操作
path.dirname('src') //返回src的父级路径
path.basename('src') //当前文件夹
path.join() //路径拼接 后面要用到路径凭借的都用这个方法去操作
fs 文件系统
stat
var fs = require('fs');
// 查看文件信息
// 参数1:需要读取的文件的路径 ,
// 读取成功或者失败后的回调
// 回调函数里面有两个参数
// 参数1:错误
// 参数2: 读取到的信息
fs.stat('./test.txt',function(err,info){
console.log(err)
//路径错误
/*
[Error: ENOENT: no such file or directory, stat './test.txt1'] {
errno: -2,
code: 'ENOENT',
syscall: 'stat',
path: './test.txt1'
}
*/
console.log(info)
// 获取到文件信息
/*
{
dev: 16777221,
mode: 33188,
nlink: 1,
uid: 501,
gid: 20,
rdev: 0,
blksize: 4096,
ino: 55428847,
size: 8,
blocks: 8,
atimeMs: 1631504207835.8264,
mtimeMs: 1631504206388.4182,
ctimeMs: 1631504206388.4182,
birthtimeMs: 1631504206388.1956,
atime: 2021-09-13T03:36:47.836Z,
mtime: 2021-09-13T03:36:46.388Z,
ctime: 2021-09-13T03:36:46.388Z,
birthtime: 2021-09-13T03:36:46.388Z
}
*/
})
readFile
读取文件内容
var fs = require('fs');
/*
读取文件的内容
参数1:文件的路径
参数2:内容的解析编码
参数3:回调函数
*/
fs.readFile('./test.txt','utf8',function(err,info){
console.log(err)
console.log(info)
})
/*
如果不传 解析编码 读取到内容是一个buffer对象
可以用toString()方法来解析
*/
fs.readFile('./test.txt1',function(err,info){
console.log(err)
console.log(info.toString())
})
writeFile
var fs = require('fs');
/*
参数1:需要写入的文件, 没有就会创建
参数2:需要写入的内容 ,会覆盖原来的内容
参数3:回调
*/
// fs.writeFile('./test.txt','我是写入的内容',function(err){
// console.log('写入成功')
// })
// 向文件末尾追加
// fs.writeFile('./test.txt','222',{flag:'a+'},function(err){
// console.log('写入成功')
// })
// 在开头加,但是也会被覆盖
// fs.writeFile('./test.txt','111',{flag:'w+'},function(err){
// console.log('写入成功')
// })
// 向文件末尾追加
// 参数1: 追加的文件
// 参数2: 追加的内容
// 参数3: 回调
fs.appendFile('./test.txt','bbbb',function(err){
console.log('ok')
})
unlink
//删除文件
// 参数1: 需要删除文件的路径 , 如果找不到也不会报错的
fs.unlink('./text.txt',function(err){
console.log('del ok')
})
复制文件
var fs = require('fs');
// 创建读的流
var reader = fs.createReadStream('./test.txt');
// 创建写的流
var writer = fs.createWriteStream('./2.txt');
// 读到的流通过pipe方法写出去
reader.pipe(writer)
//这种复制方法复制大文件
加密
md5加密方式
MD5特点
•不可逆;
•不管加密的内容多长,最后输出的结果长度都是相等的;
•内容不同输出的结果完全不同,内容相同输出的结果完全相同。
var crypto = require('crypto');
//1 .创建md5加密对象
var md5 = crypto.createHash('md5');
// 2.加密字符串,会返回一个加密后的对象
var md5sum = md5.update('young1024')
// console.log(md5sum)
//3. 返回16进制加密后的字符串
var result = md5sum.digest('hex');
console.log(result)
// d993de3659f48c800f636e9805fa1ffb
// var result2 = md5sum.digest('hex');
// 重复调用digest会报错: Digest already called
var r2 = crypto.createHash('md5').update('123456').digest('hex')
console.log(r2)
sha256加密方式
var crypto = require('crypto');
/*
crypto.createHmac()
参数1:sha256 是已知的加密方式
参数2:秘钥哦
update()
你需要加密的内容传在里面
digest('hex')
返回16进制加密后的字符串
*/
var secret = crypto.createHmac('sha256','young1024').update('123456').digest('hex')
console.log(secret)
var secret2 = crypto.createHmac('sha256','young1024').update('654321').digest('hex')
console.log(secret2)