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

node.js笔记-模块化(commonJS规范),包与npm(Node Package Manager)

目录

模块化

node.js中模块的分类

模块的加载方式

 模块作用域

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

向外共享成员

 包与npm(Node package Manager)

什么是包?

 包的来源 

为什么需要包?

 查找和下载包 

npm下载和卸载包命令  

配置npm下载镜像源(加快下载速度) 

npm的使用 

 包管理配置文件

一次性安装所有包(根据package.json) 

 包的分类

开发自己的包并上传到npm官网

 创建包  

 发布包 

删除包 


模块化

遵守固定规则,把一个系统拆分成独立并且相互依赖的多个小模块。

模块化好处

1.提高代码复用性。

2.提高代码可维护性。

3.实现按需加载。

node.js中模块的分类

根据来源不同可分为3大类

1.内置模块,如fs模块,path模块和http模块。

2.自定义模块,就是用户自己创建的.js文件。

3.第三方模块,有第三方开发出来的功能模块,我们可以下载后使用。 

模块的加载方式

在node中,三种模块的加载方式均是使用require()来引入的。

// 1.引入内置模块
const fs = require("fs");// 2.引入自定义模块(使用用户自定义模块可以省略.js后缀)
const myMoudle = require("./myMoudle");// 3.引入第三方模块(需要先使用npm下载后在引入)
const monment = require("moment");

值得注意的是:使用require()加载模块时,会执行被加载模块中的代码。

模块加载机制

1.优先从缓存中加载,也就是说,当我们在代码层面多次书写require函数,实际只执行一次被引入的模块。

2.如果用户自定义模块和内置模块同名,内置模块优先级更高

 模块作用域

类似于函数作用域,说的是一个模块中的属性和方法,在另一个模块中无法被访问到。

 好处 

防止全局变量污染

当在一个模块A中使用require函数引入另一个模块B时,模块A打印接收到的变量,发现为空对象,这说明了一个模块是无法访问另一个模块中的内容的。

但是在实际开发中,我们还是会有访问其他模块中的内容的需求。

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

module对象 

为什么要了解module对象?

因为当我们在一个模块A中使用require()导入另一个模块B时,导入的是模块B的module对象中的exports属性。

每个模块都会有module对象,此对象中存储了与当前模块有关的信息。 

打印测试模块的module对象

console.log(module);

 

 由测试可知,当别的模块引入本模块时,得到的便是module对象中的export空对象。

向外共享成员

我们可以给module.exports赋值,达到向外共享成员的目的。

可以这么说:我们在一个模块中导入另一个自定义模块(使用require),其实是导入了moudel.export(),默认是一个空对象。

 需求:在模块中对外共享name属性和一个sing方法。

 我们通过另一个模块引入此模块,并访问打印name属性和执行sing方法。

const myMoudle1 = require("./myMoudle");console.log(myMoudle1.name);
console.log(myMoudle1.sing());

共享成员的注意点:为了方便书写,我们还可以直接使用export对外共享方法,module.export和export初始指向的是同一个对象,在不改变两者内存指向的前提下,不会出问题,一旦我们改变了内存指向就又可能会出错。

因为最终向外共享的对象始终是指向moudle.export的对象

 

 如上内存图,原始两个指向的是同一个对象,当我们操作:moudule.export = {},这个操作是给重新赋予了一个新的内存地址,将不再指向原先对象,那么我们这时候如果还用export,export指定的内容将会是无效的。

 如上内存图解,执行了操作:export = {},将export的指向重新赋值,但是module.export的指向还是原始对象,那么最终export中所指定的内容将会无效,因为最终返回的始终是module.export指向的对象。

总结使用require(),返回的永远是module.export所指的对象,为了防止混乱,建议在同一个模块中不要两个一起使用。

 包与npm(Node package Manager)

什么是包?

node.js的第三方模块又叫做包。

 包的来源 

包的来源一般是第三方个人或团队开发,将开发好的包上传供所有人免费使用。

为什么需要包?

如果仅使用node提供的内置模块,我们的开发效率是有限的,例如一些比较常用的代码功能,我们就需要手动的进行封装,但是,有许多功能别人已经封装开发好,那么我们就去下载后直接用就行。这样大大提高了我们的开发效率。

 查找和下载包 

全球最大的包共享平台:https://www.npmjs.com/,我们可以通过浏览器访问,想要什么了解什么包就到此网站去搜索即可。

 下载包(使用npm包管理工具)

 在我们下载安装node.js的时候,npm(包管理工具)就已经被安装到我们电脑上了。

我们直接使用npm来下载包即可。

npm下载和卸载包命令  

方式1npm install 包名

方式2npm i 包名 (简写形式)

方式3npm i 包名@版本号 (下载指定版本的包)

卸载包方式npm uninstall 包名

值得注意的是

 当我们下载包以后,会自动创建一些文件和目录。

 node_modules目录:存放我们下载的第三方包

配置npm下载镜像源(加快下载速度) 

我们默认向npm官网下载包,但是npm官网服务器是处于国外。如果我们通过npm官网下载包,传输速度肯定受损。因此我们可以修改npm下载包的地址为国内的镜像地址就可以达到加快包下载速度的效果。

配置命令

1.查看当前的包下载地址:npm config get registry

2.修改包下载地址:npm config set registry=https://registry.npm.taobao.org/ (此地址为淘宝做的npm官网镜像地址)

 包下载地址管理工具 => nrm

 nrm是一个包下载地址的管理工具,它在其中列举了一些可用的镜像,以及封装了一些更简便的命令,操作方便。

下载包:npm i nrm -g (参数-g:全局安装)

查看可用镜像以及正在使用的镜像:nrm ls

修改下载包地址:nrm use 内置别名

 

npm的使用 

需求:下载第三方包moment,并导入js文件使用。

ps:moment主要是用来格式化时间日期的包

我们可以到https://www.npmjs.com中查询该包,查看安装命令和教程

 终端输入安装命令

// 导入已经下载好的moment包
const moment = require("moment");const date = new Date();
// 未格式化前时间
console.log("未格式化前时间",date);
// 使用moment进行格式化后输出
const formetDate = moment(date).format("YYYY-MM-DD hh:mm:ss");
console.log("格式化后时间",formetDate);

 包管理配置文件

什么是包管理配置文件?

其实就是一个json文件,此文件用来存储与项目有关的一些配置信息。

作用:其实此文件有个大用处,就是方便了多人协作开发

例如一个项目中用到了许多的包,如果我们想要将此项目上传,那么就需要将代码和包一起上传,一般代码的体积都很小可是包的体积相对较大,如果每次都将包一起上传那么将浪费时间资源,那么这时候我们就可以将需要使用什么包写在json包配置文件中,只需要将此包配置文件和代码上传即可,当其他成员想要运行我们的代码,只需要去执行相关命令下载配置文件中提及的包即可。

快速构建包配置文件(package.json

我们在起初创建项目的后,可以使用命令:npm init -y,就会自动帮我们创建package.json文件。

 package.json 解读

当我们下载了包以后,会出现dependencies(项目依赖的包) ,里面描述的是我们项目中用到的包信息。

 

值得注意的是:package.json由node自动维护,不需要我们手动修改。 

一次性安装所有包(根据package.json) 

再拿到某个项目时,我们首先需要将此项目的依赖都先给下载才可以正常运行此项目。

因此我们再拿到node项目后,我们需要先根据此项目的package.json下载所有依赖包。

命令npm i 或 npm install

在项目的根目录运行这些命令,因为package.json规定是存在于项目根目录的。

执行以后会通过package.json找到需要安装的所有依赖包进行下载。

 包的分类

node中,包一般分为项目包全局包

 项目包 

我们使用命令 npm i 包名  的方式安装的包都是项目包,因为我们没有使用命令参数 -g (全局安装)

他们会被存放到node_modules目录中。

项目包又分为开发依赖包核心依赖包

开发依赖包:记录在节点devDependencies,仅在开发时使用。例如webpack包仅在开发时用作打包工作,并不会在生成环境中使用。

核心依赖包:记录在节点dependencies,在开发和上线都会使用。

如何区分:在下载时使用命令参数 -D 

 全局包 

在下载包时使用参数-g ,例如npm i nrm -g

 如何判断是否需要全局安装?

一般全局包属于工具包的性质,在全局都会用,例如nrm包下载地址管理工具。

最准确的判断就是下载包之前到npm官网查看下载命令。

开发自己的包并上传到npm官网

 创建包  

 开发自己的包,首先我们先要了解包构成的规范,也就是包需要什么结构。

1.首先需要创建一个文件夹,代表着我们的包文件。

2.创建文件

        ①index.js (入口文件)

        ②README.md (包使用说明)

 创建好了以后,到包的根目录执行 npm init -y 创建package.json(包管理配置文件)

进入package.json修改自定义信息。

 注意:包的名字由json文件中name属性决定,而不是目录名

 mian属性的作用:当我们在导入模块时,导入路径只填写目录名,没有填写js文件,这时就会自动检查目录中是否有packge.json文件,有的话就会去其中读取main属性,就读取到了js文件,读取到了以后,导入的就是main.js文件中共享(module.export)的成员了。

 发布包 

 首先到官网注册,然后再终端登录。

登录命令:npm login

接着根据提示输入账号密码邮箱

注意:执行发布命令前需要先将包下载地址切换回官网的包下载地址。

发布命令:npm publish (发布前可用先去官网查询是否有同名的包,不可重复)

删除包 

删除命令npm unpublish 包名 --force

删除须知

        1.只能删除在72小时以内发布的包。

        2.删除的包在24小时内不允许重新发布。

相关文章:

node.js笔记-模块化(commonJS规范),包与npm(Node Package Manager)

目录 模块化 node.js中模块的分类 模块的加载方式 模块作用域 向外共享模块作用域中的成员 向外共享成员 包与npm(Node package Manager) 什么是包? 包的来源 为什么需要包? 查找和下载包 npm下载和卸载包命令 配置np…...

Linux 磁盘坏块修复处理(错误:read error: Input/output error)

当磁盘出现坏块时,你对所关联的文件进行读取时,一般会出现 read error: Input/output error 这样的错误。 反过来讲,当你看到 read error: Input/output error 这种错误时,很大可能就是磁盘出现了坏块问题。 解决步骤&#xff1a…...

API 面试四连杀:接口如何设计?安全如何保证?签名如何实现?防重如何实现?

下面我们就来讨论下常用的一些API设计的安全方法,可能不一定是最好的,有更牛逼的实现方式,但是这篇是我自己的经验分享. 一、token 简介 Token:访问令牌access token, 用于接口中, 用于标识接口调用者的身份、凭证,减…...

操作系统题目收录(六)

1、某系统采用基于优先权的非抢占式进程调度策略,完成一次进程调度和进程切换的系统时间开销为1us。在T时刻就绪队列中有3个进程P1P_1P1​、P2P_2P2​和P3P_3P3​,其在就绪队列中的等待时间、需要的CPU时间和优先权如下表所示。若优先权值大的进程优先获…...

2023年十款开源测试开发工具推荐!

今天为大家奉献一篇测试开发工具集锦干货。在本篇文章中,将给大家推荐10款日常工作中经常用到的测试开发工具神器,涵盖了自动化测试、性能压测、流量复制、混沌测试、造数据等。 1、AutoMeter-API 自动化测试平台 AutoMeter 是一款针对分布式服务&…...

MySQL慢查询分析和性能优化

1 背景我们的业务服务随着功能规模扩大,用户量扩增,流量的不断的增长,经常会遇到一个问题,就是数据存储服务响应变慢。导致数据库服务变慢的诱因很多,而RD最重要的工作之一就是找到问题并解决问题。下面以MySQL为例子&…...

C++学习笔记(四)

组合、继承。委托(类与类之间的关系) 复合 queue类里有一个deque,那么他们的关系叫做复合。右上角的图表明复合的概念。上图的特例表明,queue中的功能都是通过调用c进行实现(adapter)。 复合关系下的构造和…...

【4】深度学习之Pytorch——如何使用张量处理时间序列数据集(共享自行车数据集)

表格数据 表格中的每一行都独立于其他行,他们的顺序页没有任何关系。并且,没有提供有关行之前和行之后的列编码信息。 表格类型的数据是指通过表格的形式表示的数据,它以行和列的方式组织数据。表格中的每一行代表一个数据项,每…...

mulesoft MCIA 破釜沉舟备考 2023.02.10.01

mulesoft MCIA 破釜沉舟备考 2023.02.10.01 1. What is a defining charcateristic of an integration-Platform-as-a-Service(iPaaS)?2. An application deployed to a runtime fabric environment with two cluster replicas is designed to periodically trigger of flow f…...

干货 | PCB拼板,那几条很讲究的规则!

拼板指的是将一张张小的PCB板让厂家直接给拼做成一整块。一、为什么要拼板呢,也就是说拼板的好处是什么?1.为了满足生产的需求。有些PCB板太小,不满足做夹具的要求,所以需要拼在一起进行生产。2.提高SMT贴片的焊接效率。只需要过一…...

笔试题-2023-思远半导体-数字IC设计【纯净题目版】

回到首页:2023 数字IC设计秋招复盘——数十家公司笔试题、面试实录 推荐内容:数字IC设计学习比较实用的资料推荐 题目背景 笔试时间:2022.08.20应聘岗位:数字IC设计工程师笔试时长:90min笔试平台:牛客网题目类型:填空题(2道),不定项选择题(3道),单选题(2道),问…...

canvas根据坐标点位画图形-canvas拖拽编辑单个图形形状

首先在选中图形的时候需要用鼠标右击来弹出选择框&#xff0c;实现第一个编辑节点功能 在components文件夹下新建右键菜单 RightMenu文件&#xff1a; <template><div v-show"show" class"right-menu" :style"top:this.ypx;left:this.xpx…...

JavaEE 初阶 — 确认应答机制

文章目录确认应答机制&#xff08;安全机制&#xff09;1 什么是后发先至问题1 如何解决后发先至问题确认应答机制&#xff08;安全机制&#xff09; 确认应答 是实现可靠传输的最核心机制。 这里指的 可靠传输 不是说 100% 可以把消息发给接收方&#xff0c;而是尽力而为&…...

0207 事件

事件监听事件监听版本事件类型事件概念事件在编程时系统内发生的动作或者发生的事情例子点击按钮鼠标经过拖拽鼠标事件监听&#xff08;注册事件&#xff0c;绑定事件&#xff09;让程序员检测是否有事件产生&#xff0c;一旦有事件触发&#xff0c;就立即调用一个函数做出响应…...

SpringBoot整合Swagger

目录 一、swagger介绍 二、springboot集成swagger 1、创建一个springboot-web项目 2、导入相关依赖 3、编写一个Hellow工程 4、配置swagger --->config 5、启动springboot工程 6、配置swagger信息 7、配置swagger扫描接口 8、如何设置Swagger在生产环境中使用&…...

20230210英语学习

Why Do So Many Cats Have White ‘Socks’ on Their Paws? 为什么好多猫咪脚上都“穿着白袜子”&#xff1f; If you see a house cat, the odds are high that it will have white paws, a look that many owners affectionately call "socks."But socks are rar…...

【图像处理OpenCV(C++版)】——4.5 全局直方图均衡化

前言&#xff1a; &#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; &#x1f31f;&#x1f31f;&#x1f31f; 本专栏主要结合OpenCV和C来实现一些基本的图像处理算法并详细解释各参数含义&#xff0c;适用于平时学习、工作快…...

2022年API安全研究报告

目录 导读 2022年API安全风险概况 2022年平均每月遭受攻击的API数量超21万...

【内网安全-横向移动】基于SMB协议-PsExec

目录 一、SMB协议 1、简述&#xff1a; 2、工具&#xff1a; 二、PsExec 1、简述&#xff1a; 2、使用&#xff1a; 1、常用参数&#xff1a; 2、情况&#xff1a; 3、插件 三、PsExec&#xff08;impacket&#xff09; 1、简述&#xff1a; 1、impacket&#xff1…...

whistle 一个神奇的前端调试工具(抓包\代理工具)

在进行前端开发过程中&#xff0c;我们常常需要对一些接口进行处理&#xff0c;以及当后端接口没有弄好需要我们mock一些假数据&#xff0c;针对这些场景&#xff0c;我们就可以使用whistle 来解决。首先&#xff0c;我们要知道能满足我们需求的工具有很多&#xff0c;例如&…...

node.js下载和vite项目创建以及可能遇到的错误

目录 一、node.js的下载 1、去官网下载 节点.js (nodejs.org) 2、下载过程 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a; 第四步&#xff1a; 第五步: 二、vite项目的创建&#xff08;使用的工具是Hbuilder x&#xff09; 第一步&#xff1a; 出现报错…...

如何使用python画一个爱心

1 问题 如何使用python画一个爱心。 2 方法 桌面新建一个文本文档&#xff0c;文件后缀改为.py&#xff0c;输入相关代码ctrls保存&#xff0c;关闭&#xff0c;最后双击运行。 代码清单 1 from turtle import * def curvemove(): for i in range(200): right(1) …...

1 Flutter UI Container和 Text 和图片组件

一 Text 组件Text 文本组件的一些属性如下body: const Text("this is leonardo fibonacci",// 文本对齐的方式textAlign: TextAlign.center,// 文本方向textDirection: TextDirection.rtl,// 字体显示最大的行数maxLines: 2,// 文字超出屏幕之后的显示方式 ellipsi…...

【Hello Linux】 Linux基础命令(持续更新中)

作者&#xff1a;小萌新 专栏&#xff1a;Linux 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍Linux的基础命令 Linux基础命令ls指令lsls -als -dls -ils -sls -lls -nls -Fls -rls -tls -Rls -1总结思维导图pwd指令whoami指令…...

记录一下slf4j2打印一直不成功

整理一个之前的老项目问题&#xff0c;发现日志一直打印不出来&#xff0c;本地启动发现了第一个问题日志如下&#xff1a;此处可发现&#xff0c;jar包冲突问题&#xff0c;去掉冲突的jar包即可&#xff0c;此处不做过多赘述。然后发现了重新启动项目&#xff0c;发现jar包冲突…...

【安全知识】——对Linux密码文件的处理

作者名&#xff1a;白昼安全主页面链接&#xff1a; 主页传送门创作初心&#xff1a; 一切为了她座右铭&#xff1a; 不要让时代的悲哀成为你的悲哀专研方向&#xff1a; web安全&#xff0c;后渗透技术每日emo&#xff1a;他既乐观又悲观&#xff0c;生活也一无是处昨天在挖掘…...

动手深度学习笔记(四十七)8.3. 语言模型和数据集

动手深度学习笔记(四十七)8.3. 语言模型和数据集 8.3. 语言模型和数据集8.3. 语言模型和数据集 在 8.2节中, 我们了解了如何将文本数据映射为词元, 以及将这些词元可以视为一系列离散的观测,例如单词或字符。 假设长度为 T T T的文本序列中的词元依次为 x 1 , x...

URL编码和Base64编码

URL编码和Base64编码前言一、URL编码1. URLEncoder和URLDecoder2. URL编码规则3. Javascript 原生提供三对 Url编码 的函数3.1 三对函数的不同点二、Base64编码1. Base64编码规则2. Base64编码使用3. JavaScript 原生提供两个 Base64 相关的方法总结前言 数据操作过程中&#…...

Flink 滚动窗口、滑动窗口详解

1 滚动窗口(Tumbling Windows) 滚动窗口有固定的大小&#xff0c;是一种对数据进行“均匀切片”的划分方式。窗口之间没有重叠&#xff0c;也不会有间隔&#xff0c;是“首尾相接”的状态。如果我们把多个窗口的创建&#xff0c;看作一个窗口的运动&#xff0c;那就好像它在不…...

想要精通算法和SQL的成长之路 - 柱状图中最大的矩形

想要精通算法和SQL的成长之路 - 柱状图中最大的矩形前言一. 柱状图中最大的矩形前言 想要精通算法和SQL的成长之路 - 系列导航 一. 柱状图中最大的矩形 原题链接 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。求…...

wordpress博客建设与经营/制作网站需要什么技术

XPS是2012年为国内某股份制商业银行开发的一套信用卡业务流程处理系统&#xff0c;基于公司的Workbench 2.0框架进行开发。所谓Workbench 2.0&#xff0c;实际是2009年我在公司的Workbench 1.0的基础上&#xff0c;把底层的各开源框架更新到当时相对较新的版本&#xff0c;例如…...

长春网站开发培训价格/怎么推广淘宝店铺

1. 问题描述&#xff1a; 给你一个整数数组 nums &#xff0c;请你将数组按照每个值的频率 升序 排序。如果有多个值的频率相同&#xff0c;请你按照数值本身将它们降序排序。 请你返回排序后的数组。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2,2,2,3] 输出&#xf…...

网上那个网站做席子批发/自己建网站怎样建

配置软件源 常用软件安装 基础软件安装 常用的一些环境包括编译环境 sudo apt install -y curl proxychains-ng vim openssh-server net-tools make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev llvm libncurses5-dev libncursesw5-…...

京东b2c网站是怎么营销/山东济南最新消息

在CommonClass.cs中定义RandomNum(4)的方法&#xff1a; /// <summary>/// 实现随机验证码/// </summary>/// <param name"n">验证码个数</param>/// <returns>返回生成的随机数</returns>public string RandomNum(int n) {stri…...

wordpress 前台注册/中国疫情最新情况

榜单解读&#xff1a; 100家企业总值共计81228.41亿元&#xff0c;入围门槛为95亿元总值。 95家企业总值达到了100亿元及以上&#xff0c;其中小红书、猿辅导等12家企业总值达到1000亿元及以上&#xff1b;榜首阿里巴巴总值为21257.54亿元&#xff0c;占百强总值比重为26.17%…...

学做网站需要懂什么/北京seo培训机构

Java中自定义比较规则的方式。比如我们要将学生对象按照成绩升序排序&#xff0c;而且当成绩相同时采用名字首字母的方式升序排序。该如何操作&#xff1f;这时候就要使用自定义比较规则了。下面介绍两种常用方法&#xff1a; 待排序类对象实现Comparable接口&#xff0c;重写…...