文章

事实证明,凡是能用JavaScript重写的都将会被用JavaScript重写

前言

说到NodeJs,作为一个运行在服务器端的JavaScript,其相对于运行在浏览器端的JavaScript来说,最主要的区别就是可以调用各种系统api,操作数据库以及文件系统了。回到这次要说的文件系统,其实我也没太过深入,文档姑且浅显的读了下,因为有中文文档感觉用到的时候再去查也未尝不可,导致想写一些玩具的时候就变成了面向文档编程,只是查的多了不免生厌,故此,稍做记录一下。
最近,计划着用Node写个简单的后台管理页面,预计会把登陆流程,mysqljs单独拎出来讲讲,本文主要包括的内容大约就是,通过fs模块进行基本的,简单的文件操作。
在此我想再稍微夹杂一些私货和思考,无它,无非是NodeJs的应用场景,以及未来的预期这种很多人都发表过过评论的内容。首先,我学前端的时候正好是nodejs概念刚刚火起来的时候,网上的视频教程大都是0.几的,但最新的版本库大概是3.几还是4.几了,那个时候提到让一个传统的前端来负责后台的哪怕只是业务层的逻辑,除非是非常黑心的企业,不然大都还是相当无稽的,培训班前端课程介绍的后台语言大都还是php...nodeJs,嘛,上了一天左右吧。当时,网上无非两种观点,第一种:NodeJs是未来,全栈,JavaScript一统web开发,第二种:NodeJs辣鸡,性能低下,没有应用空间,没有意义的玩具。其实放到今天,我个人感觉大环境对前端的变化并不是那么明显,诚然三大框架越来越复杂,前端工程化的程度也越来越高,然后对于很多情况来说,都没有心力去投入这一块,就拿NodeJs来说吧,那年最佳的实践似乎是淘宝拿来做中间层...到今年...我依旧也还是没听说什么相对大型项目的服务是纯粹拿NodeJs来写的。即使,它已经完善了很多内容,迭代了无数版本...今年,Nodejs之父还公开表示,Nodejs有一些致命的不可调和的缺陷,所以走不远,顺便推了下它新出的东西....对于绝大多数前端来说,与其说是在用NodeJs不如说是在用它所集成的npm包管理工具。
这么看来,似乎,除了小型的,玩具的项目外没有NodeJs的应用空间?可能还真是这样..但是扪心自问,在互联网上现在在线的项目有多少能自诩大型项目.....放十年前,10W日活也许是个分水岭,然而现在,随便拿个现成的框架,只要你不是太过分,支持10W日活应该不是什么太难的事情,什么?还是觉得太难,那是你硬件没堆够(滑稽)...就以性能举例吧..假如这个服务用c++写,它可能1ms就能完成这个工作,用JavaScript也许需要10ms甚至20ms..但是..网络传输,或者硬盘i/o或者加密解密,数据库操作随便一个过程可能需要300ms..这个时候...即使这个单纯的服务性能好20倍..带给用户体验的提升是微乎其微的,但是开发的难度,也许JavaScript 十几分钟就能写完的东西,用c++也许得写个把个小时也是可能的....曾经面到一个以加班自豪的小企业问我前端性能优化的时候,一时调皮我回答:加带宽..因为在很多情况下,这真的很有效....然后就被问什么是带宽,怎么加,一脸讽刺..那则是另一个话题了....
总而言之,对于NodeJs的前景,我暂时找不到中间层以及辅助用的小服务以外的应用空间,真用来写大型服务,除非有一个非常好的规划,不然出来的东西可能会很崩溃...因为,它实在太灵活,怎么写都可以..而且,编译阶段是很难进行大多数错误的排查的,往往都是运行到的时候才会报错,而错误处理机制有的时候又比较糟糕,冒出来的时候也许是一个完全不相关的地方...
但是,用来让传统的纯前端来了解服务器端,作为一个后台语言入门,或者拿来写些小玩具,却是无比合适的。尤其是一些,要求不高,又没什么时间投入的个人项目,简直适合的无以复加,最主要的技多不压身,多学学肯定是没有坏处的。

fs模块Nodejs内建的文件操作模块

fs模块是Nodejs内建的文件操作模块,能以函数的形式实现文件操作,通常分为同步和异步两种。
它有很多API但实现的功能其实差不多,目前为止反正我是怎么简单怎么来,那么下面来看列子。

//引用
const fs = require('fs');
//判断文件是否存在
fs.existsSync(path) //同步的判断,返回布尔值,只判断存在,不管它是文件还是文件夹。
fs.access(path[, mode],(err)=>{
    if(err){
        consoe.log('文件不存在')
    }
}) //同步判断,检查文件是否存在,默认判断是否存在,其它也可以判断是否可以读写
//文件状态获取
var stats= fs.statSync(path); //同步的获取状态
fs.stat(path[, options],(err,stats)=>{

})//异步版本
//stats中包含了很多内容,包括但不限于,大小,创建时间,修改时间
stats.isDirectory()//判断是否为目录,返回布尔值
stats.isFile()//判断是否为普通文件,返回布尔值
stats.atimeMs//最后一次被访问
stats.mtimeMs//最后一次被修改
stats.ctimeMs//最后一次文件状态被改变
stats.birthtimeMs//创建时间
//以上均为时间戳,去掉Ms似乎是日期格式,不过,我还是习惯自己格式化时间戳
fs.readFileSync(path,'utf-8'); //读取文本格式文件中的内容同步版本,返回字符串
fs.readFile(path,'utf-8', (err, data) => {
  if (err) throw err;
  console.log(data);
});//异步版本
//不指定编码格式会得到buffer,如果是图片,返回给前台可以直接展示出来,缺陷是不好缓存..
fs.writeFileSync(path,data,{
    encoding:'utf-8'
})//写入同步
fs.writeFile(file, data[, options], (err)=>{

})//异步,option中可以指定编码
//写入不存在的文件似乎有创建的效果..可以通过options来修改这方面的内容

这种整体读写,可以说是比较常用了..如果你想写日志,不太在意效率的话,可以整体读取,添加,再整体写入...
好像是有添加的写法..虽然我没记..留着以后用到了再补...

//删除
fs.unlinkSync(Path); //同步删除
fs.unlink(path, (err)=>{
})//异步删除
//删除目录
fs.rmdir()
fs.rmdirSync()
//复制 自己实现
        var readStream = fs.createReadStream(defPath);
        var writeStream = fs.createWriteStream(targetPath);
        readStream.pipe(writeStream);
        readStream.on('end', function () {
            console.log('copy end');
        });
        readStream.on('error', function () {
            console.log('copy error');
        });
//简单来说创建一个读流,再创建一个写流,然后用Pip拼接在一起,似乎也可以用来传递一些大文件..
//新一点的版本
fs.copyFile(src, dest[, flags], callback)
fs.copyFileSync(src, dest[, flags])
//很好懂
//移动的话,有单独的方法,还可以用来重命名..不过我自己的话..移动直接复制的基础上,加上删除就可以了,重命名也是复制的时候名字不一样就好了..。
//不过自己实现的话,其实有些伤硬盘,毕竟,是做了完整的读写操作,通常而言windows如果在同分区移动的时候只是单纯的换了个标识符,所以移动的时候如果在同分区下无论多大通常都是秒结束,同硬盘不同分区也很快..
//Linux下也同样,只是Linux没有分区这个概念,不涉及到跨硬盘的话应该都是秒结束的..
//nodejs的实现
fs.rename(oldPath,newPath,calback)
fs.renameSync(oldPath, newPath)
//newPath如果存在会覆盖,效果类似mv,虽然叫rename其实拿来做移动也是极好的

至此,最常用的API都提过一遍了,简单的文件系统所必须的东西都在这里提过了。
其它,NodeJs还有包括文件夹创建,权限修改,判断,还有对文件的监听一类的的方法,我暂时没用过,留着以后再探索了。

结语

嘛,其实,很多时候,用这些内建模块用什么查什么是一个办法,但是效率其实是很低的。
做到最后有时会发现不如先过一遍文档再开发来的效率高,毕竟文档很详细,而网上博客上的总结毕竟是适用于别人的场景的。
而且,Nodejs更新的非常快,博客文章什么的,过时的,错误的,误导性的其实非常多..这个时候,自己阅读文档将大有裨益。
随着看的多了,使用新的东西的时候理解的也就快了,长远来看比单纯的东拉一段西拉一段要更节约时间。

评论

This is just a placeholder img.