
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.js3.命令行和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.文件系统 fs1.文件的操作流程
打开文件-> 对文件进行操作-> 关闭文件。
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);// 默认是二进制,但是二进制太长了,所以最后以十六进制展示
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类型
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: 713-thirdday04代码
console.log(__filename);//E: 713-thirdday04代码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模块操作文件的时候为什么要优化路径 避免思维胡乱