【学习前端第四十八课】 nodeJS

nodeJS

关于node.js

node.js可以理解成JavaScript在服务器上面的运行环境

我们之前学习的JavaScript都有这么一个概念,JavaScript是运行在浏览器上面的,它必须依托网页html存在,没有网页的存在就没有它,但是后期人们将JavaScript运行在浏览器上面的chrome v8移植到了服务器端,这样就可以保证我们js代码能够在服务器运行,而不需要依赖浏览器和网页了

node.js它只是一个平台,不关于任何标准,只要是JavaScript语言就可以在上面运行

为什么前端要学node.js

按照常规开发思维来讲,前端是不需要学习后台的具体知识,只需要掌握一些基本后端原理就行,但是现在的主流开发模式已经趋向于前后端分离开发,在这种模式下,后端不需要负责前端的事情,但是前端却要掌握一些后端的知识,比如SQL语句,一些简单的数据库设计,http请求原理等等…

在以前,我们后端知识都是以php为主来学习的,但是php毕竟是一个独立后端编程语言,学习成本比较高,所以我们当node出现的时候,我们就选择了用node来替代php

node.js具备的先天性优势:

1、非阻塞的io

2、使用事件驱动

3、天生的高并发处理能力

4、单线程运行

node里面只有ES,没有DOM和BOM

nodeJS基础

当我们安装好了之后,我们可以在终端种输入命令node -v查看,如果显示了版本号就说明安装成功了

安装成功之后,我们如果想运行一个node.js,非常简单,执行一个命令

node 文件名.js

在node.js种不能运行DOM和BOM,只能运行ECMAScript

window.alert("a");    //报错,因为window是BOM里面的对象,不能在node里面使用

CommonJS模块化

在之前我们的学习的ES6中,使用的是ESModule的模块化规范,这是ES的通用规范,基本90%的js都是遵循这个规范的,但是我们学习的node不是的,它执行的是CommonJS规范

模块化开发的现在标准:

1、浏览器及ECMA执行的通用规范 ESModule

2、node.js平台使用的CommonJS

规范导入导出
ESModuleimportexport default
CommonJSrequire()module.exports

现在我们看一下代码:

Person.js

class Person{
    constructor(userName,sex){
        this.userName = userName;
        this.sex = sex;
    }
    sayHello(){
        console.log(`大家好,我叫${this.userName},我的性别是${this.sex}`);
    }
}

//export default Person
module.exports = Person;

Student.js

const Person = require("./Person.js");

class Student extends Person{
    constructor(userName,sex,age){
        super(userName,sex);
        this.age = age;
    }
}

let s1 = new Student("张三","男",20);
s1.sayHello();

当我们 执行 node Student.js 就可以正确执行

CommonJS的模块导入

现在我们来研究一下

a.js

console.log("我是a文件");

b.js

console.log("我是b文件");
require("./a.js");
require("./a.js");
require("./a.js");
require("./a.js");
require("./a.js");
require("./a.js");

当我们导入多次的时候,我们发现最终a.js的代码只执行了一次

require方法导入一个模块之后,它会把这个模块缓存下来,下次再去导入的时候,则直接从缓存里面拿 ,在上面的代码里面,表面看起来是导入了6次,但是实际上只有第一次的导入是真的导入了,剩下5次都是从缓存里面拿的

CommonJS的缓存

如果我们希望某一个模块不放在缓存里面,我们可以在这个模块的后面添加以下代码

delete require.cache[module.filename];

这个时候再去执行就是导入了6次

CommonJS的模块导出

导入与导出应该是一对,所以在nodejs中如果导出我们可以使用以下两种方式

1、module.exports 直接导出

2、exports 指针导出

a.js

let userName = 123;
module.exports = userName;

b.js

const userName = require("./a.js");
console.log(userName);

完成了一个基本的导入导出

在CommonJS的模块化规范当中,每个文件都会有个专门用于导出的属性叫做 module.exports ,我们在require中实际导入的是 module.exports 当中的东西

module.exports

在每个文件里面,都有一个负责导出的对象,这个对象叫做 module.exports 如果我们直接打印这个对象我们会看到一个空对象 {}

let userName = "张三";
let sex = "男";

let obj = {
	userName,
	sex
}

module.exports = obj;

如果我们需要同时导出多个变量,我们可以把这些变量封装成对象,然后导出

还有这种情况

const obj = require("./a.js");
//或者
const {userName,sex} = require("./a.js");   //ES6解构方式导入
console.log(userName);
exports

在CommonJS的规范里面,真正负责导出的是module.exports,但是还有一个指针是指向了这个module.exports

console.log(module.exports === exports);

a.js

let userName = 123;
let age = 18;
module.exports = userName;
exports = age;

b.js

const obj = require("./a.js");
console.log(obj);    //userName;

在上面的代码里卖弄,既有module.exports又有exports,那么b里面导入的到底是谁?

始终记住一句化,真正导出的是module.exports的东西,所以结果是userName

node平台的常用模块

nodejs它是一个运行平台,与浏览器一样用于运行js的,同理在nodejs上面,它会内置一些模块提供给我们使用

path模块

path模块是nodejs平台自带的模块化开发使用的一个模块,遵循的是CommonJS规范

console.log(__dirname);    //代表当前js文件所属文件的所在目录路径
console.log(__filename);   //代表当前js文件的路径

上面两个内置变量是nodejs平台上面最基本的点,也是经常会使用到的变量

其中对与路径这块,nodejs平台有专门的模块去处理,这个模块就是path模块,它不用下载,在安装nodejs里面就已经自带了

const path = require("path");   //导入nodejs的path模块用于处理路径问题

1、path.join()把路径链接起来

let p1 = path.join(__dirname,"/txt");
console.log(p1);

2、path.extname() 获取某个路径的后缀名

let p1 = path.extname(__filename);
console.log(p1);

let p2 = path.join(__dirname,"/txt/abc.txt");
let p3 = path.extname(p2);
console.log(p3);

这个方法可以帮助我们判断文件的类型,方便我们以后是express框架里面做文件上传的时候判断文件类型

3、path.isAbsolute() 判断当前路径是否是绝对路径

let p1 = path.isAbsolute(__dirname);
console.log(p1);

这个方法的优点在于后面文件上传的时候,我们可以储存一个文件的真实路径

4、path.resolve() 将相对路径转换成绝对路径

let p1 = path.resolve("/txt/abc.txt");
console.log(p1);

FS模块

一般有了路径之后就会有文件,我们可以通过某一个路径去找到某一个文件

在nodejs当中,有一个专门用来读写文件的模块就是FS模块(file system)

1、fs.existsSync() 判断一个路径是否真实存在,可以判断文件夹路径,也可以判断文件路径

let p1 = path.join(__dirname,"/txt/abc.txt");
let result = fs.existsSync(p1);
console.log(result);

let p2 = path.join(__dirname,"/img");
let result2 = fs.existsSync(p2);
console.log(result2);

2、fs.rmdirSync() 删除一个空文件夹

注意:这个方法只能删除空文件夹,如果文件夹里面有文件夹或文件,则删除失败

let p1 = path.join(__dirname,"/img");
let result = fs.existsSync(p1);
if(result){
    fs.rmdirSync(p1);
}else{
    console.log("这个文件夹路径不存在");
}

3、fs.unlinkSync() 根据路径删除文件

let p1 = path.join(__dirname,"/txt/abc.txt");
let result = fs.existsSync(p1);
if(result){
    fs.unlinkSync(p1);
}else{
    console.log("这个文件不存在")
}

4、fs.copyFileSync(oldpath,newpath) 复制文件

let oldPath = path.join(__dirname,"/txt/abc.txt");
let newPath = path.join(__dirname,"/img/abc.txt");

fs.copyFileSync(oldPath,newPath);

5、fs.renameSync(oldpath,newpath) 文件重命名

注意:文件重命名的时候,一定要检测旧的路径是否存在,避免报错

let oldPath = path.join(__dirname,"/txt/abc.txt");
let newPath = path.join(__dirname,"/txt/hahaha.txt");

fs.renameSync(oldPath,newPath);

6、fs.mkdirSync() 根据路径创建一个文件夹

let p1 = path.join(__dirname,"/css");
let result = fs.existsSync(p1);
if(!result){
    fs.mkdirSync(p1);
}else{
    console.log("当前路径已经存在")
}

7、fs.readdirSync() 读取某一个路径下的文件夹的内部信息

let arr = fs.readdirSync(__dirname + "/txt");
console.log(arr);

这里的内部信息指的是该文件夹内的文件夹与文件信息(文件名)

应用:我们现在要获取到文件夹内部的信息,然后把文件夹内的txt文件删除掉,怎么做?

for(let item of arr){
    //第一步:把路径拼出来
    let tempPath = path.join(__dirname + "/txt",item);
    //第二步:把路径的后缀名拿出来进行判断看是不是txt
    if(path.extname(tempPath) == ".txt"){
        fs.unlinkSync(tempPath);
    }else{
        console.log("当前文件夹内没有txt文件");
    }
}

8、fs.statSync() 读取路径状态

let p1 = path.join(__dirname,"img");
let sta = fs.statSync(p1);
console.log(sta);

会打印

Stats {
  dev: 509938464,
  mode: 16822,
  nlink: 1,
  uid: 0,
  gid: 0,
  rdev: 0,
  blksize: 4096,
  ino: 1125899906976857,
  size: 0,
  blocks: 0,
  atimeMs: 1664250327041.3667,
  mtimeMs: 1664248502908.9805,
  ctimeMs: 1664248502908.9805,
  birthtimeMs: 1664248425771.7454,
  atime: 2022-09-27T03:45:27.041Z,
  mtime: 2022-09-27T03:15:02.909Z,
  ctime: 2022-09-27T03:15:02.909Z,
  birthtime: 2022-09-27T03:13:45.772Z
}

在上面弄得文件信息对象当中,有方法可以判断当前路径指向的是文件夹还是文件

sta.isFile()   //判断当前路径是否是一个文件
sta.isDirectory()  //判断当前路径是否是一个文件夹
练习案例

现在有了这个判断之后,我们可以在一个文件夹下面删除文件或者文件夹了

//txt目录下有文件夹和文件,如果我要把下面的内容都删除了,怎么办?
//第一步:设置路径
let p1 = path.join(__dirname,"/txt");
//第二步:判断文件夹路径是否存在
let result = fs.existsSync(p1);
if(result){
    //第三步:读取文件夹内部的信息
    let info = fs.readdirSync(p1);
    //第四步:遍历里面的信息
    for(let item of info){
        //第五步:拼接txt文件夹内的路径
        let tempPath = path.join(p1,item);
        //第六步:读取这个路径的状态,判断是文件还是文件夹
        let status = fs.statSync(tempPath);
        //第七步:开始判断文件夹还是文件,根据类型使用对饮的删除方法
        if(status.isDirectory()){
            fs.rmdirSync(tempPath);
        }else if(status.isFile()){
            fs.unlinkSync(tempPath);
        }
    }
}

9、fs.readFileSync() 通过路径读取一个文件的内容

let p1 = path.join(__dirname,"/txt/aaa.txt");
let result = fs.readFileSync(p1,{encoding:"utf8"});
console.log(result);

10、fs.writeFileSync() 把内容写入到一个文件里面

let p1 = path.join(__dirname,"/txt/aaa.txt");
let str = `今天中午没吃饭`;
fs.writeFileSync(p1,str,{encoding:"utf8"});

OS模块

os模块主要是用于获取当前操作系统的相关信息

os.freemem() 获取当前电脑的空闲内容

os.totalmem() 获取当前电脑的总内容

os.cpus() 获取当前电脑的cpu信息,它返回的是一个集合

os.networkInterfaces() 获取当前电脑的ip地址信息

os.platform() 获取当前电脑的平台信息

os.hostname() 获取当前电脑的主机名

os.homedir() 获取到当前电脑的主目录

os.tmpdir() 获取当前系统的临时目录

  • 25
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Node.js前端面试中经常被提及,以下是一些常见的面试问题和回答: 1. 你对Node.js的理解是什么? Node.js是一个基于Chrome V8引擎的JavaScript运行时环境,可以用于构建高性能、可扩展的网络应用程序。它使用单线程和非阻塞I/O模型,适用于处理并发的I/O密集型任务。 2. Node.js的优点和缺点是什么? Node.js的优点包括高性能、可扩展性、异步编程模型、丰富的包管理器等。缺点包括CPU计算能力受限、单线程可能导致阻塞等。 3. Node.js适用于哪些应用场景? Node.js适用于需要处理大量并发的I/O操作,例如实时聊天应用、实时数据推送、物联网、代理服务器等。 4. Node.js有哪些全局对象? 例如,`process`对象用于访问进程相关信息,`fs`模块用于文件系统操作,`Buffer`用于处理二进制数据,`stream`模块用于处理流数据等。 5. process对象在Node.js中的作用是什么? process对象提供了许多方法和属性,用于管理Node.js进程,例如获取命令行参数、设置环境变量、退出进程等。 6. fs模块在Node.js中的作用是什么? fs模块用于处理文件系统操作,例如读取文件、写入文件、删除文件、创建目录等。 7. Buffer在Node.js中的作用是什么? Buffer用于处理二进制数据,例如在网络传输中,可以使用Buffer来读取和写入数据。 8. stream在Node.js中的作用是什么? Stream模块用于处理流数据,可以在读取和写入大型数据时提供高效的内存管理。 9. Node.js文件查找的优先级和require方式的文件查找策略是什么? Node.js文件查找的优先级是先查找缓存,然后查找内置模块,再查找文件模块或文件夹中的package.json,最后查找index.js或index.json。require方式的文件查找策略是先查找node_modules文件夹中的模块,然后逐级向上查找。 10. 中间件是什么概念? 中间件是位于客户端和服务器之间的一个处理请求和响应的环节,可以对请求和响应进行处理和转换。 11. 如何实现JWT鉴权机制? JWT鉴权机制可以通过在服务端生成一个带有用户信息和签名的令牌,并在客户端将令牌存储起来。每次请求时,客户端将令牌发送给服务端,服务端校验令牌的合法性并解析用户信息。 12. 如何设计分页功能,前后端如何交互? 分页功能可以通过在服务端查询数据时设置偏移量和限制数量来实现,客户端可以向服务端发送包含页码和每页数量的请求参数。服务端根据请求参数计算出偏移量和限制数量,从数据库中获取相应的数据返回给客户端。 13. Node.js性能监控和优化可以通过使用性能分析工具和调优技术来实现,例如使用Node.js内置的`profiler`模块进行性能分析,使用缓存和异步编程模型来提高性能,使用负载均衡和集群来实现扩展等。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [前端面试题之NodeJS系列](https://blog.csdn.net/qq_48701993/article/details/127223784)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值