@jarringslee
什么是Node.js:
Node.js是一个跨平台JavaScript运行环境,使开发者可以搭建服务器端的JavaScript应用程序
Node.js作用:
Node.js 内置很多模块,例如 fs(文件系统)、path(路径)、http(网络通信)等。
什么是前端工程化:
指开发项目直到上线,过程中集成的所有的工具和技术。Nodejs是前端工程化的基础(因为Nodejs可以主动读取并执行js代码)
为什么Nodejs能执行js:
首先 浏览器能执行js代码依靠的是内核中的V8引擎(C++程序)
nodejs基本用法:
命名并编写js文件: 1-实例.js
const ljl = 18
const cjx = 18
console.log(ljl + cjx)
let i = 1, j = i
for (let i = 0; i < 4; i++) {
console.log(j++)
}
node语法: node 文件名.js
再改文件目录的终端中输入文件名
PS C:\Users\lenovo\Desktop\ljlvscode\nodejs> node 1-实例.js
终端输出如下
36
1
2
3
4
模块:类似于插件,封装了方法或属性
fs模块:封装了与本级文件系统进行交互的方法或属性
语法:
加载fs模块对象
const fs = require('fs') // fs是模块标识符:模块的名字
写入文件内容 fs.writeFile
fs.writeFile('文件路径', '写入内容(最好是字符串)', err => {
// 发生错误时的回调函数:写入出错时的错误信息
})
读取文件内容 fs.readFile
fs.readFile('文件路径', (err, data) => {
// 读取后的回调函数
// data是文件内容的buffer数据流
})
应用实例:
// 1. 加载fs模块对象
const fs = require('fs')
// 2. 写入文件内容
fs.writeFile('./test.txt', 'hello,cjx&ljl!', (err) => {
if (err) console.log(err)
else console.log('success!')
})
// 3. 读取文件内容
fs.readFile('./test.txt', (err, data) => {
if (err) console.log(err)
// 这里的data是buffer: 十六进制数据流的对象
// 需要用toString()函数转化为字符串形式
else console.log(data.toString())
})
同目录中出现了“test.txt”文件;
终端内容:
PS C:\Users\lenovo\Desktop\ljlvscode\nodejs> node 2-fs读写文件.js
success!
hello,cjx&ljl!
path.join() 是 Node 提供的一个路径拼接函数,作用是把多个路径片段拼接在一起,并根据系统规则(Windows 下是 \,Linux、IOS 是 /)规范化路径。
例如:
path.join('a', 'b', 'c') // 结果: 'a\b\c' (Windows)
path.join('111','aaa/js,'index.js') //结果:'111\aaa\js\index.js'
它还会自动识别:
.. 表示返回上一级目录;. 表示当前目录。在nodejs代码中,相对路径是根据终端所在路径查找的,而不是以资源管理器为起点查找。可能无法找到想要的文件。
如果在读取文件时写错了路径名(.../test.txt),就会报错:
PS C:\Users\lenovo\Desktop\ljlvscode\nodejs> node 2-fs读写文件.js
[Error: ENOENT: no such file or directory, open 'C:\Users\lenovo\Desktop\ljlvscode\nodejs\...\test.txt'] {
errno: -4058,
code: 'ENOENT',
syscall: 'open',
path: 'C:\\Users\\lenovo\\Desktop\\ljlvscode\\nodejs\\...\\test.txt'
}
success!
所以在nodejs代码中,尽量使用绝对路径。
__dirname(有两个下划线) 内置变量:获取当前模块目录的绝对路径
console.log(__dirname) //C:\Users\lenovo\Desktop\ljlvscode\nodejs
步骤:
加载path模块
const path = require('path')
使用path.join方法拼接路径
path.join('路径1', '路径2', ...)
// 1. 加载fs模块对象
const fs = require('fs')
// 2. 写入文件内容(已有文件)
// 3. 读取文件内容
// 3.0 获取绝对路径(__dirname直接获取)
// 3.1 引入path模块对象
const path = require('path')
// 3.2 调用path.join()配合__dirname组成目标文件的绝对路径(替换了原来的'./test.txt')
fs.readFile(path.join(__dirname, '../test.txt'), (err, data) => {
if (err) console.log(err)
else console.log(data.toString())
})
console.log(__dirname) // 这个会先出来,因为刚才的都是函数内部调用的操作
C:\Users\lenovo\Desktop\ljlvscode\nodejs
hello,cjx&ljl!
压缩一个文件中的html代码,并将其写入另一个html文件.
做法:把回车符 \r 换行符 \n 去掉,并用空格代替。
// 压缩一个文件中的html代码,并将其写入另一个html文件
// 做法:把回车符 \r 换行符 \n 去掉,并用空格代替。
// 1. 读取源html内容
const fs = require('fs')
const path = require('path')
fs.readFile(path.join(__dirname, '../js APIs/小练习/下班倒计时.html'), (err, data) => {
if (err) console.log(err)
else {
// console.log(data.toString())
// 2. 正则表达式替换字符串
const htmlStr = data.toString()
const resultStr = htmlStr.replace(/[\r\n]/g, '')
// console.log(resultStr)
// 3. 把处理好的字符串写入新的文件中
// 自动读取文件。有就填入,没有就先创建再填入
fs.writeFile(path.join(__dirname, '../js APIs/小练习/111node压缩版下班倒计时.html'), resultStr, err => {
if (err) console.log(err)
else console.log('成功!')
})
}
})
文件夹无法自动创建,需要提前手动创建。
注意,若要压缩成一行,文件中不能有“//”注释符,否则一行后面都会被注释掉。(可以用“/* … */”注释)
URL: 统一资源定位符,简称网址 ,用于访问服务器里的资源
http://hmajax.itheima.net:80/api/province
协议 //域名 :端口号/资源路径
钥匙 //楼房地址 :房间号/ 物品位置等信息
其中, :80 为该网址的端口号 :标记服务器里不同功能的服务程序
端口号范围: 0 ~ 65535 之间的任意整数
但是 0 ~ 1023 和一些特定端口号被占用,编写服务程序时需避开始用
http协议默认访问80端口。
web服务程序: 用于提供网上信息浏览功能
需求:创建web服务并响应内容给浏览器
例如:在本地启动一个 Web 服务(相当于一个小网站服务器)
步骤:
加载 http 模块,创建 web 服务对象
const http = require('http')
引入了http模块对象(http也为nodejs中的内置模块),让我们能创建服务器
const server = http.createServer()
http.createServer() 会返回一个 “服务器对象”,起到一个监听器的作用,等待用户请求。
监听 request 请求事件,设置响应头和响应体
server.on('request', (req, res) => {...})
监听请求事件:当有人向服务器发起请求时(监听request事件,即浏览器访问 http://localhost:3000 ),就调用该函数。
函数参数:
参数 全名 作用 reqrequest 请求对象 包含浏览器发来的所有信息(请求头、路径、方法等) resresponse 响应对象 用来返回信息给浏览器(响应头、响应体等)
res.setHeader('Content-Type', 'text/plain; charset=utf-8')
设置响应头:
res.end('您好,欢迎使用 node.js 创建的 web 服务!');
设置响应体:
向浏览器发送响应内容(一段文本)且在网页上显示,并结束本次请求响应。
配置端口号并启动 web 服务
server.listen(916, () => {
console.log('web 服务已启动')
})
浏览器请求 http://localhost:916 测试
localhost 代表本机域名
使用nodejs在终端请求后,终端会一直处于该任务的待机状态的进程中等待请求,不会自己开启下一次命令。退出本次命令: ctrl + c
访问:
http://localhost:8080/下班倒计时.html
步骤:
基于http模块来创建web服务
const fs = require('fs') //获取文件命令
const path = require('path') //获取路径
const http = require('http')
const server = http.createServer()
使用req.url获取请求资源路径,判断并读取 目标html文件 里字符串内容返回给请求方
server.on('request', (req, res) => {
const url = decodeURIComponent(req.url)
if (url === '/下班倒计时.html') {
//判断req.url获取的文件是否一致,网页会把汉字解码为百分号编码,我们需要提前给req.url加上decodeURIComponent()转为汉字
fs.readFile(path.join(__dirname, '../js APIs/小练习/下班倒计时.html'), (err, data) => {
if (err) console.log(err)
else {
// 设置响应内容类型为超文本字符串,并读取目标文件中的字符串内容并返回给请求方
res.setHeader('Content-Type', 'text/html;charset=UTF-8')
res.end(data.toString())
}
})
} else {
// ......
}
})
const url = decodeURIComponent(req.url) 百分比编码转汉字如果不想这样写,也可以直接把汉字转为百分比编码进行判断:
if (req.url === '/%E4%B8%8B%E7%8F%AD%E5%80%92%E8%AE%A1%E6%97%B6.html') {
fs.readFile(path.join(__dirname, '../js APIs/小练习/下班倒计时.html'), (err, data) => {
if (err) console.log(err)
else {
// ....
}
})
}
对于其他路径,暂时返回不存在的提示
if (...) {
} else {
// 对于其他路径,暂时返回报错
res.setHeader('Content-Type', 'text/html;charset=UTF-8')
res.end(`<b>你要访问的资源路径不存在</b>`)
}
运行web服务,用浏览器发起请求
server.listen(8080, () => {
console.log('服务启动成功!')
})
1
// 基于http模块 创建web服务
const fs = require('fs') //获取文件命令
const path = require('path') //获取路径
const http = require('http')
const server = http.createServer()
server.on('request', (req, res) => {
// 使用req.url获取请求资源路径,并读取 文件名.html 里字符串内容并返回给请求对方
// if (req.url === '/%E4%B8%8B%E7%8F%AD%E5%80%92%E8%AE%A1%E6%97%B6.html') {
const url = decodeURIComponent(req.url)
if (url === '/下班倒计时.html') {
fs.readFile(path.join(__dirname, '../js APIs/小练习/下班倒计时.html'), (err, data) => {
if (err) console.log(err)
else {
// 设置响应内容类型为超文本字符串,并读取目标文件中的字符串内容并返回给请求方
res.setHeader('Content-Type', 'text/html;charset=UTF-8')
res.end(data.toString())
}
})
} else {
// 对于其他路径,暂时返回报错
res.setHeader('Content-Type', 'text/html;charset=UTF-8')
res.end(`<b>你要访问的资源路径不存在</b>`)
}
})
server.listen(8080, () => {
console.log('服务启动成功!')
})