Nodejs生态圈很强大,第一个缘由就是NPM,由于全球有无数的程序员在NPM中贡献了本身的力量。node
为了不造轮子,咱们有时候会用到其余人的劳动成果,好比一些优秀的框架,好比Express,咱们直接使用NPM下载下来就能够用了,下降开发成本和时间。webpack
安装好nodejs后就安装好了npm,这时系统自带npm命令git
觉得Express来举例。
npm 的官网能够找到 npm 包。
https://www.npmjs.com/
例如搜索Express,就会告诉你安装方法和使用方法:程序员
新建一个文件夹,而后运行:npm init
初始化,一直按回车,它会自动生成package.json 文件,这个后面再说这个文件的做用。
而后npm install express
安装es6
会出现node_modules文件夹github
node_modules文件夹就是全部包安装的位置。
express已经安装到了node_modules文件夹,其余的不少文件都是这个express依赖的包web
咱们写一个项目的时候可能会用到不少不少包,这些包多是一些工具,也多是框架。咱们每使用一个包,就会把这些包下载下来,而后他会放到node_modules目录中。
那么项目若是太大,哪些包安装了哪些没安装,咱们如何知道呢?有没有一个机制来记住咱们安装的包呢?
有,nodejs提供了一个机制叫package.json。
他是一个文件,他能够记住全部安装的包的信息,包括名称、版本信息。
若是咱们迁移项目,咱们就可以知道安装了什么包。由于node_modules目录中文件比较大,并且不放在版本控制中(github等),也不是源码的一部分,咱们只要知道node_modules里安装的一些包的名字就能够了,根本不须要这个目录的内容。express
好比说如今一个同事获得了这一份代码,那么这个node_modules目录中的代码他是不须要的。由于他只须要安装过得这些包的名称就能够了,到他本身的电脑上再安装就能够了。npm
package.json就是记录全部安装的包的信息的文件。json
运行npm init
初始化一个项目。
他会让你回答一些关于这个项目的信息,一直按回车,由于这些信息后面能够改,最开始使用默认的就好。
而后就会生成一个package.json的文件。
npm install --save express
安装以后出现不少包,这些都是express依赖的包。
安装后出dependencies字段会出现安装的包的详细信息,包括包的名称和版本号。
"dependencies"中文是依赖的意思。
devDependencies是开发环境依赖的意思。例如咱们用下面的命令行安装gulpnpm install --save-dev gulp
开发环境的包会记录在这里
使用--save-dev
就是开发环境依赖的一些包,会记录到devDependencies
在"scripts"里加入一行"start": "node app.js",
"scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "node app.js" },
那么若是咱们运行npm run start
就会运行"start"里面的命令。
做用:别人下载你的代码以后可能不知道怎么运行你的项目,那么你把这些命令写在start里,那么项目入口文件之类的就一目了然。
package.json记录了安装包的全部安装信息,那么别人获得这些信息如何把这些包安装下来呢(安装到他的本地)
使用命令npm install
就能够了,好比咱们如今删掉node_modules,而后再运行npm install
他就会从新安装
"dependencies": { "express": "^4.16.4" }, "devDependencies": { "gulp": "^3.9.1" }
这两个依赖中的包
好比咱们安装webpacknpm install -g webpack
-g
意思是Global,全局的意思,他会把webpack做为一个命令,一个可执行文件,安装到咱们的系统中,之后咱们就可使用这个命令了
局部安装只安装到这个项目当前的文件夹中,若是想使用webpack命令,就要运行使用当前项目下的文件,才能运行webpacknode_modules/.bin/webpack
用Babel举例说明全局安装与局部安装的区别:
上面代码是在 全局环境下,进行 Babel 转码。这意味着,若是项目要运行, 全局环境必须有Babel,也就是说 项目产生了对环境的依赖。另外一方面,这样作也 没法支持不一样项目使用不一样版本的 Babel。一个解决办法是将babel-cli安装在项目之中。
总结:全局安装的话你的项目不容易更新,由于不一样项目使用的babel的版本可能不一样,并且你和你团队使用的babel的版本也可能不一样。因此要把babel直接安装在项目中。这样其余人拿到项目再安装项目内的babel,就不会出现版本不兼容问题了。
再好比咱们安装http-servernpm install -g http-server
安装在了这个目录下新增的一个文件,叫作http-server
npm install -g
的时候安装在全局目录下,npm install
不带-g
的时候安装在当前目录下,如图
若是是全局安装,那么直接就能够用了,由于Mac中 /usr/local/bin
是包含在path里面的。
若是我直接在命令行里输入http-server
,那么会访问到/usr/local/bin
这个路径里的http-server文件
若是只安装在了局部的项目里,想用的话就去当前目录下去找http-server这个文件,同样能够用:
命令行的实质就是一个文件而已!全局命令就是装在环境里的文件!局部命令就是放在一个目录里,用的时候须要执行局部文件!
注意:在国内安装这些包的时候有时候会很慢,由于这些包的服务器在国外。咱们能够换一个源,即把服务器换到国内,例如淘宝的源
运行下面的命令便可切换淘宝源
npm config set registry https://registry.npm.taobao.org/ npm config set loglevel http npm config set progress false
npm 的配置被存储在 ~/.npmrc,你能够随时改。
这是官方网站
https://npm.taobao.org/
我的以为 yarn 有如下好处:
- 超快的下载速度。
- 离线下载,若是你懂 ruby,这个有点像 bundle,就是以前下载过一次,这个包就会放到电脑上的一个地方,下次别的项目要使用同一个包的时候就不用下载了,而是作一个连接,这样速度超级快,这一点很重要,npm 饱受诟病的一点就是,每次安装依赖,都须要从网络下载一大堆东西,并且是所有从新下载。工程多的时候比较烦人。这下子能够节约大量时间了。
- 拥有 lockfile 文件,在 yarn 中叫 yarn.lock,这个在新版的 npm 也有这个功能,它的文件名叫 package-lock.json,这个文件会记录每次安装的包的版本的精确信息,这样,每次运行 yarn install 就会获得如出一辙的依赖环境,而不是会出现个别包的版本不一样,从而引起环境问题致使项目运行状况不一样的尴尬事件。
安装方法、使用方法、切换源等见连接