package-lock.json 文件
今天有同事找到我说,本地js 编译不过,编译不过的代码如下
const host = window?.location?.host || 'localhost';
是option chaining, 但我本地是编译过的,他把? 删除了,肯定没有问题了,我就没管了。过了几天,又一个同事给我说,他本地也编译不过,也是上面代码引起来。我就觉得奇怪了,有必要找找原因了。
最新的语法肯定要编译,就和babel 有关,我搜了一个babel option chaining, 都是要加一个插件@babel/plugin-proposal-optional-chaining, 但我们的项目中(.babelrc文件) 并没有这个插件, 那是不是babel-polyfill 或babel running time做了什么?在搜索babel running time的时候,发现了add optional chanining to preset-env 的信息。点过去, 看到optional chanining 添加到babel 的githup 分支讨论,最终merge了,merge 的版本是7.8.0,也就是说 最新的@babel/preset-env已经包含了optional chaining。 对于使用者来说,就是如果本地安装的@babel/preset-env大于7.8.0 就可以直接使用option chaining,如果小于就有问题了,我赶紧让同事查了一下它安装的版本,果然,他本地的安装的版本是7.7.0。升级一下,就没有问题了,本地编译也通过了。同一个包,在不同的机器上安装,会有不同的版本,这让我想到了package-lock.json 文件。以前也是觉得它没什么作用,现在需要重新认识一下了。
在说package-lock.json 之前,先说一下npm 包的版本号。它有三部分组成:x.y.z. x是大版本,y是小版本,z是补丁版本。比如react 的版本号:16.10.2。 那么16 就是大版本,10就是小版本,2是补丁版本。补丁版本通常是一些bug的修复,功能不会改变。小版本通常是增加了一些新功能,也不会破坏以前的功能。大版本就不一样了,可能把某些过时的功能上删掉了,就会和以前的版本不兼容,通常是破坏性升级。
npm在安装包的时候(npm install xxx --save, npm install xxx --save-dev),它会在package.json的dependencies 和devDependencies 中列出安装的包名,还有版本号。默认情况下,它会从npm仓库中安装最新的版本,并且在版本号前面加^
"dependencies": {
"react": "^16.10.2",
"react-dom": "^16.10.2",
"react-scripts": "3.2.0"
},
"devDependencies": {
"enzyme": "^3.10.0",
"enzyme-adapter-react-16": "^1.14.0"
}
^ 表示最小版本。使用16.10.2 版本,但大于这个版本的也ok, 只要使用相同的大版本号。因为小版本和补丁版本通常是一些bug修复和没有破坏性的添加,只要大版本号没有发生变化,使用相对高一点的版本也是安全的。
在package.json 中保存依赖,确实带来了好处,任何人拿到项目时,使用npm install 就可以安装整个项目的依赖包,而不用相互之间传递node_modules。但这同样会带来一个小问题,每个人在自己的电脑上安装的同一个包的版本可能会不同。就比如上面提到的@babel/preset-env. 当我在开发项目的时候,版本号可能是7.7.0。 npm i @babel/preset-env --save-dev.那么在package.json文件夹中,就会被记录下来 “@babel/preset-env”: “^7.7.0”, 同时项目中真正安装的版本是7.7.0. 不久之后,项目上传到git. 同事开始合作开发,他git clone, npm install. 这时@babel/preset-env可能升级了几个版本,比如7.9.0. 他npm install, 真正安装的版本是7.9.0. 通常没有问题,但如果他在开发项目的过程中,使用了7.9.0 中的内容(option chaining )。当我git pull把代码拉取下来,本地编译 就会报错,因为我本地的node_module中的版本7.7.0 中没有这个功能。不同的机器上,不同的版本,导致的问题就是为什么在我的电脑上跑不起来。
package-lock.json 就是解次这个问题的,它列出了整个项目准确的依赖。npm i @babel/preset-env --save-dev, 虽然在package.json 中记录的是“^7.7.0”, 但是package-lock.json中记录的却是精确的版本号,当时开发时从npm 仓库下载的版本。如下所示version:7.7.0, 并且reslove 都记录了包的下载地址。The goal of package-lock.json is to keep track of the exact version of every package that is installed so that a product is 100% reproducible in the same way even if packages are updated by their maintainers.
"@babel/preset-env": {
"version": "7.7.0",
"resolved": "https://registry.npm.taobao.org/@babel/preset-env/download/@babel/preset-env-7.7.0.tgz",
"integrity": "sha1-q7s+14XH/kIg1MgqU2IdcfwMddM=",
"requires": {
npm install 在安装依赖的时候,它会优先解析package-lock.json. 那每个人安装的版本就是一样的。那这又带来了一个问题,每个人的电脑上都安装的7.7.0 版本,那我想升级怎么办?要使用新的功能怎么办?有两个办法
1,手动安装要更新的包,比如@babel/preset-env. npm i @babel/preset-env --save-dev, 这时会从npm 仓库拉取最新的包,并同步更新package.json 和package-lock.json
2,手动更改package.json, 然后npm install, 这时npm会根据package.json 安装新的版本,package-lock.json 也会同步进行更新。
如果package.json 发生变化,和package-lock.json 中的版本不一致,npm 会依据package.json 安装依赖,并同步更新package-lock.json
稍微总结一下, package.json 文件记录了整个项目开发要用到的依赖,package-lock.json 则是记录开发者在开发时的准确依赖。如果没有package-lock 文件,npm install 的时候,它永远会从npm 仓库下载最新的依赖。Without a package lock file, a package manager such as npm will resolve the the most current version of a package in real-time during the dependencies install of a package, rather than the version that was originally intended for the specific package.
package-lock.json 文件的更多相关文章
- 初学Node(二)package.json文件
package.json简介 package.json在Node项目中用于描述项目的一些基本信息,以及依赖的配置,一般每一个Node项目的根目录下都有一个package.json文件. 在项目的根目录 ...
- node 通过指令创建一个package.json文件及npm安装package.json
描述包的文件是package.json文件. 一个这样的文件,里面的信息还是挺大的.我们可以放弃手动建立.为了练手我们有命令行来建一个这样的包; 完成name,varsion....license项的 ...
- 基于gulp编写的一个简单实用的前端开发环境好了,安装完Gulp后,接下来是你大展身手的时候了,在你自己的电脑上面随便哪个地方建一个目录,打开命令行,然后进入创建好的目录里面,开始撸代码,关于生成的json文件请点击这里https://docs.npmjs.com/files/package.json,打开的速度看你的网速了注意:以下是为了演示 ,我建的一个目录结构,你自己可以根据项目需求自己建目
自从Node.js出现以来,基于其的前端开发的工具框架也越来越多了,从Grunt到Gulp再到现在很火的WebPack,所有的这些新的东西的出现都极大的解放了我们在前端领域的开发,作为一个在前端领域里 ...
- Nodejs package.json文件介绍
每个npm的安装包里面都会包含一个package.json,通常这个文件会在包的根目录下. 这个文件很类似于.net项目中的.csproj+AssemblyInfo.cs+App.config文件,主 ...
- 使用grunt-init自动创建gruntfile.js和package.json文件
使用grunt-init可以自动创建gruntfile.js和package.json文件.下面说一下过程: 1.全局安装grunt-init npm install -g grunt-init 2. ...
- npm package.json文件解读
每个Nodejs项目的根目录下面,一般都会有一个package.json文件.该文件可以由npm init生成,定义了项目所需要的各种模块,以及项目的配置信息(比如名称.版本.许可证等元数据). pa ...
- [转]nodejs中package.json和package-lock.json文件的功能分析
本文转自:https://blog.csdn.net/u013992330/article/details/81110018 最新版nodejs中,多了一个package-lock.json文件,刚开 ...
- npm 和package.json 文件
你可能还记得使用vue-cli 创建vue项目.当创建项目完成后,我们进入到项目目录,启动cmd命令窗口,输入npm install,它就会安装一堆东西(依赖),然后再输入npm run dev, 我 ...
- package.json文件配置信息
1.概述 每个项目的根目录下面,一般都有一个package.json文件,定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称.版本.许可证等元数据).npm install命令根据这个配置文 ...
- npm init 命令生成package.json文件
通过npm init 命令可以生成一个package.json文件.这个文件是 整个项目的描述文件.通过这个文件可以清楚的知道项目的包依赖关系,版本,作者等信息.每个NPM包都有自己的package. ...
随机推荐
- juc之ConcurrentHashMap在我工作中的实践
Map是我工作中应用比较多的数据结构之一,主要用来存储一些kv的映射信息,如果是单线程环境下我会优先使用HashMap,但是如果在多线程环境下继续使用HashMap我不确定会不会被我老大打死,为了生命 ...
- 一个list分成 list长度/step_length 向上取整个小list集合
一.具体实现方法 /** * 将一个list按照新的步长分成list长度/step_length 向上取整个小list * @param list * @param step_length * @re ...
- nim 3. 各种集合
其实我挺想先去学习一下nim的模块系统,毕竟我决定暂时放弃学习golang,就是因为感觉他的模块和包方面的设计,不像c#+nuget的组合那么舒服. 但是这里还是先学习一下集合吧,感觉这方面nim很有 ...
- zfile 在线云盘、网盘、OneDrive、云存储、私有云、对象存储、h5ai、上传、下载
基于 Java 的在线网盘程序,支持对接 S3.OneDrive.SharePoint.又拍云.本地存储.FTP.SFTP 等存储源,支持在线浏览图片.播放音视频,文本文件.Office.obj(3d ...
- .NET Core 项目Linux环境下生成二维码
问题: 公司系统开发中,需要对企微授权链接进行二维码生成,然后向客户提供:当然,首当其冲想到的是使用ZXing.NET库进行实现,毕竟生成简单二维码也就那几句代码:然而,在本地环境中,一切都很正常,但 ...
- 代码界的超级英雄:GitHub的奇幻冒险之旅
GitHub简介 GitHub是一个用于代码托管.版本控制和协作开发的平台.它于2008年2月8日由Chris Wanstrath.PJ Hyett和Tom Preston-Werner创立,目前由微 ...
- 使用Docker安装Odoo 17(非Docker Compose)
使用Docker安装Odoo 17(非Docker Compose) 前言 最近在学习Odoo,先是windows 安装企业版,多年不用windows的服务器操作系统,一看windows的ECS那么贵 ...
- 一文搞懂 MySQL 日志
前言 MySQL 的日志记录了运行的各种信息,是 MySQL 事务.性能.数据容灾.异常排查等的基础.本文将介绍 MySQL 一些关键日志的作用和原理. MySQL InnoDB 引擎重要的三个日志: ...
- 使用python获取房价信息
从贝壳网获取房价信息. 基本的步骤和我的这篇博文一样:https://www.cnblogs.com/mrlayfolk/p/12319414.html.不熟悉的可参考一下. 下面的代码是获取3000 ...
- java.io.File类中分隔符区别
1.separator File.separator是系统默认的文件分隔符号,在UNIX系统上,这个字段的值是'/';在Microsoft Windows系统上,它是''. 类型:String 2.s ...