核心模块
- 使用的时候就可以通过
require('包名')
的方式来进行加载才可以使用。 - 核心模块的本质也是文件。
- 核心模块文件已经被编译到了二进制文件中了,我们只需要按照名字来加载就可以了。
第三方模块
- 凡是第三方模块都必须通过
npm
来下载。 - 使用的时候就可以通过
require('包名')
的方式来进行加载才可以使用。 注意:
- 不可能有任何一个第三方包和核心模块的名字是一样的。
- 第三方模块既不是核心模块、也不是路径形式的模块。
它的加载原理如下:
- 先找到当前文件所处目录中的
node_modules
目录(从该文件的位置开始,一层层的向上查询,直到找到该目录,或者找到磁盘根目录)。
- 先找到当前文件所处目录中的
- 找到该模块的文件夹。
- 找到该模块的文件夹内的
package.json
文件。 - 找到该模块的文件夹内的
package.json
文件中的main
属性。 main
属性中就记录了art-template
的入口模块。- 然后加载使用这个第三方包,实际上最终加载的还是文件。
- 如果
package.json
文件不存在或者main
指定的入口模块是也没有,则node
会自动找该目录下的index.js
,也就是说index.js
会作为一个默认备选项。 - 如果以上所有任何一个条件都不成立,则会进入上一级目录中的 node_modules 目录查找如果上一级还没有,则继续往上上一级查找。如果直到当前磁盘根目录还找不到,最后报错:
can not find module xxx var template = require('art-template')
- 我们一个项目有且只有一个 node_modules,放在项目根目录中,这样的话项目中所有的子目录中的代码都可以加载到第三方包,不会出现有多个 node_modules
模块查找机制
- 优先从缓存加载
- 核心模块
- 路径形式的文件模块
- 第三方模块
非路径形式的模块标识(自己写的模块)
路径形式的模块:
./
当前目录,不可省略../
上一级目录,不可省略/xxx
绝对路径,从该文件的磁盘根目录开始(几乎不用)d:/a/foo.js
绝对路径(几乎不用)- 首位的
/
在这里表示的是当前文件模块所属磁盘根路径 .js
后缀名可以省略
- 引入方式
require('./foo.js')