NODE

180 阅读10分钟

NODE

常用指令

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

目录

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

环境变量(window系统变量)

当我们在命令行窗口打开一个文件,或调用一个程序时,系统会首先在当前目录下寻找文件程序

如果找到了则直接打开

如果没有找到则会一次到环境变量path的路径中寻找,知道找到位置

如果没找到则报错

所以我们可以将一些经常需要访问得程序和文件的路径添加到path中

这样我们就可以在任意位置来访问这些文件和程序了

进程和线程

进程

  • 进程负责为程序的运行提供必备的环境
  • 进程就相当于工厂中的车间

线程

  • 线程是计算机中最小的计算单位,线程负责执行进程中的程序
  • 线程就相当于工厂中的工人

单线程

  • JS是单线程

多线程

Node.js

  • Node.js是一个能够在服务器端运行的JavaScript的开放源代码,跨平台JavaScript运行环境
  • Node采用Google开发的V8引擎运行js代码,使用事件驱动 非阻塞和异步I/O模型等技术来提高性能,可优化应用程序的传输量和规模
  • Node大部分基本模块都用JavaScript编写,在Node出现之前,JS通常作为客户端程序设计语言使用,以JS写出的程序常在用户的浏览器上运行
  • 目前,Node已被IBM Microsoft Tahoo! Waalmart Groupon SAP LinkedIn Rakuten PayPal Voxer GoDaddy等企业采用

I/O

  • I/O操作指的是对磁盘的读写操作

Node

  • Node是对ES标准的一个实现,Node也是一个JS引擎
  • 通过Node可以使js代码在服务器端执行
  • Node仅仅对ES标准进行了实现,所以在Node中不包含DOM和BOM
  • Node中可以使用所有的内建对象
    • String number Boolean Math Date RegExp Function Object Array而BOM和DOM都不能使用
    • 但是可以使用console也可以使用定时器(setTimeout() setInterval())
  • Node可以在后台来编写服务器
    • Node编写服务器都是单线程的服务器
    • 进程
      • 进程就是一个一个的工作计划
    • 线程
      • 线程是计算机最小的运算单位,线程是干活的
  • 传统的服务器都是多线程的
    • 每进来一个请求,就创建一个线程去处理请求
  • Node的服务器单进程
    • Node处理进程时是单线程,但是在后天拥有一个I/O线程池

模块化

  • 在Node中,一个js文件就是一个模块
  • 在Node中,每一个js文件中的js代码都是独立运行在一个函数中,而不是全局作用域,所以一个模块中的变量和函数在其他模块中无法访问

向外部暴露属性或方法

  • 在js文件中 想要一个变量被其他模块所访问
  • 我们可以通过exports来向外部暴露变量和方法
  • 只需要将需要暴露给外部的变量或方法设置为exports属性即可

CommonJS规范

  • CommonJS规范的提出,主要是为了弥补当前JavaScript没有标准的缺陷
  • CommonJS规范为JS指定了一个美好的愿景,希望JS 能够在任何地方运行
  • CommonJS对模块的定义十分简单
    • 模块引用
    • 模块定义
    • 模块识别

定义一个模块math

- 在该模块中提供两个方法
add(a,b);//求两个数的和
mul(a,b);//求两个数的积

引入其他的模块

  • 在node中,通过require()函数来引入外部的模块,require()可以传递一个文件的路径作为参数,node将会自动根据该路径来引入外部模块,这里路径,如果使用相对路径,必须以.或..开头
  • 使用require()引入模块以后,该函数会返回一个对象,这个对象代表的是引入的模块
  • 我们使用require()引入外部模块时,使用的就是模块表识,我么可以通过模块标识来找到指定的模块

image.png

image.png

实际上模块中的代码都是包装在一个函数中执行的,并且在函数执行时,同时传递进了5个实参

  • exports
    • 该对象用来将变量或函数暴露到外部
  • require
    • 函数,用来引入外部的模块
  • module
    • module代表的是当前模块本身
    • exports就是module的属性
    • 既可以使用exports导出,也可以使用module.exports导出
  • _filename
    • 当前文件的完整路径
  • _dirname
    • 当前文件所在文件夹的命令

image.png

image.png

image.png

NPM

  • CommonJS包规范是理论,NPM是其中一种实践
  • 对于Node而言,NPM帮助其完成了第三方模块的发布、安装和依赖等,借助NPM、Node与第三方模块之间形成了很好打的一个生态系统

NPM命令

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

安装node npm

www.liaoxuefeng.com/wiki/102291…

通过npm下载的包都放到node_modules文件夹中,我们通过npm下载的包,直接通过包名引入即可

  • node在使用模块名字来银日模块时,他会首先在当前目录的node_modules中寻找是否含有该模块
  • 如果有则直接使用,如果没有则去上一级目录的node_modules中寻找
  • 如果有则直接使用,如果没有则再去上一级目录寻找,回到找到为止
  • 直到找到磁盘的根目录,如果依然没有,则报错

Buffer(缓冲区)

  • Bufferde的结构和数组很像,操作的方法也和数组类似
  • 数组中不能存储二进制的文件,而buffer就是专门用来存储二进制数据
  • 使用buffer不需要引入模块,直接使用即可
  • 在buffer中存储的都是二进制数据,但是显示时都是以16进制的形式显示
  • buffer中每一个元素的范围是从00-ff

image.png

  • 从结构上看Buffer非常像一个数组,它的元素为16进制的两位数

  • 实际上一个元素就表示内存中的一个字节

  • 实际上Buffer中的内存不是通过JavaScript分配的,而是在底层通过C++申请的

  • 也就是我们可以直接通过Buffer来创建内存中的空间

  • 创建一个指定大小的buffer

  • buffer构造函数都是不推荐使用的

image.png

image.png

image.png

image.png

image.png

输入0xaa 十六进制 直接输出aa

输入大于255的数字 变成2进制超过8位 只保留后8位

只要数字在控制台或页面中输出一定是10进制

  • 如果不输出为指定10进制则无法分辨为什么进制的结果 image.png

强制输出16进制(数字做不到 其他字符可以)

image.png

遍历

image.png

遍历结果为十进制

Buffer.allocUnsafe(size) 创建一个指定大小的buffer,但是buffer中可能含有敏感数据

image.png

图片中后面也是有数据的

  • allocUnsafe 性能比 alloc好
  • 因为alloc在创建内存时候会清空数据 而allocUnsafe不会

总结Buffer

  • Buffer.from(str) 将一个字符串转换为buffer
  • Buffer.alloc(size) 创建一个指定大小的Buffer
  • Buffer.allocUnsafe(size) 创建一个指定大小的Buffer,但是可能包含敏感数据
  • buf.toString()将缓冲区中的数据转换为字符串

image.png

fs(文件系统)

  • 在Node中,与文件系统的交互是非常重要的,服务器的本质就将本地的文件发送给远程的客户端
  • Node通过fs模块来和文件系统进行交互
  • 该模块提供了一些标准文件访问API来打开、读取、写入文件,以及与其交互
  • 要使用过fs模块,首先需要对其进行加载 -const fs = require("fs");

image.png

  • 文件系统(File System)
    • 文件系统简单来说就是通过Node来操作系统中的文件
    • 使用文件系统,需要先引入fs模块,fs是核心模块,直接引入不需要下载

image.png

同步和异步调用

  • fs模块中的所有的额操作都有两种形式课供选择同步和异步

  • 同步文件系统会阻塞程序的执行,也就是除非操作完毕,否则不会向下执行代码.

  • 异步文件系统不会阻塞程序的执行,而是在操作完成时,通过回调函数将结果返回 image.png

  • 同步文件的写入

    • 手动操作的步骤
      • 1.打开文件

        • fs.openSync(path,flags[, mode])
          • path 要打开文件的路径
          • flags 打开文件要做的操作类型
            • r 只读的
            • w 可写的
          • mode 设置文件的操作权限,一般不传
        • 返回值:
          • 该方法会返回一个文件的描述符作为结果,我们可以通过描述符来对文件进行各种操作
      • 2.向文件中写入内容

        • fs,writeSync(fd,string[,position[,encoding]])
          • fd 文件的描述符,需要传递要写入的文件的描述符
          • sring 要写入的内容
          • position 写入起始位置 一般不传
          • encoding 写入的编码 默认utf-8 一般不传
      • 3.保存并关闭文件

        • fs.closeSync(fd)
          • fd 要关闭的文件的描述符

image.png

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

image.png

  • 简单文件的写入
    • fs.writeFile(file,data[,options],callback)
    • fs.writeFileSync(file,data[,options])
      • file 要操作的文件的路径

      • data 要写入的数据

      • option 选项,可以对写入进行一些设置

      • callback 当写入完成以后执行的函数

image.png

image.png1

异步文件没有返回值 只要有返回值一定是同步的

image.png

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

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

文件读取

  • 1.同步文件读取
  • 2.异步文件读取
  • 3.简单文件读取
    • fs.readFile(path[,options],callback)
    • fs.readFileSync(path[,options])
      • path 要读取的文件的路径
      • options 读取的选项
      • callback 回调函数,通过回调函数将读取到内容返回
        • err 错误对象
        • data 读取到的数据,会返回一个Buffer

image.png

- 获取一个文件并在指定位置创建并写入
  • 4.流入文件读取
    • 流式文件读取也适用于一些比较大的文件,可以分多次将文件读取到内存中

image.png

简单写法:

image.png

其他操作

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png