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():使特定于平台的分隔符,作为定界符,将所有给定的路径片段连接在一起

javascript 复制代码
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文件里的字符串内容返回给请求方

javascript 复制代码
//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

javascript 复制代码
//导入
const obj = require('./utils.js')
console.log(obj)
const result = obj.arraySum([5,1,2,3])
console.log(result)

utils.js

javascript 复制代码
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

javascript 复制代码
// 目标:基于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

javascript 复制代码
//基于ECMAScript 标准语法,"默认"导入,工具属性和方法使用
//默认导入
import obj from './utils.js'
console.log(obj)
const result = obj.arraySum([10,20,30])
console.log(result)

package.json

javascript 复制代码
{"type":"module"}

命名导出和命名导入

语法:

导出:export 修饰定义语句

导入:import {同名变量} from '模块名或路径'


什么时候用 默认导入导出;什么时候用 命名导入导出:

按需加载的时候用 命名导入导出;

全部加载的时候用 默认导入导出


将模块、代码、其他资料聚合成一个文件夹

分类:项目包(编写项目需求和业务逻辑的文件夹);软件包(封装工具和方法进行使用的文件夹;一般使用 npm 进行管理)

要求:根目录必须有package.json文件

▲ 导入软件包时,导入的默认是index.js模块文件 / package.json中main属性指定的模块文件

完整代码:

arr.js

javascript 复制代码
//封装数组常用的方法

//求和函数
const getArraySum = arr => arr.reduce
((sum,item) => sum+=item,0)

module.exports = { 
    getArraySum
}

str.js

javascript 复制代码
//封装校验用户名和密码长度的函数;
//要求:用户名最少8位,密码最少6位

const checkUserName =  username => {
    return username.length >= 8
}

const checkPassWord =  password => {
    return password.length >= 6
}

module.exports = {
    checkUser :  checkUserName,
    checkPwd : checkPassWord
}

index.js

javascript 复制代码
// 本文件是 utils 工具包的唯一出口
// 作用:把所有工具模块方法集中起来,统一向外暴露

const {getArraySum}  = require('./lib/arr.js')
const {checkUser , checkPwd} = require('./lib/str.js')

//统一导出所有函数
module.exports = {
    getArraySum,
    checkUser,
    checkPwd
}

server.js

javascript 复制代码
//导入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 软件包名


完结撒花🎉

相关推荐
垣宇11 小时前
Vite 和 Webpack 的区别和选择
前端·webpack·node.js
爱吃南瓜的北瓜11 小时前
npm install 卡在“sill idealTree buildDeps“
前端·npm·node.js
翻滚吧键盘11 小时前
npm使用了代理,但是代理软件已经关闭导致创建失败
前端·npm·node.js
浪九天12 小时前
node.js的版本管理
node.js
浪九天14 小时前
node.js的常用指令
node.js
浪九天16 小时前
Vue 不同大版本与 Node.js 版本匹配的详细参数
前端·vue.js·node.js
小纯洁w1 天前
Webpack 的 require.context 和 Vite 的 import.meta.glob 的详细介绍和使用
前端·webpack·node.js
熬夜不洗澡1 天前
Node.js中不支持require和import两种导入模块的混用
node.js
bubusa~>_<1 天前
解决npm install 出现error,比如:ERR_SSL_CIPHER_OPERATION_FAILED
前端·npm·node.js
天下皆白_唯我独黑1 天前
npm 安装扩展遇到证书失效解决方案
前端·npm·node.js