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. ...
随机推荐
- C#库dll配置文件App.config数据库连接项connectionStrings
原文地址:https://www.zhaimaojun.top/Note/5464967 网上一大堆的都是在说怎么修改项目文件,试过了不行,因为里面涉及到vs版本和安装目录等问题,不同的设备配置是不同 ...
- 使用可视化工具redis-desktop-manager管理查询缓存。
AnotherRedisDesktopManager https://gitee.com/qishibo/AnotherRedisDesktopManager/releases 下载windows版本 ...
- 【源码研读】MLIR Dialect 分层设计
以「疑问 - 求解」的形式来组织调研,此处记录整个过程. 1. MLIR 中的 Dialect 是「分层」设计的么? 先问是不是,再谈为什么.从 LLVM 社区 可以看出,至少在做 Codegen 时 ...
- nim 4. 模块
看了一下nim的模块系统,真的非常简洁. 1) 一个nim文件就是一个模块 2) 通过import 引入模块,引入的时候不需要带扩展名, 比如有个模块 mod1.nim, 引入的时候: import ...
- 第二届黄河流域网络安全技能挑战赛Web_wirteup
前言 好久没写过比赛的wp了,黄河流域的web出的不错,挺有意思了,花了点时间,也是成功的ak了 myfavorPython 注册登录,一个base64输入框,猜测pickle反序列化,简单测试下,返 ...
- 高效运维_AIRIOT智慧电力运维解决方案
可再生能源的引入带来了能源生产的去中心化和分散化趋势,同时也带来了能源输出的波动性和不确定性.电力运维因此需要更加灵活.智能的解决方案,以适应可再生能源的集成,确保电力系统的稳定运行,传统的电力运维管 ...
- HC32L110(六) AS06-VTB07H V5.0测试板AT指令固件
目录 HC32L110(一) HC32L110芯片介绍和Win10下的烧录 HC32L110(二) HC32L110在Ubuntu下的烧录 HC32L110(三) HC32L110的GCC工具链和VS ...
- 基于Python的性能优化
一.多线程 在CPU不密集.IO密集的任务下,多线程可以一定程度的提升运行效率. import threading import time import requests def fetch_url( ...
- 鸿蒙HarmonyOS实战-Stage模型(信息传递载体Want)
前言 应用中的信息传递是为了实现各种功能和交互.信息传递可以帮助用户和应用之间进行有效的沟通和交流.通过信息传递,应用可以向用户传递重要的消息.通知和提示,以提供及时的反馈和指导.同时,用户也可以通过 ...
- Linux之SELinux
1.什么是SELinux? 安全增强型 Linux(Security-Enhanced Linux)简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统. SELi ...