文章目录
Node.js初识
估计学完node.js其实就可以开发出一个前后端完整的项目了
Node.js下载
nodejs官网下载
这边建议下载长期维护版,毕竟尝鲜版还估计还有漏洞。维护版够用。
安装流程跟安装普通软件一样,配置环境是安装过程自动配置的。
这边查看是否下载成功,打开终端,在终端输入命令 node –v
后,按下回车键,即可查看已安装的 Node.js 的版本号。
Node.js运行
- 在脚本文件夹中打开终端
- 当然打开终端还可以通过cmd的方式(使用快捷键(Windows徽标键 + R)打开运行面板,输入 cmd 后直接回车,即可打开终端。),但是要cd 到脚本所在的路径。
- 用vscode打开终端
终端中的快捷键
在 Windows 的 powershell 或 cmd 终端中,我们可以通过如下快捷键,来提高终端的操作效率:
- 使用 ↑ 键,可以快速定位到上一次执行的命令
- 使用 tab 键,能够快速补全路径
- 使用 esc 键,能够快速清空当前已输入的命令
- 输入 cls 命令,可以清空终端
某个nodejs的中文文档
https://www.nodeapp.cn/documentation.html
fs文件系统模块
fs.readFile() 的语法格式
参数解读:
参数1:必选参数,字符串,表示文件的路径。
参数2:可选参数,表示以什么编码格式来读取文件,默认值是 utf8。
参数3:必选参数,文件读取完成后,通过回调函数拿到读取的结果。
// 引入fs模块
const fs = require('fs')
fs.readFile('./files/11.txt', 'utf8', function(err, dataStr) {
if (err) {
return console.log('读取文件失败!' + err.message)
}
console.log('读取文件成功!' + dataStr)
})
fs.writeFile() 的语法格式
参数解读:
参数1:必选参数,需要指定一个文件路径的字符串,表示文件的存放路径。
参数2:必选参数,表示要写入的内容。
参数3:可选参数,表示以什么格式写入文件内容,默认值是 utf8。
参数4:必选参数,文件写入完成后的回调函数。
fs.writeFile('./files/3.txt', 'ok123', function(err) {
// 1 如果文件写入成功,则 err 的值等于 null
// 2 如果文件写入失败,则 err 的值等于一个 错误对象
// console.log(err)
if (err) {
return console.log('文件写入失败!' + err.message)
}
console.log('文件写入成功!')
})
path路径模块
path.join() 方法,用来将多个路径片段拼接成一个完整的路径字符串
注意:涉及到路径拼接的操作,都使用 path.join() 方法进行处理。不要直接使用 + 进行字符串的拼接。
path.basename() 方法,用来从路径字符串中,将文件名解析出来
path.extname() 方法,可以获取路径中的扩展名部分,语法格式如下
path:必选参数,表示一个路径的字符串
返回值: 返回得到的扩展名字符串
路径读写综合案例
const fs=require("fs")
const path=require('path')
// 其中\s匹配空白字符, \S匹配非空白字符,[\s\S]就是匹配任意字符
const regStyle=/<style>([\s\S]*)<\/style>/g //不要用.*啊,因为.不匹配换行符\n
const regScript=/<script>([\s\S]*)<\/script>/g
fs.readFile(path.join(__dirname,'./index.html'),'utf-8',function(err,dataStr){
if(err){
return console.log('读取HTML失败'+err.message)
}
resolveCssAndJs('style',dataStr)
resolveCssAndJs('script',dataStr)
resolveHTML(dataStr)
})
function resolveCssAndJs(type,htmlStr){
// 判断是css还是js
let content,fileType
if(type=='style'){
fileType='css'
content=regStyle.exec(htmlStr)[0].replace(`<${type}>`,'').replace(`</${type}>`,'')
}
else if(type=='script'){
fileType='js'
content=regScript.exec(htmlStr)[0].replace(`<${type}>`,'').replace(`</${type}>`,'')
}
else{
return console.log("没有css和js")
}
if(content){
// 同步判断clock目录是否存在
if (fs.existsSync(path.join(__dirname,'./clock'))) {
console.log('file already exists');
}
else{
// mkdir是异步执行的,mkdirSync是同步执行的。这里一定要同步,否则先执行下面的写入文件了。
// 可以发现有回调函数的都是异步执行的
fs.mkdirSync(path.join(__dirname,'./clock'));
}
// 写入文件
fs.writeFile(path.join(__dirname,`./clock/index.${fileType}`),content,'utf8',function(err,res){
if(err){
return console.log("写入失败"+err.message)
}
console.log("写入成功")
})
}
else{
console.log(content)
}
}
function resolveHTML(htmlStr){
let htmlCotent=htmlStr.replace(regStyle,`<link rel="stylesheet" href="./index.css">`).replace(regScript,`<script src="./index.js"></script>`)
fs.writeFile(path.join(__dirname,'./clock/index.html'),htmlCotent,'utf8',err=>{
if(err) throw err
console.log('写入成功')
})
}
http模块
// 新引入http模块
const http=require('http')
// 创建web服务器实例
const server=http.createServer()
// 为服务器实例绑定request事件,监听客户端的请求
server.on('request', (req, res) => {
// 1. 获取请求的 url 地址
const url = req.url
// 2. 设置默认的响应内容为 404 Not found
let content = '<h1>404 Not found!</h1>'
// 3. 判断用户请求的是否为 / 或 /index.html 首页
// 4. 判断用户请求的是否为 /about.html 关于页面
if (url === '/' || url === '/index.html') {
content = url+'<h1>首页</h1>'
} else if (url === '/about.html') {
content = url+'<h1>关于页面</h1>'
}
// 5. 设置 Content-Type 响应头,防止中文乱码
res.setHeader('Content-Type', 'text/html; charset=utf-8')
// 6. 使用 res.end() 把内容响应给客户端
res.end(content)
})
server.listen(8080, () => {
console.log('server running at http://127.0.0.1:8080')
})
实现 clock 时钟的 web 服务器
核心思路
把文件的实际存放路径,作为每个资源的请求 url 地址。
实现步骤
1.导入需要的模块
2.创建基本的 web 服务器
3.将资源的请求 url 地址映射为文件的存放路径
4.读取文件内容并响应给客户端
5.优化资源的请求路径
// 1.1 导入 http 模块
const http = require('http')
// 1.2 导入 fs 模块
const fs = require('fs')
// 1.3 导入 path 模块
const path = require('path')
// 2.1 创建 web 服务器
const server = http.createServer()
// 2.2 监听 web 服务器的 request 事件
server.on('request', (req, res) => {
// 3.1 获取到客户端请求的 URL 地址
// /clock/index.html
// /clock/index.css
// /clock/index.js
const url = req.url
// 3.2 把请求的 URL 地址映射为具体文件的存放路径
// const fpath = path.join(__dirname, url)
// 5.1 预定义一个空白的文件存放路径
let fpath = ''
if (url === '/') {
fpath = path.join(__dirname, './clock/index.html')
} else {
// /index.html
// /index.css
// /index.js
fpath = path.join(__dirname, '/clock', url)
}
// 4.1 根据“映射”过来的文件路径读取文件的内容
fs.readFile(fpath, 'utf8', (err, dataStr) => {
// 4.2 读取失败,向客户端响应固定的“错误消息”
if (err) return res.end('404 Not found.')
// 4.3 读取成功,将读取成功的内容,响应给客户端
res.end(dataStr)
})
})
// 2.3 启动服务器
server.listen(80, () => {
console.log('server running at http://127.0.0.1')
})