npm(node package manager)是nodejs的 包管理⼯具,⽤于node插件的管理(包括安装、卸载、管理依赖等)。npm是随同nodejs⼀起安装的管理⼯具。
java领域有类似的是maven,linux领域有类似的yum、rpm
因为nodejs做的很⼩巧、⾼内聚。为了丰富功能,通过package的形式扩展。
使⽤npm下载模块的时候,⾃动下载依赖的模块和对应的版本。
1 初始化项⽬
通过初始化项⽬,可以创建⼀个package.json⽂件。
npm init 项⽬名称
在package.json⾥⾯记录了项⽬依赖的模块。当把项⽬给别⼈时,别⼈执⾏npm install即可把依赖项安装,⾮常⽅便。
2 安装模块
需要知道模块名称即可。
npm install xxx
在国外有⼀个nodejs的模块仓库,免费的,谁都可以下载。当我们执⾏install的时候,就去这个仓库寻找特定的模块和指定的版本。下载到本地。
下载到本地项⽬的node_modules⽂件夹中,同时注册到package-lock.json⽂件中。
使⽤参数-g可以安装到全局。
npm root -g //可以查看全局模块库的位置
npm install xxx -g
npm uninstall xxx //卸载模块
3 package.json和package-lock.json
npm5之前,不会⽣成pacakge-lock.json⽂件。
package.json⽂件锁定的是⼤版本,不关⼼⼩版本。
package-lock.json⽂件锁定⼩版本。
4 运⾏任务
使⽤npm可以运⾏package.json中的任务
{
"scripts":{
"task1":"node -v"
}
}
在命令⾏运⾏
npm run task1
npm start和是npm run start的简写形式。
在⼀个npm管理项⽬中,⼀般默认有start的定义,且会经常使⽤,所以就在npm执⾏中简化输⼊⽬的设置了npm run start的简写,类似的还有npm stop、npm test等等。⽽其他的⼀些不太通⽤的命令项则只能通过npm run <;命令项>的形式执⾏。
5 使⽤国内的npm源
使⽤淘宝镜像
npm i cnpm -g --registry=https://registry.npm.taobao.org
6 使⽤npm源的切换⼯具nrm
npm i nrm -g // 安装nrm
nrm ls //查看有哪些源仓库
nrm use taobao //指定使⽤哪个源仓库
四、 Node常⽤模块
1、⽂件系统fs
api中由同步和异步两个版本,建议使⽤异步版本。
const fs = require('fs')
1.1 获取⽂件信息
⽐如可以判断是⽂件还是⽂件夹?还可以知道⽂件⼤⼩、创建者、创建时间、权限等等。
// 访问⽂件信息,在进⾏⽂件夹遍历的时候,需要查看类型和基本信息
fs.stat('module01.js', (err, data)=>{
console.log('类型', data.isFile()?'⽂件':'⽂件夹')
console.log('⽂件信息', data)
})
1.2 读⽂件
读⽂件的时候,回调函数中,⾸先要进⾏错误判断,如果有错误,输出错误原因后返回;
fs.readFile('module01.jsasfd', (err, data)=>{
if(err){
console.error('出错了', '⽂件不存在')
return
}
console.log('⽂件内容', data.toString())
})
1.3 写⽂件
// 每次新创建⼀个⽂件。如果已经存在,则先删除再创建
fs.writeFile('a.txt', '我的名字叫吴超,年龄23',()=>{})
// 追加
// fs.writeFile('a.txt', '我的名字叫吴超,年龄23',{flag:'a'}, ()=>{})
2、Buffer类
在js中,只有字符串类型,没有⼆进制类型。
如果要读写图⽚、⾳视频⽂件的时候,就需要使⽤Buffer类。
学习api的时候,把Buffer想象成String类。
//⽅法1:创建指定⼤⼩的字节空间,指定填充的值,默认是0
let bf1 = Buffer.alloc(10, 1)
console.log('bf1= ', bf1)
// ⽅法2:根据字节数组创建
let bf2 = Buffer.from([1,2,3,4,5])
console.log('bf2=', bf2)
// ⽅法3:把字符串转为Buffer
let bf3 = Buffer.from('hello world我的祖国')
console.log('bf3 = ', bf3)
// 输出,指定输出格式
console.log('bf1 = ', bf1.toString('hex'))
// 输出字符串的时候,可以指定编码格式
console.log('bf3 = ', bf3.toString('utf-8'))
3、Stream类
Stream类是个抽象接⼝,有四种类型:Readable、Writable、Duplex、Transform类型。所有的Stream对象都是EventEmitter的实例。
3.1 读流
const readStream = fs.createReadStream('module01.js')
// 注册事件
readStream.on('data', (chunk)=>{
console.log('有数据了', chunk.toString())
})
// 注册事件
readStream.on('end', ()=>{
console.log('读取结束')
})
// 注册事件
readStream.on('error', (error)=>{
console.error('出错了', error)
})
3.2 写流
const fs = require('fs')
const writeStream = fs.createWriteStream('b.txt')
writeStream.on('finish', ()=>console.log('写完了'))
writeStream.write('hello world我的祖国')
// 调⽤end⽅法时,触发finish事件
writeStream.end('完成写⼊数据');
3.3 压缩解压缩
使⽤第三⽅库compressing,⽀持windows和linux。
先安装库 npm install compressing
const compressing = require('compressing')
// 压缩⽂件夹
// compressing.zip.compressDir('F:/DRMsoft', "DRMsoft.zip")
// compressing.zip.compressFile()
// 解压缩
compressing.zip.uncompress("DRMsoft.zip", __dirname)