Node.js入门指南(一)
目录
Node.js入门
什么是Node.js
Node.js的作用
Node.js安装
Node.js编码注意事项
Buffer(缓冲器)
定义
使用
fs模块
概念
文件写入
文件读取
文件移动与重命名
文件删除
文件夹操作
查看资源状态
路径问题
path模块
Node.js入门
什么是Node.js
何为Node.js,官方的定义是:Node.js是一个开源的,跨平台的JavaScript运行环境。简单的来讲,Node.js就是一款应用程序,是一款软件,它可以运行JavaScript。
Node.js的作用
它的主要功能有:开发服务器应用,让我们可以通过向服务器发送请求,服务器可以返回我们想要的数据。
开发工具类应用:我们熟悉的Webpack,Vite以及Babel,可以提高我们前端的开发效率与质量。而它们三者都是借助Node.js的开发能力而实现的。
开发桌面端应用,比如我们熟悉的VScode,它是借助electron框架实现的,而electron又是借助与Node.js开发出来的。
Node.js安装
如何进行安装呢?可以打开Nodo.js对应的官网:Node.js。会出现以下的界面,然后可以点击进行安装,一般都是点击右边的,因此左边的版本会长期维护,也是官方推荐使用的。

但是由于Node.js官网是在国外,因此可以下载会比较慢,也可以直接访问国内的网站:Node.js 中文网。下载方式相同,还可以查看并选择之前的所有的Node.js版本CNPM Binaries Mirror。点击对应自己想要的版本下载即可。一路next,下载完毕之后,打开命令窗口,输入node -v来进行判断是否安装成功,若有输出版本即表示安装成功。
Node.js编码注意事项
在浏览器中的JavaScript包括两大块,其一为核心语法:ECMAScript。其二为Web API,包括:DOM,BOM,AJAX,Storage,console,定时器以及alter等。而在Node.js中的JavaScript,核心语法也是ECMAScript,不同点在于它有属于自己的Node API,包括:fs,url,http,util,console,定时器,path等。
在Node.js中不能使用BOM和DOM的API,可以使用console和定时器API。Node.js中的顶级对象为global,也可以用globalThis访问顶级对象。
Buffer(缓冲器)
定义
使用
创建的方式有如下的三种:第一种使用Buffer.alloc。创建的时候会申请内存空间,传入的数字为需要申请多少字节数的Buffer,它会让每一个字节的值都为0。
第二种使用Buffer.allocUnsafe,使用它是需要注意,用它创建的buffer中可能会存在旧的数据,可能会影响执行的结果,但是它的创建速度会比使用Buffer.alloc快。
第三种是使用Buffer.from进行创建,它可以传入字符串或者数组来进行创建Buffer。在控制台输出的是十六进制。
// 1.alloc
let buf=Buffer.alloc(10);
console.log(buf);//<Buffer 00 00 00 00 00 00 00 00 00 00>
// 2.allocUnsafe
let buf2=Buffer.allocUnsafe(10);
console.log(buf2);//<Buffer 00 00 00 00 00 00 00 00 00 00>
// 3.from
let buf3=Buffer.from('hello');
let buf4 = Buffer.from([105, 108, 111, 118, 101, 121, 111, 117]);
console.log(buf3)//<Buffer 68 65 6c 6c 6f>
console.log(buf4)//<Buffer 69 6c 6f 76 65 79 6f 75> 我们可以使用toString方法来将Buffer转为字符串。toString默认是按照utf-8编码方式来进行转换的。
let buf = Buffer.from([105, 108, 111, 118, 101, 121, 111, 117]);
console.log(buf.toString())//iloveyou 除此之外,我们也可以读取以及修改Buffer,通过使用[ ]的方式来对数据进行处理。
let buf = Buffer.from('hello');
// 读取下标为4的字符
console.log(buf[4])//111
// 对其进行修改
buf[4]=98;
// 读取对应的字符串
console.log(buf.toString())//hellb 注意: 如果修改的数值超过255 ,则超过 8 位数据会被舍弃 。 一个 utf-8 的字符一般 占 3 个字节。
fs模块
概念
文件写入
// 导入fs模块
const fs=require("fs");
// 写入文件
fs.writeFile('./study.txt','今天学习Node.js',err=>{if(err){console.log("写入失败");return;}console.log('写入成功');
}); 当我们执行js文件之后,我们就可以在同级的目录下创建一个名为study.txt,里面编写了“今天学习Node.js”的txt文件。若本身该目录下就有对应的文件,则它会重新编写里面的内容。
我们还可以采取writeFileSync进行文件的写入,相比于writeFile方式,它是一种同步的执行方式,并且它只有三个参数,没有最后一个回调函数的参数。写法如下:
// 导入fs模块
const fs=require("fs");
fs.writeFileSync('./study.txt','这是一个同步的写入') 补充:可能有一些小伙伴对同步以及异步还不太清楚,说白了同步就是顺序的执行,主线程 会等待其他线程的执行结果,然后再继续执行主线程的代码,效率较低。而异步不是顺序执行的。主线程不会等待其他线程的执行结果,直接执行后续的主线程代码,效率较高。
那你有没有想过,若我们想要在原本的文件中继续编写东西,不覆盖原先编写的内容,那我们该如果实现呢?我们可以使用到前面介绍的writeFile方法,在第三个参数中设它的配置项为:{flag:'a'}即可实现文件内容的追加。
// 导入fs模块
const fs=require("fs");
// 写入文件
fs.writeFile('./study.txt','并且发布一篇博客!',{flag:'a'},err=>{if(err){console.log("写入失败");return;}console.log('写入成功');
}); 除了使用以上的方式进行追加,还可以使用appendFile / appendFileSync 进行追加写入。appendFile 语法与 writeFile 语法完全相同。都是异步的,而appenFileSync则与writeFileSync相似,都是同步的。不同点在与一个是写入,一个是进行追加。
// 导入fs模块
const fs=require("fs");
// 使用appendFile写入文件
fs.appendFile('./study.txt','并且发布一篇博客!',err=>{if(err){console.log("写入失败");return;}console.log('写入成功');
});
//使用appendFileSync
fs.appendFileSync('./study.txt','然后睡觉');
// 若想要换行使用/r/n
fs.appendFileSync('./study.txt','\r\n然后睡觉'); 接一下在介绍一种文件写入方法:createWriteStream 流式写入,流式写入方式适用于大文件写入或者频繁写入的场景, writeFile 适合于 写入频率较低的场景。
// 导入fs模块
const fs=require("fs");
// 创建写入流对象
const ws=fs.createWriteStream('./study.txt');
// write
ws.write("前天学习Webpack\r\n");
ws.write("昨天学习ES6\r\n");
ws.write("今天学习Node.js\r\n");
//关闭通道,可写可不写
ws.close(); 最后文件写入有哪些应用场景呢?下载文件、安装软件 、保存程序日志,如 Git 、编辑器保存文件 、视频录制都使用到了文件的写入。当需要持久化保存数据的时候,应该想到文件写入。
文件读取
Node.js也提供了一些读取文件的方式,第一种方式可以使用readFile 异步读取,其接收三个参数:path 文件路径 ,options 选项配置(可写可不写) ,callback 回调函数。回调函数有两个参数,err以及data,第一个是接受读取失败的对象,第二个参数则是读取到的文件的数据。
第二种方式可以使用readFileSync同步读取进行同步读取。只接受两个参数:path 文件路径 ,options 选项配置(可选)。
// 导入fs模块
const fs=require("fs");
// 使用readFile进行异步读取
fs.readFile('./study.txt',(err,data)=>{if(err){console.log('读取失败');return;}// 使用toString()转为了字符串console.log(data.toString());
});
//使用readFileSync同步读取
let data=fs.readFileSync('./study.txt');
console.log(data.toString()); 除了以上的两种方式可以读取文件,还可以使用createReadStream 流式读取。它接受两个参数:path 文件路径 ,options 选项配置(可选)。它不是将文件中的数据一次性读取出来的,而是一块一块地进行读取。适用于读取大的文件,对大文件进行处理。它每一个chunk可以读取65536字节(64KB)大小的数据。
// 导入fs模块
const fs=require("fs");
// 创建读取流对象
const rs=fs.createReadStream("./study.txt");
//绑定data事件
rs.on('data',chunk=>{console.log(chunk.length);
})
//绑定end事件。可选
rs.on('end',()=>{console.log('读取完毕');
}); 文件读取的应用场景有很多,比如:电脑开机 、程序运行 、编辑器打开文件 、查看图片 、播放视频 、播放音乐 、Git 查看日志 、上传文件 以及查看聊天记录等。
文件移动与重命名
// 导入fs模块
const fs=require("fs");
// 调用rename方法修改名字
fs.rename('./study.txt','./play.txt',err=>{if(err){console.log('操作失败');return;}console.log('操作成功');
});
//调用rename方法来移动文件
fs.rename('./play.txt','./课程代码/paly.txt',err=>{if(err){console.log('操作失败');return;}console.log('操作成功');
});// 调用renameSync方法修改名字
fs.renameSync('./paly.txt','./study.txt'); 文件删除
当我们需要删除文件时,我们可以使用Node.js提供的unlink 方法以及rm方法。两个方法的接受参数都相同:path 文件路径 ,callback 操作后的回调。它们都有对应的同步方法:unlickSync以及rmSync。在此就只对它们的异步方法进行演示。
// 导入fs模块
const fs=require("fs");
//调用unlink方法
fs.unlink('./study.txt',err=>{if(err){console.log("删除失败");return;}console.log("删除成功")
});
//调用rm方法
fs.rm('./study.txt',err=>{if(err){console.log("删除失败");return;}console.log("删除成功")
});
文件夹操作
// 导入fs模块
const fs=require("fs");
//使用mkdir创建单个文件夹
fs.mkdir('./Node.js',err=>{if(err){console.log('创建失败');return;}console.log('创建成功')
});
//使用递归创建
fs.mkdir('./a/b/c',{recursive:true},err=>{if(err){console.log('创建失败');return;}console.log('创建成功')
}); // 导入fs模块
const fs=require("fs");
fs.readdir('./',(err,data)=>{if(err){console.log('读取失败');return;}console.log(data);
}); 
// 导入fs模块
const fs=require("fs");
//使用rmdir进行删除
fs.rmdir('./Node.js',err=>{if(err){console.log('删除失败');return;}console.log('删除成功');
})
//使用rmdir进行递归删除(不推荐)
fs.rmdir('./a',{recursive:true},err=>{if(err){console.log('删除失败');return;}console.log('删除成功');
})
//使用rm进行递归删除(推荐)
fs.rm('./a',{recursive:true},err=>{if(err){console.log('删除失败');return;}console.log('删除成功');
}) 查看资源状态
// 导入fs模块
const fs=require("fs");
//stat方法
fs.stat('./study.txt',(err,data)=>{if(err){console.log(err);return;}// 输出资源的状态console.log(data);//用于判断该资源是否为文件console.log(data.isFile());//用于判断该资源是否为文件夹console.log(data.isDirectory());
}) 路径问题
// 导入fs模块
const fs=require("fs");
//相对路径
fs.writeFileSync('./index.html','N-A');
//绝对路径
fs.writeFileSync('D:/index.html','N-A') // 导入fs模块
const fs=require("fs");
let data = fs.readFileSync(__dirname + '/study.txt');
console.log(data); path模块
| API | 说明 |
| path.resolve | 拼接规范的绝对路径 常用 |
| path.sep | 获取操作系统的路径分隔符 |
| path.parse | 解析路径并返回对象 |
| path.basename | 获取路径的基础名称 |
| path.dirname | 获取路径的目录名 |
| path.extname | 获得路径的扩展名 |
// 导入fs模块
const fs=require("fs");
const path=require('path');
//resolve 会使得路径的分隔符统一,解决了__dirname拼接之后路径不太规范的问题。
console.log(path.resolve(__dirname,'./index.html'));//D:\编程\前端\index.html
//sep
console.log(path.sep);// windows下为 \ Linux下为 /
//parse方法可以对路径进行解析,返回一个对象:root,dir,base,ext以及name
//先通过__filename获取当前文件的绝对路径
let str=__filename;
console.log(path.parse(str));//返回一个对象:root,dir,base,ext以及name
//basename
console.log(path.basename(str));//index.js
//dirname
console.log(path.dirname(str));//D:\编程\前端
//extname
console.log(path.extname(str));//.js
好啦!Node.js的介绍就先到这里了,接下来还会持续更新!拜拜!!
相关文章:
Node.js入门指南(一)
目录 Node.js入门 什么是Node.js Node.js的作用 Node.js安装 Node.js编码注意事项 Buffer(缓冲器) 定义 使用 fs模块 概念 文件写入 文件读取 文件移动与重命名 文件删除 文件夹操作 查看资源状态 路径问题 path模块 Node.js入门 什么是Node.js …...
使用Grpc实现高性能PHP RPC服务
文档:Quick start | PHP | gRPC 下面将介绍使用 Grpc 和 Protobuf 实现高性能 RPC 服务的具体步骤: 1. 安装 Grpc 和 Protobuf 首先需要安装 Grpc 和 Protobuf。可以从官网下载相应的安装包(Supported languages | gRPC)或通过…...
二、爬虫-爬取肯德基在北京的店铺地址
1、算法框架解释 针对这个案例,现在对爬虫的基础使用做总结如下: 1、算法框架 (1)设定传入参数 ~url: 当前整个页面的url:当前页面的网址 当前页面某个局部的url:打开检查 ~data:需要爬取数据的关键字&…...
linux驱动开发.之spi测试工具spidev_test源码(一)
同i2c-tools工具类似,spidev_test是用来测试SPI BUS的用户态程序,其源码存在kernel目录下的tools下,具体为tools\spi\spidev_test.c。buildroot同样也提供名为spidev_test的package,可以直接进行编译,方便用户调试spi总…...
基于材料生成算法优化概率神经网络PNN的分类预测 - 附代码
基于材料生成算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于材料生成算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于材料生成优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神…...
Go——二、变量和数据类型
Go 一、Go语言中的变量和常量1、Go语言中变量的声明2、如何定义变量方式1:方式2:带类型方式3:类型推导方式定义变量方式4:声明多个变量总结 3、如何定义常量4、Const常量结合iota的使用 二、Golang的数据类型1、概述2、整型2.1 类…...
合并区间问题
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1: 输入:intervals [[1,…...
2023 年最新 MySQL 数据库 Windows 本地安装、Centos 服务器安装详细教程
MySQL 基本概述 MySQL是一个流行的关系型数据库管理系统(RDBMS),广泛应用于各种业务场景。它是由瑞典MySQL AB公司开发,后来被Sun Microsystems收购,最终被甲骨文公司(Oracle Corporation)收购…...
每天一道算法题(十)——获取和为k的子数组
文章目录 1、问题2、示例3、解决方法(1)方法1——双指针 总结 1、问题 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 2、示例 示例 1: 输入&#x…...
2023年亚太杯数学建模思路 - 案例:最短时间生产计划安排
文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 最短时…...
在vscode中使用Latex:TexLive2023
安装TexLive2023及配置vscode可参考https://zhuanlan.zhihu.com/p/166523064 然后编译模板 .tex文件时,出现以下几个错误: 1. ctexbook找不到字体集 d:/texlive/2023/texmf-dist/tex/latex/ctex/ctexbook.cls:1678: Class ctexbook Error: CTeX fo…...
Unity开发之C#基础-File文件读取
前言 今天我们将要讲解到c#中 对于文件的读写是怎样的 那么没接触过特别系统编程小伙伴们应该会有一个疑问 这跟文件有什么关系呢? 我们这样来理解 首先 大家对电脑或多或少都应该有不少的了解吧 那么我们这些软件 都是通过变成一个一个文件保存在电脑中 我们才可以…...
深度学习之二(前馈神经网络--Feedforward Neural Network)
概念 前馈神经网络(Feedforward Neural Network)是一种最基本的神经网络结构,也被称为多层感知器(Multilayer Perceptron,MLP)。它的特点是信息只在网络中单向传播,不会形成环路。每一层神经元的输出都作为下一层神经元的输入,没有反馈回路。 结构: 前馈神经网络通…...
2023全球边缘计算大会深圳站-核心PPT资料下载
一、峰会简介 边缘计算,是指在靠近物或数据源头的一侧,采用网络、计算、存储、应用核心能力为一体的开放平台,就近提供最近端服务。其应用程序在边缘侧发起,产生更快的网络服务响应,满足行业在实时业务、应用智能、安…...
【亚太杯思路助攻】2023年第十三届APMCM亚太地区大学生数学建模竞赛——(文末领取方式)
2023年第十三届APMCM亚太地区大学生数学建模竞赛——来啦!!! 大家准备好了吗?别担心,【数模加油站】会像数模国赛、研赛一样,第一时间提供无偿解题思路、代码、参考文献等资料帮助大家。 祝各位小伙伴都能…...
vue开发一、在Vue中引入ElementUI二、在Vue中使用阿里图标库
目录 一、在Vue中引入ElementUI1. 安装ElementUI2. 引入ElementUI3. 使用ElementUI组件 二、在Vue中使用阿里图标库1. 在阿里图标库中选择图标2. 下载图标3. 引入图标4. 使用图标 总结 一、在Vue中引入ElementUI ElementUI是一种基于Vue的第三方UI库,提供了许多常用…...
基于SpringBoot+Mybatis plus+React.js实现条件选择切换搜索功能
笔记/朱季谦 在写React前端逻辑时,经常遇到可以切换不同条件的列表查询功能,例如下边截图这样的,其实,这块代码基本都一个逻辑,可以一次性将实现过程记录下来,待以后再遇到时,直接根据笔记复用…...
【STM32】W25Q64 SPI(串行外设接口)
一、SPI通信 0.IIC与SPI的优缺点 https://blog.csdn.net/weixin_44575952/article/details/124182011 1.SPI介绍 同步(有时钟线),高速,全双工(数据发送和数据接收各占一条线) 1)SCK:时钟线--&…...
如何使用Mondo Rescue备份及恢复Linux系统(制作ISO镜像,成功恢复)
环境: CentOS Linux release 7.9.2009 mondoarchive v3.3.0-r3762 PVE 虚拟机 问题描述: 如何使用Mondo Rescue备份及恢复Linux系统, 制作ISO镜像, 整个系统将全部备份并恢复? Mondo Rescue是一个开源的备份和恢复工具,旨在提供快速、可靠的系统备份和恢复解决方案。…...
Java如何获取泛型类型
泛型(Generic) 泛型允许程序员在强类型程序设计语言中编写代码时使用一些以后才指定的类型,在实例化时作为参数指明这些类型。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。Ada、Delphi、Eiffel、Java、C#、F#、Swift 和 Vis…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...
算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...
对象回调初步研究
_OBJECT_TYPE结构分析 在介绍什么是对象回调前,首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例,用_OBJECT_TYPE这个结构来解析它,0x80处就是今天要介绍的回调链表,但是先不着急,先把目光…...
【Qt】控件 QWidget
控件 QWidget 一. 控件概述二. QWidget 的核心属性可用状态:enabled几何:geometrywindows frame 窗口框架的影响 窗口标题:windowTitle窗口图标:windowIconqrc 机制 窗口不透明度:windowOpacity光标:cursor…...
JUC并发编程(二)Monitor/自旋/轻量级/锁膨胀/wait/notify/锁消除
目录 一 基础 1 概念 2 卖票问题 3 转账问题 二 锁机制与优化策略 0 Monitor 1 轻量级锁 2 锁膨胀 3 自旋 4 偏向锁 5 锁消除 6 wait /notify 7 sleep与wait的对比 8 join原理 一 基础 1 概念 临界区 一段代码块内如果存在对共享资源的多线程读写操作…...
