目录

  • 前言
  • 1. 初识 Node.js
    • 1.1 回顾与思考
    • 1.2 Node.js 简介
      • 1.2.1 什么是Node.js
      • 1.2.2 Node.js 中的 JavaScript 运行环境
      • 1.2.3 Node.js 可以做什么
      • 1.2.4 学习路径
    • 1.3 Node.js环境安装
      • 1.3.1 查看已安装的Node.js版本号
      • 1.3.2 什么是终端
    • 1.4 Node.js 环境中执行 JavaScript 代码
      • 1.4.1 终端中的快捷键
  • 2. fs 文件系统模块
    • 2.1 什么是fs文件系统模块
    • 2.2 读取文件中的指定内容
      • 2.2.1 fs.readFile() 的语法格式
      • 2.2.2 示例代码
      • 2.2.3 判断文件是否读取成功
    • 2.3 向指定的文件中写入内容
      • 2.3.1 fs.writeFile()语法格式
      • 2.3.2 示例代码
      • 2.3.3 判断文件是否写入成功
    • 2.4 stat 获取文件信息
      • 使用严格模式
    • 2.5 练习-考试成绩整理
      • 2.5.1 核心实现步骤
      • 2.5.2 考试成绩整理练习答案(完整代码)
      • 2.5.3 附:JS常见转义字符
    • 2.6 fs 模块 - 路径动态拼接的问题
    • :pushpin:小结
      • 1 Node.js的交互模式和直接运行的区别
      • 2 同步和异步的使用场景
  • 3. path路径模块
    • 3.1 path路径模块定义
    • 3.2 路径拼接
      • 3.2.1 path.join的语法格式
      • 3.2.2 代码示例
    • 3.3 获取路径中的文件名
      • 3.3.1 path.basename() 的语法格式
      • 3.3.2 代码示例
    • 3.4 获取路径中的文件扩展名
      • 3.4.1 path.extname() 的语法格式
      • 3.4.2 示例代码
    • 3.5 综合案例-时钟案例
      • 3.5.1 案例要实现的功能
      • 3.5.2 案例的实现步骤
        • 步骤1 - 导入需要的模块并创建正则表达式
        • 步骤2 - 使用 fs 模块读取需要被处理的 html 文件
        • 步骤3 – 自定义 resolveCSS 方法
        • 步骤4 - 自定义resolveJS 方法
        • 步骤5 – 自定义 resolveHTML 方法
      • 3.5.4 案例的两个注意点
  • 4. http模块
    • 4.1 什么是http模块
    • 4.2 http 模块的作用
    • 4.3 服务器相关的概念
      • 4.3.1 IP地址
      • 4.3.2 域名和域名服务器
      • 4.3.3 端口号
    • 4.4 创建最基本的web服务器
      • 4.4.1 . 创建 web 服务器的基本步骤
      • 4.4.2 req 请求对象
      • 4.4.3 res响应对象
      • 4.4.4 解决中文乱码问题
    • 4.5 根据不同的 url 响应不同的 html 内容
      • 4.5.1 核心实现步骤
      • 4.5.2 动态响应内容
    • 4.6 案例 - 实现 clock 时钟的 web 服务器
      • 4.6.1 核心思路
      • 4.6.2 实现步骤

前言

学习 Node.js 需要具备的技术:


1. 初识 Node.js

1.1 回顾与思考

  1. 浏览器中的 JavaScript 的组成部分

  1. JavaScript 在浏览器中执行的原理

  2. JavaScript 操作 DOM 和 BOM 原理

  3. 浏览器中的 JavaScript 运行环境

    运行环境 是指 代码正常运行所需的必要环境。

  4. JavaScript 能否做后端开发?

    除了Java、python、PHP做后端开发外,JavaScript 也可以做后端程序开发(需要Node.js 这个运行环境)

1.2 Node.js 简介

1.2.1 什么是Node.js

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。

在Node上运行的 JavaScript 相比其他后端开发语言有何优势?

最大的优势是借助 JavaScript 天生的事件驱动机制加 V8 高性能引擎,使编写高性能Web服务轻而易举。

其次,JavaScript 语言本身是完善的函数式语言,在前端开发时,开发人员往往写得比较随意,让人感觉 JavaScript就是个“玩具语言”。但是,在Node环境下,通过模块化的 JavaScript 代码,加上函数式编程,并且无需考虑浏览器兼容性问题,直接使用最新的ECMAScript 6标准,可以完全满足工程上的需求。

Node.js 官网地址: https://nodejs.org/zh-cn/
相关技术/论述:https://www.liaoxuefeng.com/wiki/1022910821149312/1023025235359040

1.2.2 Node.js 中的 JavaScript 运行环境

  • 注意:

    • 浏览器 是JavaScript 的 前端运行环境。
    • Node.js 是 JavaScript 的 后端运行环境。
    • Node.js 中 无法调用 DOM 和 BOM 等浏览器内置 API。

1.2.3 Node.js 可以做什么

Node.js 作为一个 JavaScript 的运行环境,仅仅提供了基础的功能和 API。然而,基于 Node.js 提供的这些基础能,很多强大的工具和框架如雨后春笋,层出不穷,所以学会了 Node.js ,可以让前端程序员胜任更多的工作和岗位:

  1. 基于 Express 框架http://www.expressjs.com.cn/,可以快速构建 Web 应用;
  2. 基于 Electron 框架 https://electronjs.org/,可以构建跨平台的桌面应用;
  3. 基于 restify 框架 http://restify.com/,可以快速构建 API 接口项目;
  4. 读写和操作数据库、创建实用的命令行工具辅助前端开发、
    etc…

总之:Node.js 是 大前端时代 的“大宝剑”,有了 Node.js 这个超级 buff 的加持,前端程序员的 行业竞争力 会越来越强!

1.2.4 学习路径

  1. 浏览器中的 JavaScript 学习路径:
    JavaScript 基础语法 + 浏览器内置 API(DOM + BOM) + 第三方库(jQuery、art-template 等)

  2. Node.js 的学习路径
    JavaScript 基础语法 + Node.js 内置 API 模块(fs、path、http等)+ 第三方 API 模块(express、mysql 等)

1.3 Node.js环境安装

由于 Node.js 平台是在后端运行 JavaScript 代码,所以,必须必须首先在计算机上安装 Node.js 环境。

安装包可以从 Node.js 的官网首页直接下载,进入到 Node.js 的官网首页(https://nodejs.org/en/),点击绿色的按钮,下载所需的版本后(建议稳定版)。


【安装】:双击直接安装,不建议更改默认安装位置(C:\),中途也保持默认设置,一路 “Next” 即可。

LTS :长期稳定版 — 对于追求稳定性的企业级项目来说,推荐安装 LTS 版本的 Node.js。

Current :新特性尝鲜版 — 对热衷于尝试新特性的用户来说,推荐安装 Current 版本的 Node.js。但是,Current 版本中可能存在隐藏的 Bug 或安全性漏洞,因此不推荐在企业级项目中使用 Current 版本的 Node.js。

1.3.1 查看已安装的Node.js版本号

  1. 使用 cmd 终端
    Windows系统,打开 cmd 命令行终端,输入命令 node –v,按下回车键,即可查看已安装的 Node.js 的版本号(能看到版本号,则代表 Node.js 安装成功)。

注意命令行模式和交互模式,看到类似C:\>是在Windows提供的命令行模式:

看到 > 是在Node交互式环境下:

1、命令提示符后输入node,就会进入 Node.js 的交互环境。在交互环境下,你可以输入任意 JavaScript 语句,例如100+200,回车后将得到输出结果。
2、要退出 Node.js 环境,连按两次Ctrl+C
此外,在命令行模式运行.js文件和在Node交互式环境下直接运行 JavaScript 代码有所不同。Node交互式环境会把每一行JavaScript代码的结果自动打印出来(直接看到结果),但是,直接运行JavaScript文件则不会。

快速打开 cmd 终端的方式:

使用快捷键( Windows徽标键 + R)打开运行面板,输入 cmd 后直接回车,即可打开终端。

  1. 使用Powershell 终端

除了 cmd 终端外,还可以使用 Powershell终端。快速打开方式为,在当前文件所在目录下,shift + 右键,在弹出的菜单中,选择Powershell,如图所示:


1.3.2 什么是终端

终端(英文:Terminal)是专门为开发人员设计的,用于实现人机交互 的一种方式。

作为一名合格的程序员,我们有必要识记一些 常用的终端命令,来辅助我们更好的操作与使用计算机

1.4 Node.js 环境中执行 JavaScript 代码

语法格式:node 要执行的js文件的路径

1.4.1 终端中的快捷键

在 Windows 的 powershellcmd 终端中,我们可以通过如下快捷键,来提高终端的操作效率:

使用 ↑ 键,可以快速定位到上一次执行的命令;

使用 tab键,能够快速补全路径;

使用 ESC 键,能够快速清空当前已输入的命令;

输入 cls 命令,可以清空终端;

2. fs 文件系统模块

2.1 什么是fs文件系统模块

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

因为 Node.js 是运行在服务端的 JavaScript 环境,服务器程序和浏览器程序相比,最大的特点是没有浏览器的安全限制了,而且,服务器程序必须能接收网络请求,读写文件,处理二进制内容,所以,Node.js 内置的常用模块就是为了实现基本的服务器功能。这些模块在浏览器环境中是无法被执行的,因为它们的底层代码是用 C/C++ 在 Node.js 运行环境中实现的。

我们知道,JavaScript 有且仅有一个全局对象,在浏览器中叫window对象。而在Node.js环境中,也有唯一的全局对象,不过它不叫window了,而是叫global

和所有其它 JavaScript 模块不同的是,fs 模块同时提供了 异步同步 的方法。
回顾一下什么是异步方法。因为 JavaScript 的单线程模型,执行IO操作时,JavaScript 代码无需等待,而是传入回调函数后,继续执行后续JavaScript代码。比如 jQuery 提供的 getJSON() 操作;而同步的IO操作则需要等待函数返回

例如:
fs.readFile() 方法:用来 读取 指定文件中的内容

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

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

// 导入 fs
const fs = require ('fs')

附:如何判断JavaScript执行环境
有很多 JavaScript 代码既能在浏览器中执行,也能在 Node 环境执行,但有些时候,程序本身需要判断自己到底是在什么环境下执行的,常用的方式就是根据浏览器和 Node 环境提供的全局变量名称来判断:
if (typeof(window) === 'undefined') {
console.log('node.js');
} else {
console.log('browser');
}

2.2 读取文件中的指定内容

2.2.1 fs.readFile() 的语法格式

使用 fs.readFile() 方法,可以 读取 指定文件中的内容,语法格式如下:

fs.readFile(path[, options],callback)
  • 参数解释:

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

2.2.2 示例代码

utf8 的编码格式,读取指定文件的内容,并打印 errdataStr 的值:

const fs = require ('fs')
fs.readFile('./files/123.txt','utf8',function(err,dataStr){console.log(err);console.log('-----');console.log(dataStr);
})

2.2.3 判断文件是否读取成功

异步读取时,传入的回调函数接收两个参数,当正常读取时,err参数为nulldata参数为读取到的String。当读取发生错误时,err参数代表一个错误对象,dataundefined。这也是Node.js标准的回调函数:第一个参数代表错误信息,第二个参数代表结果。后面我们还会经常编写这种回调函数。

由于err是否为null就是判断是否出错的标志,所以通常的判断逻辑总是:

if (err) {// 出错了
} else {// 正常
}

例如,获取文件读取的结果可写成如下代码:

const fs = require ('fs')
fs.readFile('./files/123.txt','utf8',function(err,dataStr){if(err){return console.log('文件读取失败'+ err.message);}console.log('文件读取成功,内容是:'+ result );
})

如果我们要读取的文件不是文本文件,而是二进制文件,怎么办?

下面的例子演示了如何读取一个图片文件:

'use strict';var fs = require('fs');fs.readFile('sample.png', function (err, data) {if (err) {console.log(err);} else {console.log(data);console.log(data.length + ' bytes');}
});

当读取二进制文件时,不传入文件编码时,回调函数的data参数将返回一个Buffer对象。在Node.js中,Buffer对象就是一个包含零个或任意个字节的数组(注意和Array不同)。

Buffer对象可以和String作转换,例如,把一个Buffer对象转换成String:

// Buffer -> String
var text = data.toString('utf-8');
console.log(text);

或者把一个String转换成Buffer:

// String -> Buffer
var buf = Buffer.from(text, 'utf-8');
console.log(buf);

2.3 向指定的文件中写入内容

2.3.1 fs.writeFile()语法格式

使用fs.writeFile()方法,可以向指定的文件中写入内容,语法格式如下:

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

writeFile()的参数依次为文件、数据和回调函数。如果传入的数据是String默认UTF-8编码写入文本文件,如果传入的参数是Buffer,则写入的是二进制文件。回调函数由于只关心成功与否,因此只需要一个err参数。

  • 参数解释:

    • 参数1:必选参数,需要指定一个文件路径的字符串,表示文件的存放路径。
    • 参数2:必选参数,表示要写入的内容。
    • 参数3:可选参数,表示以什么格式写入文件内容,默认值是 utf8
    • 参数4:必选参数,文件写入完成后的回调函数。

2.3.2 示例代码

向指定的文件路径中,写入文件内容

const fs = require('fs')
fs.writeFile('./files/123.txt','Hello Node.js!',function(err){console.log(err);   // 输出结果为 null
})

注: 如果 files 文件夹下不存在 123.txt 文件,则会自动创建该文件,并写入 Hello Node.js! 这个内容

2.3.3 判断文件是否写入成功

通过判断 err 对象是否为 null,获取文件写入的结果:

const fs = require('fs')
fs.writeFile('./files/123.txt','Hello Node.js!',function(err){if(err){return console.log('文件写入失败!'+ err.message);};console.log('文件写入成功!');
})

2.4 stat 获取文件信息

如果我们要获取文件大小,创建时间等信息,可以使用fs.stat(),它返回一个Stat对象,能告诉我们文件或目录的详细信息:

'use strict';var fs = require('fs');fs.stat('sample.txt', function (err, stat) {if (err) {console.log(err);} else {// 是否是文件:console.log('isFile: ' + stat.isFile());// 是否是目录:console.log('isDirectory: ' + stat.isDirectory());if (stat.isFile()) {// 文件大小:console.log('size: ' + stat.size);// 创建时间, Date对象:console.log('birth time: ' + stat.birthtime);// 修改时间, Date对象:console.log('modified time: ' + stat.mtime);}}
});

fs.stat() 运行结果如下:

isFile: true
isDirectory: false
size: 145
birth time: Fri Dec 09 2020 09:43:41 GMT+0800 (CST)
modified time: Fri Dec 09 2020 12:09:00 GMT+0800 (CST)

使用严格模式

如果在 JavaScript 文件开头写上'use strict';,那么 Node 在执行该 JavaScript 时将使用严格模式。但是,在服务器环境下,如果有很多 JavaScript 文件,每个文件都写上 'use strict';很麻烦。我们可以给Nodejs传递一个参数,让Node直接为所有js文件开启严格模式:

// 给 Node传递 --use_strict 参数来开启严格模式
node --use_strict calc.js

2.5 练习-考试成绩整理

案例中需要用到的素材:网盘下载

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

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



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



2.5.1 核心实现步骤

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

2.5.2 考试成绩整理练习答案(完整代码)

// 1. 导入 fs 模块
const fs = require('fs')// 2. 调用 fs.readFile() 读取文件的内容
fs.readFile('../素材/成绩.txt', 'utf8', function(err, dataStr) {// 3. 判断是否读取成功if (err) {return console.log('读取文件失败!' + err.message)}// console.log('读取文件成功!' + dataStr)// 4.1 先把成绩的数据,按照空格进行分割const arrOld = dataStr.split(' ')// 4.2 循环分割后的数组,对每一项数据,进行字符串的替换操作const arrNew = []arrOld.forEach(item => {arrNew.push(item.replace('=', ':'))})// 4.3 把新数组中的每一项,进行合并,得到一个新的字符串const newStr = arrNew.join('\r\n')// 5. 调用 fs.writeFile() 方法,把处理完毕的成绩,写入到新文件中fs.writeFile('./files/成绩-ok.txt', newStr, function(err) {if (err) {return console.log('写入文件失败!' + err.message)}console.log('成绩写入成功!')})
})

【代码解释】
arrNew.join('\r\n')\r\n 在windows 里表示回车换行。
\r(回车),英文是Carriage return,表示使光标下移一格
\n(换行),英文是New line,表示使光标到行首


Node.js 入门详解(一)相关推荐

  1. Node.js 入门详解 (三)

    目录 1. 初识Express 1.1 Express简介 1.1.1 什么是Express 1.1.2 进一步理解 Express 1.1.3 Express能做什么 1.1.4 Express 中 ...

  2. Node.js 入门详解(四)

    数据库与身份认证 1. 数据库的基本概念 1.1 什么是数据库 1.2 常见的数据库及分类 1.3 传统型数据库的数据组织结构 1.3.1 Excel的数据组织结构 1.3.2 传统型数据库的数据组织 ...

  3. Node.js npm 详解

    一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...

  4. 第27课:Node.js 模块详解

    概述 本课主要讲解如何用 C++ 开发 Node.js 和 Electron 本地模块,其中涉及到 3 种技术:Node.js.Electron 和 C++ 语言.Electron 是基于 Node. ...

  5. node.js Promise详解(尚硅谷李立超老师视频笔记)

    • Promise就是一个用来存储数据对象,但是由于Promise存取的方式的特殊,所以可以直接将异步调用的结果存储到Promise中 Promise存储异步数据: function sum(a,b) ...

  6. 【GCN】图卷积网络(GCN)入门详解

    机器学习算法与自然语言处理出品 @公众号原创专栏作者 Don.hub 单位 | 京东算法工程师 学校 | 帝国理工大学 图卷积网络(GCN)入门详解 什么是GCN GCN 概述 模型定义 数学推导 G ...

  7. js读取http chunk流_极简 Node.js入门 教程双工流

    点击上方蓝字关注我们 小编提示: 本文是由 ICBU 的谦行小哥哥出品,我们会持续发出极简 Node.js入门 教程,敬请期待哦,文中有比较多的演示代码建议横屏阅读 双工流就是同时实现了 Readab ...

  8. mapboxGL入门详解

    MapBox GL 入门详解 1.基础知识介绍 mapbox GL Js JavaScript地图库: 使用webGL渲染,支持大数据量: 支持矢量切片渲染地图: 与mapbox其他工具兼容.生态系统 ...

  9. Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(一)

    Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(一) 本文目录: 一.[旋转的精灵女孩]案例运行效果 二.Three.js简介 三.Three.js代码正常运行显示条件 (1)不载入 ...

最新文章

  1. ACM训练小结-2018年6月19日
  2. 工具 左侧服务列表_协作办公时代,在线编辑文档工具,安排!
  3. 4.Nginx配置进阶(四)
  4. JAVA 虚拟机 (SE 7)【待更】
  5. QPW 系统管理后台用户表(tm_user_info)
  6. android p 游戏调节器,游戏调节器(Game Tuner)
  7. 数学建模 TOPSIS法
  8. iis url重写 域名跳转子目录_IIS设置URL重写,实现页面的跳转的重定向方法
  9. Oracle 12c多租户特性详解:PDB 的出与入 InAndOut
  10. libtool: Version mismatch error. This is libtool 2.4.6, but the definition of this LT_INIT
  11. 《麦肯锡方法》第7章 进行研究-思维导图
  12. (TNNLS-2022)步态质量感知网络:面向轮廓步态识别的可解释性
  13. 国内景色最震撼的9座雪山
  14. FPGA-DDR总线电源硬件设计技巧-Fly-by走线阻抗
  15. java计算机毕业设计郑工社团交流服务信息平台源码+mysql数据库+系统+lw文档+部署
  16. 2019.12.29 BMR计算
  17. 计算机科技论文摘要,计算机科技论文摘要怎么写 计算机科技论文摘要范文参考...
  18. 智能网联汽车-网联功能与应用(CFA)标准制定路线图
  19. 迅捷CAD编辑器是不错的PDF转换CAD软件
  20. 控制儿童在什么时段使用计算机,如何控制小孩用电脑的时间

热门文章

  1. php检查在线用户,php – 检查用户是否在线laravel
  2. python机器学习常用包下载安装以及使用案例汇总
  3. 阿里云PolarDB开源数据库社区与 Tapdata 联合共建开放数据技术生态
  4. 【CDS技术揭秘系列 总篇】阿里云的云定义存储来了
  5. 用手机「3D探店」是种什么体验?
  6. 重磅发布 阿里云数据中台全新产品DataTrust聚焦企业数据安全保障
  7. 数据湖正在成为新的数据仓库
  8. 函数计算搭建 Serverless Web 应用(二)- 自定义域名
  9. 超详细!上线一个机器学习项目你需要哪些准备?
  10. 通过浪潮AIStation实现细粒度高性能的GPU资源共享