0


Node.js基础【学习笔记】

一、命令行窗口、CMD窗口、终端、shell

1、打开命令行窗口

#mermaid-svg-S0niOoYZi1WPuV9Y {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-S0niOoYZi1WPuV9Y .error-icon{fill:#552222;}#mermaid-svg-S0niOoYZi1WPuV9Y .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-S0niOoYZi1WPuV9Y .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-S0niOoYZi1WPuV9Y .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-S0niOoYZi1WPuV9Y .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-S0niOoYZi1WPuV9Y .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-S0niOoYZi1WPuV9Y .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-S0niOoYZi1WPuV9Y .marker{fill:#333333;stroke:#333333;}#mermaid-svg-S0niOoYZi1WPuV9Y .marker.cross{stroke:#333333;}#mermaid-svg-S0niOoYZi1WPuV9Y svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-S0niOoYZi1WPuV9Y .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-S0niOoYZi1WPuV9Y .cluster-label text{fill:#333;}#mermaid-svg-S0niOoYZi1WPuV9Y .cluster-label span{color:#333;}#mermaid-svg-S0niOoYZi1WPuV9Y .label text,#mermaid-svg-S0niOoYZi1WPuV9Y span{fill:#333;color:#333;}#mermaid-svg-S0niOoYZi1WPuV9Y .node rect,#mermaid-svg-S0niOoYZi1WPuV9Y .node circle,#mermaid-svg-S0niOoYZi1WPuV9Y .node ellipse,#mermaid-svg-S0niOoYZi1WPuV9Y .node polygon,#mermaid-svg-S0niOoYZi1WPuV9Y .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-S0niOoYZi1WPuV9Y .node .label{text-align:center;}#mermaid-svg-S0niOoYZi1WPuV9Y .node.clickable{cursor:pointer;}#mermaid-svg-S0niOoYZi1WPuV9Y .arrowheadPath{fill:#333333;}#mermaid-svg-S0niOoYZi1WPuV9Y .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-S0niOoYZi1WPuV9Y .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-S0niOoYZi1WPuV9Y .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-S0niOoYZi1WPuV9Y .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-S0niOoYZi1WPuV9Y .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-S0niOoYZi1WPuV9Y .cluster text{fill:#333;}#mermaid-svg-S0niOoYZi1WPuV9Y .cluster span{color:#333;}#mermaid-svg-S0niOoYZi1WPuV9Y div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-S0niOoYZi1WPuV9Y :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

        windows 
      


        cmd 
      

2、常用的指令

dir列出当前目录下的所有文件cd 目录名进入到指定的目录md 目录名创建一个文件夹rd 目录名****删除一个文件名

3、目录

.表示当前目录**. .**表示上一级目录

4、环境变量(windows系统中变量)

  • 当用命令行窗口打开一个文件或调用一个程序时,系统会现在当前目录下寻找文件/程序,如果找到则直接运行,如果没找到则会在 path 路径中依次查找,直到找到为止,如果最终都没找到,则报错。
  • 因此可以将常用程序或者文件的路径添加到 path 中,这样就能在任意目录下访问它们。

二、进程与线程

  • 进程 进程负责为程序的运行提供必备的环境; 进程相当于工厂中的车间
  • 线程 线程是计算机中的最小的计算单位,线程负责执行进程中的程序; 线程相当于工厂中的工人
  • 单线程 JS是单线程
  • 多线程

三、node简介

简介:

  • Node.js 是一个能够在服务器端运行的JavaScript的开源代码、跨平台JavaScript运行环境。
  • Node采用Google开发的V8引擎运行 js 代码,使用事件驱动、非阻塞和异步I/O模型等技术来提高性能,可优化应用程序的传输量和规模。

用途:

  • Web 服务 API,比如 REST
  • 实时多人游戏
  • 后端的 Web 服务,例如跨域、服务器端的请求
  • 基于 Web 的应用
  • 多客户端的通信,如即时通信

四、模块化

简介:

  • 在 node 中,一个 js 文件就是一个模块化
  • 在 node 中,每一个 js 文件中的 js 代码都是独立运行在一个函数当中,而不失全局作用域

详解:

  • 在 node 中,通过 require() 函数来引入外部的模块
  • require() 可以传递一个文件的路径作为参数,node将会自动根据该路径来引入外部模块,如果是相对路径,必须以 . 或 … 开头
  • 使用 require() 引入后,该函数会返回一个对象,这个对象代表的是引入的模块
  • 使用 require() 引入外部模块时,使用的就是模块标识,我们可以通过模块标识来找到指定的模块
  • 模块分为两大类: 核心模块 —— 由node引擎踢狗(模块的名字) 文件模块 —— 由用户自己创建 (文件的路径)
  • 在 node 中有一个全局对象 global,它的作用和网页中的window类似
  • 在全局中创建的变量都会作为 global 的属性保存 在全局中创建的函数都会作为 global 的方法保存
  • 当 node 执行模块中的代码时,它会首先在代码前后添加如下代码:function(exports, require, module, _filename, _dirname){......}
  • 实际上模块中的代码都是包裹在一个函数中执行的,并且在函数执行时,同时传递了5个实参:- exports: 将变量或函数暴露到外部- require: 函数,用来引入外部的模块- module: 代表的是当前模块本身(export就是module的属性)- _filename: 当前模块的完整路径- _dirname: 当前模块所在文件夹的路径

exports 和 module.exports

  • 通过 exports 只能使用 . 的方式来向外暴露内部变量(exports.xxx = xxx)
  • 而 module.exports 既可以通过 . 的形式,也可以直接赋值(module.exports.xxx = xxx / module.export = {})

五、包

  • 包结构 —— 用于组织包中的各种文件
  • 包描述文件 —— 描述包的相关信息,以供外部读取分析

1、包结构

  • 包实际上就是一个压缩文件,解压以后还原为目录,包含: - package.json描述文件- bin 可执行二进制文件- lib js代码- doc 文档- test 单元测试

2、包描述文件

  • 包描述文件用于表达非代码相关的信息,它是一个 JSON 格式的文件 —— package.json,位于包的根目录下,是包的重要组成部分。
  • package.json 中的字段: - name、description、version、keywords、maintainers、contributors、bugs、licenses、repositories、dependencies、homepage、os、cpu、engine、builtin、directories、implements、scripts、author、bin、main、devDependencies。

六、NPM (Node Package Manager)

1、NPM 命令

npm -v查看npm版本npm version查看所有模块的版本npm帮助说明npm search 包名搜索模块包npm install(i) 包名在当前目录安装包npm install 包名 -g全局模式安装包npm install 包名 --save安装包并添加到依赖中npm install下载当前项目所依赖的包npm remove® 包名删除一个模块npm install 包名 -registry=地址从镜像源安装npm config set registry 地址****设置镜像源

2、node 搜索包的流程

  • 通过 npm 下载的包都放到 node_modules 文件夹中;
  • 通过 npm 下载的包,直接通过包名引入即可;
  • node 在使用模块名字来引入模块时,它会首先在当前目录的 node_modules 文件中寻找是否含有该模块,如果有,则直接使用,否则则去上一级目录的 node_modules 文件寻找,直到找到为止。如果依然找不到,则报错。

七、Buffer 缓冲区

  • Buffer 的结构和数组很像,操作的方法也和数组类似
  • 数组中不能存储二进制文件,而 Buffer 就是专门用来存储二进制文件
  • 使用 Buffer 不需要引入模块
  • Buffer 中存储的都是二进制,但是计算机显示都是以十六进制形式显示(数据过长) buffer 中每一个元素的范围都是从 00 ~ ff (0 ~ 255)(00000000 - 11111111)
  • Buffer 的大小一旦确定,则不能修改,Buffer 实际上是对底层内存的直接操作
Buffer.from(str)

将一个字符串转换为**

Buffer.alloc(size)

创建一个指定大小的 buffer

Buffer.allocUnsaafe(size)

创建一个指定大小的 buffer,但是可能包含敏感数据

buf.toString()

**将缓冲区中的数据转换为字符串

八、fs(文件系统)

1、文件系统(File System)

  • 通过 Node 来操作系统中的文件
  • 使用文件系统需要引入 fs 模块(fs 是核心模块)
  • fs 中的所有操作都有两种形式可供选择:同步和异步
  • 同步文件系统会阻塞程序的执行,也就是除非操作完毕,否则不会向下执行代码
  • 异步文件系统不会阻塞程序的执行,而是在操作完成时,通过回调函数将结果返回

2、同步文件的写入

  • 手动操作的步骤#mermaid-svg-hEXtFLIb6BuMJOHG {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hEXtFLIb6BuMJOHG .error-icon{fill:#552222;}#mermaid-svg-hEXtFLIb6BuMJOHG .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-hEXtFLIb6BuMJOHG .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-hEXtFLIb6BuMJOHG .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-hEXtFLIb6BuMJOHG .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-hEXtFLIb6BuMJOHG .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-hEXtFLIb6BuMJOHG .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-hEXtFLIb6BuMJOHG .marker{fill:#333333;stroke:#333333;}#mermaid-svg-hEXtFLIb6BuMJOHG .marker.cross{stroke:#333333;}#mermaid-svg-hEXtFLIb6BuMJOHG svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-hEXtFLIb6BuMJOHG .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-hEXtFLIb6BuMJOHG .cluster-label text{fill:#333;}#mermaid-svg-hEXtFLIb6BuMJOHG .cluster-label span{color:#333;}#mermaid-svg-hEXtFLIb6BuMJOHG .label text,#mermaid-svg-hEXtFLIb6BuMJOHG span{fill:#333;color:#333;}#mermaid-svg-hEXtFLIb6BuMJOHG .node rect,#mermaid-svg-hEXtFLIb6BuMJOHG .node circle,#mermaid-svg-hEXtFLIb6BuMJOHG .node ellipse,#mermaid-svg-hEXtFLIb6BuMJOHG .node polygon,#mermaid-svg-hEXtFLIb6BuMJOHG .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-hEXtFLIb6BuMJOHG .node .label{text-align:center;}#mermaid-svg-hEXtFLIb6BuMJOHG .node.clickable{cursor:pointer;}#mermaid-svg-hEXtFLIb6BuMJOHG .arrowheadPath{fill:#333333;}#mermaid-svg-hEXtFLIb6BuMJOHG .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-hEXtFLIb6BuMJOHG .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-hEXtFLIb6BuMJOHG .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-hEXtFLIb6BuMJOHG .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-hEXtFLIb6BuMJOHG .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-hEXtFLIb6BuMJOHG .cluster text{fill:#333;}#mermaid-svg-hEXtFLIb6BuMJOHG .cluster span{color:#333;}#mermaid-svg-hEXtFLIb6BuMJOHG div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-hEXtFLIb6BuMJOHG :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 打开文件 向文件中写入内容 保存并关闭文件 1. 打开文件:fs.openSync(path, flags[, mode])- path 要打开的文件路径- flags 打开文件要做的操作类型 - r 只读的- w 可写的- mode 设置文件的操作权限(一般不传)返回值:- 该方法会返回一个文件的描述符作为结果2. 向文件中写入内容:fs.writeSync(fd, string[, position[, encoding]])- fd 文件的描述符,需要传递要写入文件的描述符- string 要写入的内容- position 写入的起始位置- encoding 写入的编码,默认 utf-83. 保存并关闭文件fs.closeSync(fd)- fd 要关闭的文件的描述符

3、异步文件的写入

  1. fs.open(path, flags[, mode], callback)- 用来打开一个文件- 异步调用的方法,结果都是通过回调函数返回的- 回调函数两个参数 - err 错误对象,如果没有错误则为 null- fd 文件的描述符
  2. fs.write(fd, string[, position[, encoding]], callback)- 用来异步写入一个文件
  3. fs.close(fd, callback)- 用来关闭文件

4、简单文件写入

fs.writeFile(file, data[, options], callback)
fs.writeFileSync(file, data[, options])
  • file 要操作文件的路径
  • data 要写入的数据
  • options 选项,可以对写入进行一些设置 - encoding- mode- flag
  • callback 当写入完成以后执行的设置

5、打开状态(flag)

模式说明r读取文件,文件不存在则出现异常r+读写文件,文件不存在则出现异常rs在同步模式下打开文件用于读取rs+在同步模式下打开文件用于读写w打开文件用于写操作,如果不存在则创建,如果存在则截断wx打开i文件用于写操作,如果存在则打开失败w+打开文件用于读写,如果不存在则创建,如果存在则截断wx+打开文件用于读写,如果存在则打开失败a打开文件用于追加,如果不存在则创建ax打开文件用于追加,如果路径存在则失败a+打开文件进行读取和追加,如果不存在则创建该文件ax+打开文件进行读取和追加,如果路径存在则失败

6、流式文件写入

同步、异步、简单文件的写入都不适合大文件的写入,性能较差,容易导致内存溢出

fs.createWriteStream(path[, options])
  • 可以用来创建一个可写流
  • path 文件路径
  • options 配置的参数

7、文件的读取

  1. 简单文件的读取fs.readFile(path[, options], callback)``````fs.readFileSync(path[, options])- path 要读取文件的路径- options 读取的选项- callback 回调函数,通过回调函数将读取到的内容返回 - err 错误对象- data 读取到的数据,会返回一个 Buffer
  2. 流式文件的读取fs.createReadStream(path[, options]) pipe() 可将可读流中的内容直接输出到可写流中

8、其他操作

  • 验证路径是否存在fs.existsSync(path)
  • 获取文件信息fs.stat(path, callback)``````fs.statSync(path)- stat: - size 文件的大小- isFile() 是否是一个文件- isDirectory() 是否是一个文件夹
  • 删除文件fs.unlink(path, callback)``````fs.unlinkSync(path)
  • 列出文件fs.readdir(path[, options], callback)``````fs.readdirSync(path[, options])- 读取一个目录的目录结构 - files 是一个字符串数组,每一个元素就是一个文件夹或文件的名字
  • 截断文件fs.truncate(path, len, callback)``````fs.truncateSync(path, len)- 截断文件,将文件修改为指定的大小
  • 建立目录fs.mkdir(path[, options], callback)``````fs.mkdirSync(path[, mode])- 创建一个目录
  • 删除目录fs.rmdir(path, callback)``````fs.rmdirSync(path)
  • 重命名文件和目录fs.rename(oldPath, newPath, callback)``````fs.renameSync(oldPath, newPath)
  • 监视文件更改写入fs.watchFile(filename[, options], listener)- listener 回调函数,当文件发生变化时,回调函数会执行 - curr 当前文件的状态- prev 修改前文件的状态- 这两个对象都是 stat 对象
标签: node.js 学习 笔记

本文转载自: https://blog.csdn.net/kuiini/article/details/140671821
版权归原作者 kuiini 所有, 如有侵权,请联系我们删除。

“Node.js基础【学习笔记】”的评论:

还没有评论