2.Nodejs初级使用
2.1 Nodejs简介
2.1.1 node简介
Node.js是一个能够在服务器端运行JavaScript的开放源代码、跨平台JavaScript运行环境。
Node.js主要用于编写像Web服务器一样的网络应用
官网地址:Node.js
中文官网:Node.js 中文网
2.1.2 什么是node.js
它是一个环境 。比如浏览器可以解析(html、css、js[ecma]),Node就是Ecmascript的环境(它对es6支持非常友好)
2.1.3 为什么学习node.js
浏览器是前端工程师特有的环境,而node它是后端环境。而后端有哪些语言(php、java、python、C#....)
js的脚伸到后端了。比如:java能做的事情我们node也能做。
前端干不了的事情后端来干(比如我们的node)。因为语法不用学了,已经学完了,降低成本。
比如前端干不了以下事情 : 数据库操作、删除文件、动态网站。
通过学习Node.js深刻认识前后端交互,而且后端学习的Vue、React它们环境都依赖Node。
2.1.4 node简史
它是2009年发布-2021年 ,经过这几年发展,Node也已经很成熟了。
2.1.5 Node.js的特点
-
单线程:
-
多线程(配置要求高)
-
单线程:充分利用线程做到极致
-
-
非阻塞I/O
-
I/O:文件读写操作,指令操作
-
非阻塞:程序顺利的往下执行
-
-
事件驱动
-
什么时候执行,都是通过事件驱动
-
2.1.6 Node和JavaScript之间的区别
-
JavaScript:ECMAScript,DOM,BOM,内置对象方法==(前端)==
-
Nodejs:ECMAScript(变量,for,if,switch,数据类型,数据类型,对象方法)== (后端)==
==node提供的方法(fs)==
==没有DOM与BOM==
2.1.7 Node的应用领域
-
API接口
-
动态网站开发
-
即时通信
-
有一些第三方团队会基于Node开发一些前端工具
2.2 Node安装
-
下载
-
下载地址1:下载 | Node.js 中文网(V14只能是win10及以上。)
-
下载地址2:Node.js Mirror v12
node-v12.16.0-x64.msi (64位)
node-v12.16.0-x86.msi (32位)
-
-
安装
-
全程下一步,可以改路径,但是路径中不要有中文
-
查看是否安装成功
-
2.3 cmd与命令行
2.3.1 cmd
CMD一般指命令提示符。命令就是一条一条的指令 。当用户发出指令那么计算机就要准确根据指令完成某些操作。
-
特点:提高开发效率,降低内存的使用空间
-
打开cmd
-
开始-->搜索cmd-->回车
-
window+r
-
文件夹目标上输入 -- cmd
-
2.3.2 常用命令
-
==cd 目录名称:切换路径== 切换本盘符的路径用cd
-
cd .. : 切换上一级目录
-
dir : 查看目录下的信息
-
md 目录名称:创建目录
-
rd 目录名称:删除目录
-
==cls/clear : 清屏==
-
使用技巧
结合tab键 更好的使用node运行js文件(文件名补全) ↑ ↓ 上下箭头,寻找最近记录
总结:使用node运行文件,都使用相对路径(也就是说在文件目录打开cmd)
2.4 环境变量
-
什么是环境变量
打开文件或者目录的时候,环境变量能够方便开发者更好的赵铎一个程序文件 .exe
mspaint:画图
nodepad:记事本
-
为什么需要配置环境变量
node -v xxx不是内部命令
没安装成功 , 环境变量有问题
-
配置环境变量
我的电脑-->右击--》属性--》高级系统设置 ---》高级 ---》环境变量---》用户--》path(双击)--》路径复制出来加; ==>加配置软件的路径
以vscode为例,给大家配置环境变量。
win10:
win7:
3.二进制(了解)
3.1 常见进制简述
-
二进制:0 1
-
八进制:0-7
-
十进制:0-9
-
十六进制:0-9 A-F
所有数据底层都是二进制(0和1),计算机只认识0和1. 文件的数据读写和网络中的数据传输都是2二进制传递的
3.2 进制转换原理
-
了解二进制转十进制即可。
101010 ==> 1*2^5 + 0*2^4 + 1*2^3 + 0*2^2 + 1*2^1 = 42
067 ==> 6*8^1 + 7*8^0 = 55 以0开头,并且没有超过8的值,就是八进制
0xff ==> 15*16^0 + 15*16^1 = 255
-
在线转换器:进制转换 - 在线工具
3.3 计算机存储原理
最小的存储单为是: b(byte) 位
存储文件的最小单位:B 字节
1B = 8b
3.4 ASCII
每一个ascii码值代表了一个具体的字符。底层都会用二进制数表示具体的字符。
英文、数字(62个 ) 加上特殊符号(100): 162等 8个二进制位(也就是一个字节足以表示了)
所以:英文数字特殊符号,只占一个字节 。
但是:世界上有很多国家(中国), utf-8国标码(国际通用的):utf8 一个字符占3个字节
4.文件系统/fs模块
在Nodejs中可以通过内置的fs模块(功能)来操作系统文件。
文件系统操作都具有同步和回调两种方式。所有node中的都90%以上的方法(都有同步和异步两种形式)
==文件夹名不要叫node,文件名称不要叫node.js==
4.1 文件操作流程
文件操作流程:打开文件--->操作文件--->关闭文件 (释放内存)
-
打开文件
语法:
fs.openSync(path[, flags])
参数说明:
path:必写参数,是要打开的目标文件名的字符串(可以包含文件所在的具体路径)
flags:可选参数,设置打开文件的模式(访问模式),常用的模式为只读、写入、追加。
打开模式表:
模式 说明 a 文件用于追加。 如果文件不存在,则创建该文件 ax 类似于a,但如果路径存在,则失败 a+ 打开文件用于读取和追加。 如果文件不存在,则创建该文件 ax+ 类似于 'a+',但如果路径存在,则失败 as 打开文件用于追加(在同步模式中)。 如果文件不存在,则创建该文件 as+ 打开文件用于读取和追加(在同步模式中)。 如果文件不存在,则创建该文件 r+ 打开文件用于读取和写入。 如果文件不存在,则会发生异常 rs+ 打开文件用于读取和写入(在同步模式中)。 指示操作系统绕过本地的文件系统缓存 w 打开文件用于写入。 如果文件不存在则创建文件,如果文件存在则截断文件 wx 类似于 'w',但如果路径存在,则失败 -
写入文件
fs.writeSync( fd,内容 )
-
关闭文件
fs.closeSync(fd)
-
案例
//1.载入fs模块 let fs = require("fs"); console.log(fs); //2.打开文件 fs.openSync("文件路径","打开方式") r:read w:write a:append let a = fs.openSync("a.txt","w"); //3.写文件 fs.writeSync(a,"内容") fs.writeSync(a,"下课"); //4.关闭文件 fs.closeSync(a);
4.2 文件操作
4.2.1 读取文件
-
作用:readFileSync 读取文件中内容,以二进制数据返回
-
语法:
回调风格:fs.readFile( path[,options],callback ) 同步风格:fs.readFileSync( path[,options] )
-
参数说明:
-
path:必选参数,文件路径
-
options:可选参数 { encoding:'utf8' } | 'utf8',以utf8编码格式读取内容,中括号代表可选参数
-
callback:必选参数,回调函数,返回结果和错误捕获
-
-
同步与回调风格
-
同步的特点:可以用变量接收函数的返回值。node中所有内置函数都以 Sync 结尾
//1.引入fs模块 let fs = require("fs"); //2.fs.readFileSync(path[,options]) let txt = fs.readFileSync("a.txt"); console.log(txt,typeof txt); //Buffer 默认返回二进制数据,二进制数据太长,统一用十六进制表示 //.toString(); === 将二进制转换为字符串 console.log(txt.toString()); //3.第二个参数 {encoding:"utf-8"} let t = fs.readFileSync("a.txt",{encoding:"utf-8"}); console.log(t);
-
回调的特点:node中的回调风格的方法,必须传递回调函数,否则报错,然后不以sync结尾 。同时结果必须用回调函数接收。
//1.载入fs模块 let fs = require("fs"); //2.读取文件 fs.readFile(path[,options],callback) fs.readFile("a.txt",{"encoding":"utf-8"},(err,data)=>{ console.log(err); //错误信息,如果读取出问题,显示错误信息,没错null console.log(data); //结果 读取到的内容 }) //3.有错误 fs.readFile("b.txt",{"encoding":"utf-8"},(err,data)=>{ console.log(err); //错误信息,如果读取出问题,显示错误信息,没错null console.log(data); //结果 读取到的内容 })
-
4.2.2 写文件
-
作用:将内容写入到文件中
-
语法:
fs.writeFileSync( path,data[,options] ) fs.writeFile( path,data[,options],callback)
-
参数说明:
-
path:必选参数,文件路径
-
data:文件中写入的数据
-
options:可选参数,设置以何种方式写入内容,主要有替换和追加 { flag:'a' }a代表追加append,w代表替换,默认为替换
-
-
实例
//1.引入fs模块 let fs = require("fs"); //2.写入文件 fs.writeFileSync(path,data[,options]) : 如果当前这个文件没有,会自己创建一个 //options : {flag:a/w} a:append:追加 w:write:覆盖 默认 fs.writeFileSync("b.txt","万丈高楼平地起,辉煌还得靠自己"); //3.追加 \r\n:回车 fs.writeFileSync("b.txt","\r\n社会很单纯,复杂的是人",{flag:"a"});
4.2.3 文件信息
-
作用:判断文件或文件夹释放存在,如果不存在报错,还可以判断文件是文件夹还是文件
-
语法
fs.statSync( path )
-
参数说明
-
path:必选参数,文件或文件夹的路径地址
-
-
实例
//1.载入fs模块 let fs = require("fs"); //2.读取文件信息 fs.statSync(path) : 返回文件信息,如果没有这个文件,会报错 let message = fs.statSync("b.txt"); console.log(message.size); //80 文件大小
-
判断文件类型
//3.判断文件是文件还是文件夹 //isFile();判断是否是文件 //isDirectory();判断是否是文件夹 console.log(message.isFile()); //true --- 是文件 console.log(message.isDirectory()); //false
-
try...catch:同步代码捕获错误
提前预测错误,如果有错则可设置选择方案,避免因为出错,影响后期代码的运行
//1.引入fs模块 let fs = require("fs"); let message; try{ //预测可能会出问题的代码 message = fs.statSync("c.txt"); }catch(error){ //接受到了错误,会执行这里面的代码 //console.log("错误",error); message = fs.statSync("a.txt"); } console.log(message);
4.2.4 修改文件名称
-
作用:重命名也是剪切
-
语法:
fs.renameSync( oldpath,newpath )
-
参数说明:
-
oldpath:必选参数,原文件|文件夹路径
-
newpath:必选参数,新文件|文件夹路径
-
-
实例
//1.引入fs模块 let fs = require("fs"); //2.修改文件名称:fs.renameSync(oldPath,newPath) fs.renameSync("demo/aaaaa.txt","demo/a.txt"); //重命名 fs.renameSync("demo/a.txt","c.txt"); //剪切
4.2.5 删除文件
-
作用:删除文件
-
语法:
fs.unlinkSync( filepath )
-
参数说明:
-
filepath:必选参数,要删除的文件路径
-
-
实例
//1.引入fs模块 let fs = require("fs"); //删除文件 fs.unlinkSync("c.txt");
4.3 文件夹操作
4.1.1 创建目录
-
语法:
fs.mkdirSync( path[,options] )
-
参数说明:
-
path:必选参数,要创建的文件夹完整路径名称
-
options:可选参数,是否递归创建文件夹,{ recursive:true } true代表递归创建
-
-
实例
//1.引入fs模块 let fs = require("fs"); //2.创建文件夹 fs.mkdirSync(path[,options]) //options : {recursive :false} 默认 true:递归创建 //3.{recursive :false} 默认 一次创建一个文件夹 // fs.mkdirSync("demo"); //4.{recursive :false} true:递归创建 fs.mkdirSync("demo/aa/bb/cc",{recursive:true});
4.1.2 删除目录
-
语法:
fs.rmdirSync( path[,options] )
-
参数说明:
-
path:必选参数,要删除的文件夹完整路径
-
options:可选参数,是否递归删除文件夹,{ recursive:true } true代表递归创建,只有V14版本支持
-
代码案例:
const fs = require('fs') fs.rmdirSync('demo1/a')
4.1.3 读取目录
-
语法:
fs.readdirSync(path)
-
参数说明:
path:必选参数,要读取的文件夹的完整路径
-
代码案例:
fs.readdirSync('demo1/a') ["bb"]
4.4 其他
-
全局变量
//当前文件所在的绝对路径目录 console.log(__dirname); //E:\txf\第三阶段-服务端开发\day04\code //当前文件所在的绝对路径目录(包括文件名称) console.log(__filename); // E:\txf\第三阶段-服务端开发\day04\code\15 全局变量.js
-
路径优化
避免再使用fs操作文件的时候,用相对路径的一些坑,所以fs使用绝对路径
let fs = require("fs"); //获取当前文件的绝对路径 let path = __dirname + "\\a.txt"; //读文件 let txt = fs.readFileSync(path,{encoding:"utf-8"}); console.log(txt); //建议使用绝对路径