本文主要介绍require对象(函数)的结构,使用方法和注意点,对模块和CommanJS规范等内容不进行展开。

一、require函数

在Node中,所有的文件都被认为是一个模块。根据来源的不同,我们可以人为的把模块分为Node内置模块(http)NPM安装的第三方模块(jquery)自定义模块以及项目文件等。

require函数的作用就是加载这些模块,require函数直接挂载在全局对象global上,在所有的模块内部均可以直接使用,下面简单列出该函数的内部结构。

wendingding$ node
> global.require
{ [Function: require]
resolve: { [Function: resolve] paths: [Function: paths] },
main: undefined,
extensions: { '.js': [Function], '.json': [Function], '.node': [Function] },
cache: {}
}

在使用require函数导入模块的时候用法非常简单,该函数接收一个参数,这个参数可以是带有完整路径的模块文件名(自定义|文件模块),也可以是模块名(内部模块)。使用require加载模块的时候,可以省略文件的后缀名。对于文件模块,可以使用相对路径来进行加载,其中./代表的是当前路径。

//备注:app.js文件的内容
//导入Node内置的模块
var http = require("http");
console.log("http",http.get); //导入npm安装的第三方模块
var express = require("express");
console.log("express",express); //导入自定义的模块
//var other = require("./other");
var other = require("./other.js");
console.log(other.Info);
-------------------------------- //备注:other.js文件的内容
var Info = "测试的字符串信息!";
exports.Info = Info;
--------------------------------

因为测试代码中需要使用到express模块,所以需要先在当前目录中通过命令行工具来进行安装,下面简单列出安装的具体命令以及app.js文件的执行结果:

//列出命令行执行细节
wendingding:npm install express
wendingding$ node app.js
http function get(options, cb) {
var req = request(options, cb);
req.end();
return req;
}
express function createApplication() {
var app = function(req, res, next) {
app.handle(req, res, next);
};
···省略···
app.init();
return app;
}
测试的字符串信息!

模块加载的寻径

如果在require函数中只指定文件的名称,那么Node会将该文件视为node_modules目录下的文件(文件的优先关系为 文件名 > 文件名.js > 文件名.json > 文件名.node)。在具体加载模块的时候,Node将会依次尝试加载下面路径中对应的文件。

'/Users/文顶顶/Desktop/node/require/node_modules',
'/Users/文顶顶/Desktop/node/node_modules',
'/Users/文顶顶/Desktop/node_modules',
'/Users/文顶顶/node_modules',
'/Users/node_modules',
'/node_modules'

注意 使用require函数加载模块的时候会执行模块中的每行代码,而引入的每行代码都将被封装到一个独立的函数中,以防止和Node环境产生冲突。该函数的结构基本如下:

(function (exports, require, module, __filename, __dirname) {
// 模块源码
});

二、require函数的成员

通过上文的结构图我们可以看到,require函数本身的结构相对简单,只有main、cache和resolve等几个成员,这里我们调整前文中用到的app.js文件的代码,在该文件(模块)内部打印require函数本身。

//备注 : app.js文件的内容
var other = require("./other");
console.log(other.Info);
console.log(require); //备注:执行app.js文件的命令行操作细节
wendingding$ node app.js
测试的字符串信息!
{ [Function: require]
resolve: { [Function: resolve] paths: [Function: paths] },
main:
Module {
id: '.',
exports: {},
parent: null,
filename: '/Users/文顶顶/Desktop/node/require/app.js',
loaded: false,
children: [ [Object] ],
paths:
[ '/Users/文顶顶/Desktop/node/require/node_modules',
'/Users/文顶顶/Desktop/node/node_modules',
'/Users/文顶顶/Desktop/node_modules',
'/Users/文顶顶/node_modules',
'/Users/node_modules',
'/node_modules' ] },
extensions: { '.js': [Function], '.json': [Function], '.node': [Function] },
cache:
{ '/Users/文顶顶/Desktop/node/require/app.js':
Module {
id: '.',
exports: {},
parent: null,
filename: '/Users/文顶顶/Desktop/node/require/app.js',
loaded: false,
children: [Array],
paths: [Array] },
'/Users/文顶顶/Desktop/node/require/other.js':
Module {
id: '/Users/文顶顶/Desktop/node/require/other.js',
exports: [Object],
parent: [Object],
filename: '/Users/文顶顶/Desktop/node/require/other.js',
loaded: true,
children: [],
paths: [Array] }
}
}

函数的成员·说明

>❏  main  标识主模块
>❏ cache 所有缓存好的模块
>❏ resolve 解析一个模块名到它的绝对路径(不加载)
>❏ extensions 根据不同的扩展名来处理对应的文件(已被废弃)

main变量用来标识主模块,包含了文件名称(filename)以及加载路径(path)等信息。

cache对象保存缓存的模块,被引入的模块都会被缓存在这个对象中。如果从该对象象中删除指定的键值对,那么下一次require函数将重新加载被删除的模块。该对象中缓存模块的全路径作为对应的key,该模块的相关信息作为value值,在具体删除的时候可以使用delete关键字。

resolve方法的作用是返回指定模块名对应的绝对路径,在实现的时候使用内部的加载机制查询模块的位置, 该操作只返回解析后的文件名,并不会加载该模块。此外,在resolve(对象)中的paths方法会返回包含解析加载模块过程中被查询的路径数组。

//备注:app.js文件的内容
var other = require("./other");
console.log(other.Info); //得到模块的路径
var key = require.resolve("./other");
console.log("模块的路径:",key);
console.log(require.resolve.paths("./other")) //删除缓存中的模块
delete require.cache[key]; //备注:命令行执行细节
wendingding$ node app.js
other模块被执行----
测试的字符串信息!
模块的路径: /Users/文顶顶/Desktop/node/require/other.js
[ '/Users/文顶顶/Desktop/node/require' ]

前端开发系列086-Node篇之require的更多相关文章

  1. leaflet-webpack 入门开发系列一初探篇(附源码下载)

    前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...

  2. openlayers5-webpack 入门开发系列一初探篇(附源码下载)

    前言 openlayers5-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载 ...

  3. 【Windows10 IoT开发系列】配置篇

    原文:[Windows10 IoT开发系列]配置篇 Windows10 For IoT是Windows 10家族的一个新星,其针对不同平台拥有不同的版本.而其最重要的一个版本是运行在Raspberry ...

  4. 旨在脱离后端环境的前端开发套件 - IDT Server篇

    IDT,一个基于Nodejs的,旨在脱离后端环境的前端开发套件,目的就是能让前端开发完全脱离后端的环境,无论后端是什么模板引擎(主流),都能应付自如. IDT主要包括两大部分:Server + Bui ...

  5. openlayers4 入门开发系列之风场图篇

    前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...

  6. cesium-webpack 入门开发系列一初探篇(附源码下载)

    前言 cesium-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 we ...

  7. 前端开发【第2篇:CSS】

    鸡血 样式的属性多达几千个,但别担心,按照80-20原则,常用的也就几十个,你完全可以掌握它. Css初识 HTML的诞生 早期只有HTML的时候为了让HTML更美观一点,当时页面的开发者会把颜色写到 ...

  8. [置顶]【实用 .NET Core开发系列】- 导航篇

    前言 此系列从出发点来看,是 上个系列的续篇, 上个系列因为后面工作的原因,后面几篇没有写完,后来.NET Core出来之后,注意力就转移到了.NET Core上,所以再也就没有继续下去,此是原因之一 ...

  9. openlayers4 入门开发系列之热力图篇(附源码下载)

    前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...

  10. Android Metro风格的Launcher开发系列第三篇

    前言: 各位小伙伴,又到了每周更新文章了时候了,本来是周日能发出来呢,这不是赶上清明节吗,女王大人发话了,清明节前两天半陪她玩,只留给我周一下午半天时间写博客,哪里有女王哪里就有压迫呀有木有!好了闲话 ...

随机推荐

  1. lua三色标记的读写屏障理解

    起因是已经被标记为黑色的对象无法进行再次遍历,然而黑色对象发生了引用变化:断开了引用或者引用了别的对象,会导致多标(不再被黑色对象引用的对象未能回收),漏标(黑色对象的新引用未能遍历标记)

  2. Mybatis-Plus中的@TableId

    简介 在 MyBatis Plus 中,@TableId 注解是用于标记实体类中的主键字段.它可以更方便地处理主键相关的操作,如自动填充主键值或识别主键字段. 用法 public class User ...

  3. TGCTF2025 部分题目WP

    TGCTF 2025 Web AAA偷渡阴平 ?tgctf2025=eval(end(current(get_defined_vars())));&b=system('cat /flag'); ...

  4. Java 里的对象在虚拟机里面是怎么存储的?

    Java 中的对象在虚拟机里的存储 在 Java 中,对象在虚拟机中的存储方式取决于 JVM 内存模型,主要存储在 堆(Heap) 中.对象的内存布局和管理方式会影响对象的创建.访问和销毁.下面详细解 ...

  5. app类型划分

    app类型分为native类型,web类型,hybrid类型 一.native类型 1.优点:直接依托于操作系统,交互性最强,性能最好,功能最为强大 2.缺点:开发成本高,无法跨平台,更新缓慢,审核周 ...

  6. 如何在 Go 中解析 yaml 文件

    Go 语言没有内置解析 yaml 文件的功能,实现 yaml 的解析可以使用第三方库 gopkg.in/yaml.v2 和 gopkg.in/yaml.v3. 下面以解析 config.yml 文件为 ...

  7. 在AI大爆发的背景下,企业管理软件有什么冲击

    今天与同行开会提到在AI大爆发的背景下,未来企业管理软件究竟有什么冲击? 我和同事对此问题进行了探讨,一些拙见,与大家分享.先直接说观点:在未来的5到10年,制造业的管理软件市场将几乎消失.下面我来聊 ...

  8. 使用DVC管理大文件变更历史(基于git)

    DVC(Data Version Control) 是一个专门用于管理数据和二进制文件版本控制 的工具,它特别适合那些需要处理大量非文本文件(如图像.视频.模型.数据集等)的项目. 一般地,如果项目中 ...

  9. NOIP集训 P11071 「QMSOI R1」 Distorted Fate 题解

    对本题的评价:有思维含量的线段树好题.曲子好听,曲绘好看,曲师人品好,谱子写得好,鸠好看 题解: P11071 「QMSOI R1」 Distorted Fate 给定一个长度为 \(n\) 的数组 ...

  10. 【工具】VS Code Counter|除了Gitstats之外的Github一键统计代码行数工具

    需求: 1)被要求统计代码行数: 2)不想打开Linux,懒得下载Windows版本GitStats: 3)打开了Linux但也不记得find命令行怎么用: 4)打开了Linux,装好了Gitstat ...