乐趣区

思考总结npm认识

npm 认识

作为一个前端开发者,用了这么久的 npm,有一天突然问自己。自己究竟对 npm 有多了解?

npm 是一个包管理工具

想想我们最早写 js 的时候,对于重复引用的代码片段,我们是怎么引用的?

<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js">

是不是感觉熟悉又陌生。这就是最早我们引用 js 的方式。后来由于 nodejs 出现了,作为一种可以运行在系统上的语言,没有了 html,我们该怎么引用 js 呢?

module.exports=function(x){console.log(x);}; 

var xxx = require('xxx');

因此出现了 CommonJS 规范。当然此外,我们还有 AMD,CMD 等。那么这些规范的出现使得我们可以更加愉快地引用 js 代码。这时候我们便需要一种方式可以更方便地提交或者获取某些代码。npm 因此出现了。他有以下功能:

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

npm 做了什么?

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

npm init

npm 可以通过命令创建模块,生成 package.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 中。

├─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 都会指向我们规定的地址了。

待补充 …

退出移动版