本文主要介绍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. FastAPI依赖覆盖与测试环境模拟

    title: FastAPI依赖覆盖与测试环境模拟 date: 2025/04/10 00:58:09 updated: 2025/04/10 00:58:09 author: cmdragon ex ...

  2. FastAPI依赖注入系统及调试技巧

    title: FastAPI依赖注入系统及调试技巧 date: 2025/04/11 15:00:50 updated: 2025/04/11 15:00:50 author: cmdragon ex ...

  3. [开源] .Net 使用 ORM 访问 人大金仓数据库

    前言 京人大金仓信息技术股份有限公司(以下简称"人大金仓")是具有自主知识产权的国产数据管理软件与服务提供商.人大金仓由中国人民大学一批最早在国内开展数据库教学.科研.开发的专家于 ...

  4. sql学习day3——case when的使用

    1,当前表 course_master                                                            open_course           ...

  5. 【经验】CiteSpace|Wiley Online Library或除知网以外的其他网站的文献怎么导入CiteSpace 6.1.6?

      如果没安装,请看这篇博客安装,现在新版(6.1.6)的不需要额外下载java了,就很妙~:   最新版citespace软件的安装与配置   结论:导出成RIS然后用它自带的转换成WoS. 文章目 ...

  6. 详解ES6升级优化以及知识点汇总

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  7. C++11 auto和decltype关键字

    今天来看下C++中的auto和decltype两个关键字 auto关键字定义变量,编译器会自动判断变量的类型 举个栗子: auto i =100; // i 是 int auto p = new A( ...

  8. Summary of Indexing operation in DataFrame of Pandas

    Summary of Indexing operation in DataFrame of Pandas For new users of pandas, the index of DataFrame ...

  9. JVM 使用jstat分析系统的垃圾回收情况

    jstat -gcutil 输出结果分析_助你了解jvm命令,查找JVM堆栈信息,分析性能问题.下面介绍一下jstat命令: jstat:虚拟机统计信息监视工具(JVM Statistics Moni ...

  10. 深入浅出容器学习--Docker网络

    一.Docker的网络概念 容器网络模型主要包含了三个概念: network:网络,这里可以理解为一个Driver,是一个第三方网络栈,包含多种网络模式. 单主机网络模式(none.host.brid ...