node js学习 [第三篇] 文件系统,npm包发布新建【新手向】

169 阅读4分钟

这是我参与8月更文挑战的第12天,活动详情查看:8月更文挑战

文件系统

fs是 Node.js 提供一组类似 UNIX(POSIX)标准的文件操作API 可以想象我们操作系统中的操作基本fs模块涵盖了。

下面我们代码敲起来。

异步和同步

Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()。

异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。

建议大家使用异步方法,比起同步,异步方法性能更高,速度更快,而且没有阻塞。

下面展示写入//同步

const fs = require('fs');
//write
//写入数据
//output/input  i/o操作  =》流  二进制
//fs.writeFile(file, data[, options], callback)
//'./1.txt E/cc/1.txt'
//数据(字符串,音频,视频,二进制)=》buffer=>stream

//如果目录不存在,则会失败
// 如果文件不存在,则创建
//first error :node中一种约定,如果一个回调可能有错误发生,那么约定回调函数的第一个参数专门用来提供错误对象
fs.writeFile('./1.txt','hello',(err)=>{
  console.log(err);
  if(err){
    console.log('写入失败');   
  }else{
    console.log('文件写入成功');
  }
}) 

同步的代码比较简单的,支持传入一个函数,捕捉错误,然后根据错误进行提示。

当然,也可以根据错误进行重试,或者是其他业务操作。

下面展示node fs异步写入

const fs = require('fs');
//write
//写入数据
//output/input  i/o操作  =》流  二进制
//fs.writeFile(file, data[, options], callback)

//数据(字符串,音频,视频,二进制)=》buffer=>stream

//如果目录不存在,则会失败
// 如果文件不存在,则创建
//first error :node中一种约定,如果一个回调可能有错误发生,那么约定回调函数的第一个参数专门用来提供错误对象
//'./1.txt E/cc/1.txt'
// fs.writeFile('./1.txt','hello',(err)=>{
//   console.log(err);
//   if(err){
//     console.log('写入失败');   
//   }else{
//     console.log('文件写入成功');
//   }
// }) 

try{
  fs.writeFileSync('./1.txt','hello')
  console.log('文件写入成功');
}catch(e){
  console.log('写入失败'); 
}

异步的模式不会阻塞线程,马上打印‘文件写入成功’。

//追加
//fs.appendFileSync('./1.txt','我是追加的')
//获取文件其他信息
// let content=fs.readFileSync('./1.txt')
// console.log(content);
let content=fs.statSync('./1.txt')
console.log(content);

展示删除文件夹

好了,现在展示fs来删除文件夹。

这里要注意的是文件夹还可能包含文件夹。 所以我们需要特别注意,这里就的遍历一下子目录,递归的执行操作。

rmdir('./aa')

function rmdir(dirpath){
let files =fs.readdirSync(dirpath)
files.forEach(child=>{
  //当前的child可能是文件也可能是文件夹,所以不能直接删除
  //而是需要递归
  let childPath=dirpath+'/'+child
  if(fs.statSync(childPath).isDirectory()){
    rmdir(childPath)
  }else{
    fs.unlinkSync(childPath)

  }
  // let dirpath='./a'
  })
  fs.rmdirSync(dirpath)
}
    

也能监控文件系统

fs.watchFile()方法用于连续监视给定文件上的更改。

它具有一个回调监听器,每次访问文件时都会调用该监听器。它具有一个可选的options参数,该参数可用于指定属性。

比如,我们必须轮询文件的间隔时间以及只要监视文件,那就可以继续进行。

侦听器有两个参数,即当前stat对象和上一个stat对象。这可用于比较对文件的更改。修改后的文件访问时间可以从fs.Stat对象的mtime属性中找到。

下面展示watchFile 文件监听

const fs = require('fs');

//监听文件的变化

// fs.watchFile('./data.txt',data=>{
//   console.log(data);
  
// })

//监听文件夹
fs.watch('./a',(e,files)=>{
  console.log(e,files)
})

这个很有用的,比如文件系统更新了需要触发代码更新。这个watchFile就很有用了。

比如我们常见的修改代码后,自动重新编译代码,服务器自动热加载。 这个内部大概率就是用了文件系统的监听了。

实战一下

下面,我们仿vue-cli的项目

const fs=require('fs')

//获取用户要生成的项目名称,process

console.log(process.argv);

let appName=process.argv[2]
let appRoot=__dirname+'/'+appName
if(fs.existsSync(appRoot)){
  console.log('项目已存在,请勿重复创建');
  
  process.exit()
}

fs.mkdirSync(appRoot);
fs.mkdirSync(appRoot+'/images');
fs.mkdirSync(appRoot+'/js');
fs.mkdirSync(appRoot+'/css');

//判断是否存在-i的选项
if(process.argv.includes('-i')){
  fs.writeFileSync(appRoot+'/index.html',`
  <!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <h1>app</h1>
</body>
</html>
  `)
}
console.log('项目创建成功');

代码解析:

类似vue-cli 的创建一个展示项目。

创建目录和项目文件。

生成项目的demo页面。

比较简单。

发布我们的代码

写了很多有用的函数之后,我们可以把代码打包成为一个模块。

发布到npm上面,分享给其他开发者。

npm 发包
在有pagckjson的文件里下cmd
npm login
npm publish

bin设置全局
在这里插入图片描述

好了,今天就展示到这里。

我是丸子,每天学会一个小知识。
一个前端开发
希望多多支持鼓励,感谢