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下载和卸载包命令
方式1:npm install 包名
方式2:npm i 包名 (简写形式)
方式3:npm 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 这种错误时,很大可能就是磁盘出现了坏块问题。 解决步骤:…...
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拖拽编辑单个图形形状
首先在选中图形的时候需要用鼠标右击来弹出选择框,实现第一个编辑节点功能 在components文件夹下新建右键菜单 RightMenu文件: <template><div v-show"show" class"right-menu" :style"top:this.ypx;left:this.xpx…...

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

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

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? 为什么好多猫咪脚上都“穿着白袜子”? 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 全局直方图均衡化
前言: 😊😊😊欢迎来到本博客😊😊😊 🌟🌟🌟 本专栏主要结合OpenCV和C来实现一些基本的图像处理算法并详细解释各参数含义,适用于平时学习、工作快…...
2022年API安全研究报告
目录 导读 2022年API安全风险概况 2022年平均每月遭受攻击的API数量超21万...

【内网安全-横向移动】基于SMB协议-PsExec
目录 一、SMB协议 1、简述: 2、工具: 二、PsExec 1、简述: 2、使用: 1、常用参数: 2、情况: 3、插件 三、PsExec(impacket) 1、简述: 1、impacket࿱…...

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

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

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

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...