1. node知识汇总01

107 阅读7分钟
  • Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境

1.1 如何在 node.js 中执行 JavaScript 代码

  • 打开终端
  • 输入node 要执行的 js 文件的路由

1.2 什么是 fs 文件系统模块

  • 在 JavaScript 代码中,使用 fs 模块操作文件,则需要导入

    const fa = require('fs');
    
  • fs.readFile() 方法,用来读取指定文件中的内容

    const fs = require('fs');
    
    // fs.readFile(path[, options], callback)
    /** 
     * 参数1:必选参数,字符串,表示文件路径
     * 参数2:可选参数,表示一什么编码格式来读取文件   'utf8'
     * 参数3:必选参数,文件读取完成后,通过毁掉函数拿到读取结果
     */
     fs.readFile('./files/text1.txt', 'utf8', (err, dataStr) =>{
      // err 表示失败之后的结果, dataStr 表示成功之后的结果
      // 如果读取成功,则 err 的值为 null;读取失败,则 err 为错误对象, dataStr 为 undefined
      if(err) {
        return console.log('文件写入错误', err.message);
      }
      // 如果读取成功,dataStr 则是打印成功的结果
      console.log(dataStr);
    });
    
  • fs.writeFile() 方法,用来想指定的文件中写入内容

    const fs = require('fs');
    
    // fs.writeFile(file, data[, option], callback);
    /**
     * 参数1:必选参数,需要指定一个文件路径的字符串,表示文件的存放路径
     * 参数2:必选参数,表示要写入的内容
     * 参数3:可选参数,表示以什么格式写入文件内容,默认是 utf8
     * 参数4:必选参数,文件写入完成后的回调函数
     */
     fs.writeFile('./files/text2.txt', '我是要添加的内容', function(err){
     // 如果写入成功,则 err 的值为 null
     // 如果写入失败,则 err 的值为错误对象
     if(err) {
     	return console.log('文件写入错误', err.message);
      }
       console.log('文件写入成功');
     });
    
  • fs.writeFile() 只能用来创建文件,不能用来创建路径

  • 重复调用 fs.writeFile() 写入同一个文件,新写入的内容会覆盖之前的旧内容

1.3 文件存放路径的处理方法

  • 使用 __dirname 进行读取,其表示当前文件所处的目录

    const fs = require('fs');
    
    fs.readFile(__dirname + '/files/text1.txt', 'utf8', function(err, dataStr){
      if(err) {
        return console.log('读取文件失败!' + err.message);
      }
      console.log('读取文件成功!', dataStr);
     });
    
  • path 路径模块 (注:今后凡是涉及路径凭借都要使用 path.join() 方法进行处理,不要直接使用 + 进行字符串拼接)

    // 在 JavaScript 代码中,使用 path 模块操作文件,则需要导入
    const path = require('path');
    
    const pathStr = path.join('/a', '/b/c', '../', '/d', '/e');
    console.log(pathStr) // 输出 \a\b\c\d\e  注:'../'表示上一级
    
    const pathStr2 = path.join(__dirname, './file/1.txt');
    console.log(pathStr2) // 输出 当前文件所处目录\file\1.text
    
  • path.basename() 可以从一个文件路径中,获取到文件的名称部分

    // path.basename(path[, ext])
    /**
     * 参数1:必选参数,表示一个路径的字符串
     * 参数2:可选参数,表示文件扩张名
     * 返回:表示路径中的最后一部分
     */
    const fpath = '/a/b/c/index.html';
    
    const fullName = path.basename(fname);
    console.log(fullName); // 输出 index.html
    
    const nameWithoutExt = path.basename(fpath, '.html');
    console.log(nameWithoutExt); // 输出 index
    
  • path.extname() 可以获取路径中的扩展名部分

    const path = require('path');
    // path.extname(path);
    /**
     * path:必选参数,表示一个路径的字符串
     * 返回:返回得到的扩展名字符串
     */
    const fpath = '/a/b/c/index.html';
    
    const fext = path.extname(fpath); 
    console.log(fext); // 输出 .html
    

1.4 http 模块

  • 什么是客户端、什么是服务器

    • 在网络节点中,负责消费资源的电脑,叫做客户端
    • 负责对外提供网络资源的电脑,叫做服务器
  • IP 地址

    • IP 地址就是互联网上每台计算机的唯一地址,因此 IP 地址具有唯一性,如果把"个人电脑" 比作 "一台电话",那么 "IP 地址" 就相当于 "电话号码" ,只有知道对方 IP 地址的前提下,才能与对应的电脑之间进行数据通信
    • IP 地址的格式:通常用 "点分十进制" 表示成 (a,b,c,d) 的形式,a,b,c,d 都是 0 ~ 255 之间的十进制整数
      • 例如:百度的 IP 地址:在 Window 终端中输入 ping www.baidu.com 就能查看到百度的 IP 地址,IP 地址也能直接访问网页
      • 自己电脑也是一台服务器,自己电脑(web 客户端)访问自己电脑(服务器),可以在浏览器上输入 127.0.0.1
    • 域名和域名服务器
      • IP 地址和域名是一一对应的关系,这份对应关系存放在一种叫做域名服务器(DNS Domain name serve) 的电脑中,使用者只需通过记好的域名访问对应的服务器即可,对应的转换工作由域名服务器实现。因此,域名服务器就是提供 IP 地址和域名之间转换转换服务的服务器
    • 端口号
      • 每一台 web 服务都对应一个唯一的端口号,客户端发送过来的网络请求,通过端口号,可以被准确地交给对应的 web 服务器进行处理
    • 注意:
      • 每个端口号不能同时被多个 web 服务占用
      • 在实际应用中, URL 中的 80 端口可以被省略
  • http 模块

    • Node.js 官方提供的、用来创建 web 服务器的模块。通过 http 模块提供的 **http.createServer() **方法,就能把一台普通的电脑变成 web 服务器,从而对外提供 web 资源服务

    • 创建基本的 web 服务器

      • 导入 http 模块
      • 创建 web 服务器实例
      • 为服务器实例绑定 request 事件,监听客户端的请求
      • 启动服务器
      // 1. 导入 http 模块
      const http = require('http');
      
      // 2. 创建 web 服务器实例
      const server = http.createServer();
      
      // 3. 为服务器实例绑定 request 事件,监听客户端的请求
      server.on('request', (req, res) => {
        /**
         * req 是请求对象,它包含了与客户端相关的数据和属性
         * req.url 是客户端请求的 URL 地址
         * req.method 是客户端的 method 请求类型
         */
         const str = `Your request url is ${req.url}, and request method is ${req.method}`
         console.log(str);
      
         /**
          * res.end() 方法,向客户端反应一些内容,并结束这次请求的处理过程
          */
          res.end(str)
      });
      
      // 4. 启动服务器
      server.listen('80', () => {
        console.log('server running at http://127.0.0.1:80');
      });
      
    • res 对象

      • 设置响应头,中文的话在客户端浏览器是会乱码的
      • res.setHeader()res.writeHead()
        /**
         * 如果不设置响应头,中文的话在客户端浏览器是会乱码的
         * 设置响应头的两种方式: 
         * res.setHeader('Content-type', 'text/plain;charset=utf-8')
         * res.writeHead(200, {'Content-Type':'text/html;charset=UTF8'});
         */
          res.writeHead(200, {'Content-Type': 'text/plain;charset=utf-8'}); // text/plain 就是普通文本,纯文本无法解析标签
          res.setHeader('Content-type', 'text/html;charset=utf-8'); // text/html 显示html的格式在页面上,可以解析标签
          const str = `<h1>您请求的 url 地址是 ${req.url}, 请求的 method 类型是 ${req.method}</h1>`;
          console.log(str);
         /**
          * res.end() 方法,向客户端反应一些内容,并结束这次请求的处理过程
          */
          res.end(str)
      

    1.5 Node.js 中的模块化

  • 内置模块 (内置模块是由 Node.js 官方提供的,例如 fs 、path 、http等)

  • 自定义模块 (用户创建的每个 .js 文件,都是自定义模块)

  • 第三方模块 (由第三方开发出来的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要先下载)

    // 1. 加载内置的 fs 模块
    const fs = require('fs');
    
    // 2. 加载用户的自定义模块
    const custom = require('./custom.js');
    
    // 3. 加载第三方模块 (关于第三方模块的下载和使用,会在后面的课程中进行专门的讲解)
    const moment = require('moment');
    
  • 模块作用域

    • 和函数作用于类似,在自定义模块中定义的变量、方法等成员,只能在当前模块内被访问,这种模块级别的访问限制,叫做模块作用域

    • 好处:防止全局变量污染的问题

    • module 对象:可以向外共享模块作用域中的成员,存储了和当前模块有关的信息,打印如下:

    01module.png

    • 时刻谨记,require() 模块时,得到的永远是 module.exports 指向的对象:
    module.exports === exports // true
    

1.6 npm

  • 包的语义化版本规范,例如 2.24.2

    • 第一位数字:大版本
    • 第二个数字:功能版本
    • 第三个数字:Bug 修复版本
    • 注意:版本号提升的规则:只要前面的版本号增长了,则后面的版本号归零
  • 解决 npm 下载包速度慢的问题

02npm.png

  • 切换淘宝镜像源
// 查看当前的下包镜像源
npm config get registry

// 将下包的镜像源切换为淘宝镜像源
npm config set registry=https://registry.npm.taobao.org/
  • nrm切换镜像源的小工具
// 全局安装 nrm 包管理器
npm i nrm -g
// 查看所有可用的镜像源
nrm ls
// 将下包的镜像源切换为 taobao 镜像
nrm use taobao