Node.js
是什么
是一个js的运行环境(有了Node.js,就可以脱离浏览器,独立执行js的代码)
选择cmd终端
在node环境下使用node命令,执行js代码
法一
法二(选)
这样再执行某个js文件时,(切换终端里的路径,直接定位文件所在文件夹)就可以使用node + 相对路径
fs模块 —— 读写文件
语法:
- 将js模块加载到js文件中,获取js模块对象
const fs = require(' fs ') 模块的名字
- 写入文件内容
fs.writeFile('文件路径' , '写入的内容' , err => {} ) 写入后的回调函数
- 读取文件内容
fs.readFile('文件路径' , (err, data )=>{} ) 读取后的回调函数
data 是 buffer 16进制数据流对象 ;要通过data.toString()才能转换成字符串
path模块 —— 路径问题
注意一个问题:Node.js代码中,相对路径是根据终端所在路径来找的
建议:在Node.js代码中,使用绝对路径
绝对路径如何获取: __dirname
可动态获取 当前模块 js文件 所在文件夹目录的绝对路径
由于windows和mac不同平台的定界符不同;我们使用 path.join() 拼接路径
path.join():使特定于平台的分隔符,作为定界符,将所有给定的路径片段连接在一起
const fs = require('fs')
const path = require('path')
//读取文件内容
fs.readFile(path.join(__dirname,'../test.txt'),(err,data)=>{
if(err) console.log(err)
else console.log(data.toString())
})
语法:
- 加载path模块,引入path模块对象
- 调用path.join() 配合__dirname 组成目标文件的绝对路径
案例1. —— 压缩前端html
目的:让前端的代码体积更小,用户在自己浏览器中加载的更快
需求:把回车符\r 和 换行符\n去掉,然后写入新的html文件中
思路:
读取源html文件内容 -> 正则表达式替换字符串(\r\n 换成'')-> 写入新的html文件中
- 读取源html文件内容
- 正则表达式替换字符串
- 写入新的html文件中
http模块 —— 创建Web服务程序
需求:创建Web服务 并 响应内容给浏览器
端口号:0~65535 ; 其中0~1023是被系统占用的
- 加载http模块
- 创建Web服务对象
- 监听request请求事件,设置响应头和响应体
- 配置端口号 并 启动Web服务
- 浏览器请求(http://localhost:端口号)测试
server.on ("request",( req,res )=>{
res.end("Hello Nodejs")
//end方法能够将数据返回给浏览器,浏览器会显示该字符串
})*on:该方法用来监听事件**
参数1(此处的request):事件类型,request代表浏览器请求事件
参数2:回调函数。当监听到浏览器请求后,发出的回调函数,该函数中有两个参数
第一个参数(此处req):请求对象
第二个参数(此处res):响应对象
end方法能够将数据返回给浏览器,浏览器会显示该字符串
案例2.—— 浏览时钟
需求:基于Web服务,将时钟网页提供给浏览器浏览
只有请求/index.html时,才把压缩完的,时钟的html文件里的字符串内容返回给请求方
//1.加载http模块
const http = require('http')
const fs = require('fs')
const path = require('path')
//2.创建Web服务对象
const server = http.createServer()
//3.server.on监听request请求事件
server.on('request',(req,res)=>{
//使用req.url获取请求资源路径,并读取index.html里字符串内容返回给请求方
if(req.url === '/index.html'){
fs.readFile(path.join(__dirname,'dist/index.html'),(err,data)=>{
if(err) console.log(err)
else{
//html这里要设置响应内容类型为超文本字符串,让浏览器解析成标签网页
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('你要访问的资源路径不存在')
}
})
//6.配置端口号,server.listen启动Web服务 //在指定的端口或路径上创建监听
server.listen(8080,()=>{
console.log('Web 服务启动成功了')
})
Node.js的模块化:在Node.js中,每个文件都被视为一个单独的模块;一个项目通常由很多个模块文件组成;
好处:每个模块的作用域是独立的(独立作用域)
CommonJS标准
自定义模块通常起名为utils.js;在这个模块内,可以对想要向外暴露属性和方法进行导入、导出
语法:
导出:module.exports = {
对外属性名1 = 属性名1,
对外属性名2 = 属性名2
}
导入:const obj = require('模块名或路径')
obj就等于module.exports导出的对象
什么时候写模块名;什么时候写路径:
对于内置模块,直接写名字 eg. fs、path、http ... ...
对于自定义模块,写模块文件路径 eg. './utils.js'
完整代码:
index.js
//导入
const obj = require('./utils.js')
console.log(obj)
const result = obj.arraySum([5,1,2,3])
console.log(result)
utils.js
const baseURL ='http://hmajax.itheima.net'
//arr.reduce(回调函数,初始值)
//回调函数有四个参数分别为(pre,current,index,arr)
//pre:类似于累加器
//current:当前元素
//index:当前元素的下标
//arr:遍历的原数组
const getArraySum = arr => arr.reduce
((sum,item) => sum+=item,0)
//导出
module.exports = {
url:baseURL,
arraySum:getArraySum
}
ECMAScript标准
默认导出和导入
语法:
导出:export default {
对外属性名1 = 属性名1,
对外属性名2 = 属性名2
}
导入:import 变量名 from '模块名或路径'
注意:Node.js默认支持CommonJS标准语法;如果要使用ECMAScript标准语法,需要在运行模块所在文件夹下新建package.json文件,并设置{"type":"module"}
完整代码:
utils.js
// 目标:基于ECMAScript 标准语法,封装属性 和 方法并“默认”导出
const baseURL ='http://hmajax.itheima.net'
//arr.reduce(回调函数,初始值)
//回调函数有四个参数分别为(pre,current,index,arr)
//pre:类似于累加器
//current:当前元素
//index:当前元素的下标
//arr:遍历的原数组
const getArraySum = arr => arr.reduce
((sum,item) => sum+=item,0)
//导出
export default {
url:baseURL,
arraySum:getArraySum
}
index.js
//基于ECMAScript 标准语法,“默认”导入,工具属性和方法使用
//默认导入
import obj from './utils.js'
console.log(obj)
const result = obj.arraySum([10,20,30])
console.log(result)
package.json
{"type":"module"}
命名导出和命名导入
语法:
导出:export 修饰定义语句
导入:import { 同名变量 } from '模块名或路径'
什么时候用 默认导入导出;什么时候用 命名导入导出:
按需加载的时候用 命名导入导出;
全部加载的时候用 默认导入导出
包
将模块、代码、其他资料聚合成一个文件夹
分类:项目包(编写项目需求和业务逻辑的文件夹);软件包(封装工具和方法进行使用的文件夹;一般使用 npm 进行管理)
要求:根目录必须有package.json文件
▲ 导入软件包时,导入的默认是index.js模块文件 / package.json中main属性指定的模块文件
完整代码:
arr.js
//封装数组常用的方法
//求和函数
const getArraySum = arr => arr.reduce
((sum,item) => sum+=item,0)
module.exports = {
getArraySum
}
str.js
//封装校验用户名和密码长度的函数;
//要求:用户名最少8位,密码最少6位
const checkUserName = username => {
return username.length >= 8
}
const checkPassWord = password => {
return password.length >= 6
}
module.exports = {
checkUser : checkUserName,
checkPwd : checkPassWord
}
index.js
// 本文件是 utils 工具包的唯一出口
// 作用:把所有工具模块方法集中起来,统一向外暴露
const {getArraySum} = require('./lib/arr.js')
const {checkUser , checkPwd} = require('./lib/str.js')
//统一导出所有函数
module.exports = {
getArraySum,
checkUser,
checkPwd
}
server.js
//导入utils软件包,使用里面封装的工具函数
const obj = require('./utils')
console.log(obj)
const result = obj.getArraySum([10,20,30])
console.log(result)
npm —— 软件包管理器
npm 是个命令(是Node.js的软件包管理器);使用npm命令就可以下载和管理Node.js环境中需要使用的软件包
怎么使用npm下载一些软件包:
- 初始化项目清单文件:npm init -y (得到package.json文件)
- 下载软件包:npm i 软件包名称
- 使用软件包
需求:使用dayjs软件包,来格式化日期时间
1.初始化项目清单文件
2.下载软件包到当前项目
多俩文件:node_modules(里有dayjs)和 package-lock.json
package-lock.json:锁定当前项目中所使用的软件包的版本号(dayjs:1.11.7)
npm —— 安装所有依赖
场景:从别人那里拿来的项目,缺少软件包对应的源码(即项目中只有package.json没有node_modules)
解决方法:当前项目下 npm i 安装所有依赖软件包
它会根据package.json中记录的所有软件包进行下载
npm —— 全局软件包 nodemon
本地软件包:作用在当前项目,用于封装属性和方法
全局软件包:本机所有项目使用,用于封装命令和工具
怎么用:
- 安装:npm i nodemon -g
- 使用nodemon执行目标js文件(代替node命令)
nodemon作用:检测代码更改,自动重启程序
删除软件包:npm uni 软件包名
完结撒花🎉