01.什么是Node.js
- node是js语言的服务器运行环境(类似于php中的apache服务器)
- 后端语言都有什么? -》 Java php node
- 前端的js运行环境是什么? -》 浏览器
- node.js是单线程,高并发场景用的多
- node 提供了大量的工具库,使js可以调用任意一个工具库中的API(接口)
- node 不是一门编程语言,是一个Javascript的编译环境,使用了事件驱动,非阻塞式的I/O的模型,使其轻量又高效。
- 前端js 是DOM驱动,平时写前端js的时候,才从dom为出发点考虑问题。
input 输入流 output输出流 非阻塞 异步/回调函数
02.node 环境安装
- 官网安装稳定版本,不要安装最近版本
- 安装完成之后,在控制台查看是否安装成功,windows + R -> 输入cmd -> 回车 -> 弹出终端输入node -v,如果出现了版本号,就证明安装成功。
03.node 文件执行命令
1.终端
node 文件名.后缀名
2.vsCode 让js文件快捷执行的插件: code runner
[Done] exited with code=0 in 0.096 seconds
Done -> 完成 (do did过去式 Done 完成式 代码已经执行完毕)
exited -> 出口
code=0 -> 代表项目执行完成,并且退出
以上是输出的结果说明 ↑
- 装环境,nodemon
04.模块和包
node的==核心==之一
模块(module)和包(package)
1.模块(module)
模块就是一个文件,但是这个文件的格式可以是js,json,ts(TypeScript)
优点:
代码方便管理,对代码进行了抽离
方便复用
我们也可以自己写模块,写模块遵循 commonJS 规范
通过 require 导入模块
通过 exports 导出模块
属性导出:
1.
// 导出的属性,可以和赋值的属性不一样
/*
exports.uName = userName;
exports.descprition = descprition;
exports.sex = sex;
exports.sayWord = sayWord;
*/
2.
// ----------------
let obj = {
uNmae:userName,
sex,//对象的key和value变量名一样可以省略
descprition,
sayWord
}
// commonJS 规范
module.exports = obj;
自己写的模块导入的时候,要写路径
系统自己的模块直接写名字就行
模块的查找顺序:先从自己找,再从父级找
top: new 关键字有什么用?
- 创建了一个空对象,并且this变量引用该对象,同时还继承了该函数的原型。
- 属性和方法被加入到this引用的对象中。
- 新创建的对象由this所引用,并且最后隐式的返回this。
2.包(package)
模块(module) 文件
那么 包(package)就是文件夹
本质上,就是一个文件目录,包是由多个模块组成的,也就是模块多了,就放到一个文件夹里面管理,就形成了包。
创建包,需要遵循commonJS规范
必须保证每个包里面,有一个package.json 文件,该文件 存储了与包有关的所有配置信息,比如包的入口,包里面有那些模块
1.创建package.json文件
两种方式:
1.交互式创建
在包下面执行 npm init 指令
2. npm init -y 都是默认配置
创建一个新项目
1.创建 package.json文件
命令:npm init -y
2.安装模块/依赖,也可以指定版本,npm install 模块名@版本号
命令:npm install jquery@3
卸载模块/依赖 npm uni(缩写) 包名
其实在公司里面,直接删掉完事
创建的东西有:node_modules 这个文件夹里面是安装的所有模块/依赖
在package.json 文件中 dependencies字段,存储的是安装的模块信息
引用的时候,包的入口是在package.json 文件当中main配置的
05. fs 文件处理模块
nodejs提供了大量的工具库,其中文件处理的工具库,就是fs模块
// 首先需要先导入fs模块
const fs = require('fs');
nodejs模块级别的全局变量:__dirname 当前执行文件的绝对路径(两个下滑线)
1.fs.readFile() 读取文本文件
fs.readFile() //读取文件
/*
三个参数:
1:path 路径,文件的路径
2:options 配置信息 比如编码方式
3:callback 回调函数,读取文件是不一定成功的。
回调函数中有两个参数:一个返回错误信息,一个返回读取的文件信息
*/
使用方法:
fs.readFile("./book.txt","utf-8",function(err,data){
if(err){
console.log('读取失败',err);
}else{
console.log('读取成功',data);
}
});
2.fs.writeFile() 写入文本文件
fs.writeFile() //写入文本文件
/*
四个参数:
1:路径
2:data 写入文件的内容
3:配置信息 ,两个配置
{
flag:'w', // 默认为w,覆盖之前内容,a是追加内容
encoding:‘utf-8’// 编码方式
}
4:回调函数,写入成功和失败都会告诉你
回调函数一个参数:如果错误会返回错误 err
*/
使用方法:
let str = "寒风孤影,江湖故人,相逢何必曾相识";
// 默认是覆盖文件原来的内容,
fs.writeFile("./book1.txt",str,{
flag:'a', // a 追加内容 默认是w 覆盖操作
encoding:'utf-8' //编码方式
},(err) => {
if(err){
console.log('写入失败',err);
}else{
console.log('写入成功');
}
})
回调函数的执行问题?
回调函数什么时候执行完成? =》 不确定
谁去调用回调函数? =》 别人来调用
目前常见的回调函数场景:
1.定时器
- 请求 ajax/fetch
writeFile / readFile 都是异步的
3.大文件的读写 fs.createReadStream/fs.createWriteStream
1.I/O流,Stream大文件的读写一般采用流 Buffer
2.对大文件的操作 还是fs模块
let readF = fs.createReadStream('路径') // 创建读入流
let writF = fs.createWriteStream('路径') // 创建写入流
// 由于node是事件驱动,所以需要事件监听
// on() 事件监听方法 data 监听读取事件 end 监听读取完毕事件
let count1 = 0; //记录读取次数
// data 监听读取事件 每次只读取 64kb
readF.on('data',function(chunk){
// chunk
count1 ++; // 每次只读取 64kb
console.log('读取次数',count1);
// chunk 里面是每次读取的字节
// console.log('chunk',chunk);
// write(写入的内容,回调函数) 将读取到的数据写入
writF.write(chunk,(err) => {
if(err){
console.log('写入失败',err);
return;
}
console.log('写入成功');
});
});
// end 监听读取完毕事件
readF.on('end',() => {
console.log('读取完毕');
})
4.目录的操作
目录也属于文件操作 ,也需要引入fs模块
fs来源于nodejs环境
fs.mkdir() // 创建目录 注意:文件加名不能和已经有的文件夹名重名
fs.exists() // 判断目录名或者文件名是否存在
fs.readdir() // 读取目录下的所有文件
使用方法
// 创建目录
// 名字不能和已经有的目录名重名
fs.mkdir('./imgs',(err,files) => {
if(err){
return console.log('创建目录失败',err);
}
console.log('创建成功:',files);
})
// 判断目录是否已经存在
fs.exists('./imgs',(bol) => {
console.log('是否存在:',bol);
})
// 判断文件是否已经存在
fs.exists(__dirname+'/imgs/123.jpg',(bol) => {
console.log('文件是否存在:',bol);
})
// 读取目录下的所有文件
fs.readdir(__dirname,(err,files) => {
if(err){
return console.log('读取目录失败:',err);
}
console.log('读取目录成功',files);
})