当前位置: 首页 > news >正文

第四章认识Node.js模块化开发

Node.js系统模块

续上一篇文章第三章认识Node.js模块化开发-CSDN博客,这次继续来认识和总结以下node的常用模块开发

Node.js系统模块是指Node.js自带的一些模块,这些模块可以直接在Node.js中使用,无需安装其他包。以下是常用的Node.js系统模块:

  1. fs模块:用于处理文件系统。

  2. http模块:用于创建HTTP服务器和客户端。

  3. url模块:用于解析URL和格式化URL。

  4. path模块:用于处理文件路径。

  5. os模块:用于获取服务器的操作系统相关信息。

  6. process模块:用于与当前进程进行交互。

  7. events模块:用于创建和处理事件。

  8. buffer模块:用于处理二进制数据。

  9. stream模块:用于处理大量数据的输入输出流。

  10. crypto模块:用于加密和解密数据。

  11. zlib模块:用于压缩和解压缩数据。

  12. assert模块:用于编写测试用例。

以上模块均可以通过 require() 函数进行引入使用。

Node.js第三方模块

Node.js第三方模块是指由其他开发者或组织编写的、不隶属于Node.js官方维护的模块,这些模块通常都发布在npm(Node Package Manager)上,可以通过npm命令进行安装和使用。

命令格式:npm install 模块名称

常见的Node.js第三方模块有:

  1. Express:一个流行的Web应用程序框架,提供了简单和灵活的API,可以快速搭建Web应用程序和API。

  2. Socket.IO:一个实时的双向通信库,支持Websocket协议和轮询方式,可以实现实时聊天、在线游戏等功能。

  3. Sequelize:一个ORM框架,支持多种数据库,可以方便地进行数据库操作。

  4. Async:用于处理异步操作的工具库,提供了多种函数,可以方便地处理异步流程和控制流。

  5. Nodemailer:一个邮件发送库,可以方便地发送电子邮件。

  6. Moment:一个处理日期和时间的工具库,提供了方便的API,可以方便地进行时间处理。

  7. Lodash:一个JS工具库,提供了多种常用函数,可以方便地进行数组、字符串、对象等操作。

综上所述,Node.js第三方模块可以极大地丰富Node.js的功能和扩展性,提供了更多的选择和便利,可以大大提高Node.js开发效率和编程质量。

Node.js常用开发工具

nodemon工具

nodemon是一个非常实用的Node.js工具,它可以帮助我们在开发过程中自动重启Node.js应用程序,而不需要手动重启。nodemon会监视文件的变化,并自动重新启动Node.js应用程序,从而使开发过程更高效,减少手动重启的麻烦。

要使用nodemon安装它非常简单,只需要在命令行中输入以下命令即可:

npm install -g nodemon

安装完毕后,在命令行中使用nodemon来启动应用程序,就可以自动重启了。例如:

nodemon app.js

这条命令将启动一个名为app.js的Node.js应用程序,并监听该文件的变化,如果文件发生更改,它将自动重新启动。

nrm工具

nrm是一个npm registry manager,它可以帮助我们快速地切换npm镜像源,以加快我们在使用npm工具时的下载速度。在国内由于网络限制,使用默认的npm镜像源会非常慢,因此我们需要使用nrm来快速切换到国内镜像源,例如cnpmjs等。

要使用nrm,需要先全局安装它:

npm install -g nrm

安装完成后,可以使用以下命令查看可用的镜像源:

nrm ls

使用以下命令来切换到指定的镜像源:

nrm use <mirror-name>

例如,要切换到cnpmjs镜像源,可以使用以下命令:

nrm use cnpm
gulp工具

Gulp是一款基于Node.js的自动化构建工具,它可以自动完成开发过程中的一些重复、耗时任务,如代码压缩、文件合并、自动刷新浏览器等,从而提高项目开发效率。

使用Gulp需要先全局安装它:

npm install -g gulp

安装完成后,在项目中安装gulp及相关插件:

npm install --save-dev gulp gulp-concat gulp-uglify gulp-rename

其中,gulp-concat用于合并文件,gulp-uglify用于压缩JavaScript代码,gulp-rename用于重命名文件。

在gulpfile.js文件中编写任务:

const gulp = require('gulp');
const concat = require('gulp-concat');
const uglify = require('gulp-uglify');
const rename = require('gulp-rename');// 合并、压缩、重命名JS文件
gulp.task('js', function() {return gulp.src('src/js/*.js').pipe(concat('all.js')).pipe(gulp.dest('dist/js')).pipe(uglify()).pipe(rename({ suffix: '.min' })).pipe(gulp.dest('dist/js'));
});// 默认任务
gulp.task('default', gulp.series('js'));

在命令行中执行gulp任务:

gulp

执行完毕后,即可在dist/js目录中生成合并、压缩、重命名后的JS文件。

Node.js模块加载机制

Node.js采用的是CommonJS模块规范,模块是Node.js中最重要的概念之一。在Node.js中,每个文件都被视为一个独立的模块,每个模块都有自己的作用域,也就是说,在一个模块内定义的变量、函数等只是在该模块内有效,而在其他模块内无法访问。

Node.js模块加载机制的实现基于以下两个原则:

  1. 模块第一次加载时会被缓存,以后再次加载时直接从缓存中读取,不会重复执行。

  2. 模块加载的顺序是按照其被引用的顺序来执行的。

在Node.js中,使用require函数来加载模块。require函数会根据传入的参数,去寻找该模块,并将其返回。在寻找模块的过程中,Node.js会按照以下规则来匹配模块:

  1. 如果参数是一个绝对路径,Node.js会根据该路径直接加载对应的模块。

  2. 如果参数是一个相对路径,Node.js会将其转化为绝对路径后再加载对应的模块。在转换为绝对路径时,会以调用require函数的模块所在的目录作为基准路径。

  3. 如果参数是一个模块名,Node.js会按照以下顺序依次尝试:

    a. 将模块名作为文件名来查找对应的模块文件(比如,模块名为“./hello”,则会查找当前目录下的hello.js文件)。

    b. 将模块名作为目录名来查找对应的模块目录(比如,模块名为“./foo”,则会查找当前目录下的foo目录)。

    c. 在上一步找到的目录中查找package.json文件,读取其中的main字段,然后根据该字段所指定的文件名来加载对应的模块文件。

    d. 如果上述步骤都失败了,就会将模块名作为一个包名来查找对应的模块目录。

在实际开发中,我们可以通过模块化的方式来组织代码,将不同的功能模块分开编写,提高代码的可维护性和可重用性。

项目

好的,以下是一个使用node.js的系统模块、第三方模块和nodemon、nrm、gulp工具和模块加载机制的小项目示例:

  1. 安装nodemon和nrm

在命令行中输入以下命令:

npm install -g nodemon nrm
  1. 添加一个package.json文件并添加依赖

在项目根目录下,输入以下命令创建package.json文件:

npm init

依次输入相关配置信息即可,最后会生成一个package.json文件。

在命令行中输入以下命令,安装需要的依赖:

npm install express body-parser gulp gulp-concat gulp-uglify gulp-rename gulp-clean-css
  1. 创建项目文件结构

在项目根目录下创建以下文件夹:

public/css/style.cssjs/script.js
views/index.html
server.js
gulpfile.js

其中,public文件夹用于存放静态资源文件,views文件夹用于存放HTML模板文件,server.js文件是项目的入口文件,gulpfile.js文件是gulp的配置文件。

  1. 编写代码

在server.js文件中,编写以下代码:

const express = require('express');
const bodyParser = require('body-parser');const app = express();app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));app.use(express.static(__dirname + '/public'));app.get('/', (req, res) => {res.sendFile(__dirname + '/views/index.html');
});const server = app.listen(3000, () => {console.log('Server running on port 3000');
});

在views/index.html文件中,编写以下代码:

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>Node.js小项目</title><link rel="stylesheet" href="/css/style.css"></head><body><h1>Hello, Node.js!</h1><script src="/js/script.js"></script></body>
</html>

在public/css/style.css文件中,编写以下代码:

body {background-color: #ccc;
}

在public/js/script.js文件中,编写以下代码:

console.log('Hello, Node.js!');

在gulpfile.js文件中,编写以下代码:

const gulp = require('gulp');
const concat = require('gulp-concat');
const uglify = require('gulp-uglify');
const rename = require('gulp-rename');
const cleanCSS = require('gulp-clean-css');gulp.task('scripts', () => {return gulp.src('public/js/*.js').pipe(concat('main.js')).pipe(gulp.dest('public/dist')).pipe(rename({ suffix: '.min' })).pipe(uglify()).pipe(gulp.dest('public/dist'));
});gulp.task('styles', () => {return gulp.src('public/css/*.css').pipe(concat('main.css')).pipe(gulp.dest('public/dist')).pipe(rename({ suffix: '.min' })).pipe(cleanCSS()).pipe(gulp.dest('public/dist'));
});gulp.task('watch', () => {gulp.watch('public/js/*.js', gulp.series('scripts'));gulp.watch('public/css/*.css', gulp.series('styles'));
});gulp.task('default', gulp.series('scripts', 'styles', 'watch'));
  1. 运行项目

在命令行中输入以下命令启动项目:

nodemon server.js

在命令行中输入以下命令启动gulp:

gulp

现在你可以在浏览器中访问http://localhost:3000/看到运行效果了。

相关文章:

第四章认识Node.js模块化开发

Node.js系统模块 续上一篇文章第三章认识Node.js模块化开发-CSDN博客&#xff0c;这次继续来认识和总结以下node的常用模块开发 Node.js系统模块是指Node.js自带的一些模块&#xff0c;这些模块可以直接在Node.js中使用&#xff0c;无需安装其他包。以下是常用的Node.js系统模块…...

Widget必须在GUI线程中创建

背景&#xff1a;miniblink的vip版本&#xff0c;下载功能是独立线程&#xff0c;我希望在下载后弹出窗口&#xff0c;就在其中创建了QWidget子类对象。然后出现了上面的错误。 解决方法&#xff1a; 使用信号和槽来处理。 具体来讲&#xff0c;在独立线程中创建QObject子类…...

Kubernetes概念及实践

Kubernetes(K8S)中文文档_Kubernetes中文社区 Kubernetes 文档 | Kubernetes K8S 是负责自动化运维管理多个跨机器 Docker 程序的 集群。 kubeadm快速部署K8s集群的工具&#xff0c;如&#xff1a; 创建master node&#xff1a;kubeadm init 将worker node加入到集群中&#x…...

洛谷 B2007 A+B问题 C++代码

目录 题目描述 AC Code 题目描述 AC Code #include<bits/stdc.h> using namespace std; typedef long long ll; int main() { int a,b;cin>>a>>b;cout<<ab<<endl;return 0; }...

Git基础 | 原理、配置、用法、分支 合并

目录 1 git初步了解 1.1 git的安装 1.2 git原理模型 1.3 git基础配置 1.4 git基础用法 1 将文件加入暂存区 2 查看当前的git仓库状态 3 删除文件 4 commit 将暂存区文件加入本地git版本仓库 5 查看提交历史 更改 2 分支 2.1 创建分支 2.2 查看分支 2.3 切换分支 …...

刀具磨损状态识别(Python代码,MSCNN_LSTM_Attention模型,初期磨损、正常磨损和急剧磨损分类,解压缩直接运行)

1.运行效果&#xff1a;刀具磨损状态识别&#xff08;Python代码&#xff0c;MSCNN_LSTM_Attention模型&#xff0c;初期磨损、正常磨损和急剧磨损&#xff09;_哔哩哔哩_bilibili 环境库&#xff1a; NumPy 版本: 1.19.4 Pandas 版本: 0.23.4 Matplotlib 版本: 2.2.3 Keras …...

web:[网鼎杯 2020 青龙组]AreUSerialz

题目 点进题目发现 需要进行代码审计 function __destruct() {if($this->op "2")$this->op "1";$this->content "";$this->process();}这里有__destruct()函数&#xff0c;在对象销毁时自动调用&#xff0c;根据$op属性的值进行…...

【Python机器学习】零基础掌握PolynomialCountSketch内核近似特征

面临挑战的机器学习模型:如何提高准确性? 在实际应用中,机器学习模型常常面临一个问题:如何在保持模型复杂性不变的情况下,提高模型的准确性?特别是在处理高维数据集时,这个问题尤为突出。这里,有一种名为“核方法”的技术可以解决这个问题,但通常会增加计算成本。那…...

【Linux】深入理解系统文件操作(1w字超详解)

1.系统下的文件操作&#xff1a; ❓是不是只有C\C有文件操作呢&#xff1f;&#x1f4a1;Python、Java、PHP、go也有&#xff0c;他们的文件操作的方法是不一样的啊 1.1对于文件操作的思考&#xff1a; 我们之前就说过了&#xff1a;文件内容属性 针对文件的操作就变成了对…...

echarts柱状图和折线图双图表配置项

{tooltip: {trigger: axis,axisPointer: { // 坐标轴指示器&#xff0c;坐标轴触发有效type: cross // 默认为直线&#xff0c;可选为&#xff1a;line | shadow}},legend: {data: [新增客户数, 新增客户两年内回款情况],type: scroll,selectedMode: false // 控制是否可以通过…...

【LVS实战】02 搭建一个LVS-NAT实验

一、网络结构 用虚拟机搭建如下的几台机器&#xff0c;并配置如下的ip 关于虚拟机网卡和网络的配置&#xff0c;可以参考 iptables章节&#xff0c;05节&#xff1a;网络转发实验 主机A模拟外网的机器 B为负载均衡的机器 C和D为 RealServer 二、C和D主机的网关设置 C和D机…...

2023.10.26-SQL测试题

employee表&#xff1a; department表&#xff1a; job表&#xff1a; location表&#xff1a; 题目及答案&#xff1a; -- (1).查询工资大于一万的员工的姓名(first_name与last_name用“.”进行连接)和工资-- select CONCAT(first_name,.,last_name) as 姓名 ,salary -…...

JVM虚拟机:从结构到指令让你对栈有足够的认识

本文重点 在前面的课程中,我们学习了运行时数据区的大概情况,从本文开始,我们将对一些组件进行详细的介绍,本文我们将学习栈。栈内存主管java的运行,是在线程创建时创建的,它是线程私有的,它的生命周期是跟随线程的生命期,也就是说线程结束栈内存就释放了,对于栈来说…...

【启发式算法】白鲸优化算法【附python实现代码】

写在前面&#xff1a; 首先感谢兄弟们的订阅&#xff0c;让我有创作的动力&#xff0c;在创作过程我会尽最大能力&#xff0c;保证作品的质量&#xff0c;如果有问题&#xff0c;可以私信我&#xff0c;让我们携手共进&#xff0c;共创辉煌。 路虽远&#xff0c;行则将至&#…...

【Python机器学习】零基础掌握RBFSampler内核近似特征

有没有想过如何在复杂的数据集上快速进行分类? 在现实生活中,大量的数据集通常非常复杂,并不总是线性可分的。例如,在医疗领域,诊断患者是否患有某种疾病通常涉及多个变量和复杂的模式。简单的线性模型可能无法有效地处理这种复杂性。 一种可能的解决方案是使用更复杂的…...

高级工技能等级认定---网络设备安全

目录 一、DHCP 安全配置 二、SSH配置 三、标准ACL的配置 四、配置交换机端口安全 五、三层交换和ACL的配置 一、DHCP 安全配置 配置要求&#xff1a; 1.给交换机配置enable密码. 2.在交换机上创建VLAN 100&#xff0c;将F0/1-3口改为Access口&#xff0c;并加入到VLAN …...

spting Boot常见知识点

31.介绍一下 SpringBoot&#xff0c;有哪些优点&#xff1f; 1、Spring Boot 基于 Spring 开发&#xff0c;Spirng Boot 本身并不提供 Spring 框架的核心特性以及扩展功能&#xff0c;只是用于快速、敏捷地开发新一代基于 Spring 框架的应用程序。它并不是用来替代 Spring 的解…...

大模型在数据分析场景下的能力评测

“你们能对接国产大模型吗&#xff1f;” “开源的 LLaMA 能用吗&#xff0c;中文支持怎么样&#xff1f;” “私有化部署和在线服务哪个更合适&#xff1f;” 自 7 月 14 日发布 AI 数智助理 Kyligence Copilot 后&#xff0c;我们收到了很多类似上面的咨询&#xff0c;尤其…...

[笔记] 关于y1变量取名冲突的问题

参考博客 遇到的问题和这位老哥的一模一样。 结论是&#xff1a;当我们用math头文件的时候&#xff0c;不能在全局定义 y0 和 y1&#xff0c;j0、j1、jn、yn。...

js笔记(函数参数、面向对象、装饰器、高级函数、捕获异常)

JavaScript 笔记 函数参数 默认参数 在 JavaScript 中&#xff0c;我们可以为函数的参数设置默认值。如果调用函数时没有传递参数&#xff0c;那么参数将使用默认值。 function greet(name World) {console.log(Hello, ${name}!); }greet(); // 输出&#xff1a;Hello, Wo…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...