Node.js

扫测资讯 2024-11-18 06:07   16 0

是什么

是一个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 软件包名


完结撒花🎉