Node.js中模块的加载机制

【图书介绍】《Node.js+MongoDB+Vue.js全栈开发实战》-CSDN博客

《Node.js+MongoDB+Vue.js全栈开发实战(Web前端技术丛书)》(邹琼俊)【摘要 书评 试读】- 京东图书 (jd.com)

在Node.js中,凡是第三方模块都必须通过npm或yarn来下载,使用的时候可以通过require('包名')的方式来进行加载。注意,任意一个第三方包的名字和核心模块的名字都是不一样的。

2.5.1 模块查找规则:当模块拥有路径但没有后缀时

模块查找规则:当模块拥有路径但没有后缀时,模块查找规则如下:

(1)require方法根据模块路径查找模块,如果是完整路径,则直接引入模块。

(2)如果模块后缀省略,先找同名JS文件,再找同名JS目录。

(3)如果找到了同名目录,则找目录中的index.js。

(4)如果目录中没有index.js,就会去当前目录中的package.json文件中查找main选项中的入口文件。

(5)如果指定的入口文件不存在或者没有指定入口文件,就会报错,最终模块没有被找到。

例如:require('./user.js')和require('./user')。

2.5.2 模块查找规则:当模块没有路径且没有后缀时

模块查找规则:当模块没有路径且没有后缀时,模块查找规则如下:

(1)Node.js会假设它是系统模块。

(2)Node.js会去node_modules目录中:

  1. 首先看是否有该名字的JS文件。
  2. 再看是否有该名字的目录。
  3. 如果是目录,则看里面是否有index.js。
  4. 如果没有index.js,则查看该目录中的package.json中的main选项,确定模块入口文件。
  5. 如果都找不到,最后会报错。

例如:require('fs')。

接下来,通过一个示例来演示模块查找规则。

(1)新建目录module-find-rules,然后在目录下依次添加如图2-9所示的结构。

图2-9

(2)通过命令cd knife进入knife目录,然后运行npm init -y,在该目录下快速生成一个package.json文件,接着修改main属性,将默认的index.js改为main.js:

复制代码
{
  "name": "knife",
  "version": "1.0.0",
  "description": "",
  "main": "main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

knife目录下,index.js代码如下:

console.log('刀');

main.js代码如下:

console.log('刀是什么样的刀,金丝大环刀');

sword目录中index.js代码如下:

console.log('剑是什么样的剑,闭月羞光剑');

user目录中index.js代码如下:

console.log('人是什么样的人,飞檐走壁的人');

user.js代码如下:

console.log('他是横空出世的英雄');

require.js文件用于模块加载测试,测试代码如下:

复制代码
require('./user.js');
require('./sword');
require('./knife');

(3)执行node require.js,结果如下:

复制代码
PS D:\node_mongodb_vue3_book_write\codes\chapter2\module-find-rules> nod
e require.js
他是横空出世的英雄
剑是什么样的剑,闭月羞光剑
刀是什么样的刀,金丝大环刀
相关推荐
你的人类朋友4 小时前
【Node】认识一下Node.js 中的 VM 模块
前端·后端·node.js
索西引擎9 小时前
npm、yarn、pnpm
前端·npm·node.js
San3010 小时前
深入理解 JavaScript 函数:从基础到高阶应用
前端·javascript·node.js
深蓝电商API16 小时前
不止是 Python:聊聊 Node.js/Puppeteer 在爬虫领域的应用
爬虫·python·node.js
_AaronWong19 小时前
Electron IPC 自动化注册方案:模块化与热重载的完美结合
前端·electron·node.js
一碗饭特稀19 小时前
NestJS入门(1)——TODO项目创建及概念初步了解
node.js·nestjs
jump_jump1 天前
超长定时器 long-timeout
前端·javascript·node.js
牧码岛2 天前
服务端之NestJS接口响应message编写规范详解、写给前后端都舒服的接口、API提示信息标准化
服务器·后端·node.js·nestjs
嚴寒2 天前
Node 版本管理还在手动重装全局包?这个方案让你效率翻倍
node.js
你的人类朋友3 天前
【Node】单线程的Node.js为什么可以实现多线程?
前端·后端·node.js