目标:
能够知道什么是Node.js
能够知道Node.js可以做什么
能够说出Node.js 中的JavaScript的组成部分
能够使用fs模块读写操作文件
能够使用path模块处理路径
能够使用http模块写一个基本的web 服务器
1.初识 Node.js
1.1 Node.js 简介
1.什么是Node.js
Node.js is a JavaScript ru ntime built on Chrome’s V8 JavaScript engine.
Node.js
是一个基于Chrome V8 引擎的JavaScript运行环境。
☆ Node.js 的官网地址: https://nodejs.org/zh-cn/
2. Node.js 中的JavaScript运行环境
注意:
- 浏览器是JavaScript的前端运行环境。
- Node.js是JavaScript的后端运行环境。
- Node.js 中无法调用DOM和BOM等浏览器内置API。
Node.js 特性:
- event-driven事件驱动
- non-blocking I/O model 非阻塞IO模型(异步)
- lightweight and efficient 轻量高效
3.Node.js 可以做什么
- Web服务器后台
- 命令行工具
- npm(node)
- git(c语言)
- hexo(node)
- 等等
- 对于前端开发军程师来讲,接触 node最多的是它的命令行工具。自己写的很少,主要是使用别人第三方的
- webpack
- gulpo npm
4.Node.js 怎么学
浏览器中的JavaScript学习路径:
JavaScript基础语法+浏览器内置API(DOM + BOM) + 第三方库(jQuery、art-template等)
Node.js 的学习路径:
JavaScript 基础语法 + Node.,js 内置API模块(fs、path、http等)+第三方API模块(express、mysql等)
1.5.一些资源·
- 《深入浅出Node.js》
- 《Node.,js权威指南》
- JavaScript标准参考教程(alpha) : http://javascript.ruanyifeng.com/
- Node 入门:http://www.nodebeginner.org/index-zh-cn.html
- 官方API文档: https://nodejs.org/dist/latest-v6.x/docslapil
- 中文文档(版本比较旧,凑合看):http://www.nodeclass.com/api/node.html
业 - CNODE社区:http:/lcnodejs.org
- CNODE-新手入门: http://cnodejs.org/getstart
1.2 Node.js 环境安装
如果希望通过 Node.js 来运行Javascript 代码,则必须在计算机上安装 Node.js 环境才行。
安装包可以从Node.js的官网首页直接下载,进入到Node.js 的官网首页(https://nodejs.org/en/),点击绿色的按钮,下载所需的版本后,双击直接安装即可。
如果已经安装过,重新安装,会进行覆盖升级。
这个地方不建议修改安装目录
其余页面,默认下一步即可。
2.确认Node 环境 是否安装成功
打开终端,在终端输入命令 node -v
后,按下回车键,可查看已安装的 Node.js的版本号,则安装成功。
1.4 在 Node.js 环境中执行 JavaScript 代码
步骤:
- 打开终端
- 进入代码文件所在的文件目录
- 输入 node + 空格 + 要执行的js文件的相对路径
小技巧:在 Visual Studio Code 软件中,使用快捷键 Ctrl + ~,可以在软件中打开终端窗口。
浏览器中 的 JavaScript 是由 JS 核心语法 和 WebAPI 组成的。
浏览器中有 JavaScript 解析引擎,可以解析并执行 JavaScript 代码。
JavaScript 操作 DOM 和BOM 的原理:
每个浏览器都内置了DOM、BOM这样的API函数,因此,浏览器中的JavaScript才可以调用它们。
浏览器中的 JavaScript 运行环境
☆ 运行环境是指代码正常运行所需的必要环境。
1. V8 引擎负责解析和执行 JavaScript 代码
2. 内置 API 是由运行环境提供的特殊接口,只能在所属的运行环境中被调用。
2. fs 文件系统模块
fs文件系统模块
是Node,js官方提供的、用来操作文件的模块。它提供了一系列的方法和属性,用来满足用户对文件的操作需求。
例如:
fs.readFile()方法
,用来读取指定文件中的内容fs.writeFile()方法
,用来向指定的文件中写入内容
2.1 导入 fs 文件系统模块
如果要在JavaScript 代码中,使用fs模块来操作文件,则需要使用require函数
先导入它:
const fs = require('fs')
2.2 读取指定文件中的内容
fs.readFile()
方法,读取指定文件中的内容
1.语法格式:
fs.readFile(path[, options], callback)
参数解读:
- 参数1:必选参数,字符串,表示文件的路径。
- 参数2:可选参数,字符串,表示以什么编码格式来读取文件。
- 参数3:必选参数,文件读取完成后,通过回调函数拿到读取的结果。
2.示例代码:
以utf8的编码格式,读取指定文件的内容,并打印err 和dataStr的值:
// 导入 fs 文件系统模块
const fs = require('fs');
fs.readFile('1.js', 'utf8', function (err, dataStr) {
// 如果读取成功,则 error 的值为 null,datastr就是读取的数据
// 如果读失败,则 error 的值为错误对象,dataStr的值为 undefined
console.log(err);
console.log(‘-----’);
console.log(dataStr);// 打印成功的结果
})
3.判断文件是否读取成功
可以判断 err 对象是否为 null ,从而知晓文件读取的结果
const fs = require('fs');
fs.readFile('3.js', 'utf8', function (err, dataStr) {
if (err) {
return console.log('文件读取失败!' + err.message);
}
console.log('文件读取成功,内容是:' + dataStr);
})
2.3 向指定的文件中写入内容
fs.writeFile()
方法,向指定的文件中写入内容
1.语法格式如下:
fs.writeFile(file,data[, options], callback)
参数解读:
- 参数1:必选参数,需要制定一个文件路径的字符串,表示文件的存放路径
- 参数2:必选参数,表示要写入的内容
- 参数3:可选参数,表示以什么格式写入文件内容,默认是 utf8
- 参数4:必选参数,文件写入完成后的回调函数
注意:
- 覆盖写入,而不是追加
- 如果文件不存在,则会新建该文件。(写f盘,且该盘符不存在的情况下报错)
2.示例代码:
const fs = require('fs');
fs.writeFile('5.js', 'console.log("hello js~~~")', function(err){
console.log(err)
})
3.判断文件是否写入成功
const fs = require('fs');
fs.writeFile('1.js', 'console.log("hello js~~~")', function(err){
if (err) {
return console.log('文件写入失败:' + err.message);
}
console.log('输入成功!');
})
2.4 文件路径动态拼接的问题
1.使用相对路径
在使用fs模块操作文件时,操作路径是以 ./
或 ../
开头的相对路径。
缺点:很容易出现路径动态拼接错误的问题
(原因:代码在运行的时候,会以执行node命令时所处的目录,动态拼接出被操作文件的完整路径。)
2.使用绝对路径
在使用fs模块操作文件时,直接提供完整的路径,从而防止路径动态拼接的问题。
缺点:完整的路径–移植性非常差,不利于维护
// 文件路径字符串中的“\”为转移符号,得写2个才代表一个。
fs.write('D:\\projects\\Node\\01-文件读取.js', 'console.log("hello js~~~")', function(err){
//
}
3.使用 __dirname(推荐使用)
__dirname
表示当前文件所处的目录
// “\\1.js” 也可以写作‘/1.js’
fs.readFile(__dirname + '\\1.js', 'utf-8', function(err){
if (err) {
return console.log('文件读取失败:' + err.message);
}
console.log('输入成功!');
})
}
3 path 路径模块
path模块
是Node,js官方提供的、用来处理路径的模块。它提供了一系列的方法和属性,用来满足用户对路径的处理需求。
例如:
path.join()
方法,用来将多个路径片段拼接成一个完整的路径字符串path.basename()
方法,用来从路径字符串中,将文件名解析出来
3.1 导入 path 模块
导入语句:
如果要在JavaScript 代码中,使用path模块来处理路径,则需要先导入它
const path = require(‘path’)
3.2 路径拼接
使用path.join()
方法,将多个路径片段拼接起来。
语法格式:
path.join([…paths])
参数解读:
...paths
: <string>路径片段的序列- 返回值:<string>
const path = require('path')
// ../ 会把前面的一层路径抵消掉
const pathStr = path.join( '/a", "/b/c', '../', './d','e')
console.log(pathStr) //输出\a\b\d\e
const pathStr2 = path.join(__dirname,'./files/1.txt')
console. log(pathStr2)//输出当前文件所处目录\files\1.txt
注意:今后凡是涉及到路径拼接的操作,都要使用path.join()
方法进行处理,不要直接使用 +
进行字符串的拼接。(path.join()方法可以屏蔽路径中多写的“.”)
3.3 获取路径中的文件名
使用path.basename()方法,可以获取路径中的最后一部分,经常通过这个方法获取路径中的文件名.
语法格式:
path.basename(path[, ext])
参数解读:
- path 必选参数,表示一个路径的字符串
- ext 可选参数,表示文件扩展名–不希望返回扩展名时填写。
返回:
- 表示路径中的最后一部分
代码示例:
const path = require('path')
const fpath = '/a/b/c/index.html' //文件的存放路径
var fullName = path.basename(fpath)
console.log(fullName)//输出index.html
// 注意:文件的扩展名一定要写正确,否则返回的还是带扩展名的文件名。
var namewithoutExt = path.basename(fpath, '.html')
console.log(namewithoutExt)//输出index
3.4 获取路径中的文件扩展名
语法格式:
path.extname(path)
参数:
path 必选参数,表示一个路径的字符串
返回:
返回得到的扩展名字符串
示例代码:
const fpath = " /a/b/c/index.html'1/路径字符串
const fext = path.extname(fpath)
console.log(fext)1/输出.html
3.5 综合案例 - 时钟案例
372集–待补
4. http 模块
在网络节点中,负责消费资源的电脑,叫做客户端;负责对外提供网络资源的电脑,叫做服务器。
http模块是Node,js官方提供的、用来创建 web服务器的模块。通过 http模块提供的 http.createServer()方法,就能方便的把一台普通的电脑,变成一台Web服务器。从而对外提供Web资源服务。
4.1 http 模块的使用
最简单的 http 服务:
// 加载 http 核心模块
const http = require('http');
// 使用 `http.createServer()`方法创建一个 Web 服务器,返回一个 Server 实例
var server = http.createSever();
// 当服务器收到客户端的请求后,自动触发服务器的 request 请求事件,然后执行第二个参数,回调处理
server.on('request', function () {
console.log('收到客户端的请求了');
})
// 绑定端口号,启动服务器成功会调用函数。
server.listen(3000, function () {
console.log('服务器启动成功, 可以通过http://127.0.0.1:3000/来进行访问。')
})
4.2 请求对象和响应对象
request 请求事件的处理函数,需要接受两个参数:
- request 请求对象:请求对象可以用来获取客户端的一些请求信息,例如请求路径
- response 相应对象: 用来给客户端发送响应信息
// 当服务器收到客户端的请求后,自动触发服务器的 request 请求事件,然后执行第二个参数,回调处理
server.on('request', function (request, response) {
console.log('收到客户端的请求了,请求路径是:' + request.url);
// response对象有一个方法: write可以用来给客户端发送响应数据
// write可以使用多次,但是最后一定要使用end来结束响应,否则客户端会一直等待
response.write('hello');
// 告诉客户端相应对象传递完整,可以呈现给用户
response.end();
})
以上的http服务,无论是什么请求,响应的数据都相同。(/
、/index、/login)