首页
学习
活动
专区
圈层
工具
发布

Node.js的require函数原理

时至今日,Node.js 的模块仓库 npmjs.com ,已经存放了15万个模块,其中绝大部分都是 CommonJS 格式。 这种格式的核心就是 require 语句,模块通过它加载。...学习 Node.js ,必学如何使用 require 语句。本文通过源码分析,详细介绍 require 语句的内部运行机制,帮你理解 Node.js 的模块机制。...Module.prototype.require = function(path) { return Module...._load(path, this); }; 由此可知,require 并不是全局性命令,而是每个模块提供的一个内部方法,也就是说,只有在模块内部才能使用 require 命令(唯一的例外是 REPL 环境...有时在项目代码中,需要调用模块的绝对路径,那么除了 module.filename ,Node 还提供一个 require.resolve 方法,供外部调用,用于从模块名取到绝对路径。

1.7K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    彻底搞懂 Node.js 中的 Require 机制(源码分析到手写实践)

    本文你能学到什么 自己手写实现一个 require,面试用也可以。 如何看 Node.js 源码 require 函数是如何产生的?为什么在 module 中可以直接使用。...require 加载原生模块时候如何处理的,为什么 require('net') 可以直接找到 Node.js 中 require 会出现循环引用问题吗? require 是同步还是异步的?为什么?...(id); // path是Node.js内置模块,用它来获取传入参数对应的文件夹路径 this.exports = {}; // 导出的东西放这里,初始化为空对象 this.filename...路径分析并定位到文件 找到源码中的 _resolveFilename 函数,这个方法是通过用户传入的require参数来解析到真正的文件地址。...require 的源码中还是有很多细节点可以学习和分析的,比如这里忽略了 isMain 主文件判断,启动时候 require 的使用(这个会在另一篇文章 Node.js 的启动源码分析中介绍),以及在

    3.2K21

    深入Node.js的模块加载机制,手写require函数

    = id; // 这个id其实就是我们require的路径 this.path = path.dirname(id); // path是Node.js内置模块,用它来获取传入参数对应的文件夹路径..._resolveFilename从名字就可以看出来,这个方法是通过用户传入的require参数来解析到真正的文件地址的,源码中这个方法比较复杂,因为按照前面讲的,他要支持多种参数:内置模块,相对路径,绝对路径..._resolveFilename = function (request) { const filename = path.resolve(request); // 获取传入参数对应的绝对路径..., module, __filename, __dirname这几个参数 // exports可以直接用module.exports,即this.exports // require官方源码中还包装了一层...总结 require不是黑魔法,整个Node.js的模块加载机制都是JS实现的。

    1.3K51

    RequireJS 中的define,require区别

    这个函数应该返回一个值,这个值就是这个模块的输出(即它的“导出”)。 (可选)模块ID:一个字符串,表示模块的ID。但在实践中,通常通过路径来识别模块,所以这个参数很少使用。...在RequireJS中,你可以使用 require 函数来异步地加载一个或多个模块,并在这些模块加载完成后执行一个回调函数。这个回调函数会接收这些模块作为参数。...// ... }); 另外,在模块的顶层(不在其他函数中),你也可以使用 require 语句来同步地加载一个模块。...返回值:define 函数返回一个模块的定义(即它的导出值),而 require 函数没有返回值(但它的回调函数会接收加载的模块作为参数)。      ...在模块的顶层使用 require(同步加载) 在RequireJS中,通常不推荐在模块的顶层(全局作用域)直接使用 require 语句来加载模块,因为这会使得加载过程同步进行,从而阻塞代码的执行。

    18400

    PHP中include,require,include_once,require_once的区别详解

    前言 在做程序设计的时候避免不了要去引用外部文件,在 PHP 中引入文件的方式有很多种,这里详细说一下 include ;require ;include_once;require_once。...4.include_once 和 require_once 的作用 使用方法与不加后缀一样,加上_once 后缀 意味着如果该文件中的代码已经被包括进来了,就不会再次包括。...在框架复杂的 php 应用程序编程中,请始终使用 require向执行流引用关键文件。这有助于提高应用程序的安全性和完整性,在某个关键文件意外丢失的情况下。包含文件省去了大量的工作。...require 通常放在 php 脚本程序最前面,php 再执行程序前,就会先读取 require语句引入的文件,使之成为 php 脚本文件的一部分。...include 通常用在流程控制的处理部分中,php 脚本在读到 include的文件时,才将它读进来。这种方式,可以把程序执行时的流程简单化。

    1.2K10

    python中os.path.isabs(path)的分析

    这个本身是小组朋友问的问题,感觉不错,我给出的回答 问:>>> os.path.isabs("/home")True>>> os.path.isabs("/home/..")True>>> os.path.isabs...答:首先,给段资料 The current os.path.isabs documentation says: > isabs(path) >    Return True if path is an...folderName2:fileName.ext ...and this is a relative one: :folderName1:fileName.ext Moreover, on Windows os.path.isabs...根据, linux中absolute *is* begins with a slash, so return True 说说,第三个吧,你除非在"/"目录下,要不然在其他目录下当然是错的,应为这个路径就不对...而,我在"/"目录下也试了,也返回False,那是因为没有以slash开始 linux中,你只用记下上面那句话就好,其他系统看上面的资料

    90330

    SQL中的for xml path

    今天就给大家介绍一下FOR XML PATH,它就是用来处理低版本数据库中数据合并的,是一个比较古老的功能了,新版本中也依然还能使用。...: 此外我们还可以在FOR XML PATH的后面写参数,如果后面接参数,会将节点换成参数名称,例如: SELECT * FROM dbo.Stu_Hobby FOR XML PATH(hobby) 结果如下图...: 已经变成了我们添加的参数了。...然后我们把XML中的给去掉。 结果如下: 可以看到我们写的所有爱好都给列出来了,没有去掉重复的,可以理解成把列里的值都显示出来了。...STUFF()函数中如果开始位置或长度值是负数,或者如果开始位置大于第一个字符串的长度,将返回空字符串。如果要删除的长度大于第一个字符串的长度,将删除到第一个字符串中的第一个字符。

    40610

    node中的path模块

    path模块,其实还是在webpack中用过一下下,至于node,还没开始用。这个模块算是基础,当作是预习一下。 path模块方法还是有几个的,这边只学习几个认为有必要、能用到的几个方法。...引入path模块都一样: let path = require('path'); path.resolve: webpack配置output的时候使用过,相当于cd命令: console.log(path.resolve.../coding console.log(path.dirname('/html/coding')) /html path.basename: 返回文件名,其实就是最后的名字: console.log(path.basename...coding.html console.log(path.basename('/html/coding')) coding 两个参数,第一个是路径,第二个是可选参数,表示不输出后缀名。...path.relative: 接收两个参数,(from, to),表示从from路径到to路径的相对路径: console.log(path.relative('/html/coding/coding.html

    84020

    node中的require模块的加载规则

    require的加载规则require的加载规则:在Node.js中,使用require函数加载模块。.../index')('hello')总结和思考Node.js 中的模块是通过 require() 函数来加载的,require() 函数接受一个字符串参数,指定需要加载的模块名称。...Node.js 会根据模块名称从文件系统中寻找对应的模块文件并进行加载。Node.js 中的模块分为两类,一类是核心模块,另一类是用户自定义模块。...核心模块是指 Node.js 中内置的模块,如 fs、http、path 等,它们可以直接通过 require() 函数来加载,无需指定模块路径。...总的来说,Node.js 中的 require() 函数通过模块名称来加载模块,具体的加载路径是根据模块名称的类型和当前模块所在的位置来计算的。

    52100

    详解PHP中include和require的区别

    举例说明,创建两个名为 test-include.php 和 test-require.php 的PHP文件, 注意相同的目录中,不要存在一个名字是test-nothing.php的文件。...line 2 Warning: include() [function.include]: Failed opening ‘test-nothing.php’ for inclusion (include_path...]: Failed opening required ‘test-nothing’ (include_path=’....$i.php"; $i++; } 3.文件引用方式 include执行时所引用的文件,每次都要进行读取和评估; require执行时所引用的文件,只处理一次(实际上执行时所引用的文件内容替换了...可以看出若有包含这些指令之一的代码和可能执行多次的代码,则使用require效率比较高, 若每次执行代码时将读取不同的文件或者有通过一组文件叠代的循环,就使用include。

    51520

    PHP中include()与require()的区别说明

    require 的使用方法如 require("MyRequireFile.php"); 。...这个函数通常放在 PHP 程序的最前面,PHP 程序在执行前,就会先读入 require 所指定引入的文件,使它变成 PHP 程序网页的一部份。常用的函数,亦可以这个方法将它引入网页中。...这个函数一般是放在流程控制的处理部分中。PHP 程序网页在读到 include 的文件时,才将它读进来。这种方式,可以把程序执行时的流程简单化。...你可以导入同一个服务器中的静态页面。...7. require通常放在PHP程序的最前面,PHP程序在执行前,就会先读入require所指定引入的文件,使它变成PHP程序网页的一部份。常用的函数,亦可以这个方法将它引入网页中。

    70540

    Linux中的环境变量PATH

    一、介绍 在讲环境变量之前,先介绍一下命令which,它用于查找某个命令的绝对路径,示例如下: 在上面的示例中,用which查到rm命令的绝对路径为/usr/bin/rm。...那么问题来了:为什么我们使用命令时,只是直接打出了命令,而没有使用这些命令的绝对路径呢? 答:环境变量PATH在起作用。 我们可以试着输入以下命令, 这里的echo用来输出  的值。...PATH前面的$是变量的前缀符号。 二、命令cp cp是copy(复制)的简写,该命令的格式为:cp [选项][来源文件][目的文件]。...echo:打印 >:在Linux中叫做重定向,即把前面产生的输入写入到后面的文件中去 cat:读一个文件,并把读出的内容打印到当前屏幕上 三、命令mv mv是move(移动)的简写,该命令格式为:mv...,则会把源文件重命名为给定的目标文件名  上例1中,目标文件是目录dirc,并且dirc不存在,相当于把目录dira重命名为dirc  上例2中,目标文件是目录dirb,且dirb存在,则会把目录dirc

    3.7K20

    彻底搞明白PHP中的include和require

    彻底搞明白PHP中的include和require 在PHP中,有两种包含外部文件的方式,分别是include和require。他们之间有什么不同呢?...这就是它们最主要的区别,其他方面require基本等同于include。 被包含文件先按参数给出的路径寻找,如果没有给出目录(只有文件名)时则按照 include_path 指定的目录寻找。...如果在 include_path 下没找到该文件则 include 最后才在调用脚本文件所在的目录和当前工作目录下寻找 如果定义了路径不管是绝对路径还是当前目录的相对路径 include_path 都会被完全忽略...include_path 在php.ini中定义 当一个文件被包含时,其中所包含的代码继承了 include 所在行的变量范围。...不过所有在包含文件中定义的函数和类都具有全局作用域 除了普通的require和include之外,还有require_once和include_once,他们的作用是: 如果该文件中已经被包含过,则不会再次包含

    1.7K20
    领券