[思考总结]npm认识

npm认识

做为一个前端开发者,用了这么久的npm,有一天忽然问本身。本身究竟对npm有多了解?html

npm是一个包管理工具

想一想咱们最先写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

  • 容许用户从NPM服务器下载别人编写的第三方包到本地使用。
  • 容许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
  • 容许用户将本身编写的包或命令行程序上传到NPM服务器供别人使用。

npm作了什么?

首先咱们要知道咱们的项目中须要用到什么依赖,版本是什么?这些信息须要找一个地方记录,这就是package.jsonnpm

npm init

npm能够经过命令建立模块,生成 package.json 文件,生成的文件包含了基本的结果。当咱们须要从网上下载依赖的时候只要执行json

npm ininstall xxx

npm就会把依赖下载放到node_modules文件夹中,并在package.json中记录咱们下载的依赖的名称和版本号。服务器

引用流程

当咱们引用js的时候,系统该去哪里找咱们须要的代码?npm做了一个规范,就是node_modules。系统会先当前目录找有没有适合的代码,若是找不到就往上一层文件夹找,找到node_modules以后就会在node_modules里找。找到代码,便引用成功。若是找不到就在全局里面找,还找不到就会抛出错误。工具

package-lock.json

上面刚刚说到的,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都会指向咱们规定的地址了。

待补充...

相关文章
相关标签/搜索