目录
一、package.json和package-lock.json文件的区别?
二、package.json中怎么区分开发依赖和生产依赖?安装包时的 ' -S、-D '等参数含义?
四、package.json包信息版本号如' ^1.0.0、~1.0.0、1.0.0 '等方式的区别?
一、package.json和package-lock.json文件的区别?
package.json是是手动维护的文件,用于记录项目中所依赖的包以及这些包的版本号等,但是并没有保存依赖包信息;
-
生成package.json文件指令:npm init -y
-
package.json中的信息摘要
参数 描述 name 项目名称 version 项目版本号 scripts 可以使用预定义变量和自定义变量,可以参考npm script 操作文章 engines 说明具体的版本号;例如:node、npm等 ;需要注意, engines
只是起一个说明的作用,即使用户安装的版本不符合要求,也不影响依赖包的安装。dependencies 生产依赖 npm i 包名称 -S 或者 npm i 包名称 --save devDependencies 开发依赖 npm i 包名称 -D 或者 npm i 包名称 --save-dev config 自定义变量 ( 用来配置 scripts
运行时的配置参数 )lint-staged 是一个在 Git
暂存文件上运行linters
的工具,配置后每次修改一个文件即可给所有文件执行一次lint
检查,通常配合gitHooks
一起使用。使用lint-staged
时,每次提交代码只会检查当前改动的文件。gitHooks 用来定义一个钩子,在提交(commit)之前执行ESlint检查。在执行lint命令后,会自动修复暂存区的文件。修复之后的文件并不会存储在暂存区,所以需要用git add命令将修复后的文件重新加入暂存区。在执行pre-commit命令之后,如果没有错误,就会执行 git commit license 用于指定软件的开源协议; MIT :只要用户在项目副本中包含了版权声明和许可声明,他们就可以拿你的代码做任何想做的事情,你也无需承担任何责任。Apache :类似于 MIT ,同时还包含了贡献者向用户提供专利授权相关的条款。GPL :修改项目代码的用户再次分发源码或二进制代码时,必须公布他的相关修改。 type 用于定义package.json文件和该文件所在目录根目录中.js文件和无拓展名文件的处理方式 ’moduel’则当作es模块处理;’commonjs’则被当作commonJs模块处理 …… ……
package-lock.json是自动生成的文件,其中定义的是某个包的具体版本,以及包之间的层叠关系,包括版本号、下载地址等;
-
生成package-lock.json指令:npm install --package-lock-only
-
package-lock.json信息摘要
参数 描述说明 version 依赖包的版本号 resolved 依赖包的安装源(其实就是可以理解为下载地址) devDependencies 依赖包 node_modeles
中依赖的包(特殊情况下才存在)dev 表示该模块是否为顶级模块的开发依赖或者是一个的传递依赖关系 …… ……
二、package.json中怎么区分开发依赖和生产依赖?安装包时的 ' -S、-D '等参数含义?
在package.json中,dependencies
对应生产环境依赖,devDependencies
是开发环境依赖。
用npm install
的时候加上--save
是添加到dependencies
,--save-dev
把模块添加到devDependencies
部分 。
安装包时的 ' -S、-D '等参数含义是:
-
'-S':类似于
--save
,只安装指定的依赖项,不安装其他依赖项。 -
'-D':类似于
--save-dev
,只安装指定的开发依赖项,不安装其他依赖项。
三、为什么有些包名,以@开头,有些没有?
@ 符号在 JavaScript 依赖中表示一个命名空间或者作用域,它可以用来区分不同的包或者组织。比如,@angular/core 是 Angular 框架的核心模块,@babel/core 是 Babel 编译器的核心模块。使用 @ 符号可以避免包名冲突或者提高可读性;
当在package.json文件中作为依赖项列出时,作用域包前面是其作用域名称。默认情况下,作用域包是私有的。作用域名称是介于@和斜线之间的所有内容:
@npm/package-name // "npm" scope
四、package.json包信息版本号如' ^1.0.0、~1.0.0、1.0.0 '等方式的区别?
每个版本号都形如:1.2.3,有三部分组成,依次叫主版本号、次版本号、修订号;
主版本号:当新版本无法兼容基于前一版本的代码时,则提高主版本号;
次版本号:当新版本新增了功能和特性,但仍兼容前一版本的代码时,则提高次版本号;
修订号:当新版本仅仅修正了漏洞或者增强了效率,仍然兼容前一版本代码,则提高修订号;
最优版本:默认情况下,npm install xxx --save
下载的都是最新版本,并且会在package.json
文件里登记一个最优版本号。
^1.0.0 表示兼容某个大版本:
意味着下载的包可能会是更高的次版本号或者修订版本号。(也就是主版本不能变,次版本、修订版本可以随意变)。
~1.0.0 表示兼容某个次版本:
意味着有可能会有更高的修订版本号。(也就是主版本、次版本不能变,修订版本可以随意变)。
1.0.0 表示固定的某个版本号:
意味着固定的版本号。(也就是主版本、次版本,修订版本不能变)。
注意点:当我们想要固定某个包的版本时,不仅仅只是修改package.json,还需要修改package-lock.json;锁定版本应该根据package-lock.json实际应用的版本更新package.json
五、如何在项目中限制node的版本号和npm的版本号?
-
说明node的版本号
通过在 package.json 中指定 engines 字段,可限定项目使用的 node 版本。需要注意,
engines
只是起一个说明的作用,即使用户安装的版本不符合要求,也不影响依赖包的安装。和依赖项一样,如果不指定版本(或者指定“ * ”作为版本),则任何版本的节点都可以。
"engines": { "node": "14.x || 16.x" // 仅允许用户使用 14 或者 16的版本 },
要限制npm的版本号,可以在项目根目录创建一个名为.npmrc的文件,并加入以下语句:
// .npmrc engine-strict = true
-
锁定包管理器
利用 only-allow 工具包、npm scripts 快速实现锁定。
步骤一: 在项目中 npm install -D only-allow
步骤二: 在 package.json 文件中进行配置 scripts.preinstall , 允许输入的值 only-allow npm、only-allow yarn…
"scripts": { "preinstall": "npx only-allow npm", ... }