共计 3078 个字符,预计需要花费 8 分钟才能阅读完成。
前端开发的时候经常用到 npm 安装依赖包,初步使用的时候会跟着使用很多命令 –save -dev 之类的,看起来没有太大的区别,那为什么要这么用呢?就要深入了解一下 package.json 文件。
package.json 是什么
很多时候我们都是站在别人的肩膀上写代码,会引入很多依赖包,那自然,就需要对这些包的安装卸载有一个统一的管理。创建 package.json 文件是用来管理 npm 依赖包的最好方式。
虽然是这么说,但是很明确,package.json 只是一个记录文件,不是管理方式,管理的事还是 npm 在做。
那首先一开始,我们需要生成 package.json 文件
创建 package.json 文件
npm initnpm init –yes
生成文件有两个命令,前者是手动命令,输入后,我们可以手动配置项目的一些信息,不输入直接回车,就会自动填充默认配置。
后者是快捷命令。顾名思义,快捷命令就是按照默认设置,直接生成文件,文件内容如下:
{
“name”: “test”,
“version”: “1.0.0”,
“description”: “”,
“main”: “index.js”,
“scripts”: {
“test”: “echo \”Error: no test specified\” && exit 1″
},
“keywords”: [],
“author”: “”,
“license”: “ISC”
}
根据文件我们可以看到一些基本的内容,默认配置的时候取值如下。
name:当前目录名称 version:永远是 1.0.0description:来自自述文件的信息或空字符串 “”main:永远是 index.jsscripts:默认情况下会创建一个空 test 脚本 keywords:空的 author:空的 license: ISCbugs:来自当前目录的信息(如果存在)homepage:来自当前目录的信息(如果存在)
对于 package.json 来说,name 与 version 是必须的,也有一定的要求。
“name”
全是小写的
一个词,没有空格
允许破折号和下划线
“version”
以 x.x.x 的形式
遵循 semver 规范
也可以使用初始命令配置一些选项
npm set init.author.email “wombat@npmjs.com”npm set init.author.name “ag_dubs”npm set init.license “MIT”
如果文件中中没有描述字段,package.json 就会使用 README.md 或 README 的第一行。该描述可帮助人们在搜索 npm 时找到您的包,因此在 package.json 中写入自定义描述,可以让人更容易找到包。
总的来说:
package.json 文件
列出了项目依赖的所有包
允许你使用语义版本控制规则指定项目可以使用的包的版本
使您的构建可重现,因此更容易与其他开发人员共享
依赖包的管理
除了上面介绍的 package 信息之外,就是我们的核心信息——项目中所使用的所有依赖包。
仔细发现的话,我们会在 package.json 文件中找到两种类型的依赖包列表:
“dependencies”:项目在生产环境中需要的包。”devDependencies”:开发和测试中需要的包。
例如,下面的项目使用 my_dep 与生产中的主要版本 1 匹配的任何版本的软件包,并且需要 my_test_framework 与主要版本 3 匹配的任何版本的软件包,但仅用于开发:
{
“name”: “my_package”,
“version”: “1.0.0”,
“dependencies”: {
“my_dep”: “^1.0.0”
},
“devDependencies” : {
“my_test_framework”: “^3.1.0”
}
}
–save 和 –save-dev 安装区别
向项目中安装 package.json 中的依赖包的更简单(也更棒的)方法,是从命令行 npm install 执行此操作,使用 –save 或 标记命令 –save-dev,具体取决于您希望如何使用该依赖项。
一个条目添加到您 package.json 的 dependencies:
npm install <package_name> –save
一个条目添加到您 package.json 的 devDependencies:
npm install <package_name> –save-dev
我们在使用 npm install 安装模块的模块的时候,一般会使用下面这几种命令形式:
npm install moduleName # 安装模块到项目目录下
npm install -g moduleName # -g 的意思是将模块安装到全局,具体安装到磁盘哪个位置,要看 npm config prefix 的位置。
npm install -save moduleName # -save 的意思是将模块安装到项目目录下,并在 package 文件的 dependencies 节点写入依赖。
npm install -save-dev moduleName # -save-dev 的意思是将模块安装到项目目录下,并在 package 文件的 devDependencies 节点写入依赖。那么问题来了,在项目中我们应该使用四个命令中的哪个呢?这个就要视情况而定了。下面对这四个命令进行对比,看完后你就不再这么问了。
npm install moduleName 命令
安装模块到项目 node_modules 目录下。
不会将模块依赖写入 devDependencies 或 dependencies 节点。
运行 npm install 初始化项目时不会下载模块。
npm install -g moduleName 命令
安装模块到全局,不会在项目 node_modules 目录中保存模块包。
不会将模块依赖写入 devDependencies 或 dependencies 节点。
运行 npm install 初始化项目时不会下载模块。
npm install -save moduleName 命令
安装模块到项目 node_modules 目录下。
会将模块依赖写入 dependencies 节点。
运行 npm install 初始化项目时,会将模块下载到项目目录下。
运行 npm install –production 或者注明 NODE_ENV 变量值为 production 时,会自动下载模块到 node_modules 目录中。
npm install -save-dev moduleName 命令
安装模块到项目 node_modules 目录下。
会将模块依赖写入 devDependencies 节点。
运行 npm install 初始化项目时,会将模块下载到项目目录下。
运行 npm install –production 或者注明 NODE_ENV 变量值为 production 时,不会自动下载模块到 node_modules 目录中。
总结
devDependencies 节点下的模块是我们在开发时需要用的,比如项目中使用的 gulp,压缩 css、js 的模块。这些模块在我们的项目部署后是不需要的,所以我们可以使用 -save-dev 的形式安装。像 express 这些模块是项目运行必备的,应该安装在 dependencies 节点下,所以我们应该使用 -save 的形式安装。
管理依赖版本
npm 使用语义版本控制,或者,正如我们经常提到的那样,SemVer,用于管理软件包版本和范围。
如果你的 package.json 目录中有一个文件并且你运行 npm install,npm 将查看该文件中列出的依赖项并使用语义版本控制下载最新版本
参考原文 Working with package.json 参考 npm install