Node之学习笔记

391 阅读8分钟

1.全局对象

在Node.js中,全局对象换成了global,所有的全局变量(除了global本身)都是global对象的属性。而我们在Node.js中能够直接访问的对象通常都是global的属性,如:console,process等。

全局对象与全局变量

global最根本的作用就是作为全局变量的宿主。按照ECMAScript规范,满足以下条件的变量即为全局变量:

  • 在最外层定义的变量(在Node.js中不存在,因为Nodejs的代码在模块中执行,不存在在最外层定义变量)
  • 全局对象的属性
  • 隐式定义的变量(即未定义而直接进行赋值的变量)

当我们定义一个全局变量的时候,这个全局变量会自动成为全局变量的属性。

1. process(不需要require,是自动可用的)

process对象是一个全局变量,提供当前Node.js进程的相关信息,以及控制当前Node.js进程

  1. process.exit() 从当前Node.js的程序编程式退出
  2. process.env 属性托管在启动过程时设置的所有环境变量
  3. process.argv 命令行参数(格式--name=joe,argv是个数组)
  4. process.nextTick(callback,[...args]) 一旦当前事件轮询队列的任务全部完成,在nextTick队列中的所有callbacks会被依次调用。
2.console

console 模块提供了一个简单的调试控制台,类似于 Web 浏览器提供的 JavaScript 控制台

  1. console.log() 打印
  2. console.error()错误信息
  3. console.warn()警告

2.模块

模块化

  1. 什么是模块化?
    模块化就是有组织地把一个大文件拆成独立并互相依赖的多个小模块,就是在一个js文件中,引入另一个js文件
  2. node.js为什么需要模块化?
    • 低耦合,高内聚:把实现相同功能的代码封装在一起,提高了重复利用率。
    • 方便维护:模块化的管理我们的代码,更佳人性化。
    • 防止代码冲突:通过闭包的形式来保护里面的变量不受外界的干扰
  3. 如何实现模块化
    • 前端方式 require.js sea.js
    • 后端方式 commonJS
  4. commonjs 的特性规范
    • 引入 require
    • 暴露 export
    • 对象 module(是一个标识符)

模块化应用

  1. require
    require 用于导入其他 Node 模块,其参数接受一个字符串代表模块的名称或路径,通常被称为模块标识符
  • 系统核心模块
    require('fs')

    查找规则默认先从缓存中查找
    在本地引入查找,找到了之后再缓存起来

  • 第三方模块
    require('jquery')

    默认先从缓存中查找
    查找的规则
    node_modules->jquery文件夹->package.json->main指定的路径

  • 自定义模块
    require(相对路径)

    默认先从缓存中查找
    查找规则
    先查找文件夹 --> package.json --> main --> 指定的文件

  1. exports
    写一个 Node 模块,并导出其中内容
  2. module
    module 模块对象

3.包

什么是包?
把多个模块结合在一起,放在一个文件夹中,这个文件夹就是包

包的规范

  1. 组成
    • package.json 项目的清单
    • lib / src 存放源码
    • dist 存放打包后的文件提供给外界使用
    • test 测试文件
    • doc 文档 readme.md
  2. package.json 定义规范
    • name 包的名称
    • version 版本号
    • main 包的入口路径
    • scripts 定义一组可以运行的节点脚本
    • dependencies设置npm安装为依赖项的软件包列表
    • devDependencies设置npm安装为开发依赖项的软件包列表
      ps: 可以使用 npm init -y 快速生成

包的管理工具

  1. 分类
    • yarn
    • cnpm
    • npm
  2. 安装node_modeules依赖
    • npm i
    • yarn i
    • cnpm i
  3. 卸载包 npm uninstall
  4. 安装的后缀
    • -S 全写 --save 项目打包上线的时候需要 比如 jquery bootstrap
    • -D 全写 --save-dev 开发环境需要 比如 less上线的时候不需要使用
  5. 第三方包的查找规则
    • 先在node_modules 中查找相应的包名
    • 在改包中查找package.json
    • 在查找main属性对应的文件
    • 试运行该文件

4.事件模块(events)

使用events模块构建类似系统的选项。,提供了EventEmitter用于处理事件的类。

  1. 初始化
    const EventEmitter = require('events')
    const eventEmitter = new EventEmitter()
    
    该对象展示了on和emit方法,以及其他方法。
    • emit 用于触发事件
    • on 用于添加将在事件触发时执行的回调函数
  2. 事件触发及参数传递
    eventEmitter.on('start', number => {
       console.log(`started ${number}`)
     })
     
     eventEmitter.emit('start', 23)
    
  3. EventEmitter对象还公开了其他几种与事件进行交互的方法
    • once():添加一次性监听器
    • removeListener()/ off():从事件中删除事件监听器
    • removeAllListeners():删除事件的所有侦听器

5.文件模块(fs)

fs 模块是文件操作的封装,它提供了文件的读取、写入、更名、删除、遍历目录、链接等 POSIX 文件系统操作,且所有的方法都有异步和同步的形式
const fs = require('fs')

  1. fs.readFile(path,[options], callback)
    在Node.js中读取文件的最简单方法是使用fs.readFile()方法,向其传递文件路径,编码和将与文件数据一起调用的回调函数
    1. 异步方法的最后一个参数都是一个回调函数。传给回调函数的参数取决于具体方法,但回调函数的第一个参数都会保留给异常。如果操作成功完成,则第一个参数会是 null 或 undefined。
      const fs = require('fs')
      
      fs.readFile('/Users/joe/test.txt', 'utf8' , (err, data) => {
        if (err) {
          console.error(err)
          return
        }
        console.log(data)
      })
      
    2. 当使用同步方法时,任何异常都会被立即抛出。可以使用 try/catch 来处理异常,或让异常向上冒泡(脚本的执行将阻塞,直到文件操作成功)
      const fs = require('fs')
      
      try {
        const data = fs.readFileSync('/Users/joe/test.txt', 'utf8')
        console.log(data)
      } catch (err) {
        console.error(err)
      }
      
  2. fs.writeFile()
    用Node.js编写文件
  3. fs.appendFile()
    将数据附加到文件。如果文件不存在,则创建
  4. fs.copyFile()
    复制文件
  5. fs.readdir()
    读取目录的内容
  6. fs.unlink()
    删除文件或符号链接
  7. fs.rmdir()
    删除文件夹

6.路径模块(path)

该path模块提供了许多功能来访问文件系统并与文件系统进行交互(windows,linux不同必须考虑到这种差异)
const path = require('path')

  1. path.join()
    连接路径的两个或多个部分:
    const name = 'joe'
    require('path').join('/', 'users', name, 'notes.txt') //'/users/joe/notes.txt'
    
  2. path.basename()
    返回路径的最后一部分。第二个参数可以过滤掉文件扩展名
    require('path').basename('/test/something') //something
    require('path').basename('/test/something.txt') //something.txt
    require('path').basename('/test/something.txt', '.txt') //something
    
  3. path.dirname() 返回路径的目录部分
    require('path').dirname('/test/something') // /test
    require('path').dirname('/test/something/file.txt') // /test/something
    
  4. path.relative() 接受2个路径作为参数。根据当前工作目录,返回从第一个路径到第二个路径的相对路径。
    require('path').relative('/Users/joe', '/Users/joe/test.txt') //'test.txt'
    require('path').relative('/Users/joe', '/Users/joe/something/test.txt') //'something/test.txt'
    
  5. path.resolve() 可以使用来获得相对路径的绝对路径计算path.resolve()
    // 通过指定第二个参数,resolve将使用第一个作为第二个的基础
    path.resolve('tmp', 'joe.txt') //'/Users/joe/tmp/joe.txt' if run from my home folder
    // 如果第一个参数以斜杠开头,则表示它是绝对路径:
    path.resolve('/etc', 'joe.txt') //'/etc/joe.txt'
    

7.操作系统模块(os)

该模块提供了许多功能,可用于从底层操作系统和程序运行所在的计算机上检索信息并与其进行交互。
const os = require('os')

  1. os.cpus()
    返回有关系统上可用CPU的信息
  2. os.homedir()
    将路径返回到当前用户的主目录'/Users/joe'
  3. os.hostname()
    返回主机名
  4. os.tmpdir()
    返回指定的临时文件夹的路径
  5. os.type()
    标识操作系统
    • Linux
    • Darwin 在macOS上
    • Windows_NT 在Windows上

8.http模块

HTTP核心模块是Node.js网络的关键模块,提供了一些属性和方法以及一些类。
const http = require('http')

方法
  1. http.createServer() 返回http.Server该类的新实例。
    const server = http.createServer((req, res) => {
      //handle every single request with this callback
    })
    
  2. http.request()
    向服务器发出HTTP请求,创建http.ClientRequest该类的实例
  3. http.get()
    与相似http.request(),但自动将HTTP方法设置为GET,并req.end()自动调用。
  1. http.Agent
    Node.js创建http.Agent该类的全局实例,以管理HTTP客户端(Node.js HTTP网络的关键组成部分)的连接持久性和重用。
  2. http.ClientRequest
    http.ClientRequest在http.request()或http.get()调用时创建一个对象。
    收到response响应后,将以响应(以http.IncomingMessage实例作为参数)来调用事件。
    可以通过两种方式读取响应的返回数据:
    • 调用response.read()方法
    • 在response事件处理程序中,可以为事件设置事件侦听器data,以便可以侦听流入的数据。
  3. http.Server
    使用创建新服务器时,通常会实例化并返回此类http.createServer()。
    拥有服务器对象后,就可以访问其方法:
    • close() 阻止服务器接受新连接
    • listen() 启动HTTP服务器并监听连接
  4. http.ServerResponse
    作为request触发事件的第二个参数传递。在代码中用作res
    const server = http.createServer((req, res) => {
      //res is an http.ServerResponse object
    })
    
    将始终在处理程序中调用的方法是end(),它将关闭响应,消息已完成,服务器可以将其发送给客户端。必须在每个响应上调用它。
    • setHeader('headername', value) 设置HTTP标头值
    • getHeader('headername') 获取已设置的HTTP标头
  5. http.IncomingMessage
    用来访问响应
    • 利用statusCode和statusMessage方法
    • 标头使用其headers方法或rawHeaders
    • 使用HTTP方法的method方法

node服务器

  1. 引入http模块
    const http = require('http')
  2. 创建node服务
    const server = http.createServer()
  3. 监听路径请求
    server.on('request',(request,response)=>{ 
      //request提供请求的详细信息。通过它,我们访问请求标头和请求数据。
      //response用于填充我们要返回给客户端的数据。
        response.statusCode = 200
        response.end('hello nodejs')
      })
    
  4. 给服务设置端口号
    server.listen(3000,()=>{
      console.log('http://127.0.0.1:3000')
    })