node.js 基础知识

前言:这篇博客是跟着黑马程序员的 node.js 入门课程写下的。
链接地址: b站黑马程序员node.js课程
结合自己的理解,做了部分补充,可放心食用。
以下是正文:

黑马程序员nodejs 入门

目标

  • 知道什么是node.js
  • 知道node.js 可以做什么
  • 说出node.js 中JavaScript 的组成部分
  • 使用 fs 模块读写操作文件
  • 使用 path 模块处理路径
  • 使用 http 模块写一个基本的 web 服务器

回顾与思考

浏览器中的 JavaScript 组成部分
  1. JavaScript 核心语法

    包括 变量、数据类型、循环、分支、判断、函数、作用域、this 等

  2. WebAPI

    包括 DOM 操作、 BOM 操作、 基于XMLHttpRequest 的Ajax 操作 等

为什么JavaScript可以在浏览器中被执行

待执行的js代码 -> 被 JavaScript 解析引擎 解析

不同的浏览器使用不同的JavaScript解析引擎

浏览器 引擎
Chrome 浏览器 V8(性能最好)
Firefox 浏览器 OdinMonkey
Safri 浏览器 JSCore
IE 浏览器 Chakra

node

什么是node.js

node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境.(也就是说webApi 不能在nodejs中运行)

node.js

包括两部分

  1. V8 引擎(即JavaScript运行环境,学过了)

  2. 内置 API (包括内置模块 fs,path, http,js内置对象,querystring,等等)

    但是内置api 最终也是交给v8 引擎执行,本质上是代码

node.js可以做什么

node 作为一个 JavaScript 的运行环境,仅仅提供了基础的功能和api。然而,基于nodejs 提供的这些基础功能,有很多强大的工具和框架。

  1. 基于 express 框架,可以快速构建web 应用
  2. 基于 electron 框架,可以构建跨平台的桌面应用
  3. 基于 restify 框架, 可以构建api 接口项目
  4. 读写和操作数据库、创建实用的命令行工具辅助前端开发 等等

总之,node功能强大,可以增强前端程序员的行业竞争力

node.js 怎么学

学习路径

JavaScript 基础语法 + node.js 内置模块 +第三方api 模块(express, mysql)

fs 文件系统模块

fs 模块是 nodejs 官方提供的、用来操作文件的模块。它提供了一系列的方法和属性,用来满足用户对文件的操作需求。

如果要在 JavaScript 代码中,使用 fs 模块来操作文件, 则需要使用如下的方式先导入它:

const fs = require('fs')

方法:

  • fs.readFile() 方法,用来读取指定文件中的内容

    ​ 语法格式如下

    fs.readFile(path[, options], callback)
    

    参数:

    • 参数1:必选参数,字符串,表示文件的路径。
    • 参数2:可选参数,字符串,表示以什么编码格式来读取文件。(以 [] 中括号括起来的都是可选参数)。
    • 参数3:必选参数,文件读取完成后,通过回调函数拿到读取的结果。

    谨记:

    callback(err, data) 中 data 用来声明接收数据的时候接收的是一个二进制文件,是一个object类型,不是string。如果要输出的话要用data.toString() 方法

  • fs.writeFile() 方法,用来向指定的文件写入内容

    语法格式

    fs.writeFile(file, data[, options], callback)
    

    参数:

    • 参数1:必选参数,字符串,需要指定一个文件路径的字符串,表示文件的存放路径

    • 参数2:必选参数,字符串表示要写入的内容

    • 参数3:可选参数,表示以什么格式写入文件,默认值是utf-8

    • 参数4:必选参数,文件写入完成以后的回调函数

    说明:

    • 如果文件写入成功,则回调函数接收到的参数值为null,否则为错误对象

    • 只能用来创建文件,不能用来创建目录

  • 如果是文件名未建立,则会建立。如果已有同名文件,则会覆盖写入。

练习

考试成绩整理

使用 fs 文件系统模块, 将素材目录下成绩.txt文件中的考试数据,整理到成绩-ok.txt文件中。

整理前,成绩.txt 文件中的数据格式如下:

小红=99 小白=100 小黄=70 小黑=66 小绿=88

整理完成之后,希望得到成绩-ok.txt文件中的数据格式如下:

小红: 99
小白: 100
小黄: 70
小黑: 66
小绿: 88

实现步骤

  1. 导入需要的 fs 文件系统模块
  2. 使用 fs.readFile() 方法,读取素材目录下的 成绩.txt 文件
  3. 判断文件是否读取失败
  4. 文件读取成功后,处理成绩数据
  5. 将处理完成的成绩数据,调用 fs.writeFile() 方法,写入到新文件 成绩-ok.txt 中
const fs = require('fs')

fs.readFile('./成绩.txt',(err,data) => {
  if (err) {
    console.log(err.message)
    return
  }
  
  // 4.1 先把处理的数据, 按照空格进行分割成数组
  const arr = data.toString().split(' ')
  
  // 4.2 循环分割后的数组,对每一项数据,进行字符串的替换操作
  const newArr = []
  for (let i = 0;i < arr.length; i++) {
    newArr[i] = arr[i].replace('=',': ')
  }
  // 4.3 把新数组中的每一项,进行合并,得到一个新的字符串
  const newData = newArr.join('\n')
  fs.writeFile('./成绩-ok.txt',newData,(err) => {
    if (err) {
      console.log('写入失败'+err.message)
    } else {
      console.log('写入成功!');
    }
  })
})
路径动态拼接的问题

代码在运行的时候,如果是相对路径。操作文件的目录 = 执行 node 命令时所处的目录 + 操作路径 动态凭借出来的。所以在不是当前代码文件的目录层执行文件时,容易出现动态拼接错误的问题。

代码如下:

PS C:\Users\MI\Desktop\process> node .\node\readFile.js
[Error: ENOENT: no such file or directory, open 'C:\Users\MI\Desktop\process\1.txt'] {
  errno: -4058,
  code: 'ENOENT',
  syscall: 'open',
  path: 'C:\\Users\\MI\\Desktop\\process\\1.txt'
}

绝对路径:移植性非常差,不利于维护。可能在你的电脑上是这个路径,到了别人的电脑上又是另外一个路径。就找不到了

解决方案

__dirname 这个dirname 是返回你这个 fs 模块这个代码文件的绝对路径字符串。不会跟着node 命令的路径变换而变换

所以 fs 模块 路径参数可以使用__dirname+文件目录拼接起来执行。

代码:

fs.readFile(__dirname + '/file/1.txt', () => {})

如果写的是./file/1.txt 则会报错,所以推荐使用path.join()方法

path 路径模块

path 模块是node.js 官方提供的、用来处理路径的模块。它提供了一系列的方法和属性,来满足用户对路径的处理需求。

使用:

先导入

const path = require('path')

方法:

path.join() 方法,用来将多个路径片段凭借成一个完整的路径字符串

path.join([...paths])

参数:

  • paths 路径片段序列

  • 返回值:

path.basename() 方法,返回路径字符串的最后一个部分,通常用于解析文件名

path.basename(path[, ext])

参数:

  • path 必选参数,字符串,表示一个路径的字符串

  • ext 可选参数,字符串,表示文件的扩展名。如果扩展名命中则不会显示扩展名

时钟案例
案例要实现的功能

将素材目录下的 index.html 页面,拆分成三个文件,分别是:

  • index.css
  • index.js
  • index.html

并且将拆分出来的 3 个文件, 存放到clock 目录中。

案例的实现步骤
  1. 创建两个正则表达式,分别用来匹配