一些简单的node学习笔记记录,
是Vue等前端框架的基础
入门学习备忘录
文章目录
前言
node.js 内置网络服务器,是前端框架学习的基础:
概念:node.js 是开源,跨平台的JavaScript运行环境,是一款可以运行JavaScript的软件。可以开发服务端,工具类应用(Webpack,Vite,Babel),桌面应用使用 electron框架开发(Vscode,postman)。node.js 中需要了解的进程与线程基础。
一、node.js下载与调试
下载地址 打开官网如下,点击长期维护的版本,如若下载其他版本,可以点击download。
提供中文网址,国内用的是阿里的镜像,不是官方,但是下载速度比较快,历史版本需要找到下载后删除path后的URL,地址如下:CNPM Binaries Mirror (npmmirror.com) 。安装时直接点击msi文件安装即可,注意不必安装相关工具
安装完成后,打开cmd窗口,输入 node -v 回车后显示版本号,即为安装成功 。
在vscode中安装 CodeRunner,点击右上角三角形之后运行编写的js测试文件输出结果。
二、简单的使用
0.注意事项
node 不支持BOM DOM 操作,也不支持ajax,但是支持console和定时器API,node的顶级对象不是window,而是global,es2020支持 globalThis,
1. Buffer的简单使用
Buffer:大小固定(1字节),类似数组对象,处理二进制数据,性能较好,代码实例如下
console.log("ds:buffertest ...") ;
let buf = Buffer.alloc(10);
console.log("buf: "+buf);
// 2.不安全,不会清空旧数据;但是速度快
let buf_2 = Buffer.allocUnsafe(10);
console.log("buf_2: "+buf_2);
// 3.from
let buf_3 = Buffer.from('Alice');
let buf_4 = Buffer.from([105,108,121]);
console.log("buf_3: "+buf_3);
console.log("buf_4: "+buf_4);
//转字符串
console.log(buf_4.toString());
//解析数组
let name = buf_3[2] ;
console.log("name:"+name) ;
//溢出,了解即可
let buf_5 = Buffer.from('ds');
console.log("buf_5: "+buf_5);
buf_5[0]= 361;
console.log("buf_5[0]--overflow:"+buf_5[0]);
console.log("buf_5[0]-- "+buf_5);
//
[Running] node "e:\nodePra\tempCodeRunnerFile.js"
ds:buffertest ...
buf: ����������
buf_2: ����������
buf_3: Alice
buf_4: ily
ily
name:105
buf_5: ds
buf_5[0]--overflow:105
buf_5[0]-- is
2.node.js 中的文件系统 fs模块(API)
fs模块是一个重要功能,可以 对硬盘中的文件进行 读/写,移动,删除,重命名,也可以读取,删除,新建文件夹。
node中相对同步,提供了效率更高的异步操作。参考博客
一般同步操作都有 Sync 标记,
0.相关操作函数 :
方法 | 说明 |
---|---|
writeFile | 异步写入 |
writeFileSync | 同步写入 |
appendFile / appendFileSync | 追加写入 |
createWriteStream | 流式写入 |
readFile | 异步读取 |
readFileSync | 同步读取 |
createReadStream | 流式读取 |
文件夹操作函数:
项目 | Value |
---|---|
mkdir / mkdirSync | 创建文件夹 |
readdir / readdirSync | 读取文件夹 |
rmdir / rmdirSync | 删除文件夹 |
1.文件写入
代码如下(示例):
/***
* 新建一个ds.txt,向其中写入 abcdefg
* 再追加写入
*/
//0.导入fs模块
var fs = require('fs');
//1.写入文件
fs.writeFile('\ds.txt','abcdefg',function (err){
if(err){
console.log("fail to write ! "+err);
return;
}else{
console.log(" sucess ! ");
return ;
}
});
//2.写入追加文件
fs.appendFile('\ds.txt','\r\nappdendContent',function (err){ //\r\n 换行
if(err){
console.log("fail to appdendwrite ! "+err);
return;
}else{
console.log(" sucess appdend ! ");
return ;
}
});
node也支持流式写入以减少打开关闭文件的次数 节约资源。
let ws = fs.createWriteStream('./ds.txt');
ws.write('\r\n 111111');
ws.write('\r\n 222222');
ws.write('\r\n 3333333');
ws.write('\r\n 44444455');
ws.end ;
console.log(" end ! ");
2.文件读取
let fs = require('fs');
fs.readFile('\ds.txt',(err, data)=>{
if(err){
console.log('err: '+err);
}else{
console.log("data: "+data);
}
});
//同步读取
let dataSync = fs.readFileSync('\ds.txt');
console.log("dataSync: "+dataSync);
如果使用/ds.txt,node会直接读取E盘下的ds.txt,之后显示没有这个文件。
流式读取:
//流式读取 createReadStream
let rs = fs.createReadStream('\ds.txt') ;
rs.on('data',data=>{
console.log(data);
console.log(data.length)
});
rs.on('end',()=>{
console.log("end read ! ") ;
}) ;
文件 移动与重命名:(如果移动到其他磁盘会显示报错因为跨区重命 名文件出现的权限)
fs.rename('./ds.txt','./temp/new.txt',(err)=>{
if(err){
console.log(err);
}else{
console.log(' 完成');
}
});
//文件删除
fs.unlinkSync('./temp/new.txt'); console.log(' 完成');
3.补充
文件状态查看:
let fs = require('fs');
fs.stat('./ds.txt',(err,data)=>{
if(err){
console.log('stat err: '+err);
}else{
console.log("stat data: "+data.size+'---'+data.mtime+'---'+data.isDirectory);
}
});
console.log("stat Syncdata: "+fs.statSync('./ds.txt').isFile);
路径问题:
./ds.txt :程序所在目录下的文件 ,也可以写 \ds.txt ,如果写 .\ds.txt,程序会寻找当前文件路径下的名称为 .ds.txt 的文件。也可以直接写绝对路径,但是文件移动要注意报错, 这是跨区重命名文件出现的权限问题。
对于绝对路径,也可以使用 __dirname ,将相对路径转换为绝对路径避免bug:
let fs = require('fs');
console.log('__dirname: '+fs.readFileSync(__dirname + '/ds.txt')); // __dirname
node中可以引入 path模块,实现格式化路径或拼接路径。
const path = require('path');
path模块有固定用法 ,可以查阅相关文档资料,这里做一些简单的使用介绍。
显然,按vscode的提示,输入路径后返回路径字符串中最后的一个“.”后的字符串,如果没有点,或者最后的结尾是个点,就会返回空字符串。
还有join的拼接功能;返回文件夹名称的dirname;返回文件名的basename等功能。
let path = require('path') ;
var extname = path.extname('./ds.txt');
console.log("extname: "+extname);
var newdir = path.join('./02','./01');
console.log("newdir: "+newdir);
var fullpath = path.dirname('./ds.txt');
console.log("fullpath: "+fullpath);
var filename = path.basename('./ds.txt');
console.log("filename: "+filename);
返回结果如下
[Running] node "e:\nodePra\pathPra.js"
extname: .txt
newdir: 02\01
fullpath: .
filename: ds.txt
[Done] exited with code=0 in 0.256 seconds
三 、简单应用与总结
批量重命名文件去除指定内容
功能需求:在我的电脑里存储了许多视频,但是视频文件的名字存在一些不必要的内容,现在需要使用node实现批量重命名功能。大概流程就是先读取文件夹下的所有文件名,循环这个读取到的文件名数组,再替换掉想要变更的特定文字。代码如下:
let fs = require('fs') ;
//F:\回形针视频\ 该文件夹下有多个文件,需要清除一些前后缀
var fileNames ;
fileNames = fs.readdirSync('F:\回形针视频');
var newFileNames = new Array;
// console.log("fileNames :"+fileNames+" length:"+fileNames.length);
for(var num=0;num<fileNames.length;num++){
// console.log("\r\n fileName :"+fileNames[num]);
newFileNames[num]= fileNames[num].replace(" - 【回形针PaperClip】","");
newFileNames[num]= newFileNames[num].replace("回形针PaperClip - ","");
newFileNames[num]= newFileNames[num].replace("【回形针PaperClip】","");
//fileNames[num],newFileNames[num]
// console.log("\r\n newFileName :"+newFileNames[num]);
fs.rename('F:\\回形针视频\\'+fileNames[num],'F:\\回形针视频\\'+newFileNames[num],err=>{
if(err){
console.log(err);
}else{
console.log(newFileNames[num]+" rename sucess ! ");
}
});
}
小结:
本文简单介绍了node与一些基础的使用方法,fs模块的应用。 http模块后面再介绍。