有什么区别:
npm install [package_name]
和:
npm install [package_name] --save
和:
npm install [package_name] --save-dev
这是什么意思? --save
和 -dev
关键字的真正效果是什么?
npm install --production
时,不会重新安装通过 --save-dev 选项安装的软件包。这就是操作上的差异(有关详细信息,请参阅 https://docs.npmjs.com/cli/install)。
NODE_ENV
设置为生产,那么只有 npm install
会自动排除开发包。
moment.js
为例:运行 webpack 时,moment
代码取自 node_modules
并包含在项目中。从这个意义上说,与运行 webpack 时也需要的 typescript
没有区别。
如果您在自己的项目中尝试过 --save
和 --save-dev
之间的差异,则可能不会立即注意到它们。所以这里有几个例子......
假设您正在构建一个使用 moment 包来解析和显示日期的应用程序。你的应用是一个调度器,所以它确实需要这个包来运行,例如:没有它就无法运行。在这种情况下,您将使用
npm install moment --save
这将在您的 package.json 中创建一个新值
"dependencies": {
...
"moment": "^2.17.1"
}
在开发时,使用测试套件等工具确实很有帮助,可能需要 jasmine-core 和 karma。在这种情况下,您将使用
npm install jasmine-core --save-dev
npm install karma --save-dev
这也会在你的 package.json 中创建一个新值
"devDependencies": {
...
"jasmine-core": "^2.5.2",
"karma": "^1.4.1",
}
您确实不需要测试套件以正常状态运行应用程序,因此它是 --save-dev
类型的依赖项,仅此而已。您可以看到,如果您不了解真正发生的事情,这有点难以想象。
直接取自 NPM 文档 docs#dependencies
依赖关系 依赖关系在一个简单的对象中指定,该对象将包名称映射到版本范围。版本范围是具有一个或多个以空格分隔的描述符的字符串。依赖关系也可以使用 tarball 或 git URL 来标识。请不要将测试工具或转译器放在您的依赖项对象中。请参阅下面的 devDependencies。
即使在文档中,它也会要求您将 --save-dev
用于测试工具等模块。
--save-dev 用于保存包以用于开发目的。示例:单元测试,缩小..
--save 用于保存应用程序运行所需的包。
-D
是 --save-dev
的缩写,-S
是 --save
的缩写
--save
选项。如果您执行 npm install my-package
,它将在 package.json 文件中添加“my-package”作为依赖项。
默认情况下,NPM 只是在 node_modules 下安装一个包。当您尝试为您的应用/模块安装依赖项时,您需要先安装它们,然后将它们添加到 package.json
的 dependencies
部分。
--save-dev
将第三方包添加到包的开发依赖项中。当有人直接运行 npm install
来安装您的软件包时,它不会被安装。它通常仅在有人首先克隆您的源存储库然后在其中运行 npm install
时安装。
--save
将第三方包添加到包的依赖项中。每当有人运行 npm install package
时,它将与软件包一起安装。
开发依赖项是仅在开发包时需要的那些依赖项。这可以包括测试运行程序、编译器、打包程序等。这两种类型的依赖项都存储在包的 package.json
文件中。 --save
添加到 dependencies
,--save-dev
添加到 devDependencies
npm install 文档可以参考这里。
--
请注意,自 NPM 5 起,--save
现在是默认选项。因此,不再明确需要它。可以在没有 --save
的情况下运行 npm install
以获得相同的结果。
dependency package name is going to install.
.. 不是开发依赖项中的开发人员包。
让我给你举个例子,
你是一个非常严肃的 npm 库的开发者,它使用不同的测试库来测试包。
用户下载您的库并希望在他们的代码中使用它。他们是否也需要下载您的测试库?也许您使用 jest 进行测试,而他们使用 mocha。你想让他们也安装 jest 吗?只是为了运行你的图书馆?
没有权利?这就是他们在 devDependencies
中的原因。
当有人这样做时,npm i yourPackage
只会安装RUN您的库所需的库。您用于捆绑代码或测试和模拟的其他库将不会安装,因为您将它们放在 devDependencies
中。很整洁吧?
那么,为什么开发人员需要公开 devDependancies?
假设您的包是一个开源包,并且有 100 人正在向您的包发送拉取请求。那么他们将如何测试包呢?他们将git clone
您的 repo 以及何时执行 npm i
dependencies 以及 devDependencies。
因为它们是不使用您的包裹。他们正在进一步开发包,因此,为了测试您的包,他们需要通过现有的测试用例以及编写新的测试用例。因此,他们需要使用您的 devDependencies
,其中包含您使用的所有测试/构建/模拟库。
一个完美的例子是:
$ npm install typescript --save-dev
在这种情况下,您希望 Typescript(一种 javascript 可解析的编码语言)可用于开发,但一旦部署应用程序,就不再需要,因为所有代码都已转换为 javascript。因此,将其包含在已发布的应用程序中是没有意义的。实际上,它只会占用空间并增加下载时间。
--save
保存的包仍然只保存在 node_modules
文件夹中。该代码未包含在已部署的网站中。
--save-dev
标志时,包将添加到您的 devDependencies
对象中。如果/当有人安装 您的 软件包时,所有 dependencies
都会被下载,但 devDependencies
不会,因为它们在运行时不是必需的。正如答案所述,这可以节省他们的时间和空间。开发您的包文件本身的开发人员也可以在包目录中运行 npm install
来安装 devDependencies
。
npm install
,devDependencies
会被忽略吗?
正如 this answer 中的 @andreas-hultgren 所建议并根据 npm docs:
如果有人计划在他们的程序中下载和使用您的模块,那么他们可能不想或不需要下载和构建您使用的外部测试或文档框架。
但是,对于 webapp 开发,Yeoman(一种安装经过同行评审的预先编写的 package.json 文件等的脚手架工具)将所有包放在 devDependencies 中,而在依赖项中没有任何内容,因此使用 {2 } 至少在 webapp 开发中是一个安全的选择。
--save-dev
安装软件包时遇到了问题,其中软件包不会安装其所需的依赖项。运行 --save
安装了那些缺少的依赖项。
--save
用于除测试和文档依赖项之外的所有依赖项(根据 npm 文档)。我开始认为我上面提到的 Yeoman 示例不是最佳实践的好示例。
--save-dev
只是因为这里的每个答案变得不太清楚:)
--save-dev
将 semver 规范保存到包描述符文件中的“devDependencies”数组中,--save
将其保存到“依赖项”中。
--save-dev
使包本地化到您的项目,而 --save
使它们本地化到您的节点安装?
--save-dev
用于应用程序开发中使用的模块,在生产环境中运行时不需要 --save
用于将其添加到 package.json 中,并且它是运行应用程序所必需的。
示例:express,body-parser,lodash,helmet,mysql 所有这些都在运行应用程序时使用使用 --save
放入依赖项而 mocha,istanbul,chai,sonarqube-scanner 都在开发过程中使用,所以把它们放在 dev -依赖项。
npm link 或 npm install 还将在您的项目文件夹中安装开发依赖模块以及依赖模块
已经提供了明确的答案。但值得一提的是 devDependencies
如何影响安装包:
默认情况下,npm install 将安装 package.json 中列为依赖项的所有模块。使用 --production 标志(或者当 NODE_ENV 环境变量设置为 production 时),npm 将不会安装 devDependencies 中列出的模块。
请参阅:https://docs.npmjs.com/cli/install
阅读完整并忘记--save-dev
头痛
最简单的答案是当您为其他开发人员创建包并想要托管您的NPM Registry 中的软件包,例如 lodash、mongoose、express 等。在构建或编写 Node Server 时,--save
之间没有区别和 --save-dev
,因为您的 Node Server 实现对您来说是私有的,您永远不会在 NPM 上发布它。
NPM 安装的工作原理
每当我们使用 npm 安装一个新包时,例如 npm install express 然后 NPM 将该包安装到我们的系统并将其放入 node_modules 文件夹中,现在 NPM 将分析新安装的包的 package.json 文件,即 express 在这种情况下,分析后 NPM 将安装 express 包的 package.json 文件的依赖项部分中提到的所有那些包。在安装那些 express 依赖的包之后,NPM 再次分析所有新安装的包的 package.json 文件并再次为它们安装包,这个循环一直持续到所有包都可以在 node_modules 文件夹中正常运行。您可以通过在终端中运行 npm list 来检查包依赖关系,终端应该指向项目目录的位置。
--save-dev
与上述内容的关系
假设你想创建一个新的 package 像 express,现在在开发这个新包时你可能想写一些 单元测试代码 并测试与任何其他可用的测试包 包一起假设在这种情况下是 mocha。现在您知道 mocha 只需要 测试包 不需要 使用包。在这种情况下,您应该使用 --save-dev
标志安装 mocha,否则只要开发人员使用 NPM 安装您的软件包,NPM 就会安装它。因此,如果我们希望在有人从 NPM 安装我们的包时不安装 依赖项,我们必须在开发阶段使用 --save-dev
安装该包。
最后一件事
不要将 --save-dev
与 协作开发 混用,如果有人从 github 等源代码版本控制系统克隆了您的包代码,那么 NPM 肯定会安装所有 devDependencies 即使用 --save-dev
安装的软件包。
这里的所有解释都很棒,但缺少一个非常重要的东西:如何仅安装生产依赖项? (没有开发依赖项)。我们使用 --save
或 --save-dev
将 dependencies
与 devDependencies
分开。要安装我们使用的所有内容:
npm i
要仅安装生产包,我们应该使用:
npm i --only=production
您通常不希望使用仅打算用于开发目的的东西来膨胀生产包。
使用 --save-dev
(或 -D
)选项来分隔包,例如单元测试框架(jest、jasmine、mocha、chai 等)
您的应用需要用于生产的任何其他软件包都应使用 --save
(或 -S
)安装。
npm install --save lodash //prod dependency
npm install -S moment // " "
npm install -S opentracing // " "
npm install -D jest //dev only dependency
npm install --save-dev typescript //dev only dependency
如果您打开 package.json
文件,您将看到这些条目列在两个不同的部分下:
"dependencies": {
"lodash": "4.x",
"moment": "2.x",
"opentracing": "^0.14.1"
},
"devDependencies": {
"jest": "22.x",
"typescript": "^2.8.3"
},
npm install
时,依赖项和 devDependencies 都会安装,所以似乎没有任何区别?
当您使用 npm install <package-name>
安装 npm 包时,您将其安装为依赖项。
该软件包会自动列在 package.json
文件中的 dependencies
列表下(从 npm 5 开始:在您必须手动指定 --save
之前)。
例如。 npm install lodash
按下回车后检查您的 package.json 文件。
"dependencies": {
"lodash": "4.x",
},
添加 -D
标志或 --save-dev
时,您将其安装为开发依赖项,这会将其添加到 devDependencies
列表中。
前任。 npm install --save-dev lite-server
按回车后检查您的 package.json 文件
"devDependencies": {
"lite-server": "^2.6.1"
},
开发依赖项旨在作为仅开发包,在生产中不需要。例如测试包、webpack 或 Babel。
当您进入生产环境时,如果您键入 npm install
并且该文件夹包含一个 package.json
文件,它们就会被安装,因为 npm 假定这是一个开发部署。
您需要设置 --production
标志 (npm install --production
) 以避免安装这些开发依赖项。
--save-dev(仅用于开发,不用于生产)--save(生产依赖项)--global 或 -g(全局使用,即可以在我们本地系统的任何地方使用)
人们在生产环境中使用 npm 来做一些很酷的事情,Node.js 就是一个例子,所以你不希望你的所有开发工具都在运行。
如果您使用 gulp(或类似的)来创建构建文件以放在您的服务器上,那么这并不重要。
基本上我们写
npm install package_name
但特别是为了测试目的,我们不需要在应用程序以正常状态运行时运行某些包,以便 Node 引入解决这个问题的好方法。每当我们写
npm install package_name --save-dev
当时这个包只是为了开发目的而安装的。
我想添加一些我的想法作为
我认为当有人使用您的代码而不是自己使用时,所有差异都会出现
例如,您编写了一个名为 node's request
的 HTTP 库
在你的图书馆里,
您使用 lodash 处理字符串和对象,没有 lodash,您的代码无法运行
如果有人使用您的 HTTP 库作为其代码的一部分。您的代码将与他的一起编译。
你的代码需要 lodash,所以你需要输入 dependencies
来编译
如果您编写一个像 monaco-editor
这样的项目,它是一个网络编辑器,
您已使用 webpack 捆绑了所有代码和 product env library
,构建完成后,只有一个 monaco-min.js
所以有人不在乎是--save
还是--save-dependencies
,他只需要monaco-min.js
概括:
如果有人想编译您的代码(用作库),请将您的代码使用的 lodash 放入依赖项中如果有人想为您的代码添加更多功能,他需要单元测试和编译器,将它们放入 dev-dependencies
因为 --save 是 npm 的默认选项,所以我使用
npm i package
对于--save-dev,我使用
npm i package -D
默认选项将安装包作为项目依赖项,其中 -D 用于开发依赖项,如测试、lint 等,并为开发过程安装包
你可以在这里找到所有的标志https://docs.npmjs.com/cli/v8/commands/npm-install
不定期副业成功案例分享