node_modules干什么的(node_modules详解)

 分类:前端开发时间:2023-01-07 07:30:01点击:

一、概述

在 Node.js 模块系统中,每个文件都被视为一个独立的模块;

npm install 执行完毕后,我们可以在 nodemodules 中看到所有依赖的包。虽然使用者无需关注这个目录里的文件夹结构细节,只管在业务代码中引用依赖包即可;node_modules是安装node后用来存放用包管理工具下载安装的包的文件夹。比如webpack、gulp、grunt这些工具。在node.js中模块与文件是一一对应的,也就是说一个node.js文件就是一个模块。


二、模块类型

node.js中模块有两种类型:核心模块和文件模块;

三、核心模块

Node.js 核心模块会被编译成二进制,核心模块定义在 Node.js 源代码的lib/目录下,require()总是会优先加载核心模块;

核心模块直接使用名称获取:

var http = require('http');

四、文件模块

如果按确切的文件名没有找到模块,则 Node.js 会尝试带上.js、.json或.node拓展名再加载。

const circle = require('./circle.js');
console.log(`半径为 4 的圆的面积是 ${circle.area(4)}`);

1、.js 文件会被解析为 JavaScript 文本文件, .json 文件会被解析为 JSON 文本文件。 .node 文件会被解析为通过 process.dlopen() 加载的编译后的插件模块。

2、以 '/' 为前缀的模块是文件的绝对路径。 例如, require('/home/marco/foo.js') 会加载 /home/marco/foo.js 文件。

3、以 './' 为前缀的模块是相对于调用 require() 的文件的。 也就是说, circle.js 必须和 foo.js 在同一目录下以便于 require('./circle') 找到它。

4、当没有以 '/'、 './' 或 '../' 开头来表示文件时,这个模块必须是一个核心模块或加载自 node_modules 目录。

5、如果给定的路径不存在,则 require() 会抛出一个 code 属性为 'MODULE_NOT_FOUND' 的 Error。

五、目录模块

可以把程序和库放到一个单独的目录,然后提供一个单一的入口来指向它。把目录递给require()作为一个参数,有三种方式:

1、第一种方式是在根目录下创建一个package.json文件,并指定一个main模块。 例子,package.json文件类似:

{ 
  "name" : "some-library",  
  "main" : "./lib/some-library.js" 
}

如果这是在./some-library目录中,则require('./some-library')会试图加载

./some-library/lib/some-library.js。

这就是 Node.js 处理package.json文件的方式。

如果目录里没有package.json文件,或者'main'入口不存在或无法解析,则 Node.js 将会试图加载目录下的index.js或index.node文件。 例如,如果上面的例子中没有package.json文件,则require('./some-library')会试图加载:

  • ./some-library/index.js

  • ./some-library/index.node

2、如果传递给require()的模块标识符不是一个核心模块,也没有以'/'、'../'或'./'开头,则 Node.js 会从当前模块的父目录开始,尝试从它的/node_modules目录里加载模块。 Node.js 不会附加node_modules到一个已经以node_modules结尾的路径上。如果还是没有找到,则移动到再上一层父目录,直到文件系统的根目录。

例如:如果在'/home/ry/projects/foo.js'文件里调用了require('bar.js'),则 Node.js 会按以下顺序查找:

  • /home/ry/projects/node_modules/bar.js

  • /home/ry/node_modules/bar.js

  • /home/node_modules/bar.js

  • /node_modules/bar.js

3、从全局目录加载

如果NODE_PATH环境变量被设为一个以冒号分割的绝对路径列表,则当在其他地方找不到模块时 Node.js 会搜索这些路径;

  • $HOME/.node_modules

  • $HOME/.node_libraries

  • $PREFIX/lib/node

除注明外的文章,均为来源:老汤博客,转载请保留本文地址!
原文地址: