3001

I saw some tutorial where the command was:

npm install --save

What does the --save option mean?

Dequog
  • 124
  • 13
Dmitri
  • 34,780
  • 9
  • 39
  • 55
  • 20
    You can use shortcut -S and -D there -S is --save and -D is '--save-dev. --save (or simple -S): Package will appear in your dependencies. --save-dev (or simple -D): Package will appear in your devDependencies. – Gil Epshtain Feb 28 '16 at 20:47
  • 6
    @WiredPrairie thanks I was trying `npm install (--help | -h | -help ..)` and nothing. – juliangonzalez Aug 16 '16 at 20:14
  • 3
    thx @Dmitri, I had the same issue. come on NPM add that to your MAN page for your tool – Erdinc Ay Sep 13 '17 at 12:05
  • 185
    I don't understand the rationale behind the decision of removing even just a mention of this option from the docs and help page *without* also deprecating it, at the very least, with a warning in the tool itself. Meanwhile newbies are exposed to it via zillions of tutorials. Then they try to find out what it does and have to waste 20 minutes perusing the docs, to eventually end up reading npm history on stackoverflow. Oddly enough preventing this sort of massive waste of time (if the popularity of the question is any indication) is one of the purposes of documentation. – Michael Ekoka Jul 05 '18 at 05:30
  • 3
    As of 2020 it does not exist as parameter anymore. See full answer in this thread for further info instead of the comments to the question. – Dirk Schumacher Jun 03 '20 at 19:25
  • 6
    @MichaelEkoka I am using React-Native for the first time and it is the finickiest piece of development software I have ever had. So far I've spent well over 20 hours debugging dependencies and zero time coding. It's great. There is no long term shared views between the modules. It's chaotic as hell and this is just another example it it. – FMaz008 Dec 20 '20 at 15:35
  • As of now installed modules are added as a dependency by default, so the --save option is no longer needed. Thus, it's optional at the time of posting this comment. Not sure few seconds/minutes/hours afterwards. because they enjoy changing these options every often. – Atul Aug 06 '22 at 09:23
  • 2
    Since new npm version no longe needs `--save`, but I am curious what did it save without `--save` before npm 5? global? – Arst Feb 23 '23 at 08:19

14 Answers14

3469

Update npm 5:

As of npm 5.0.0, installed modules are added as a dependency by default, so the --save option is no longer needed. The other save options still exist and are listed in the documentation for npm install.

Original answer:

Before version 5, NPM simply installed a package under node_modules by default. When you were trying to install dependencies for your app/module, you would need to first install them, and then add them (along with the appropriate version number) to the dependencies section of your package.json.

The --save option instructed NPM to include the package inside of the dependencies section of your package.json automatically, thus saving you an additional step.

In addition, there are the complementary options --save-dev and --save-optional which save the package under devDependencies and optionalDependencies, respectively. This is useful when installing development-only packages, like grunt or your testing library.

voithos
  • 68,482
  • 12
  • 101
  • 116
  • 227
    Seriously, is this documented anywhere? I couldn't find it on Google or in the `npm` help. – Christian Ternus Oct 24 '13 at 23:56
  • 170
    It would be nice if documentation for this showed up when `npm install --help` was used. – Mark Stosberg Dec 06 '13 at 20:23
  • 2
    @MarkStosberg: It is listed under `npm help install`, which brings up the man page for `npm-install` on my machine. – voithos Dec 06 '13 at 23:43
  • 1
    I wanted to update all of my not-versioned (version = *) dependencies and set them to a fixed version. `npm install --save` does not update these in the package.json if I'm correct. If someone else wants to do what I did as well, see the next hideous command you can run: cat package.json | sed -E 's/"([a-z -_.]*)":[ ]*"\*",?/\1/g' | sed -E 's/[ ]*["|{|}].*//g' | tr '' ' ' | xargs npm install --save -frbl – frbl Sep 12 '15 at 12:31
  • 2
    Use `--save --save-exact` or `--save-dev --save-exact` to pin the semver range to a particular version, rather than using a caret. Also worth noting is that if you do e.g. `npm install sails@balderdashy/sails#master --save --save-exact`, you'll pin the dependency of the most recent commit on the master branch of the specified GitHub repo. – mikermcneil Oct 23 '16 at 18:27
  • -S, --save: Package will appear in your dependencies. – jawath Nov 09 '16 at 04:46
  • 2
    surprised this isn't the default, like composer – jim smith May 17 '17 at 10:39
  • 18
    @jimsmith: As of npm 5.0, it is the default. – voithos Jun 14 '17 at 00:14
  • 3
    Does "npm update" on NPM 5 modifies package.json by default? – Igor Okorokov Jul 03 '17 at 09:05
  • 1
    @IgorOkorokov: By default, I don't think so. `npm update` will comply with whatever version spec you already have in your package.json (so, it may perform an update, but only to a version that matches the specified pattern). If you want to save the updated version to your package.json, you can [pass `--save`](https://docs.npmjs.com/cli/update#recording-updates-with---save). – voithos Jul 03 '17 at 21:10
  • 8
    @voithos For me NPM 5 updates package versions in package.json. To avoid it i need to run 'npm update --no-save' – Igor Okorokov Jul 06 '17 at 14:57
  • 1
    I know I shouldn't downvote an answer because I think that NPM has made a dumb decision. But, it's so compelling. :) – Thomas Jan 10 '18 at 00:22
  • 3
    It appears that the obsolete save option has been removed from the official documentation of npm install. – David A. Gray Apr 09 '18 at 04:56
  • 1
    Just ran `npm install -g --save @google-cloud/vision`, it saved into `C:\Users\MyName\AppData\Roaming\npm\node_modules`, but it's not added into **package.json** at all. Any thought? – Jeb50 Jul 28 '18 at 23:20
  • 1
    so all these people adding --save to their npm commands these days are doing it out of habit. – nurettin Sep 18 '18 at 09:16
  • 2
    Now that --save is the default you can use --no-save to not automatically add the dependency to your package.json – Billkamm Aug 22 '19 at 15:20
  • @Jeb50 - *remove* `-g`, to add it to your project's package.json. See https://stackoverflow.com/a/8951576/199364, https://docs.npmjs.com/files/folders – ToolmakerSteve Oct 31 '19 at 13:00
  • 1
    Amazing that this is not documented anywhere but no matter. I noticed in the last couple of years that npm install and npm install --save did the same thing. – Harlin Aug 03 '20 at 15:30
  • 1
    It still makes a difference. E.g. installing react-router-dom fails without `--save`. – Soerendip Sep 08 '21 at 19:20
  • I have npm version 6. E.g, when I write npm install json-server, I already see it dependencies in package.json. In this case there is no difference between without save and with save. – A7x Mar 10 '22 at 13:09
360

Update as of npm 5:

As of npm 5.0.0 (released in May 2017), installed modules are added as a dependency by default, so the --save option is no longer needed.
The other save options still exist and are listed in the documentation for npm install.


Original Answer:

To add package in dependencies:

npm install my_dep --save

or

npm install my_dep -S

or

npm i my_dep -S

To add package in devDependencies

npm install my_test_framework --save-dev

or

npm install my_test_framework -D

or

npm i my_test_framework -D

package.json enter image description here

Henke
  • 4,445
  • 3
  • 31
  • 44
Joe L.
  • 4,433
  • 1
  • 19
  • 14
  • 50
    be careful using shortcut versions like `-S` `-D` as they must be uppercase. I always make this mistake and npm doesn't complain or add it to package.json – Murray Wynnes Aug 12 '16 at 14:23
  • 29
    It doesn't complain because `-s` (lowercase) is for the `--silent` option, and `-d` is for loglevel info which are both valid shortcuts. – tanvi Aug 21 '19 at 20:00
178

Update as of npm 5:

As of npm 5.0.0, installed modules are added as a dependency by default, so the --save option is no longer needed. The other save options still exist and are listed in the documentation for npm install.


Original answer:

It won't do anything if you don't have a package.json file. Start by running npm init to create one. Then calls to npm install --save or npm install --save-dev or npm install --save-optional will update the package.json to list your dependencies.

temporary_user_name
  • 35,956
  • 47
  • 141
  • 220
Nick Retallack
  • 18,986
  • 17
  • 92
  • 114
  • 42
    Just found out that it works retroactively (it seems). You can run your `npm install --save-dev` first, then npm init and your package.json will be populated. – Jacob Wang Nov 15 '14 at 10:37
44

According to NPM Doc:

Enter image description here

So it seems that by running npm install package_name, the package dependency should be automatically added to package.json, right?

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
ROROROOROROR
  • 959
  • 1
  • 14
  • 31
  • 2
    I guess --no-save is to use when you want functionality of like npm<5 – Abhiroj Panwar May 20 '18 at 08:01
  • I see, `npm config ls -l` shows that by default, save-xxx options are all false, only save is true. – ROROROOROROR May 21 '18 at 05:56
  • Looks like npm will not fire any error if you put a none exist option, like --save-xxxxxx. It just ignore it and the default behavior --save-prod will be in affect. Maybe --save comes from some old npm version. – Leon Mar 30 '20 at 06:54
  • Please review *[Why not upload images of code/errors when asking a question?](https://meta.stackoverflow.com/questions/285551/)* (e.g., *"Images should only be used to illustrate problems that* ***can't be made clear in any other way,*** *such as to provide screenshots of a user interface."*) and [do the right thing](https://stackoverflow.com/posts/50206643/edit) (it covers answers as well). Thanks in advance. – Peter Mortensen Jan 27 '23 at 03:09
20

You can also use -S, -D or -P which are equivalent of saving the package to an application dependency, a development dependency or production dependency. See more NPM shortcuts below:

-v: --version
-h, -?, --help, -H: --usage
-s, --silent: --loglevel silent
-q, --quiet: --loglevel warn
-d: --loglevel info
-dd, --verbose: --loglevel verbose
-ddd: --loglevel silly
-g: --global
-C: --prefix
-l: --long
-m: --message
-p, --porcelain: --parseable
-reg: --registry
-f: --force
-desc: --description
-S: --save
-P: --save-prod
-D: --save-dev
-O: --save-optional
-B: --save-bundle
-E: --save-exact
-y: --yes
-n: --yes false
ll and la commands: ls --long

This list of shortcuts can be obtained by running the following command:

npm help 7 config
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
DevWL
  • 17,345
  • 6
  • 90
  • 86
19

npm v6.x update

Now you can use one of npm i or npm i -S or npm i -P to install and save a module as a dependency.

npm i is the alias of npm install

  1. npm i is equal to npm install, meaning the default save module as a dependency;
  2. npm i -S is equal to npm install --save (npm v5-)
  3. npm i -P is equal to npm install --save-prod (npm v5+)

Check out your npm version

npm -v

6.14.4

Get npm cli help information

npm -h

Usage: npm <command>

where <command> is one of:
    access, adduser, audit, bin, bugs, c, cache, ci, cit,
    clean-install, clean-install-test, completion, config,
    create, ddp, dedupe, deprecate, dist-tag, docs, doctor,
    edit, explore, fund, get, help, help-search, hook, i, init,
    install, install-ci-test, install-test, it, link, list, ln,
    login, logout, ls, org, outdated, owner, pack, ping, prefix,
    profile, prune, publish, rb, rebuild, repo, restart, root,
    run, run-script, s, se, search, set, shrinkwrap, star,
    stars, start, stop, t, team, test, token, tst, un,
    uninstall, unpublish, unstar, up, update, v, version, view,
    whoami

npm <command> -h  quick help on <command>
npm -l            display full usage info
npm help <term>   search for help on <term>
npm help npm      involved overview

Specify configs in the ini-formatted file:
    /Users/xgqfrms-mbp/.npmrc
or on the command line via: npm <command> --key value
Config info can be viewed via: npm help config

npm@6.14.4 /Users/xgqfrms-mbp/.nvm/versions/node/v12.18.0/lib/node_modules/npm

Get npm install help

npm help install alias npm -h i

npm help install

# OR, alias
npm -h i

Output:

npm install (with no args, in package dir)
npm install [<@scope>/]<pkg>
npm install [<@scope>/]<pkg>@<tag>
npm install [<@scope>/]<pkg>@<version>
npm install [<@scope>/]<pkg>@<version range>
npm install <alias>@npm:<name>
npm install <folder>
npm install <tarball file>
npm install <tarball url>
npm install <git:// url>
npm install <github username>/<github project>

aliases: i, isntall, add
common options: [--save-prod|--save-dev|--save-optional] [--save-exact] [--no-save]
➜  ~

References

npm-install

Enter image description here

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
xgqfrms
  • 10,077
  • 1
  • 69
  • 68
15

Use:

npm install package_x --save

The given package (package_x) will be saved in file package.json inside dependencies.

If you add

npm install <<package_x>> --save-dev

then it will be saved inside devDependencies.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Nizam Deen
  • 241
  • 2
  • 7
12

As of npm 5, it is more favorable to use --save-prod (or -P) than --save but doing the same thing, as is stated in npm install. So far, --save still works if provided.

themefield
  • 3,847
  • 30
  • 32
  • 2
    This needs to go to the top to save us all an eyesore reading variations, contradictions and thread hijacks. SO needs to encourage succinct answers with valid URLs so we can avoid CRUD and get on with our work. (Quora has a neat 'Is this answer relevant' etc and I had even before that suggested to SO to do this) \n Sucks that the official node doc has no mention of older (defunct) options and most node references seem to be pre-5.0, sending our heads for a spin. – killjoy Apr 28 '18 at 13:10
10

As of npm 5, npm will now save by default.

In case, if you would like npm to work in a similar old fashion (no autosave) to how it was working in previous versions, you can update the config option to enable autosave as below.

npm config set save false

To get the current setting, you can execute the following command:

npm config get save

Source: Here’s what you need to know about npm 5

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
rajesh kumar
  • 1,578
  • 16
  • 14
8

–npm install --save or -S: When the following command is used with npm install, this will save all your installed core packages into the dependency section in the package.json file. Core dependencies are those packages without which your application will not give the desired results.

But as mentioned earlier, it is an unnecessary feature in the npm 5.0.0 version onwards.

npm install --save
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
7

npm install --save or npm install --save-dev is why we choose one option between these two, while installing the package in our project.

Things are clear from the previous answers that npm install --save will add an entry in the dependency field in the package.json file and other one in dev-dependency.

So the question arises: Why do we need an entry of our installing module in package.json file, because whenever we check in code in Git or giving our code to someone, we always give it or check it without the node_modules folder, because it is very large in size and is also available at a common place, so to avoid this, we do that.

So then how another person will get all the modules that is specifically or needed for that project so answers is from the package.json file that have the entry of all the required packages for running or developing that project.

So after getting the code we simply need to run the npm install command. It will read the package.json file and install the necessary required packages.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Sunny Goel
  • 1,982
  • 2
  • 15
  • 21
5

npm i (Package name) --save

Simply, using the above command we’ll not need to write the package name in your package.json file, it’ll auto add its name and dependency with version that you’ll need at time when you go for production or set up another time.

npm help install

The above command will help to find out more options and correct def.shown in the picture:

Enter image description here

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Nitin .
  • 808
  • 9
  • 12
  • Please review *[Why not upload images of code/errors when asking a question?](https://meta.stackoverflow.com/questions/285551/)* (e.g., *"Images should only be used to illustrate problems that* ***can't be made clear in any other way,*** *such as to provide screenshots of a user interface."*) and [do the right thing](https://stackoverflow.com/posts/48182529/edit) (it covers answers as well). Thanks in advance. – Peter Mortensen Jan 27 '23 at 03:08
  • Sure, Will keep it in mind for further posts/answers. Thanks @PeterMortensen – Nitin . Jun 20 '23 at 20:12
5

The easier (and more awesome) way to add dependencies to your package.json is to do so from the command line, flagging the npm install command with either --save or --save-dev, depending on how you'd like to use that dependency.

Rubin bhandari
  • 1,873
  • 15
  • 20
0

When you are using --save in the npm command to install a package, this means that your project will install those dependencies in the production environment, for example, if you install a library to manage dates.

npm install moment --save
npm i moment -S (same result)

(this is for a production environment)

npm install moment --save--dev
npm i moment -D (same result)

(this is for a development environment)

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Samuel Reyes
  • 177
  • 1
  • 4