node.js
1.node.js是什么 组成
是基于chromev8引擎的javas运行环境,让js脱离浏览器也可以运行。
1.1. NodeJs用在哪里?
1、网站(如express/koa等)
2、im即时聊天(socket.io)
3、api(移动端,pc,h5)
4、http proxy(淘宝首页)
5、前端构建工具(grunt/gulp/bower/webpack/fis3…)
6、写操作系统(NodeOS)
7、跨平台打包工具(以前叫Node-WebKit现在叫nw.js)
8、命令行工具(比如cordova)
nodejs 遵循ECMAscript规范,增加了模块,操作系统,文件系统,操作系统api ,网络系统等后端功能。
2.安装node.js
1.官网下.msi文件-傻瓜式安装
2.dos命令 node -v 查看版本
3.常用的dos命令
windows系统=可视化界面+dos系统
1)切换盘符:盘符:
2)切换目录:cd 目录名1/目录名2/目录名3
3)返回上一级目录:cd..
4)返回根目录:cd/
5)显示当前目录所有文件夹和文件:dir
6)清屏:cls
7)终止:ctrl+c
8)退出:.exit
从 DOS模式切换到 Node模式:只能运行js代码
命令: node 回车
从Node模式切换到DOS模式: 只能运行dos命令
命令: .exit
快捷键: ctrl+c 按多次
编译器打开dos窗口:ctrl+` 或者 右键文件名在终端打开
4.dos窗口中使用nodejs环境执行js文件的代码,(基本使用)
以下是在vscode里用dos窗口使用nodejs环境执行js文件代码 //Windows自带的dos窗口中也能相应操作
1.项目中创建js文件写入代码
2.当前项目文件夹下打开cmd后台命令
这里需要手动配置cmd终端窗口 vscode版本不同配置方式不同,例:1.23.1版本,文件-首选项-设置-集成终端- "terminal.integrated.shell.windows": "C:\\Windows\\system32\\cmd.exe"//后边的改成cmd.exe的路径就好
3.跳转路径到当前js所在路径
4.使用命令:node 文件名.js //node环境执行这个js文件的代码
5.node.js模块化
概念:在nodejs中,每一个js文件都是独立的模块,之间不影响,又相互有联系;
模块又分为:主模块和单元模块
主模块:用来加载单元模块进行运行的js文件。
单元模块:实现独立页面功能的js文件。
导出:(单元模块上的操作,【暴露】导出去给主模块使用--module.exports.变量=要导出的东西 //不导出就是个闭包)
1)module.exports=要导出的东西。
2)module.exports.属性名=要导出的东西
导入:(主模块上的操作,【引入】其他模块,实现他们的内部方法--requuire("") //导入进来的是一个对象)
1)自己写的js模块
var 变量=require("js文件相对路径") //.js可以省略
2)node.js内置的模块
var 变量=require("模块名")
3)第三方模块
a.下载第三方模块
npm i 模块名
b.var 变量=require("模块名")
6.包(package)
每个js文件是一个模块,很多个模块放在同一个文件夹下,这个文件夹就是包(可以用package.json文件管理包 以后每次安装包都会记录到json文件里)
npm init 创建package.json文件
{
"name":"包名", //包名,不能是中文
"version":"1.0.0", //版本号
"description": "", //描述信息
"main": "index.js", //入口文件(主模块)
"scripts": { //配置命令 通过npm run 属性名执行相应的命令
"main": "node main.js",
},
"author": "", //作者
"license": "ISC" //类型
}
7.常用npm命令(重重点)
NPM的全称是Node Package Manager,是随同NodeJS一起安装的包管理和分发工具,它很方便让JavaScript开发者下载、安装、上传以及管理已经安装的包。目前几乎所有的js插件都能在npm上直接下载
npm init //创建package.json文件(包管理文件)
npm i //安装package.json文件记录的全部模块
npm i 插件名 //安装包--安装到本地--node_modules目录里
npm i 插件名 -s //安装包--保存到运行依赖【生产环境】
【生产环境】:指的是你的项目已经完成编码,并发布上线可供用户浏览的阶段时的环境。代码可能经过了压缩、优化等处理。
npm i 插件名 -d //安装包--保存到开发依赖(本地)【开发环境】
【开发环境】:指的是你的项目尚且在编码阶段时的环境。你在代码可能还有各种console.log()、注释、格式化等。
npm i 插件名 -g //安装包--全局安装
1)安装后可以直接在命令行里使用,需要在任何文件下都能执行的命令就需要全局安装
例:npm i gulp-cli -g 安装的是gulp脚手架(命令行工具) 让我们可以操作gulp命令,cli是脚手架的 意思,就是封装的一些功能方法。---只有全局安装成功后才会存在脚手架的版本。
2)不是每个包都需要全局安装,一般需要用到该包定义的命令才需要全局安装。
3)为什么全局安装了还需要本地安装?
如果只是全局安装了而没本地安装,就得require("路径")通过全局包路径来引入,而本地安装后就可以直接require("包名")来使用。
本地安装可以避免全局包污染问题---全局多了可能会在不同项目上产生影响。
npm view 插件名 versions //查看模块所有的版本信息
npm i 插件名@version //安装固定版本号的包
npm remove 插件名 //删除某一个模块
8.cnpm 安装
打开dos窗口 复制下面的执行就完事了 //国内使用npm安装包比较缓慢,用cnpm快一些
npm install -g cnpm --registry=https://registry.npm.taobao.org
cnpm i //一次性安装package.json里面的所有包
node.js常用模块
要使用,先引入
1.内置模块fs文件系统模块
1)文件读取
path
:文件路径callback
:回调,带有两个参数:(err,data),data为读取到的文件内容
fs.readFile(路径,回调) ---异步方法
const fs = require('fs'); //引入
fs.readFile('./1.txt',(err,data)=>{ //两个参数,先抛出错误,后给值
if(err){
throw err;
}else{
console.log(data.toString()); //toString转换成字符串
}
})
2)查看文件信息
path
:文件路径callback
:回调,带有两个参数:(err,stats),其中stats是fs.Stats对象。
fs.stat(路径,回调) ---异步方法
const fs = require('fs');
fs.stat('./1.txt',(err,stats)=>{
if(err){
throw err;
}else{
console.log(stats); //stats对象就是文件全部信息,同时也是fs.Stats对象。
console.log(stats.isFile()); //true 可以使用stats类的相关方法来判断当前文件的属性,比如此处判断是否为文件
}
})
3)写入文件
path
:文件路径,或者文件文件描述符(不作要求)data
:需要写入的内容options
:配置项,包含{ encoding,mode,flag }。默认编码为utf8,模式为0666,flag为' w 'callback
:回调函数,回调函数只包含错误信息(参数err),在写入失败的时候返回
fs.writeFile(路径,写入的内容,配置项,回调) ---异步方法
flag |
描述 |
r |
以读取模式打开文件。如果文件不存在抛出异常。 |
r+ |
以读写模式打开文件。如果文件不存在抛出异常。 |
rs |
以同步的方式读取文件。 |
rs+ |
以同步的方式读取和写入文件。 |
w |
以写入模式打开文件,如果文件不存在则创建。写入方式为覆盖写 |
wx |
类似 'w',但是如果文件路径存在,则文件写入失败。 |
w+ |
以读写模式打开文件,如果文件不存在则创建。 |
wx+ |
类似 'w+', 但是如果文件路径存在,则文件读写失败。 |
a |
以追加模式打开文件,如果文件不存在则创建。 |
ax |
类似 'a', 但是如果文件路径存在,则文件追加失败。 |
a+ |
以读取追加模式打开文件,如果文件不存在则创建。 |
ax+ |
类似 'a+', 但是如果文件路径存在,则文件读取追加失败。 |
const fs = require('fs');
//先读后写
fs.reagFile("./1.txt",(err,data)=>{
if(err) return; //如果报错,后面代码不执行
fs.writeFile("./1.copy.txt",data.toString(),{encoding:"utf8"},(err)=>{
if(err) return;
console.log("拷贝完成")
})
})
// 以追加的模式写入内容,如果文件不存在则创建
4)拷贝图片
readFile和writeFile结合实现文件拷贝
// 读取图片内容
const imgData = fs.readFileSync('./timg.jpg');
// 将图片内容写入到3.jpg中
fs.writeFile('./3.jpg',imgData,(err)=>{
if(err){
throw err;
}
})
5)删除文件
fs.unlink --异步方法
path
:文件路径callback
:回调函数,没有参数
const fs = require('fs');
fs.unlink('./1.txt',()=>{
console.log('删除成功')
})
6)创建目录
fs.mkdir
path
:目录路径options
:配置项,包含{ recursive,mode }
recursive
:是否以递归的方式创建目录,默认为falsemode
:设置目录权限,默认为0777
callback
:回调函数,参数为err
const fs = require('fs');
// 创建一层目录
fs.mkdir('./目录1',()=>{
console.log('创建完成')
})
// 递归创建多层目录
fs.mkdir('./第一/第二/第三',{recursive:true},()=>{
console.log('创建完成!')
})
7)读取目录
fs.readdir
path
:目录路径callback
:回调函数,参数(err,files),files为当前目录下文件数组列表
const fs = require('fs');
fs.readdir('./第一',(err,files)=>{
console.log(files) //输出结果为:[ '1.txt', '2.txt', '第二' ],从数组可以看出,带有后缀的是文件,不带后缀的是目录
})
8)删除目录
rmdir
pathS
:目录路径callback
:回调函数,参数为err
const fs = require('fs');
fs.rmdir('/目录4',()=>{
console.log('删除成功')
})
2. stream流
1)概念??
应用程序中,流是一组有序的,有起点和终点的字节数据传输方式。
2)特点
边读边写。
3)nodejs中用stream表示流,这是一个抽象接口,nodejs中stream流有四种方式。
readable --可读操作
writeable --可写操作
duplex --可读可写操作
Transform --操作被写入数据,然后读出结果
4)流的基本操作--读数据(重点)
在stream流的操作之前,我们要知道stream流的常用事件:
1.data --当读取到数据时触发一次,默认每次读取数据大小:64kb(64*1024)
2.end --没有更多的数据时(读取结束)触发。
3.error --在读取过程和写入过程中发生错误时触发。
5)创建可读流
const fs = require('fs');
// 第一步:创建可读流的实例对象
// 通过配置highWaterMark可以控制每一次读取的内容大小
const readStream = fs.createReadStream('./1.txt',{highWaterMark:2});
// 第二步:设置编码
readStream.setEncoding('utf8');
// 第三步监听事件——data读取到内容/err读取报错/end读取结束
// data事件的参数——chunk,读取到的内容
readStream.on('data',(chunk)=>{
console.log(chunk)
})
// err事件——当读取发生错误的时候
readStream.on('err',(err)=>{
if(err){
console.log(err)
}
})
// end事件——读取完成后,执行end事件
// end事件没有参数
readStream.on('end',()=>{
console.log('读取完成啦!')
})
6)创建可写流
const fs = require('fs');
// 第一步:创建需要写入的内容
const data = '源码时代,高薪就业';
// 第二步:创建一个可写流
const writeStream = fs.createWriteStream('./2.txt');
// 第三步:开始写入内容
// 第一个参数——data——要写入的内容
// 第二个参数——'UTF8'——设置文本的编码
writeStream.write(data,'UTF8');
writeStream.write(data,'UTF8');
writeStream.write(data,'UTF8');
// 第四步:写入完成,调用end方法,结束写入行为
writeStream.end();
// 第五步:监听写入结束事件,执行回调
writeStream.on('finish',()=>{
console.log('写入结束了')
})
7)创建管道流
const fs = require('fs');
// 第一步:创建可读流
const readStream = fs.createReadStream('./1.txt');
// 第二步:创建可写流
const writeStream = fs.createWriteStream('./1.copy.txt');
// 第三步:使用管道方法链接读写过程
readStream.pipe(writeStream)
3.path模块
1)path.join() //(重点)
path.joins是路径拼接方法,该方法会正确的转换和使用基于当前操作系统的分隔符去进行路径拼接(window为【\】,linux为【/】)
语法:path.join(path1,path2...)
const path=require("path")
let resolvePath = path.join(__dirname,'../03.stream流/1.copy.txt');
//path.join常常用于本地需要连接两个路径,便于引用的时候
//__dirname:node的全局对象,作用是返回当前目录的绝对位置
//有时候再开发过程中我们需要一个文件或者目录的绝对地址,此时使用path.join结合__dirname就能帮我们得到结果了
2)path.resolve()
语法:path.resolve( [from ...], to )
;
// 必须掌握的用法!!!!
// 结合__dirname获取某个文件的绝对路径
const resolveUrl = path.resolve(__dirname,'./path.join.js');
3)path.basename()
语法:path.basename(p[, ext])
,其中的可选参数ext在返回文件名的时候用到,可选参数ext代表忽略目录分隔符(比如后缀等)
path.basename
用于返回路径中的最后一部分,往往在我们需要获得某个路径的最后一个文件名加后缀时使用
console.log(path.basename('./第一/第二?@/','?@'))
console.log(path.basename('./第一/1.txt','.txt'))
console.log(path.basename('./第一/1.txt'))
4.http协议-
HTTP协议是一种网络传输协议,采用的是 请求/应答 方式传递数据
http交互特点(三次握手)
1)浏览器给服务器发送数据:一次请求
2)服务器给浏览器反馈数据:一次响应
3)一次请求对应一次响应,多次请求对应多次响应
5.递归获取目录内全部同类文件,并合并为新的文件
还有点小问题,内容顺序问题(同步异步)
var fs = require("fs");
var path = require("path");
function readFileList(dir, filesList = []) {
const files = fs.readdirSync(dir);
// console.log(files);
files.forEach((item, index) => {
var fullPath = path.join(dir, item);
const stat = fs.statSync(fullPath);
if (stat.isDirectory()) {
readFileList(path.join(dir, item), filesList); //递归读取文件
} else {
const reg = /.md/;
reg.test(fullPath) && filesList.push(fullPath);
}
});
return filesList;
}
var filesList = [];
readFileList("./test", filesList);
fs.writeFile("README.md", "", () => {}); //先清空
filesList.forEach((item) => {
let content = fs.readFileSync(item, "utf-8");
console.log(content);
fs.appendFile("README.md", content, () => {});
});
// console.log(filesList, "1");
标签:文件,fs,err,nodejs,基本知识,js,模块,path
From: https://www.cnblogs.com/sclweb/p/17637762.html