今天有同事找到我说,本地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 文件的更多相关文章

  1. 初学Node(二)package.json文件

    package.json简介 package.json在Node项目中用于描述项目的一些基本信息,以及依赖的配置,一般每一个Node项目的根目录下都有一个package.json文件. 在项目的根目录 ...

  2. node 通过指令创建一个package.json文件及npm安装package.json

    描述包的文件是package.json文件. 一个这样的文件,里面的信息还是挺大的.我们可以放弃手动建立.为了练手我们有命令行来建一个这样的包; 完成name,varsion....license项的 ...

  3. 基于gulp编写的一个简单实用的前端开发环境好了,安装完Gulp后,接下来是你大展身手的时候了,在你自己的电脑上面随便哪个地方建一个目录,打开命令行,然后进入创建好的目录里面,开始撸代码,关于生成的json文件请点击这里https://docs.npmjs.com/files/package.json,打开的速度看你的网速了注意:以下是为了演示 ,我建的一个目录结构,你自己可以根据项目需求自己建目

    自从Node.js出现以来,基于其的前端开发的工具框架也越来越多了,从Grunt到Gulp再到现在很火的WebPack,所有的这些新的东西的出现都极大的解放了我们在前端领域的开发,作为一个在前端领域里 ...

  4. Nodejs package.json文件介绍

    每个npm的安装包里面都会包含一个package.json,通常这个文件会在包的根目录下. 这个文件很类似于.net项目中的.csproj+AssemblyInfo.cs+App.config文件,主 ...

  5. 使用grunt-init自动创建gruntfile.js和package.json文件

    使用grunt-init可以自动创建gruntfile.js和package.json文件.下面说一下过程: 1.全局安装grunt-init npm install -g grunt-init 2. ...

  6. npm package.json文件解读

    每个Nodejs项目的根目录下面,一般都会有一个package.json文件.该文件可以由npm init生成,定义了项目所需要的各种模块,以及项目的配置信息(比如名称.版本.许可证等元数据). pa ...

  7. [转]nodejs中package.json和package-lock.json文件的功能分析

    本文转自:https://blog.csdn.net/u013992330/article/details/81110018 最新版nodejs中,多了一个package-lock.json文件,刚开 ...

  8. npm 和package.json 文件

    你可能还记得使用vue-cli 创建vue项目.当创建项目完成后,我们进入到项目目录,启动cmd命令窗口,输入npm install,它就会安装一堆东西(依赖),然后再输入npm run dev, 我 ...

  9. package.json文件配置信息

    1.概述 每个项目的根目录下面,一般都有一个package.json文件,定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称.版本.许可证等元数据).npm install命令根据这个配置文 ...

  10. npm init 命令生成package.json文件

    通过npm init 命令可以生成一个package.json文件.这个文件是 整个项目的描述文件.通过这个文件可以清楚的知道项目的包依赖关系,版本,作者等信息.每个NPM包都有自己的package. ...

随机推荐

  1. oracle RDBMS Kernel Executable 占用内存过高

    oracle RDBMS Kernel Executable 占用内存过高 参考:https://www.cnblogs.com/markkang/archive/2019/11/25/1192540 ...

  2. ansible(2)--ansible的安装与配置文件管理

    目录 1 ansible的安装 1.1 yum安装 1.2 pip安装 2 ansible相关文件 2.1 ansible配置文件 2.2 ansible配置文件的优先级 2.3 ansible的主机 ...

  3. ProxyKit服务器http反向代理应用

    方法一:这个方法很漂亮,但是,有问题,不知道什么原因,cookie偶尔会收不到,而造成验证错误,提交内容也会错误 扩展类: public class MyTypedHandler : IProxyHa ...

  4. 神经网络常见参数解释:epoch、batch、batch size、step、iteration

      本文介绍在机器学习.深度学习的神经网络模型中,epoch.batch.batch size.step与iteration等名词的具体含义.   epoch:表示将训练数据集中的所有样本都过一遍(且 ...

  5. FRDM-MCXN947开发板之RGB灯

    一.背景 RGB LED:通过红.绿.蓝三种颜色组合发光的LED,可以理解由三个不同发光属性的LED组成,这个是LCD平板显示原理的基础,一个LED相当于屏幕上面的一个像素 FRDM-MCXN947集 ...

  6. 7.19考试总结(NOIP模拟20)[玩具·y·z]

    与其被自己的本性牵着走而痛苦,倒不如试着改变自己. 前言 首先自我检讨一下,T1的部分分是原题,但是我这个 FW 居然没有看出来..(主要是我看错题了) 论语文素养如何限制 OI 水平 别人眼里是一棵 ...

  7. itest(爱测试)开源接口测试&敏捷测试&极简项目管理 7.1.0 发布,ui优化及bug修复

    (一)itest 简介及更新说明 itest 开源敏捷测试管理,testOps 践行者,极简的任务管理,测试管理,缺陷管理,测试环境管理,接口测试,接口Mock 6合1,又有丰富的统计分析.可按测试包 ...

  8. uniapp 上拉加载下拉刷新

    page.json中配置"enablePullDownRefresh": true //单个页面修改刷新按钮的颜色 "app-plus": { "ti ...

  9. docker inspect 格式化输出

    docker inspect 例子 [root@hmm ~]# docker run -tid --name YUN-teSt ubuntu 337170fc3109a824273a7f04dd5c5 ...

  10. react 数组列表

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...