Npm优化的工程化相关问题

开发 前端
package-lock.json文件作用就是锁定依赖安装结构,目的就是保证在任意机器和环境上执行npm install都会得到完全相同的node_modules安装结果。

[[436070]]

package-lock.json缓存了每个包的具体版本和下载链接,这样就不需要再去远程仓库进行查询,节约了安装时间,提升了部署效率。package-lock.json文件作用就是锁定依赖安装结构,目的就是保证在任意机器和环境上执行npm install都会得到完全相同的node_modules安装结果。

我们知道单一的package.json不能确定唯一的依赖树,这是因为:

  • 不同版本的npm安装依赖策略和算法不同
  • npm install将根据package.json中的semver-range version更新依赖,某些依赖项自上次安装以来,可能已经发布了新版本。

并不是所有的子依赖都有dependencies属性,只有子依赖的依赖和当前已安装在根目录的node_modules中的依赖冲突后,才会有这个属性。

至于要不要将lockfiles文件提交到代码仓库中,要看项目定位进行决定。

  • 如果开发一个应用,建议将package-lock.json文件提交到代码版本仓库
  • 如果开发目标是开发一个给外部使用的库,可以复用主项目已经加载过的包,减少依赖重复和体积
  • 如果开发的库依赖精确的版本号的模块,那么提交lockfiles到仓库可能会造成同一个依赖不同版本都被下载的情况
  • 如果作为库开发者,真的有使用某个特定版本依赖的需要,一个更好的方式就是定义peerDependencies

因此,推荐做法是将packjson-lock.json一起提交到代码库中,不需要ignore。但是在执行npm publish命令,发布一个库的时候,应该被忽略而不是直接发布出去。

早期npm锁定版本的方式使用npm-shrinkwrap.json,与package-lock.json不同点在于:npm包发布的时候默认将npm-shrinkwrap.json发布,因此类库或组件需要慎重使用。使用package-lock.json是npm v5.x版本新增特性,而npm v5.6以上才逐步稳定在5.0-5.6中间,对于package-lock.json的处理逻辑进行了几次更新。

在npm v5.x版本中,npm install时都会根据package-lock.json文件下载,不管package.json内容究竟是什么

npm v5.1.0版本到npm v5.4.2,npm install会无视package-lock.json文件,下载最新的npm包并进行更新package-lock.json文件

npm 5.4.2版本后

  • 如果项目只有package.json文件,npm install后生成一个package-lock.json文件;
  • 如果项目中存在package.json和package-lock.json文件,同时package.json文件的semver-range版本和package-lock.json中版本兼容,即使此时有新的适用版本,npm install还是会根据package-lock.json进行更新
  • 如果项目存在package.json和package-lock.json文件,同时package.json文件的semver-range版本和package-lock.json中版本不兼容,npm install时package-lock.json会将更新到兼容package.json的版本
  • 如果package-lock.json和npm-shrinkwrap.json同时存在项目根目录下,package-lock.json将会被忽略

npm设计的依赖类型声明有以下几种:

  • dependencies项目依赖----------------------------全部被下载,会部署在生成环境中
  • devDependencies开发依赖-------------------------不会被自动下载,只在开发环境中使用
  • peerDependencies同版本依赖-----------------------
  • bundledDependencies捆绑依赖----------------------
  • optionalDependencies可选依赖----------------------

并不是只有在dependencies中的模块才会被一起打包,也不是devDependencies中的依赖一定不会被打包,这取决于项目开发过程代码是否进行了相关的依赖引用。其实dependencies、devDependencies更多是个规范作用。

注意:在bundledDependencies中指定的依赖包必须在dependencies、devDependencies中声明过,否则在npm pack阶段会进行报错

peerDependencies主要用于:

  • 插件不能单独运行
  • 插件正确运行的前提是核心依赖库必须先下载安装
  • 不希望核心依赖库被重复安装
  • 插件API的设计必须要符合核心依赖库的插件编写规范
  • 在项目中同一插进体系下,核心依赖库版本最好相同

最后,可以得到开发建议:

优先使用npm v5.4.2以上的npm版本,以保证npm的最基本先进性和稳定性

项目的第一次搭建使用npm install安装依赖包,并提交package.json、package-lock.json文件,而不提交node_moduels目录

其它项目成员首次checkout/clone项目代码后,执行一次npm install安装依赖包

对于升级依赖包的需求:

  • 依靠npm update命令升级到新的小版本
  • 依靠npm install@升级大版本
  • 也可以手动修改package.json中的版本号,并执行npm install来升级版本
  • 本地验证升级后新版本无问题,提交新的package.json、package-lock.json文件

对于降级依赖包的需求:执行npm install@命令,验证没有问题后,提交新的package.json、package-lock.json文件

删除某些依赖:

  • 执行npm uninstall,验证没有问题后,提交新的package.json、package-lock.json文件
  • 手动操作package.json删除依赖,执行npm install验证没有问题后,提交新的package.json、package-lock.json文件

任何团队提交package.json、package-lock.json文件,其他成员需要拉取更新代码,执行npm isntall更新依赖

任何时候都不要修改package-lock.json

如果package-lock.json出现冲突或问题,建议将本地package-lock.json文件删除,拉取远程的package-lock.json文件和package.json,再执行npm install命令

参考:《前端基础建设和架构设计30讲》

 

责任编辑:姜华 来源: 前端万有引力
相关推荐

2015-10-26 10:32:01

前端优化工程化

2023-09-15 10:33:45

前端工程化commit

2022-12-01 07:46:01

工程化工具

2021-05-18 19:18:50

前端工程化工程

2022-08-20 18:28:49

汽车软件

2021-06-05 18:01:05

工具Rollup前端

2022-08-17 11:33:35

前端配置

2018-05-18 10:08:15

人工智能移动平台大数据

2022-07-26 17:19:11

前端前端工程化

2022-10-09 14:50:24

前端pnpm工具

2021-07-06 10:03:05

软件开发 技术

2022-07-06 11:20:16

前端开发

2021-11-16 08:13:30

CSS 技巧工程化技术

2022-07-14 11:43:47

Node.jswebpack

2021-12-27 08:27:18

RepoGo 代码

2018-06-15 10:12:04

滴滴前端分支管理

2023-02-15 18:12:43

开发企业级CLI

2021-03-19 07:23:23

Go架构Go工程化

2021-12-09 11:30:46

CSS技术前端

2023-09-28 08:34:26

Docker微服务
点赞
收藏

51CTO技术栈公众号