做为一个前端开发者,用了这么久的npm,有一天忽然问本身。本身究竟对npm
有多了解?html
想一想咱们最先写js的时候,对于重复引用的代码片断,咱们是怎么引用的?前端
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js">
是否是感受熟悉又陌生。这就是最先咱们引用js的方式。后来因为nodejs出现了,做为一种能够运行在系统上的语言,没有了html,咱们该怎么引用js呢?node
module.exports=function(x){console.log(x);}; var xxx = require('xxx');
所以出现了CommonJS规范。固然此外,咱们还有AMD,CMD等。那么这些规范的出现使得咱们能够更加愉快地引用js代码。这时候咱们便须要一种方式能够更方便地提交或者获取某些代码。npm所以出现了。他有如下功能:jquery
首先咱们要知道咱们的项目中须要用到什么依赖,版本是什么?这些信息须要找一个地方记录,这就是package.json
。npm
npm init
npm能够经过命令建立模块,生成 package.json 文件,生成的文件包含了基本的结果。当咱们须要从网上下载依赖的时候只要执行json
npm ininstall xxx
npm就会把依赖下载放到node_modules
文件夹中,并在package.json
中记录咱们下载的依赖的名称和版本号。服务器
当咱们引用js的时候,系统该去哪里找咱们须要的代码?npm做了一个规范,就是node_modules
。系统会先当前目录找有没有适合的代码,若是找不到就往上一层文件夹找,找到node_modules
以后就会在node_modules
里找。找到代码,便引用成功。若是找不到就在全局里面找,还找不到就会抛出错误。工具
上面刚刚说到的,npm引用的时候是一层一层的往外找的,这是为何呢?由于咱们在开发的时候引用的某些依赖自己,并非彻底由该做者全程写完的。有可能某些依赖中还依赖着另外一个包。因此咱们会看到node_modules
包里的文件夹里还有一个package.json
,而他的依赖则放在当前的文件夹里的node_modules
中。ui
├─node_modules └─xxx └─node_modules
这样就会产生一个问题,万一引用的依赖又套另外一层依赖,这样由很是多层依赖组层。最后引用的路径就会很长,有可能会遇到不可估算的错误。另外这样也会致使同一个包会被下载屡次的问题。为了解决这个问题,从npm 5(这就是为何会有yarn 的缘由) 以后package-lock.json
出现了。他的做用是记录这项目中用到的依赖包的具体版本号,和位置信息。在每次install
的时候他会先检查node_modules
的首层有没有该依赖须要的包,若是有了就不下载。若是有同名的包,但是版本号需求不一样,就会在该package.json
的路径下再建立node_modules
把那个须要的包放进去。这样因为引用的时候是一层一层外网找的,就能够确保当前依赖引用的是正确的包。也大大减小了套层的状况。命令行
咱们都知道当咱们执行npm install
的时候,会下载咱们想要的代码。但是他是从哪里下载回来的呢?npm有本身的一个代码库,也就是咱们经常使用的https://www.npmjs.com。但是这里有个问题,这个地址的国外的服务器,会致使咱们常常出现下载很慢的结果。这就出现了不少咱们说的“源”。所谓的“源”就是不一样的代码仓库,国内目前用的最多的应该就是阿里的源,想要改变下载代码的仓库只要执行。
npm install xxx --registry=https://registry.npm.taobao.org
这样咱们就能够改为从阿里的服务器上下载资源。若是想要全局替换这个源,能够执行
npm config set registry https://registry.npm.taobao.org
这时候可能又聪明的同窗要问了,能不能在不改全局配置的状况下给项目规定一个特定的源?其实在npm的安装目录下有一个.npmrc
文件,他记录着npm的源地址,咱们经过上面的命令事实上就是在修改他。若是咱们想要在项目中配置特定的源,只要在项目目录下新建一个.npmrc
文件,编辑内容:
registry=https://registry.npm.taobao.org
这样只要咱们在这个项目下执行npm install
都会指向咱们规定的地址了。
待补充...