安装
检查
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 calledvar 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)
