前言
包管理器指的就是npm、yarn、cnpm等,在包管理器之前,前端开发者如果需要使用某个库,比如jQuery,他就要跑到jQuery的官网去下载到本地然后引入,如果还需要再依赖其他库会发现这是一件非常麻烦的事,有些程序员就受不了了,npm创始人**艾萨克·施吕特(Isaac Z. Schlueter)**给出一个解决方案:用一个工具把这些代码集中到一起来管理吧!这个工具就是他写的npm,全称是 Node Package Manager。无论是npm、yarn或其他等等,他们包的查找规则都大同小异,本文来解释下在我们引入包的时候,它们到底是怎样的查找规则。
正文
index.j中引入loadsh库,为啥不需要写./或者../呢?直接写库的名称为什么能找到loadsh文件呢?
var _ = require("loadsh");
console.log(_);
复制代码
首先,当使用nodejs导入模块时,如果模块路径不是以 ./ 或 ../ 开头,则node会认为导入的模块来自于node_modules目录,例如:
它会首先从当前目录的以下位置寻找文件
1. node_modules/loadsh.js
2. node_modules/lodash/入口文件
复制代码
若当前目录没有这样的文件,则会回溯到上级目录按照同样的方式查找
比如我在当前文件夹新建一个loadsh.js,那么就不会找到“真正的”loadsh了。
如果到顶级目录都无法找到文件,则抛出错误
上面提到的入口文件按照以下规则确定
-
查看导入包的package.json文件,读取main字段作为入口文件
-
若不包含main字段,则使用index.js作为入口文件
入口文件的规则同样适用于自己工程中的模块
例如:
在node_modules下新建一个我自己的XXX包,并在index.js中引入。
var _ = require("XXX");
console.log(_);
复制代码
为什么打印main模块呢?答案非常简单,因为我的package.json的入口文件配置的就是main。
如果我把这个字段改成hello.js,那么入口文件就为hello.js。如果不写main字段,那么它默认的就会以index.js为入口文件。
在node中,还可以手动指定路径来导入相应的文件,这种情况比较少见
var _ = require("./node_modules/XXX/hello");
console.log(_);
复制代码
一个小小的知识点,没什么好总结的,大家了解一下足矣~