从npm install命令说起package.json的作用

问:为什么现在js安装某个模块都使用npm install这个命令去安装了?

答:因为大家都变懒了啊,哈哈。是不是觉得做了几年的前端之后发现,现在如果不更新自己的知识体系,有点不知所措了,甚至自己使用的技术有点被后辈们嘲笑的意思。其实大可不必担心,目前新的技术栈都是建立在之前的基础之上了,所谓的新的技术,多数为旧核心新封装,本质是不变,只是某些懒人为了更懒的工作,开发出更能节省时间,更能高效工作的的工具。所以技术的更新驱动很大一部分的原因在于使用者的懒惰思想在怂恿,但这可不是真的懒,不然怎么会构思一套新的体系来解决当前他认为很浪费时间的问题呢。Npm就是这么来的。Npm是一个js的包管理工具,类比到后端php开发工作上,和composer扮演的角色是一样的。包管理的概念现在已经全面铺展开来,新的项目中几乎全部都使用了包管理这一概念去管理自己的依赖包,不管是前端还是后端。这主要是这确实解决了程序员在开发中自行管理包时的一不小心就焦头烂额的情况。为什么这么说呢,以前端为例,以前我们写前端基本上都是把使用的包或者库直接下载到本地,自行寻找合适的版本完成相关的引入。当规模越来越大的时候,这样的包会越来越多,当你把这个完整的项目上线或者传给别人的时候,我们需要把它一块传递,当遇到复杂的项目是,这可是一个可观的容量了。所以这些懒人们就开始想法了,比如我在传给你的时候,我只把我写的东西给你,我用的包,或者叫我倚赖的那些包,你自己下载去就行了(这也是我们在github上clone项目是并没有node_modules文件夹)。你肯定想,我怎么知道你用什么包了,况且版本不一样也可能会导致无法兼容使用啊。要不就说懒人有懒法呢,这些懒人么早就想到解决办法了。我给你个文件,告诉你我用了哪些第三方的包,而且是那些版本的,这不就行了嘛。所以package.json这个文件诞生了。他就是来告诉别人本项目中使用了哪些第三方库,包括具体到哪些版本。而且这个文件不光承担这么点职能,还有别的作用呢!

 

问:那package.json文件还有啥作用一块说说呗,另外他是怎么来的?

答:先说他是怎么来的吧,两种方式,一种自己手写,要严格按照json书写格式。另一种使用npm init命令自动生成,会记录当前整个项目中的一些基础信息。注意使用命令是一种交互问答的形式,相关问题也是json对象的键名称。至此可知这个文件其实就是一个json对象,里面有各种各样的配置,里面的内容当然不是随便写的,他要能让npm识别的,这样npm就能根据它来完成相应的任务了,比如下载那些项目中使用的第三方库。下面我们来对这些个名称来个介绍。

  1. name:这个项目(包)的名称,必须是唯一的,由小写字母数字下划线组成。
  2. version:项目的版本号,按照大.中.小格式。
  3. description: 项目简要介绍。
  4. author:项目的作者
  5. keywords: 这是个数组,里面的元素是用户搜索关键词,方便用户搜索到本项目。
  6. homepage: 用来说明项目的官方主页
  7. bugs:提交bug,或反馈问题的地址,除了url还可以提供email。
  8. license:事实上这个字段对版权意识弱的人,基本无感。他是用来说说明该项目的授权情况的,让别人知道使用范围和权限。如果是常见通用的许可证,直接使用许可证的名称就行。如果比较复杂,你可以自行定义该证书细节,然后提供一个对象,可以包含type和url字段,用来详细说明授权内容。
  9. private:如果为true,npm就不会发布它,这个主要用来防止意外发布私有仓库。
  10. preferGlobal:本模块本来要求安装为全局模块,用户没有全局安装,要不要显示警告
  11. config:用来向环境变量输出值,给scripts提供配置参数的,在其整个周期中都可用。还可可通过指定包名,来设置配置
  12. repository:用来指定你代码放那个仓库了,方便别人想给你提交点代码啥的。里面可指定type和url。
  13. directoires:用来说明包内结构,比如库在哪,手册在哪,bin目录或文档目录。
  14. main:指定当通过[require(‘moduleName’)]加载本模块的的时候,要加载的入口文件。默认值是模块根目录下的index.js文件
  15. bin:将指定可执行文件加入bin目录(全局或者局部),可在命令行直接执行命令。
  16. engines:可以指定该项目需要的node.js版本或指定npm版本
  17. scripts:指定运行脚本命令的npm命令行缩写。他写进scripts的命令(command),可以通过npm run <command>或者npm <command> 运行对应的shell指令
  18. dependencies:指定了项目运行所以来的模块,用对象来表达,由模块名和对应版本组成。
  19. devDependecies:指定了项目开发所需要的模块(有的为了调试或者方便加入的),同样用对象来表达,由模块名和对应版本组成。
  20. bundledDependencies:指定发布时会被一起打包的模块。
  21. peerDevpendencies:指定不同版本模块安装(存在倚赖不同版本的情况)

以上便是package.json文件中常用到的字段。说回到我们的npm install 这条命令上。

 

如果我们只输入npm install这条命令,他会根据package.json中dependecies和devdendencies安装所有模块。但是如果包里面有package_lock.json(这个package-lock.json 是在 `npm install`时候生成一份文件,用以记录当前状态下实际安装的各个npm package的具体来源和版本号)或者npm_shrinkwrap.json(是运行npm shrinkwrap时生成的一份文件)文件的话,则会倚赖这两个文件去安装,如果两个文件都存在,npm_shrinkwrap.json优先。

另外需要注意的是:

  1. npm_shrinkwrap.json只会在运行npm shrinkwrap才会创建/更新
  2. package_lock.json会在修改pacakge.json或者node_modules时就会自动产生或更新了。

上面我们对指导整体安装的文件有了认识,下面我们来了解一下具体包安装过程几个代表。

还是npm install ,不过后面要跟一个包名,当然也可以更github的地址的。

  1. 是的,这样就可以下载了,这种形式安装的话,会先检查node_modules目录中是否存在指定模块 。如果存在就不安装了,即使有新的版本。当然添加一个-f参数就能强制npm安装了。But.but,but他不会更改package.json文件中的dependecies或DevDependecies字段
  2. 追加个--save参数,也是下载模块,但是会更新dependecies字段。
  3. 追加--save --dev,也是下载模块,但是会更新devDependecies字段。

上面的方式都是将模块安装到项目的node_modules文件下。下面这种方式可就不一样了,他是将模块安装到全局的node_modules文件下,也就是你电脑安装nodejs时指定安装的位置。这样的话,其他项目也能引用的。

  1. 方法就是追加一个-g参数。

 

如此便是使用npm完成一个模块安装的相关内容了。整体感觉下来,npm包管理器的概念确实好用方便,这也证明了,那帮人确实很懒。哈哈

 

 

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值