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

news2024/11/28 17:50:24

目录

模块化

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小时内不允许重新发布。

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

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

相关文章

【数据结构】二叉排序树——平衡二叉树的调整

文章目录前置概念一、构造平衡二叉树的基本思想二、一个示例三、平衡二叉树的调整细节(1)LL型(顺时针 )举例(2)RR型(逆时针)(3)LR型(先逆时针再顺…

测试左移之需求质量

测试左移的由来 缺陷的修复成本逐步升高 下面是质量领域司空见惯的一张图,看图说话,容易得出:大部分缺陷都是早期引入的,同时大部分缺陷都是中晚期发现的,而缺陷发现的越晚,其修复成本就越高。因此&#…

【Vue3 组件封装】vue3 轮播图组件封装

文章目录轮播图功能-获取数据轮播图-通用轮播图组件轮播图-数据渲染轮播图-逻辑封装轮播图功能-获取数据 目标: 基于pinia获取轮播图数据 核心代码: (1)在types/data.d.ts文件中定义轮播图数据的类型声明 // 所有接口的通用类型 export typ…

linux(centos7.6)docker

官方文档:https://docs.docker.com/engine/install/centos/1安装之前删除旧版本的docker2安装yum install-y yum-utils3配置yum源 不用官网的外国下载太慢 推荐阿里云yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.r…

笔记_js运算符

目录二进制相关运算符移位运算符<<>>&#xff5c;(位或运算)参考文档二进制相关运算符 移位运算符 移位运算就是对二进制进行有规律的移位。 tips:进制转换文档链接 << “<<”运算符执行左移位运算。在移位运算过程中&#xff0c;符号位始终保持不变…

jvm mat分析dump文件

jvm调优中&#xff0c;经常使用dump来分析是否存在大对象导致频繁full gc&#xff0c;以下为使用步骤&#xff1a;一、获得服务进程二、生成dump文件jmap -dump:formatb,filexxx.dump pid三、下载mat工具地址:https://www.eclipse.org/mat/downloads.php注意&#xff0c;12及以…

网络安全实验室5.上传关

5.上传关 1.请上传一张jpg格式的图片 url&#xff1a;http://lab1.xseclab.com/upload1_a4daf6890f1166fd88f386f098b182af/ 上传一张后缀名为jpg的图片&#xff0c;上传抓包修改后缀名为别的&#xff0c;s或者直接删掉&#xff0c;放包 得到key is IKHJL9786#$%^& 2.请…

再说多线程(六)——Thread生命周期

前面一直在用Thread介绍多线程任务&#xff0c;本节对线程类Thread的生命周期进行简单的梳理。线程状态对于一个线程来说&#xff0c;有以下几种状态&#xff1a;Unstarted(New) StateRunnable State(Ready to Run)Running StateNot Runable StateDead State这几种状态的转换关…

chatgpt国内能用的镜像与api请求样例

chatgpt去年刚出来时我就到openai注册了账号&#xff0c;必须用国外的线路才能注册&#xff0c;正常注册不了&#xff0c;注册完要用国外手机接收验证码&#xff0c;才能使用&#xff0c;我卡到验证码就没继续用了&#xff0c;昨晚&#xff0c;找了几个国内的镜像&#xff0c;用…

课程回顾|以智能之力,加速媒体生产全自动进程

本文内容整理自「智能媒体生产」系列课程第二讲&#xff1a;视频AI与智能生产制作&#xff0c;由阿里云智能视频云高级技术专家分享视频AI原理&#xff0c;AI辅助媒体生产&#xff0c;音视频智能化能力和底层原理&#xff0c;以及如何利用阿里云现有资源使用音视频AI能力。课程…

PyTorch学习笔记:nn.Sigmoid——Sigmoid激活函数

PyTorch学习笔记&#xff1a;nn.Sigmoid——Sigmoid激活函数 torch.nn.Sigmoid()功能&#xff1a;逐元素应用Sigmoid函数对数据进行激活&#xff0c;将元素归一化到区间(0,1)内 函数方程&#xff1a; Sigmoid(x)σ(x)11e−xSigmoid(x)\sigma(x)\frac1{1e^{-x}} Sigmoid(x)σ(…

基于python下selenium库实现交互式图片保存操作(批量保存浏览器中的图片)

Selenium是最广泛使用的开源Web UI&#xff08;用户界面&#xff09;自动化测试套件之一&#xff0c;可以通过编程与浏览量的交互式操作对网页进行自动化控制。基于这种操作进行数据保存操作&#xff0c;尤其是在图像数据的批量保存上占据优势。本博文基于selenium 与jupyterla…

Python基础01

Python基础 1、编程环境&#xff1a;IDLE 1.1使用 1、文件创建&#xff1a;File —> New File 2、文件打开&#xff1a;File —> Open 3、文件保存&#xff1a; File —> Save 2、输入输出 2.1输入&#xff1a;input() 语法&#xff1a;input(“想要表达的内容”…

在阿里当外包,是一种什么工作体验?

上周和在阿里做外包的朋友一起吃饭&#xff0c;朋友吃着吃着&#xff0c;就开启了吐槽模式。 他一边喝酒一边说&#xff0c;自己现在做着这份工作&#xff0c;实在看不到前途。 看他状态不佳&#xff0c;问了才知道&#xff0c;是手上的项目太磨人。 他们现在做的项目&#…

大数据---Hadoop安装Hadoop简易版

编写自动安装Hadoop的shell脚本 完整流程: 大数据—Hadoop安装教程&#xff08;二&#xff09; 文章目录编写自动安装Hadoop的shell脚本上传压缩包编写shell脚本vim hadoopautoinstall.sh运行上传压缩包 在opt目录下创建连个目录install和soft 将压缩包上传到install目录下 …

docker file和compose

文章目录1.dockerfile&#xff08;单机脚本&#xff09;1.概念2.原理3.dockerfile核心四步4.命令2.docker compose1.概念2.注意事项3.常用字段4.常用命令1.dockerfile&#xff08;单机脚本&#xff09; 1.概念 通过脚本&#xff0c;生成一个镜像&#xff0c;并运行对应的容器…

简介Servlet

目录 一、maven中心库 二、简介Servlet 三、实现Servlet动态页面 1、创建一个maven项目 2、引入依赖 3、创建目录结构 4、编写Servlet代码 5、打包 6、部署 7、验证程序 四、Servlet的运行原理 五、Tomcat伪代码 1、Tomcat初始化 a、让Tomcat先从指定的目录…

C语言学习_DAY_2_变量的定义_输入与输出

高质量博主&#xff0c;点个关注不迷路&#x1f338;&#x1f338;&#x1f338;&#xff01; 目录 I. 变量的定义 II. 变量的赋值 III. 输出 IV. 输入 I. 变量的定义 首先&#xff0c;我们新建一个.c文件在Dev C中&#xff0c;并把之前定义好的程序框架放进去。 此时我…

丝绸之路——NFT 系列来袭!

丝绸之路的经历讲述了汉朝时代的一个重要历史事件。该系列中的 NFT 带有中国这段黄金时代令人愉悦的视觉元素&#xff0c;使其成为值得收藏的物品。 NFT 系列介绍 敦煌女神像01&#xff08;左&#xff09;&#xff1b;汉代士兵&#xff08;中&#xff09;&#xff1b;敦煌女神像…

Matlab与ROS(1/2)链接与入门(一)

0. 简介 Matlab作为广大学生以及算法工程师常用的软件&#xff0c;因其良好的可视化以及矩阵适应能力&#xff0c;使其得到了广泛的使用。同时ROS作为机器人、自动驾驶领域最常用的软件&#xff0c;其与Matlab结合在一起也是理所当然的。为此这一系列就是来带领读者熟悉并了解…