包管理器之包的查找规则

前言

包管理器指的就是npm、yarn、cnpm等,在包管理器之前,前端开发者如果需要使用某个库,比如jQuery,他就要跑到jQuery的官网去下载到本地然后引入,如果还需要再依赖其他库会发现这是一件非常麻烦的事,有些程序员就受不了了,npm创始人**艾萨克·施吕特(Isaac Z. Schlueter)**给出一个解决方案:用一个工具把这些代码集中到一起来管理吧!这个工具就是他写的npm,全称是 Node Package Manager。无论是npm、yarn或其他等等,他们包的查找规则都大同小异,本文来解释下在我们引入包的时候,它们到底是怎样的查找规则。

正文

index.j中引入loadsh库,为啥不需要写./或者../呢?直接写库的名称为什么能找到loadsh文件呢?

var _ = require("loadsh");
console.log(_);
复制代码

image

首先,当使用nodejs导入模块时,如果模块路径不是以 ./ 或 ../ 开头,则node会认为导入的模块来自于node_modules目录,例如:

它会首先从当前目录的以下位置寻找文件

1. node_modules/loadsh.js
2. node_modules/lodash/入口文件
复制代码

若当前目录没有这样的文件,则会回溯到上级目录按照同样的方式查找

比如我在当前文件夹新建一个loadsh.js,那么就不会找到“真正的”loadsh了。

image image

如果到顶级目录都无法找到文件,则抛出错误

上面提到的入口文件按照以下规则确定

  1. 查看导入包的package.json文件,读取main字段作为入口文件

  2. 若不包含main字段,则使用index.js作为入口文件

入口文件的规则同样适用于自己工程中的模块

例如:

在node_modules下新建一个我自己的XXX包,并在index.js中引入。
image

var _ = require("XXX");
console.log(_);
复制代码

image

为什么打印main模块呢?答案非常简单,因为我的package.json的入口文件配置的就是main。

image

如果我把这个字段改成hello.js,那么入口文件就为hello.js。如果不写main字段,那么它默认的就会以index.js为入口文件。

在node中,还可以手动指定路径来导入相应的文件,这种情况比较少见

var _ = require("./node_modules/XXX/hello");
console.log(_);
复制代码

一个小小的知识点,没什么好总结的,大家了解一下足矣~

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享