Node.js 学习 path模块、fs模块、npm软件包管理器、导出、导入

news2024/11/24 20:32:04

目录

1.Node.js入门

1.1 什么是 Node.js

1.2 fs模块-读写文件

1.3 path模块-路径处理

1.4 案例-压缩前端html

1.5 认识URL中的端口号

1.6 http模块-创建Web服务

1.7 案例-浏览时钟

2.Node.js 模块化

2.1 模块化简介

2.1.1 什么是模块化?

2.1.2 CommonJS 标准导出和导入(默认)

2.2 ECMAScript标准-默认导出和导入

2.3 ECMAScript标准-命名导出和导入

2.4 包的概念

2.5 npm软件包管理器

2.6 npm安装所有依赖

2.7 npm全局软件包-nodemon

2.8 Node.js总结


1.Node.js入门

1.1 什么是 Node.js

定义:Node.js 是一个开放源代码的服务器平台,用于在服务器中执行JavaScript代码。它通常运行在服务器上而不是浏览器中。

作用:使用 Node.js 编写服务器端程序
  • ✓ 编写数据接口,提供网页资源浏览功能等等
  • 前端工程化:为后续学习 Vue 和 React 等框架做铺垫

Node.js 为何能执行 JS?

原理:Node.js 是建立在 Google 的 V8 JavaScript 引擎之上,这意味着它可以运行JavaScript代码而无需在浏览器中。这意味着开发者可以使用Javascript来编写服务器端代码,从而在客户端和服务器端都使用同一种语言和同一种编程范式,简化了开发和测试工作。

浏览器和Node.js的区别:都支持 ECMAScript 标准语法,Node.js 有独立的 API

 

可以看到Node.js,没有浏览器的BOM和DOM

如何使用 Node.js?
需求:新建 JS 文件,并编写代码后,在 node 环境下执行
命令:在 VSCode 集成终端中,输入 node xxx.js,回车即可执行

1.2 fs模块-读写文件

模块:类似插件,封装了 方法/属性
fs 模块:封装了与本机文件系统进行交互的,方法/属性
语法:
  • 1. 加载 fs 模块对象
  • 2. 写入文件内容
  • 3. 读取文件内容

实现:

注意事项:在读取文件时,成功返回的data,这里的data是buffer 16 进制数据流对象,

但是可以通过toString()方法变成字符串。

1.3 path模块-路径处理

问题:Node.js 代码中,相对路径是根据 终端所在路径 来查找的,可能无法找到你想要的文件。

解决方案:

建议:在 Node.js 代码中,使用 绝对路径。
补充:__dirname 内置变量(获取当前模块目录-绝对路径)
windows: D:\备课代码\3-B站课程\03_Node.js与Webpack\03-code\03
mac: /Users/xxx/Desktop/备课代码/3-B站课程/03_Node.js与Webpack/03-code/03
注意: path.join() 会使用特定于平台的分隔符,作为定界符,将所有给定的路径片段连接在一起
语法:
  • 1. 加载 path 模块
  • 2. 使用 path.join 方法,拼接路径

代码:

1.4 案例-压缩前端html

原始:

需求:把 回车符(\r)和换行符(\n)去掉后,写入到新 html 文件中
步骤:
  • 1. 读取源 html 文件内容
  • 2. 正则替换字符串
  • 3. 写入到新的 html 文件中
代码:
// 案例 - 压缩前端 html
// 需求:把 回车符(\r)和换行符(\n)去掉后,写入到新 html 文件中
// 步骤:
// 1. 读取源 html 文件内容  public/index.html
// 2. 正则替换字符串   String.replace(pattern, replacement)  pattern 可以是正则
// 3. 写入到新的 html 文件中   dist/index.html

const fs = require('fs')
const path = require('path')

fs.readFile(path.join(__dirname, 'public/index.html'), (err, data) => {
    if (err) console.log(err)
    else {
        // 使用正则表达式替换
        const disString = data.toString().replace(/[\r\n]/g, '')
        console.log(disString)
        // 将处理过的文件写到其他位置
        fs.writeFile(path.join(__dirname, 'dist/index.html'), disString, err => {
            if (err) console.log(err)
            else console.log('写入成功')
        })
    }
})

实现后效果:

1.5 认识URL中的端口号

URL: 统一资源定位符,简称网址用于访问服务器里的资源
端口号:标记服务器里不同功能的 服务程序
端口号范围:0-65535 之间的任意整数

平常我们没加端口号也能访问到数据,是因为 http 协议,默认访问 80 端口。

Web 服务程序 :用于提供网上信息浏览功能
注意:0-1023 和一些特定端口号被占用,我们自己编写服务程序请避开使用

1.6 http模块-创建Web服务

需求:创建 Web 服务并响应内容给浏览器
步骤:
  • 1. 加载 http 模块,创建 Web 服务对象
  • 2. 监听 request 请求事件,设置响应头和响应体
  • 3. 配置端口号启动 Web 服务
  • 4. 浏览器请求 http://localhost:3000 测试
  • (localhost:固定代表本机的域名)

代码:

// 需求:创建 Web 服务并响应内容给浏览器
// 步骤:
// 1. 加载 http 模块,创建 Web 服务对象
// 2. 监听 request 请求事件,设置响应头和响应体
// 3. 配置端口号并启动 Web 服务
// 4. 浏览器请求 http://localhost:3000 测试
// (localhost:固定代表本机的域名)

// 加载 http 模块,创建 Web 服务对象
const http = require('http')
const server = http.createServer()
// 监听 request 请求事件,设置响应头和响应体
server.on('request', (req, res) => {
    // 设置text/plain;charset=utf-8 , 请求体才可以显示中文
    res.setHeader('Content-Type', 'text/plain;charset=utf-8')
    // 请求体
    res.end('欢迎使用node.js 和 http模块创建的 Web 服务')
})

// 配置端口号并启动 Web 服务
server.listen(3000, () => {
    console.log('Web 启动成功')
    
})

1.7 案例-浏览时钟

需求:基于 Web 服务,开发提供 网页资源 的功能。
浏览时钟

步骤:
  • 1. 基于 http 模块,创建 Web 服务
  • 2. 使用 req.url 获取请求资源路径,判断并读取 index.html 里字符串内容返回给请求方
  • 3. 其他路径,暂时返回不存在的提示
  • 4. 运行 Web 服务,用浏览器发起请求测试 http://localhost:8080/index.html

代码:

/**
 * 目标:基于 Web 服务,开发提供网页资源的功能
 * 步骤:
 *  1. 基于 http 模块,创建 Web 服务
 *  2. 使用 req.url 获取请求资源路径,并读取 index.html 里字符串内容返回给请求方
 *  3. 其他路径,暂时返回不存在提示
 *  4. 运行 Web 服务,用浏览器发起请求
 */

// 1. 基于 http 模块,创建 Web 服务
const http = require('http')
const server = http.createServer()
const fs = require('fs')
const path = require('path')
const { error, log } = require('console')

// 2. 使用 req.url 获取请求资源路径,并读取 index.html 里字符串内容返回给请求方
server.on('request', (req, res) => {
  // req.url得到的是资源路径
  if (req.url === '/index.html') {
    fs.readFile(path.join(__dirname, 'dist/index.html'), (error, data) => {
      if (error) console.log(error)
      else {
        const resource = data.toString()
        res.setHeader('Content-Type', 'text/html;charset=utf-8')
        res.end(resource)
      }
    })
  } else {
    // 3. 其他路径,暂时返回不存在提示
    res.setHeader('Content-Type', 'text/html;charset=utf-8')
    res.end('不存在提示')
  }
})

// 4. 运行 Web 服务,用浏览器发起请求
server.listen(8080, () => {
  console.log('Web 服务启动成功')

})

2.Node.js 模块化

2.1 模块化简介

2.1.1 什么是模块化?

定义:在Node.js中,每个文件都被视为一个单独的模块。

概念:项目是由很多个模块文件组成的
好处:提高代码复用性,按需加载, 独立作用域

使用:需要标准语法导出导入进行使用。

2.1.2 CommonJS 标准导出和导入(默认)

使用:
  • 1. 导出:module.exports = {}
  • 2. 导入:require('模块名或路径')
模块名或路径:
  • 内置模块:直接写名字(例如:fs,path,http)
  • 自定义模块:写模块文件路径(例如:./utils.js)

演示:

2.2 ECMAScript标准-默认导出和导入

默认标准使用:
  • 1. 导出:export default {} ,也可以是一个函数
  • 2. 导入:import 变量名 from '模块名或路径'
     

这里的变量名就是export default 里面的对象。 

注意事项: Node.js 默认支持 CommonJS 标准语法
如需使用 ECMAScript 标准语法,在运行模块所在文件夹新建 package.json 文件,
并设置 { "type" : "module" }

2.3 ECMAScript标准-命名导出和导入

命名标准使用:
  • 1. 导出:export 修饰定义语句
  • 2. 导入:import { 同名变量 } from '模块名或路径‘
如何选择:
  • 按需加载,使用命名导出和导入
  • 全部加载,使用默认导出和导入

2.4 包的概念

包:将 模块,代码,其他资料 聚合成一个文件夹。
包分类:
  • 项目包:主要用于编写项目和业务逻辑
  • 软件包:封装工具和方法进行使用

要求:根目录中,必须有 package.json 文件(记录包的清单信息)
package.json 文件的作用?
        ➢ 记录 软件包的名字 ,作者, 入口 文件等信息
注意:导入软件包时,引入的默认是 index.js 模块文件 / main 属性指定的模块文件
需求:封装数组求和函数的模块,判断用户名和密码长度函数的模块,形成成一个 软件包。
分析执行过程:
lib文件夹下的 js 都是封装了属性和方法,方便开发者调用,但是该软件包引入时只会去访问该包的 ( 默认是 index.js 模块文件 / main 属性指定的模块文件 ),该文件为唯一入口,因此需要把所有封装的再封装一遍,提供调用者使用。

演示:

2.5 npm软件包管理器

定义 npm(“Node Package Manager” 的缩写)是Node.js 标准的软件包管理器,用来下载和管
理Node.js包依赖。

使用:
  • 1. 初始化清单文件 :npm init -y(得到 package.json 文件,有则略过此命令)
    • package.json 是 Node.js 项目的核心文件,它包含了项目的元数据、依赖项、脚本等重要信息。
  • 2. 下载软件包 :npm i 软件包名称
  • 3. 使用软件包

npm - 安装所有依赖

原理:

引入软件包: const dayjs = require("dayjs");

 

2.6 npm安装所有依赖

问题:项目中不包含 node_modules,能否正常运行?
答案:不能,缺少依赖的本地软件包(里面包含引入软件包的源码)
问题:为什么一般拷贝别人的项目是很多都没有  node_modules 文件?
原因:因为,自己用 npm 下载依赖比磁盘传递拷贝要快得多
解决:项目终端输入命令: npm i   ,因为   package.json 存在软件包以及版本,因此可以恢复
node_modules 文件。

2.7 npm全局软件包-nodemon

软件包区别:
  • 本地软件包:当前项目内使用,封装属性和方法,存在于 node_modules
  • 全局软件包:本机所有项目使用,封装命令和工具,存在于系统设置的位置
nodemon 作用:替代 node 命令,检测代码更改,自动重启程序

使用:
  • 1. 安装:npm i nodemon -g(-g 代表安装到全局环境中)
  • 2. 运行:nodemon 待执行的目标 js 文件

2.8 Node.js总结

Node.js 包:
概念:把模块文件,代码文件,其他资料聚合成一个文件夹
项目包:编写项目需求和 业务逻辑 的文件夹
软件包: 封装工具和方法 进行使用的文件夹(一般使用 npm 管理)
  • 本地软件包:作用在当前项目,一般封装的属性/方法,供项目调用编写业务需求
  • 全局软件包:作用在所有项目,一般封装的命令/工具,支撑项目运行

常用命令:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2164178.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【软件建设方案】设备管理系统建设方案(Doc原件参考)

1.系统概述 1.1.需求描述 1.2.需求分析 1.3.重难点分析 1.4.重难点解决措施 2.系统架构设计 2.1.系统架构图 2.2.关键技术 3.系统功能设计 3.1.功能清单列表 3.2.设备信息数据库 3.3.设备维护计划管理子系统 3.4.设备维护管理子系统 3.5.备件物资管理子系统 3.6.…

1区IEEE-Trans发文暴涨3倍,CCF-B类,刚跌出了TOP榜!这是不是官方提前发出警告?

【SciencePub学术】今天给大家推荐的是1本地球科学领域的SCI—《IEEE TRANSACTIONS ON GEOSCIENCE AND REMOTE SENSING》,IEEE-Trans系列,并且是CCF-B类期刊!此系列的期刊在业界的权威性还是不容置疑的。 优点VS缺点 ✦ IEEE-Trans系列 ✦ C…

普通本科生也能成为AI高手:人工智能学习指南

在人工智能(AI)日益普及的今天,许多人都渴望掌握这项技术,但常有人疑惑:没有顶尖学府的背景,我也能学习人工智能吗? 答案是肯定的! 人工智能是一个充满机遇与挑战的领域&#xff0c…

渗透测试工具 sqlmap 基础教程

一、引言 在网络安全领域,渗透测试是一项至关重要的工作,它可以帮助我们发现系统中的安全漏洞,从而采取相应的措施进行修复。而 sqlmap 作为一款强大的开源渗透测试工具,专门用于检测和利用 SQL 注入漏洞。本文将为大家详细介绍 …

HTTP 1.0 2.0 3.0详解

HTTP HTTP全称超文本传输协议,是一种属于应用层的通信协议。它允许将超文本标记语言文档(HTML)从Web服务器传输到客户端的浏览器。 HTTP报文结构 请求报文结构 请求方法: GET:一般用来请求已被URI识别的资源&#x…

Elasticsearch7.7.1集群不能相互发现的问题解决以及Elasticsearch7.7.1安装analysis-ik中文分词插件的应用

一、Elasticsearch7.7.1集群不能相互发现的问题解决 在使用elasticsearch7.7.1搭建集群,使用了3台服务器作为节点,但在搭建的过程中发现每台服务器的elasticsearch服务都正常,但是不能相互发现,期间进行了一些配置的修改偶尔出现了…

(附源码)SSM养老院综合服务管理系统-计算机毕设 23237

基于SSM的养老院综合服务管理系统 摘 要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,…

助力解析化学图像生成文本分析,化学大语言模型 ChemVLM 来啦!

ChemVLM 是由上海人工智能实验室于 2024 年推出的首个面向化学领域的开源多模态大型语言模型。该模型旨在解决化学图像理解与文本分析之间的不兼容问题,通过结合视觉 Transformer (ViT)、多层感知机 (MLP) 和大型语言模型 (LLM) 的优势,实现了对化学图像…

万维组态介绍

演示地址:http://121.40.16.189:12000 万维组态本地部署文档万维组态线上部署文档万维组态操作说明文档万维组态接入文档万维组态绑点示例文档万维组态接入源代码说明万维组态扩展图元示例文档万维组态大屏图元示例文档 项目介绍 万维组态是一款功能强大的基于Web的…

sar信号RD域的距离向傅里叶变换

下面可知,举例傅里叶变换时,posp 距离时间和频率 t不等于ft/K。而方位时间和频率时这种线性关系

整合SpringSecurity框架经典报错

报错描述Description: Field userDetailsService in com.atguigu.security.config.WebSecurityConfig required a bean of type org.springframe 这是整合SpringSecurity权限认证中经常出现的一个问题,由于SpringSecurity中这个UserDetailsService未找到 解决方案…

稀疏线性方程组求解技术——超节点法(Supernodal)简介

一、介绍 直接法的基础是矩阵的分解,常见的分解形式有LU分解、Cholesky分解、LDL分解等。 直接法通过将A矩阵分解成两个或多个因子的乘积,使得原方程组转化为若干个较容易求解的子问题。例如LU分解ALU,其中L是单位下三角矩阵,U是…

JavaScript typeof运算符

在js中可以typeof来做到确定一个值到底是什么类型。 <script>var num 100;//数值类型var name "mingzi";//字符串类型var book true;//布尔类型var student {name: " 小明",age: 16,tnum: "213444"}//对象是由多个数据组合而成&#x…

效率工具推荐 | 高效管理客服中心知识库

人工智能AI的广泛应用&#xff0c;令AI知识库管理已成为优化客服中心运营的核心策略之一。一个高效、易用且持续更新的知识库不仅能显著提升客服代表的工作效率&#xff0c;还能极大提升客户的服务体验。而高效效率工具如HelpLook&#xff0c;能够轻松搭建AI客服帮助中心&#…

[论文速读] Multimodal Fusion on Low-quality Data:A Comprehensive Survey 低质多模态数据融合综述

摘要&#xff1a; 多模态融合侧重于整合多种模态的信息&#xff0c;以实现更准确的预测&#xff0c;在自动驾驶和医疗诊断等广泛场景中取得了显着进展。然而&#xff0c;多模态融合的可靠性在很大程度上仍未得到探索&#xff0c;特别是在低质量数据设置下。本文调查了野外多模态…

Android平台使用VIA创建语音交互应用

Android平台使用VIA创建语音交互应用 概述 在 Android 平台上开发一款语音助手应用需要整合多种技术,包括语音识别(ASR)、文字转语音(TTS)、以及热词检测(Hotword Detection)。这些技术共同构成了语音助手应用的核心交互方式,使用户能够通过语音命令与设备进行无缝交…

JavaWeb便利店管理系统

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 spring-mybatis.xml3.5 spring-mvc.xml3.5 login.jsp 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优…

spring里面内置的非常实用的工具

一 、请求数据记录 Spring Boot提供了一个内置的日志记录解决方案&#xff0c;通过 AbstractRequestLoggingFilter 可以记录请求的详细信息。 AbstractRequestLoggingFilter 有两个不同的实现类&#xff0c;我们常用的是 CommonsRequestLoggingFilter。 通过 CommonsRequestL…

Python 烟花展示:使用 Pygame 创建绚丽的夜空

在Python中&#xff0c;使用pygame库可以轻松地创建图形和动画效果&#xff0c;非常适合制作各种游戏和视觉展示。今天&#xff0c;我们将一起探索如何使用pygame来制作一个简单的烟花展示程序。这个程序将模拟烟花在夜空中绽放的壮丽景象&#xff0c;通过随机生成的粒子来模拟…

MQTT客户端实战:从连接到通信。详细说明MQTT客户端和MQTT代理进行通信

EMQX安装 EMQX服务器安装 安装文档&#xff0c;见链接不另外写 https://docs.emqx.com/zh/emqx/latest/deploy/install-ubuntu.html 启动 EMQX 启动为一个 systemd 服务&#xff1a; sudo systemctl start emqx在windows安装客户端 在线 MQTT WebSocket 客户端工具&…