写在前面:
我是「沸羊羊_」,昵称来自于姓名的缩写 fyy ,之前呕心沥血经营的博客因手残意外注销,现经营此账号。
本人是个小菜,正向着全栈工程师的方向努力着,文章可能并不高产,也很基础,但每写一篇都在用心总结,请大佬勿喷。
如果您对编程有兴趣,请关注我的动态,一起学习研究。
感谢每位读者!
如何生成 package(-lock).json文件
- 如果发现你的项目中没有 package.json 文件,说明新建项目时,命令中没有添加 init 关键字,生成package.json文件可以通过输入命令:npm init --yes 来初始化生成此文件。
- 如果项目中没有 package-lock.json 文件,打开终端输入:npm -v ,查看你的 npm 版本,如果是 npm 5 以下的版本是不会生成此文件的。npm 5 以后的版本,在项目终端中输入:npm install 会安装包,并自动生成 package-lock.json 文件。
package(-lock).json文件的作用
package-lock.json文件内保存了node_modules中所有包的信息,包含这些包的名称、版本号、下载地址。这样带来好处是,如果重新 npm install的时候,就无需逐个分析包的依赖项,因此会大大加快安装速度。
package.json 文件里定义了运行项目需要的各种依赖和项目的配置信息,当我们 npm install 的时候,node 会先从 package.json 文件中读取所有 dependencies 信息,然后根据dependencies 中的信息与 node_modules 中的模块进行对比,如果缺少直接下载,已有的检查更新(见下一点)
package.json 文件可以锁定依赖包的版本,但只能锁定大版本,也就是版本号的第一位,后面的小版本并不能锁定,每次 npm install 的时候拉取的都是该大版本下的最新小版本,但为了稳定性考虑我们几乎是不能随意升级依赖包的,这将导致很多工作量,此时,package-lock.json 文件起了很大作用,lock 本意就是锁定,这个文件会锁定当前项目中依赖包的版本号,防止 npm install 自动拉取最新版本依赖包。
当 npm install 时,node 会从 package.json 文件中读取模板名称,从 package-lock.json 文件中读取版本号,然后进行下载或更新,但由于 package-lock.json 锁定了版本号,所以是不能更新的,但如果想要更新依赖包的话,可以使用 npm install packagename (自动更新小版本号) 或 npm install packagename@x.x.x (指定版本号)来进行安装才会更新。
package.json属性说明
{
"name": "vue-online-shop-frontend",
"version": "1.0.0",
"description": "A Vue.js project",
"author": "fuyuanyuan",
"private": true,
"scripts": {
"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
"start": "npm run dev",
"build": "node build/build.js"
},
"dependencies": {
"vue": "^2.5.2",
"vue-router": "^3.0.1"
},
"devDependencies": {
},
"engines": {
"node": ">= 6.0.0",
"npm": ">= 3.0.0"
},
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 8"
],
"main": ".postcssrc.js",
"license": "ISC"
}
name:项目名称
命名时需遵循官方的一些规范与建议:
- 项目名称会成为 url、命令行中的一个参数或者一个文件夹名称,任何非安全的字符在项目名称中都不能使用(可以使用 validate-npm-package-name)包来检测项目名称是否合法
- 定义的项目名称要尽量符合项目功能,有意义
- 如果名称包含符号,将符号去除后不得与现有的模块名重名,例如:vue-online-shop-frontend 已经存在,vue.online.shop.frontend 不可以再创建
version:项目版本
npm 包的模块版本都需要遵循 SemVer 规范,该规范的标准版本号采用 X.Y.Z 格式,其中 X , Y , Z 均为非负的整数,且禁止在数字前补零
- X:主版本号,修改了不兼容的API
- Y:次版本号,新增了向下兼容的功能
- Z:修订号,修正了向下兼容的问题
其中,使用 ^ 用来标识版本范围:
版本标识 | 版本范围 | 说明 |
---|---|---|
^2.5.2 | 2.5.2 <= version < 3.0.0 | 主版本不为0,允许次要版本和补丁版本升级,(下限是 2.5.2,上限是3.0.0,但不匹配3.0.0) |
^0.2.3 | 0.2.3 <= version < 0.3.0 | 主版本为0,允许补丁版本升级,(下限是 0.2.3,上限是0.3.0,但不匹配0.3.0) |
^0.0.3 | 0.0.3 <= version < 0.0.4 | 主版本+次版本都为0,无法升级模块 |
^1.3 | 1.3.0 <= version < 2.0.0 | 主版本不为0,补丁版本因缺失被视作0,允许次要版本+补丁版本升级到到最新(此例下限是1.3.0,上线是2.0.0但不匹配2.0.0) |
^0.2 | 0.2.0 <= version < 0.3.0 | 主版本为0,补丁版本因缺失被视作0,允许补丁版本升级到最新(此例下限是0.2.0,上限是0.3.0但不匹配0.3.0) |
^1 | 1.0.0 <= version < 2.0.0 | 主版本不为0,次要版本+补丁版本因缺失被视作0,允许次要版本+补丁版本升级(此例下限是1.0.0,上限是2.0.0但不匹配2.0.0) |
^0 | 0.0.1 <= version < 1.0.0 | 主版本为0,次要版本因缺失被视作0,补丁版本虽缺失但只能被视作1,允许缺失的次要版本+补丁版本升级到最新(此例下限是0.0.1,上限是1.0.0但不匹配1.0.0) |
description:项目描述
用于添加模块的描述信息,便于用户了解该模块。
author:作者
private:定义私有模块
- 一般公司的非开源项目,都会设置 private 属性值为 true,通过设置该字段可以防止私有模块被无意间发布
scripts:简化终端命令
- scripts 属性是 package.json 的一种元数据功能,它接收一个对象,对象的属性为可以通过 npm run运行的脚本,值为实际运行的命令。
- 比如上述代码中,在终端输入命令 npm run dev,就可执行 “webpack-dev-server --inline --progress --config build/webpack.dev.conf.js”
dependencies & devDependencies:项目运行依赖模块(生产环境 & 开发环境)
- dependencies 字段指定了项目运行所依赖的摸块(生产环境),它是我们生产环境所需要的依赖项,用户 安装npm包的时候只会安装dependencies 里的依赖。
- 从 字段指定了项目开发所需要的模块(开发环境)。
如果一个模块不在 package.json 文件中 ,我们可以单独安装这个模块,并使用相应的参数,将其写入 dependencies /dependencies 字段中:
npm install --save //写入 dependencies 属性
npm install --save-dev //写入 devDependencies 属性
engines:指定项目 node 版本
- 用 engines 字段来指定项目 node 版本
- 也可以指定适用的 npm 版本
- engines 属性 仅起到一个说明的作用,当用户版本不符合指定值时也不影响依赖的安装。
browserslist:浏览器兼容情况
- 用来描述浏览器的兼容情况
- 例如,last 2 verions :表示兼容每个浏览器的最后两个版本
main:项目入口文件
- main 是 package.json 的另一种元数据功能,用来指定项目加载的入口文件,
- 当不指定main 字段时,默认值是模块根目录下面的index.js 文件
license:许可证
- 这是非常重要但经常被忽略的属性。license 字段使我们可以定义适用于 package.json 所描述代码的许可证。
- license 字段的值通常是许可证的标识符代码——例如 MIT 或 ISC 之类的字符串,它们代表MIT 许可证和 ISC 许可证。
管理你的package.json
package.json 必须是有效的 json 文件,文件中出现任何的语法错误,都将导致npm 与 package.json 无法交互。建议尽可能使用 npm CLI 更新和管理 package.json,以避免意外将错误引 入package.json 中。使用 npm init 创建你的 package.json 将有助于确保你生成有效的文件。
最好使用 npm 的命令来管理依赖项,这样可以使你的 package.json 和 node_modules/ 文件夹保持同步。如果手动添加依赖项列表的话,需要你在把依赖项实际安装到项目之前运行 npm install。
因为 package.json 仅是我们记录依赖项的位置,而 node_modules/ 文件夹是安装依赖项代码的实际位置,所以手动更新 package.json 的依赖项字段不会立即将我们的状态反映到 node_modules/ 文件夹。这就是为什么要用 npm 帮助管理依赖项的原因,因为它会同时更新 package.json 和 node_modules/ 文件夹。
最后
以上为本人的一点学习记录与总结,如有错误,请指出,不胜感激。