一、npm 安装中的 i、-g、–save、–save-dev、-D、-S的区别
基本说明:
i
是install
的简写-g
是全局安装,不带-g
会安装在个人文件夹-S
是--save
的简写,安装包信息会写入dependencies
中-D
是--save-dev
的简写,安装包写入devDependencies
中
dependencies 与 devDependencies:
dependencies
生产阶段的依赖,也就是项目运行时的依赖devDependencies
开发阶段的依赖,就是我们在开发过程中需要的依赖,只在开发阶段起作用的例如:你写 ES6 代码,需要 babel 转换成 es5 ,转换完成后,我们只需要转换后的代码,上线的时候,直接把转换后的代码部署到生产环境,不需要 bebal 了,生产环境不需要。这就可以安装到 devDependencies ,再比如说代码提示工具,也可以安装到 devDependencies,如果你用了
Element-UI
,由于发布到生产后还是依赖Element-UI
,这就可以安装到dependencies
二、全局安装和本地安装
全局安装:
1 | npm install <pageName> -g//(这里-g是-global的简写) |
通过上面的命令行(带-g修饰符)安装某个包,就叫全局安装。通常全局包安装在node目录下的node_modules文件夹。可以通过执行下面几条命令查看node、npm的安装目录和全局包的安装目录。
1 | which node // 查看node的安装目录 |
本地安装:
1 | npm install <pageName> (后面可以加几种修饰符,主要有两种--save-dev和--save) |
通过上面的命令行安装某个包,就叫本地安装。包安装在你当前项目文件夹下的node_modules文件夹中。
全局安装的作用:
全局安装的包可提供直接执行的命令(例:gulp -h可以查看gulp定义了什么命令)。 比如gulp全局安装后,可以在命令行上直接执行gulp -v、gulp -h等(原理:全局安装的gulp会将其package.json中的bin命令注入到了全局环境,使得你可以全局执行:gulp xxx命令,这另一个话题了,不深入)。倘若只在本地安装了gulp,未在全局安装gulp,直接执行这些命令会报错。你想要执行相应的命令则可能需要例如:node ./node_modules/gulp/bin/gulp.js -v(查看版本) 这样用一大串命令来执行。因此全局安装就发挥到他的好处了,一个gulp -v就搞定
当然,不是每个包都必须要全局安装的,一般在项目中需要用到该包定义的命令才需要全局安装。比如gulp
可以全局安装,那么直接全局安装到处使用就行了,干嘛还需要本地安装?
- 如果只是全局安装了而没本地安装,就得require(‘
‘) 例:引入一个全局的包可能就是requirt(‘/usr/local/….’)通过全局包的路径引入,这样显然十分的不灵活。如果安装了本地包,那么就可以直接require(‘ ‘)引入使用。 - 一个包通常会在不同的项目上会重复用到,如果只全局安装,那么当某个项目需要该包更新版本时,更新后可能就会影响到其他同样引用该包的项目,因此本地安装可以更灵活地在不同的项目使用不同版本的包,并避免全局包污染的问题。
一个经验法则:要用到该包的命令执行任务的就需要全局安装,要通过require引入使用的就需要本地安装( 但实际开发过程中,我们也不怎么需要考虑某个包是全局安装还是本地安装,因为这一点在该包的官网上一般会明确指出,以上是为了理解全局安装和本地安装)。
参考:node.js - npm(你怕吗) 全局安装与本地安装、开发依赖和生产依赖_个人文章 - SegmentFault 思否