Node.js进阶-包与模块化

文章目录

  • 一、模块化
    • 概念
    • node.js的模块
    • 加载模块
    • 向外共享模块作用域的成员
    • 模块化规范
  • 二、npm与包
    • 概念
    • 包的下载与使用
      • 下载速度慢的解决方法
  • 三、npm
    • npm初体验
    • 包管理配置文件
      • 多人协作问题
      • 一次性安装所有包
      • 卸载包
    • 调试包
    • 包的分类
      • 项目包
      • 全局包
    • 规范包结构
    • 开发属于自己的包
      • 模块化拆分
      • README.md
    • 发布包
      • 注册npm账号
      • 登录npm账号
      • 发布包
      • 删除已发布的包
    • 模块加载机制
      • 缓存机制
      • 优先级
      • 自定义模块
      • 第三方模块
      • 目录作为模块

一、模块化

概念

模块化是指解决一个复杂问题时, 自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说,模块是可组合、分解和更换的单元。

编程领域中的模块化,就是遵守固定的规则,把一个大文件拆成独立并互相依赖的多个小模块。

node.js的模块

内置模块(内置模块是由Node.js官方提供的,例如fs、path. http 等)

自定义模块(用户创建的每个.js文件,都是自定义模块)

第三方模块(由第三方开发出来的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要先下载)

加载模块

使用强大的 r e q u i r e ( ) require() require()方法,可以加载需要的内置模块、用户自定义模块、第三方模块进行使用。

// 1.加载内置的fs模块
const fs = require('fs')
// 2.加载用户的自定义模块,去掉.js也能成功加载
const custom = require(' ./custom.js ' )
// 3.加载第三方模块(关于第三方模块的下载和使用,会在后面的课程中进行专]的讲解)
const moment = require( ' moment ' )

注意:使用require0方法加载其它模块时,会执行被加载模块中的代码。

向外共享模块作用域的成员

模块内的变量和方法只能模块内部使用,即使加载模块也无法使用,想要共享,可以使用 m o d u l e module module对象
在每个js自定义模块中都有一个 m o d u l e module module对象,它里面存储了和当前模块有关的信息, c o n s o l e . l o g ( m o d u l e ) console.log(module) console.log(module)打印如下:
在这里插入图片描述
通过exports属性可以对外共享数据
在自定义模块中,可以使用module.exports对象,将模块内的成员共享出去,供外界使用。
外界用require0方法导入自定义模块时,得到的就是module.exports所指向的对象。
程序员可以选择想要暴露的属性

const age = 20
//向module. exports 对象上挂载username 馬性
module.exports.username =' zs'
//向module.exports对象上挂载sayHello方法
module.exports.sayHello = function() {
	console.log( 'Hello!')
}

由于 m o d u l e . e x p o r t s module.exports module.exports单词写起来比较复杂,为了简化向外共享成员的代码,Node提供了 e x p o r t s exports exports对象。默认情况下, e x p o r t s exports exports m o d u l e . e x p o r t s module.exports module.exports指向同一个对象。最终共享的结果,还是以 m o d u l e . e x p o r t s module.exports module.exports指向的对象为准。
时刻谨记,require()模块时,得到的永远是module.exports指向的对象: .
在这里插入图片描述
为了防止混乱,建议大家不要在同一个模块中同时使用exports和module.exports

模块化规范

Nodejs遵循了CommonJS模块化规范, CommonJS 规定了模块的特性和各模块之间如何相互依赖。
CommonJS规定:
①每个模块内部,module 变量代表当前模块。
②module变量是一个对象, 它的exports属性(即module.exports)是对外的接口。
③加载某个模块,其实是加载该模块的module.exports属性。require(方法用于加载模块。

二、npm与包

概念

Node.js中的第三方模块又叫做包。
由于Node.js的内置模块仅提供了一些底层的API,导致在基于内置模块进行项目开发的时,效率很低。
包是基于内置模块封装出来的,提供了更高级、更方便的API,极大的提高了开发效率。

包的下载与使用

国外有一家IT公司,叫做npm, Inc. 这家公司旗下有一个非常著名的网站:npm,是目前全球最大的包共享平台
npm, Inc. 公司提供了一个的服务器,来对外共享所有的包,我们可以从这个服务器上下载自己所需要的包。
注意服务器地址打不开,npm, Inc.公司提供了-一个包管理工具,我们可以使用这个包管理工具,从服务器把需要的包下载到本地使用。
这个包管理工具的名字叫做Node Package Manager (简称npm包管理工具) , 这个包管理工具随着Node.js的安装包一起被安装到了用户的电脑上。
可以在终端中执行 n p m − v npm -v npmv命令,来查看自己电脑上所安装的npm包管理工具的版本号
安装指定名称的包,使用如下命令

npm install 包的完整名称[@版本号]/npm i 完整的包名称[@版本号]
不写版本号默认最新版本
重新安装不需要卸载,会直接覆盖

包的使用和模块使用方式一样,具体用处见官方文档npm

下载速度慢的解决方法

PS:在使用npm下包的时候,默认从国外的服务器进行下载,此时,网络数据的传输需要经过漫长的海底光缆,因此下包速度会很慢。
使用镜像服务器:
一些公司在国内搭建了一个服务器,专]把国外官方服务器上的包同步到国内的服务器,然后在国内提供下包的服务。从而极大的提高了下包的速度。此时应该切换npm的下包镜像源:
下包镜像源,指的就是下包的服务器地址

#查看当前的下包镜像源
	npm config get registry 
#将下包的镜像源切换为淘宝镜像源
	npm config set registry=https://registry.npm.taobao.org/
#检查镜像源是否下载成功
	npm config get registry

为了更方便的切换下包的镜像源,我们可以安装nrm这个小工具,利用nrm提供的终端命令,可以快速查看和切换下包的镜像源。

#通过npm包管理器,将nrm安装为全局可用的工具
	npm i nrm -g
#查看所有可用的镜像源
	nrm ls
#将下包的镜像源切换为taobao 镜像
	nrm use taobao

三、npm

npm初体验

初次装包完成后,在项目文件夹下多一个叫做 node. modules的文件夹和package -lockjson的配置文件。
node_ modules文件夹用来存放所有已安装到项目中的包。require()导入第三方包时,就是从这个目录中查找并加载包。
package- lockjson配置文件用来记录node. _modules目录下的每一个包的下载信息, 例如包的名字、版本号、下载地址等.

包管理配置文件

npm规定,在项目根目录中,必须提供一个叫做 package.json的包管理配置文件。用来记录与项目有关的一些配置
●项目的名称、版本号、描述等
●项目中都用到了哪些包
●哪些包只在开发期间会用到
●那些包在开发和部署时都需要用到

多人协作问题

一般一个项目中自己写的源代码体积很小,主要是第三方包占据主要内存,因此在共享时只需要传输自己源代码,第三方包需要剔除,因此需要记录,因此package.json就是用来记录第三方包的。packagejison文件中,有一个dependencies节点,专门用来记录您使用npm install
命令安装了哪些包。
今后在项目开发中,一定要把node. modules文件夹,添加到.gitignore忽略文件中。
npm包管理工具提供了一个快捷命令 ,可以在执行命令时所处的目录中,快速创建packagejson这个包管理配置文件:

//作用:在执行命令所处的目学中,快速新建package.json 文件
npm init -y

上述命令只能在英文的目录下成功运行。所以,项目文件夹的名称- -定要使用英文命名。不要使用中文,不能出现空格.
运行npm install命令安装包的时候,npm包管理工具会自动把包的名称和版本号,记录刭package.json中。

一次性安装所有包

当我们拿到一个副除了node _modules的项目之后,需要先把所有的包下载到项目中,才能将项目运行起来。
因为package.json还在,可以运行npm install命令(或npm i) 一次性安装所有的依赖包。执行npm install 命令时,rpm包管理工具先读取package.json中的dependencies 节点
被取到的所有依赖包名称版本号之后。npm包管理工具会把这些包一次性下载到项目中

卸载包

可以运行npm uninstall 包名 命令,来卸载指定的包:
npm uninstall命令执行成功后,会把卸载的包,自动从package.json的dependencies中移賒撬

调试包

如果某些包只在项目开发阶段会用到,在项目上线之后不会用到,则建议把这些包记录到devDependencies节点中。
与之对应的,如果某些包在开发和项目上线之后都需要用到,则建议把这些包记录到dependencies节点中。

npm -i 包名 -D //npm install 包名 --save-dev

包的分类

项目包

那些被安装到项目的node_ modules目录中的包,都是项目包。
项目包又分为两类,分别是:
●开发依赖包(被记录到devDependencies节点中的包,只在开发期间会用到)
●核心依赖包(被记录到dependencies节点中的包,在开发期间和项目上线之后都会用到)

全局包

在执行npm install命令时,如果提供了-g参数,则会把包安装为全局包。
全局包会被安装到 C:\Users\用户目录\AppData\Roaming\npm\node_ modules 目录下

npm i 包名 -g  #全局安装指定的包
npm uninstall 包名 -g  #卸载全局安装的包

只有工具性质的包,才有全局安装的必要性。因为它们提供了好用的终端命令。
判断某个包是否需要全局安装后才能使用,可以参考官方提供的使用说明即可
常见包:i5ting_ toc
i5ting_ toc是一一个可以把md文档转为html页面的小工具,使用步骤如下:

npm install -g i5ting_toc    #将i5ting toc安装为全局包
i5ting_toc -f 要转换的md文件路径 -o  #调用i5ting_ toc,轻松实现md转html的功能

规范包结构

一个规范的包,它的组成结构,必须符合以下3点要求:
①包必须以单独的目录而存在
②包的顶级目录下要必须包含package.json这个包管理配置文件
③package.json 中必须包含name, version, main 这三个属性,分别代表包的名字、版本号、包的入口。
更多约束

开发属于自己的包

新建一个自命名的文件夹,作为包的根目录。
在根目录中,新建如下三个文件:
    package.json(包管理配置文件)

{
	"name": 自定义 ,
	"version": "1.0.0",
	"main": "index.js",
	"description":”简单说明这个包的功能" ,
	"keywords": [" itheima",” dateFormat", "escape"] ,  //搜索的关键字,自行写
	"license":” ISC"   //遵循的开源许可协议
}

        关于license相关信息,参考协议
    index.js(包的入口文件)
    README.md(包的说明文档)

模块化拆分

若是一个包里面实现了很多功能,全放在index.js不太好,因此可以分类整理
将不同的功能,拆分到对应src -> 自定义命名.js中,并用module.exports将功能暴露出去
在index.js中,导入各个模块,得到需要向外共享的方法。

const 自定义命名 = require('./src/自定义命名');

在index.js中,使用module.exports把对应的方法共享出去

README.md

包根目录中的README.md文件,是包的使用说明文档。通过它,我们可以事先把包的使用说明,以markdown的格式写出来,方便用户参考。
README文件中具体写什么内容,没有强制性的要求;只要能够清晰地把包的作用、用法、注意事项等描述清楚即可。
我们所创建的这个包的README.md文档中,会包含以下6项内容:
安装方式、导入方式、内部实现方法(举例说明一下)、开源协议

发布包

注册npm账号

访问网站,点击sign up按钮,进入注册用户界面
填写账号相关的信息: Full Name、Public Email、Username、 Password
点击Create an Account按钮,注册账号
登录邮箱,点击验证链接,进行账号的验证

登录npm账号

这里所指的登录,不是在网站上登录,而是在终端上登录。
npm账号注册完成后,可以在终端中执行npm login命令,依次输入用户名、密码、邮箱后,即可登录成功。
注意:在运行npm login命令之前,必须先把下包的服务器地址切换为npm的官方服务器。否则会导致发布包失败

发布包

将终端切换到包的根目录之后,运行npm publish命令,即可将包发布到npm上(注意:包名不能雷同)。

删除已发布的包

运行npm unpublish 包名 --force命令,即可从npm删除已发布的包。
npm unpublish命令只能删除72小时以内发布的包
npm unpublish删除的包,在24小时内不允许重复发布

模块加载机制

缓存机制

模块在第一次加载后会被缓存。这也意味看多次调用require0不会导致模块的代码被执行多次,只能执行一次。
注意:不论是内置模块、用户自定义模块、还是第三方模块,它们都会优先从缓存中加载,从而提高模块的加载效率。

优先级

内置模块是由Node.js官方提供的模块,内置模块的加载优先级最高。
例如,require('fs") 始终返回内置的fs模块,即使在node_ modules目录下有名字相同的包也叫做fs。

自定义模块

使用require0加载自定义模块时,必须指定以/或.开头的路径标识符。
在加载自定义模块时,如果没有指定./或./这样的路径标识符,则node会把它当作内置模块或第三方模块进行加载。
同时,在使用require0导入自定义模块时,如果省略了文件的扩展名,则Node.js会按顺序分别尝试加载以下的文件:
    ①按照确切的文件名进行加载
    ②补全.js扩展名进行加载
    ③补全.json扩展名进行加载
    ④补全.node扩展名进行加载
    ⑤加载失败,终端报错

第三方模块

如果传递给require0的模块标识符不是一个内置模块, 也没有以’I’ 或…/” 开头, 则Node.js会从当前模块的父目录开始,尝试从/node_ modules 文件夹中加载第三方模块。
如果没有找到对应的第三:方模块,则移动到再上- -层父目录中,进行加载,直到文件系统的根目录。
例如,假设在’C:\Users\itheima\project\foo.js’文件里调用了require(toos),则Node.js会按以下顺序查找:
    ①C:\Users\itheima\project\node_ modules\tools
    ②C:\Users\itheima\node_ modules\tools
    ③C:\Users\node_ modules\tools
    ④C:\node modules\tools
    ⑤加载失败,终端报错

目录作为模块

当把目录作为模块标识符,传递给require0进行加载的时候,有三种加载方式:
    ①在被加载的目录下查找一个叫做package.json的文件,并寻找main属性,作为require0加载的入口
    ②如果目录里没有package.json 文件,或者main入口不存在或无法解析,则Node.js将会试图加载目录下的index.js文件
    ③如果以上两步都失败了,则Node.js会在终端打印错误消息,报告模块的缺失: Error: Cannot find module ‘xxx’

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

常用的Linux命令;Linux常用命令用法及实现方式

1.系统工作命令 (1)echo命令:echo命令用于在终端设备上输出字符串或变量提取后的值,语法格式为“echo [字符串] [$变量]”。 (2)date命令:date命令用于显示或设置系统的时间与日期,语法格式为“date [指定的格式]”。 (3)timedate…

Vscode舒适的主题推荐

1. One Dark Pro与One Dark Pro Darker 感觉配色特别好看,强烈推荐

数据结构(二)基本概念和术语

😀前言 本人是根据bi站王卓老师视频学习并且做了相关笔记希望可以帮助到大家 🏠个人主页:尘觉主页 🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力&…

Axure9学习

产品经理零基础入门(四)Axure 原型图教程,2小时学会_哔哩哔哩_bilibili 1. ① 页面对应页面个数,概要对应每个页面的具体内容 ② 文件类型 ③ 备用间隔改为5分钟 ④ 当多个元件重叠,想把在下面的元件b直接拖出来&…

navicat导入已有sql表过程

已知我有一个外部的sql表,如图: 想要将其导入navicat并运行。 看一下我的navicat, navicat里已有的数据库并没有library,所以需要建立一个同名的library数据库来存储library.sql文件。 具体步骤如下: 在“本地连接”…

【git】解决git报错:ssh:connect to host github.com port 22: Connection timed out 亲测有效

如题,git使用中突然报错 ssh:connect to host github.com port 22: Connection timed out 通过查阅各种资料,得知原因可能是由于电脑的防火墙或者其他网络原因导致ssh连接方式 端口22被封锁。 解决方法 一:抛弃ssh连接方式,使…

3C制造RFID产线智能化升级改造设计方案

3C行业需求 近年来,随着政策的支持、相关技术的进步以及市场需求的推动,3C行业迅速发展,我国的3C市场已经进入了稳定发展阶段,作为仅次于汽车产业的大市场,3C产业在智能制造的推动下,越来越多的物联网技术…

钡铼S270如何应用在智慧养殖-监测控制风机开关温湿度采集

钡铼技术有限公司的S270智能养殖监测控制系统是一款专为智慧养殖场设计的先进产品,该产品具备2路开关量输入、2路模拟量输入、2路继电器输出和1路温湿度传感器接口。通过其强大的数据采集和远程控制能力,S270系统可以实现对养殖场内环境参数的全面监测和…

APM系列之三-原理篇-进程CPU峰值采集

前言 本篇是APM系列文章的第三篇,主要介绍如何通过一个第三方应用,去监控整个系统中所有应用进程的CPU占用,线程数量等信息,从而辅助排查问题。 文章开始之前,抛出2个问题: 1.为什么要进行采集CPU峰值&a…

YOLOv8-Seg改进:分割注意力系列篇 | 上下文增强和特征细化注意力ContextAggregation

🚀🚀🚀本文改进:多头上下文集成(Context Aggregation)的广义构建模块 ,引入YOLOv8二次创新; 🚀🚀🚀Context Aggregation小目标分割&复杂场景首选,实现涨点 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创…

电脑监控软件丨功能详情丨特点分析

电脑监控软件的出现,是在信息技术的飞速发展以及计算机使用的普及的背景下产生的。随着计算机在企业、学校以及家庭等各个场所的广泛使用,管理和保护计算机数据安全的问题变得越来越重要。因此,电脑监控软件应运而生,旨在帮助用户…

YOLOv8-Seg改进:卷积变体系列篇 | DCNv3可形变卷积基于DCNv2优化 | CVPR2023

🚀🚀🚀本文改进:DCNv3算子,基于DCNv2算子引入共享投射权重、多组机制和采样点调制,引入到YOLOv8,与C2f结合实现二次创新; 🚀🚀🚀DCNv3 亲测在多个数据集能够实现涨点,同样适用于小目标分割 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐…

基于springboot实现体育场馆运营平台项目【项目源码】

基于springboot实现体育场馆运营管理系统演示 系统开发平台 在该数码论坛系统中,Eclipse能给用户提供更多的方便,其特点一是方便学习,方便快捷;二是有非常大的信息储存量,主要功能是用在对数据库中查询和编程。其功能…

hadoop 大数据环境配置 ssh免密登录 centos配置免密登录 hadoop(四)

1. 找到.ssh文件夹 cd ~ 2. 生成私钥公钥命令: ssh-keygen -t rsa3. 发送到需要免密机器: # hadoop23 是我做了配置。在host配置得机器ip和名称得映射 ssh-copy-id hadoop23 4. 成功

SpringBoot整合Dubbo和Nacos

1.概述 dubbo是一个高性能、轻量级的开源分布式服务框架,早期由阿里巴巴进行开源。它提供了服务注册、发现、调用和负载均衡等分布式服务治理功能,为分布式开发提供了极大便利。dubbo核心概念包括:Provider(消费提供者&#xff0…

【Windows】安装绿色版Mysql数据库 -- 可支持所有版本安装教程

👨‍🎓博主简介 🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 🐋 希望大家多多支…

化妆品发墨西哥专线的难点解析

化妆品发往墨西哥专线的难点主要包括以下几个方面: 1. 物流监管:墨西哥对化妆品的进口有严格的监管和法规要求,包括产品注册、标签规定、成分审批等。化妆品属于特殊的进口商品,需要满足墨西哥卫生部门(COFEPRIS)的相关规定&#…

基于springboot实现小学家校一体“作业帮”系统项目【项目源码】计算机毕业设计

基于springboot实现小学家校一体“作业帮”系统演示 Java语言简介 Java是由SUN公司推出,该公司于2010年被oracle公司收购。Java本是印度尼西亚的一个叫做爪洼岛的英文名称,也因此得来java是一杯正冒着热气咖啡的标识。Java语言在移动互联网的大背景下具…

科研绘图与学术图表绘制:从入门到精通

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 一、入门篇 1.1 软件介…

cryptopp Base64Encoder \n问题

1、问题: new Base64Encoder(new StringSink(out_base)) 调用库函数Base64Encoder进行base64加密后确认多出来了\n 2、原因 base64加密的问题, 由于base64一行不能超过76字符, 超过就会添加回车换行符(在Windows中是 \r\n , 在Linux中是 \n ) 3、解决 方法一、给定参…