Node-基础
1.Node.js介绍
Node.js是一个能够在服务器端运行JavaScript的开放源代码、跨平台JavaScript运行环境。 Node.js主要用于编写像Web服务器一样的网络应用 官网地址:Node.js 中文官网:Node.js 中文网
1.什么是Node.js?
它是一个环境。比如浏览器可以解析(html、css、js[ecma]),Node就是ECMAScript的环境(它对es6支持非常友好).
javascript ECMAScript
2.为什么学习Node.js?
前端--》与后端交互《-- 后端(操作数据库)【node-express】 数据库【mysql】
浏览器是前端工程师特有的环境,而node它是后端环境。而后端有哪些语言(php、java、python、C#....) js的脚伸到后端了。比如:java能做的事情我们node也能做。 前端干不了的事情后端来干(比如我们的node)。因为语法不用学了,已经学完了,降低成本。 比如前端干不了以下事情:数据库操作、删除文件、动态网站。 通过学习Node.js深刻认识前后端交互,而且后端学习的Vue、React它们环境都依赖Node。
3.Node.js简史
它是2009年发布-2021年,经过这几年发展,Node也已经很成熟了。
4.Node.js特点
铃铛 1个服务员 张三 李四 王五 1个服务员---单线程 不等待-----非阻塞I/O input/output 铃铛-------事件驱动
1.单线程
单线程的好处,减少了内存开销
2.非阻塞I/O
I/O:是文件读写操作,指令操作。非阻塞:程序顺利往下执行
3.事件驱动【回调函数】
程序怎么知道该执行了呢?就是由事件驱动(事件触发)
5.Node.js和javascript的区别
JavaScript:ecmascript/BOM/DOM,以及其它的内置对象 RegExp、Date、Math... Location
有window|document
Node: Ecmascript/Node提供的方法,没有DOM和BOM,无window|document 纯语法:let const if for switch 数据类型、表达式、运算符、函数、class、RegExp、Date、Math
Node提供的方法: fs.rmfile( ) .
6.Node.js的应用领域
API接口 动态网站开发 即时通信 有一些第三方团队会基于Node开发一些前端工具
2.安装
1.下载
如果你的电脑是wind10,就直接官网下载即可。如果是win7 win8.1 就下载网盘链接
1.官网下载 2.window10以下电脑 链接:https://pan.baidu.com/s/1iPeZV2mub_tZjEuTHsiUTQ 提取码:o4lu
不要更换安装路径
2.验证是否安装成功
node -v
3.运行第一个node程序
node 1.js
3.命令行和cmd(终端)
1.打开cmd的方式
第1种:开始->输入cmd->回车 第2种:win+r=>输入cmd->回车,wind键是ctrl和alt中间的键 第3种:在任意目录下的地址栏输入cmd->回车 第4种:在文件夹中--》 按shift键+右键--》在此处打开命令窗口 --》打开
2.常用命令
cd 目录名称 //进入某个目录 cd .. //返回上一级目录 F: //切盘 dir //查看目录下的信息 cls //清屏 md 目录 //创建目录 rd 目录 //删除目录 上键 :查询上一次命令 下键:查询下一个命令 tab键:自动补全名称
https://jingyan.baidu.com/article/6766299796ce9354d41b8443.html https://jingyan.baidu.com/article/36d6ed1f0355235bcf4883d4.html cmd命令不是重点,重点是使用技巧和cd、cls
4.环境变量
1.演示
mspaint //打开绘画板 notepad //打开记事本
2.演示配置环境变量
Win10:
Win7:
3.总结
xxx不是内部或外部命令,也不是可运行的程序。 你确实没有安装,要么就是环境变量出了问题。 而node.js安装成功以后,自动把node的路径安装到了环境变量path中。所以可以直接在任意目录下运行node.exe
5.文件系统 fs
1.文件的操作流程
打开文件-> 对文件进行操作-> 关闭文件。
1) 打开文件
语法:
fs.openSync(path[,flags])
参数说明: path:必写参数,是要打开的目标文件名的字符串(可以包含文件所在的具体路径) flags:可选参数,设置打开文件的模式(访问模式),常用的模式为写入、追加。
模式 | 说明 |
---|---|
a | 文件用于追加。如果文件不存在,则创建该文件 |
w | 打开文件用于写入。如果文件不存在则创建文件,如果文件存在则截断文件 |
2)对文件进行操作
fs.writeSync(fd,内容)
3)关闭文件
fs.closeSync(fd)
2.进制(了解)
2.1 常见进制简述
二进制、八进制、十进制、十六进制... 以二次幂往下增。因为所有数据底层都是二进制(0和1),计算机只认识0和1. 而且文件的数据读写和网络中的数据 传输都是2二进制传递的
2.2 进制转换原理
二进制转十进制即可。 2进制逢2进1,10进制逢10进1 十六进制:0-9 A B C D E F 十进制:143
1*10^2+4*10^1+3*10^0=143
二进制:1010 =》十进制
1*2^3+0*2^2+1*2^1+0*2^0=10
在线转换器 进制转换 - 在线工具
2.3 计算机存储原理
最小的存储单为是: b(byte)位 存储文件的最小单位:B 字节 1B = 8b
1T = 1024M 1M = 1024KB 1KB = 1024B 1B = 8b
2.4 ASCII
每一个ascii码值代表了一个具体的字符。底层都会用二进制数表示具体的字符。 但是:世界上有很多国家(中国), utf-8国标码(国际通用的)
3.两种编程风格(同步和异步)
同步的特点:可以用变量接收函数的返回值。node中所有内置函数都以Sync结尾。 回调的特点:node中的回调风格的方法,必须传递回调函数,否则报错,然后不以sync结尾。同时结果必须用回调 函数接收。 注意:推荐使用同步风格。
4.文件操作
1.读取文件
回调风格:
fs.readFile(path[,options],callback)
同步风格:
fs.readFileSync(path[,options])
const fs = require("fs"); // 文件操作推荐使用同步 //读取文件 同步读取 let result = fs.readFileSync("./demo/2.txt") // console.log(result);//<Buffer 68 65 6c 6c 6f 2c 77 6f 72 6c 64> 默认是二进制,但是二进制太长了,所以最后以十六进制展示 console.log(result.toString());//hello,world // 万国码 utf-8 let result2 = fs.readFileSync("./demo/1.txt", { encoding: "utf-8" }) // console.log(result2);//hello threehello four // 万国码 简写 推荐 let result3 = fs.readFileSync("./demo/1.txt", "utf-8"); // console.log(result3);//hello threehello four
2.写入文件
语法:
fs.writeFileSync(path,data[,options])
参数说明: path:必选参数,文件路径 data:文件中写入的数据 options:可选参数,设置以何种方式写入内容,主要有替换和追加{flag:'a'} a代表追加append,w代表替换,默认为替换
// fs.writeFileSync("./demo/2.txt","abcdefg",{flag:"w"}) fs.writeFileSync("./demo/2.txt","hijklmn",{flag:"a"})
3.文件信息
语法:
fs.statSync(path)
判断文件或文件夹是否存在,如果不存在则报错。还可以判断是文件还是文件夹
参数说明: path:必选参数,文件或文件夹的路径地址
其他: 判断文件:stat.isFile() 判断目录:stat.isDirectory() Stats{ size:8,//文件的大小 atimeMs:1620626644219.5903,access:访问时间 mtimeMs:1620634078057.7815,modify:修改时间 ctimeMs:1620634078057.7815,create:创建时间 }
// fs.statSync("./demo2/2.txt") 返回一个Stats类型 /* 里面有2个方法, isFile() 是否是文件 isDirectory() 是否是文件夹 */ let stat = fs.statSync("./demo2/2.txt") console.log(stat.isFile());//true console.log(stat.isDirectory());//false let s2=fs.statSync("./demo"); console.log(s2.isFile());//false console.log(s2.isDirectory());//true
4.修改文件名称
语法:
fs.renameSync(oldpath,newpath)
参数说明: oldpath:必选参数,原文件|文件夹路径 newpath:必选参数,新文件|文件夹路径
//修改名称 fs.renameSync(oldPath,newPath) // 1.可以修改名称 fs.renameSync("./demo/1.txt","./demo/2.txt") // 2.实现剪切功能 fs.renameSync("./demo/2.txt","./demo2/2.txt")
5.删除文件
语法:
fs.unlinkSync(filepath)
参数说明: filepath:必选参数,要删除的文件路径
//删除文件 fs.unlinkSync(文件地址) fs.unlinkSync("./demo/2.txt")
6.捕捉同步代码错误
//如果一段代码可能会出错,建议使用try{}catch(err){} //如果不使用try{}catch(err){},出错了,程序就停止了;如果使用了他们,出错了,会进入catch,程序继续运行 try { let result = fs.readFileSync("./demo2/3.txt", "utf-8"); console.log(result); }catch(error){ console.log(error); console.log("出错了"); } console.log("嘻嘻嘻");
5.目录操作
1.创建目录
语法:
fs.mkdirSync(path[,options])
参数说明: path:必选参数,要创建的文件夹完整路径名称 options:可选参数,是否递归创建文件夹,{recursive:true}true代表递归创建
// fs.mkdirSync(目录地址,{recursive:true }) //如果要多层创建文件夹,需要使用递归模式 // recursive:递归 // fs.mkdirSync("./demo3") // fs.mkdirSync("./demo4") fs.mkdirSync("./aa/bb/cc/dd",{recursive:true})
2.删除目录
语法:
fs.rmdirSync(path)
注意文件夹必须是空的,才可以删除 参数说明: path:必选参数,要删除的文件夹完整路径
//删除 fs.rmdirSync(地址) // 注意:文件空的,才可以被删除 // fs.rmdirSync("./demo3") // fs.rmdirSync("./demo4") // fs.rmdirSync("./demo") fs.rmdirSync("./aa/bb/cc/dd")
3.读取目录
语法:
fs.readdirSync(path)
参数说明: path:必选参数,要读取的文件夹的完整路径
//读取目录 =fs.readdirSync(地址) 返回该目录下的所有文件和文件夹 let a=fs.readdirSync("./demo4");//[ '1.html', '1.txt', 'aa' ] console.log(a);
4.删除目录和目录下所有内容
const fs = require("fs") //自己封装 let removeDir = (path) => { // 1.读取目录 let files = fs.readdirSync(path);//["1.txt","aa"] // 2.遍历files,查看是不是文件 files.forEach(item => { //3.取出文件信息 let stat = fs.statSync(`${path}/${item}`) // 4.判断是否是文件 if (stat.isFile()) { //文件 删除文件 fs.unlinkSync(`${path}/${item}`) } else { //目录 removeDir(`${path}/${item}`) } }) //删除文件夹 fs.rmdirSync(path) } removeDir("./demo4")
6.其他
1.全局变量
在浏览器 JavaScript 中,通常 window是顶层对象,而 Node.js 中的顶层对象是 global Node平台内置了例如:filename和dirname等全局变量setInterval() setTimeout()等方法
console.log(global);
Object[global] { global: [Circular], clearInterval: [Function: clearInterval], clearTimeout: [Function: clearTimeout], setInterval: [Function: setInterval], setTimeout: [Function: setTimeout] { [Symbol(util.promisify.custom)]: [Function] }, queueMicrotask: [Function: queueMicrotask], clearImmediate: [Function: clearImmediate], setImmediate: [Function: setImmediate] { [Symbol(util.promisify.custom)]: [Function] } }
2.优化路径
相对路径的问题
①Node.js中使用的相对路径指的是当前的cmd指向的路径; ②避免过多使用相对路径而造成思维混乱 ③使用动态的绝对路径解决这个问题
具体优化代码
console.log(__dirname);//E:\0713-third\day04\代码 console.log(__filename);//E:\0713-third\day04\代码\17-其他.js // fs.readFileSync("./demo/person.json","utf-8") //相对地址 let r = fs.readFileSync(__dirname + "/demo/person.json", "utf-8")//绝对地址 推荐 console.log(r);
6.面试题
●Node.js的特点是什么 ●在使用fs模块操作文件的时候为什么要优化路径 避免思维胡乱