NodeJs简单理解package包

本文探讨了Node.js中的包和模块概念,介绍了包的基本结构和package.json文件的作用。通过实例演示了如何使用不同方式引入模块,并强调了遵循规范的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

today, 我们的话题作文是nodejs,我尝试对它的描述是:似曾相似,但它又不一样的存在着。百花齐放的it世界里,以独特身姿绽放的美丽更容易吸引人。也许只是不了解,也许时间会给出答案,nodejs你值得拥有。

在1篇中聊了一点NodeJs的模块,在本篇会聊一点和模块联系非常紧密的package(NodeJS的包)

1.包

包是在模块的基础上更深一步的抽象,NodeJS的包类似于C/C++的函数库或者.Net的类库。它将某个功能封装起来,用于发布,更新,依赖管理和版本控制.NodeJS根据CommonJS规范实现了包机制,开发了npm来解决包的发布和获取需求.下一篇会聊一下npm。

包就是一个文件夹,文件夹下lib放着js文件被充当为模块,包是包装的一个模块,包对模块进行封装以及解释(类库形式表现出来)

符合CommonJS规范的包具备的东西:

package.json文件。

bin文件夹。存放二进制文件。

lib文件夹,存放模块文件,其实就是javascript文件。

doc文件夹,存放文档。

test文件夹,存放单元测试。

比如有一个myPackage文件夹,文件夹下有index.js模块和defualt.js模块,那么这个文件夹myPackage包就是这两个文件的index,defualt模块的封装.

2.package.json

CommonJS为package.json文件定义了一些必须的字段:(我们并不一定需要全部按照规范)

符合CommonJS规范的package.json包描述文件如下:

name:包的名称,必须是唯一的,由小写英文字母、数字和下划线组成,不能包含空格。(必须)
description:包的简要说明。(可选)
version:版本字符串。(必须)
keywords:关键字数组,通常用于搜索。npm search的时候会用到. (可选)
maintainers:维护者数组,每个元素要包含name、email(可选)、web(可选)字段。
contributors:贡献者数组,格式与maintainers相同。包的作者应该是贡献者数组的第一个元素。
Author, contributors(都是可选字段。author是一个人,contributors是一组人。)
bugs:提交bug的地址,可以是网址或者电子邮件地址。(可选)
licenses:许可证数组,每个元素要包含type(许可证的名称)和url(链接到许可证文本的地址)字段。(可选)
repositories:仓库托管地址数组。每个元素要包含type(许可证的名称)和url(链接到许可证文本的地址)字段。可选字段。用于指示代码存放的位置。
dependencies:包的依赖,一个关联数组,由包名称和版本组成。可选字段,指示当前包所依赖的其他包。

package.json文件的内容是js对象,所以要注意格式(json格式)

EXample:

问题1:如果包里面没有package.json文件的情况,那么require("包名")函数将会尝试加载包名目录下的index.js或者index.node,如果没有找到就报错.

首先创建包myPackage(文件夹),再次确认在myPackage包下是不存在package.json文件的条件下,我们在myPackage包下直接创建index.js(index.node)文件。

在index.js文件编写如下内容:

exports.sayHello=function(){
    console.log("hello YZR");
}

然后在myPackage包的同级目录下创建callMyPackage.txt文件,内容如下:

var package=require("./myPackage");//指定包路径
package.sayHello();

在命令行执行:

E:\NodeJS>node callMyPackage.txt
hello YZR

 

问题2:虽然能顺利找到index.js,但这并不是规范的,我们假设包目录下还是没有package.json文件的同时,包目录下也不存在index.js或者index.node。我们把我们的文件index.js放到包目录下的lib文件夹下。

index.js文件内容不变,需要修改一下callMyPackage.txt中的require()函数。如下:

var package=require("./myPackage/lib");
package.sayHello();

最后再来调试一下:

E:\NodeJS>node callMyPackage.txt
hello YZR (lib)

问题3:当我们的文件不止一个呢,除了index.js,还有default.js文件的话,那么default.js怎样才能找到?而且,默认情况下想让require能找到我们的文件,在问题1和问题2的条件下只能命名为index.js或者index.node,处于这些不理想的原因,我们假设依旧不存在Package.json文件,在包下的lib文件夹下创建多一个default.js文件,文件内容如下:

exports.click=function(){
console.log(" default Click");
}

这样我们若想得到default.js模块,需要修改一下callMyPackage.txt中的require()函数。如下:

var package=require("./myPackage/lib/default");
package.click();

最后再来调试一下:

E:\NodeJS>node callMyPackage.txt
default Click

问题4:上面的讨论看来,指定一个文件要非常注意路径的问题,那如果我们可以想JAVA那样提供一个程序入口那该多好,当我们写的模块提供出去,别人拿到我们的文件,我们还得提供一份说明文档,再者可能还需要以后的维护的工作,比如版本升级更新,卸载。出于这些问题,我们明白package.json文件的重要性。

接下来我们创建一个package.json文件,内容如下:

{

"name":"default",
"main":"./lib/default.js",
"version":"0.0.1"

}

现在,恢复callMyPackage.txt中的require()函数。如下:

var package=require("./myPackage"); //指定包路径

package.click();

最后调试结果为:

 

E:\NodeJS>node callMyPackage.txt
default Click

 

由require的查找过程可以知道,Node.js在没有找到目标文件时,会将当前目录当作一个包来尝试加载,所以在package.json文件中最重要的一个字段就是main。而实际上,这一处是Node.js的扩展,标准定义中并不包含此字段,对于require,只需要main属性即可。但是在除此之外包需要接受安装、卸载、依赖管理,版本管理等流程,所以CommonJS为package.json文件定义了一些其他必须的字段。

 

 Next:npm包管理器

转载于:https://www.cnblogs.com/Francis-YZR/p/5253267.html

<think>好的,我现在需要回答用户关于如何在Node.js环境下使用npm或yarn安装依赖的问题。首先,我得回忆一下自己之前学过的相关知识,同时结合提供的引用内容来确保信息的准确性。 用户的问题很明确,他们想知道具体的安装步骤。根据引用中的信息,Node.js依赖npm或Yarn来管理,而安装命令括npm install和npm i。同时,引用还提到了在mac上安装Yarn需要使用sudo权限,否则会有权限错误,这点需要注意。另外,用户提供的引用中还提到了设置npm的全局路径和缓存路径,这可能是在特定环境下配置npm时需要的内容,但用户的问题主要是关于安装依赖,这部分可能属于进阶配置,暂时不需要深入,除非用户提到相关问题。 首先,我应该分步骤说明使用npm和Yarn的基本安装方法。对于npm,基本命令是npm install <名>,或者简写为npm i <名>。如果是安装到生产依赖,默认就是如此,而开发依赖则需要加上-D选项。全局安装则是-g选项,但引用中提到在mac上需要sudo,这点需要特别提醒,避免用户遇到权限问题。 然后,Yarn的安装命令类似,引用中提到使用yarn add <名>,开发依赖则是-D,全局安装用global。需要注意的是,Yarn本身需要先安装,用户可能已经按照引用中的步骤安装好了,但可能需要确认这一点,或者在回答中提到如何安装Yarn,比如通过npm install -g yarn,但根据引用4,在mac上需要sudo,所以这点要强调。 接下来,用户可能需要知道如何区分生产依赖和开发依赖,所以需要解释这两个概念,并举例子,比如express作为生产依赖,eslint作为开发依赖。 然后,安装全部依赖通常是在项目初始化时,使用npm install或yarn install,这时候会根据package.json安装所有依赖项。这点需要说明,可能用户已经有了package.json,或者需要初始化,但问题可能集中在安装特定,所以可以简单提及。 注意事项部分,权限问题在mac/linux下需要注意,尤其是全局安装时,可能需要sudo。另外,镜像源的问题可能影响安装速度,但用户如果没有提到,可能不需要深入,但可以作为优化建议提到,比如使用淘宝镜像或者nrm工具,但根据引用中的信息,用户可能没有提到,所以可能作为附加内容。 然后,引用中的例子比如npm install uniq,可以作为示例,这样用户更容易理解。同时,引用2中的配置设置可能和用户的问题无关,但用户的问题是关于安装依赖,所以可以忽略这部分,除非用户问及配置。 总结下来,回答的结构应该是: 1. 使用npm安装依赖 - 基本命令 - 生产依赖与开发依赖 - 全局安装 - 示例 2. 使用Yarn安装依赖 - 基本命令 - 生产与开发依赖 - 全局安装 - 示例 3. 安装全部依赖 - npm install 和 yarn install 4. 注意事项 - 权限问题 - 镜像源 同时,需要引用对应的引用内容,比如引用3提到的npm install和npm i等效,引用4中的sudo权限问题,引用1中提到的工具依赖关系。 需要确保步骤清晰,语言简洁,符合用户要求的用中文回答,行内公式正确使用$...$,但在这个问题中可能用不到数学公式,所以可以忽略。但需要遵循系统级指令的其他要求,比如生成相关问题,放在最后。 最后,检查是否有遗漏,比如是否需要初始化package.json,但用户的问题可能假设已经有一个项目存在,所以可能不需要详细说明npm init的步骤,除非用户提到,但根据问题,用户可能已经知道这些基础,所以可以略过。</think>在Node.js环境下使用npm或yarn安装依赖的具体步骤如下: --- ### 一、使用npm安装依赖 1. **基本命令** 安装单个到项目依赖(默认保存到`dependencies`): ```bash npm install <名> # 简写 npm i <名> ``` 示例:安装`lodash`工具库: ```bash npm install lodash ``` 2. **区分生产依赖与开发依赖** - **生产依赖**(运行时必需):默认直接安装。 - **开发依赖**(仅开发阶段需要):通过`-D`或`--save-dev`标志安装,保存到`devDependencies`: ```bash npm install <名> -D ``` 示例:安装代码检查工具`eslint`作为开发依赖: ```bash npm install eslint -D ``` 3. **全局安装** 添加`-g`标志可将工具类(如`yarn`、`nodemon`)安装到系统全局: ```bash npm install <名> -g ``` *注意:在macOS/Linux系统中可能需要`sudo`权限[^4]。* --- ### 二、使用yarn安装依赖 1. **基本命令** 安装单个到项目依赖: ```bash yarn add <名> ``` 2. **区分依赖类型** - 开发依赖:添加`-D`标志: ```bash yarn add <名> -D ``` 3. **全局安装** 使用`global`关键字: ```bash yarn global add <名> ``` --- ### 三、安装项目全部依赖 若已有`package.json`文件,运行以下命令自动安装所有依赖: - **npm**: ```bash npm install ``` - **yarn**: ```bash yarn install ``` --- ### 四、注意事项 1. **权限问题** 在macOS/Linux系统中,全局安装时若报错`EACCES`,需使用`sudo`提升权限[^4]: ```bash sudo npm install <名> -g ``` 2. **镜像源加速** 若下载速度慢,可切换为国内镜像(如淘宝源): ```bash npm config set registry https://registry.npmmirror.com ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值