- 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 对象:可以向外共享模块作用域中的成员,存储了和当前模块有关的信息,打印如下:
- 时刻谨记,require() 模块时,得到的永远是 module.exports 指向的对象:
module.exports === exports // true -
1.6 npm
-
包的语义化版本规范,例如 2.24.2
- 第一位数字:大版本
- 第二个数字:功能版本
- 第三个数字:Bug 修复版本
- 注意:版本号提升的规则:只要前面的版本号增长了,则后面的版本号归零
-
解决 npm 下载包速度慢的问题
- 切换淘宝镜像源
// 查看当前的下包镜像源
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