[Node.js]node中的require到底是怎样工作的

关于require

但凡使用过node.js/io.js,必定都会用到require这个函数来引用其它模块(自己写的或他人的)。但很多人(包括本人)都没有把node中关于require(在文档中modules这一部份)介绍认真看过一遍。



这里先介绍一下大家可能都已熟知的情况:

文件加载

node中在使用require加载文件时,会尝试在引用文件名不存在的情况下,依次加上.js、.node.json这三个后缀名来试错。注意,这里指的是引用文件名对应文件不存在的情况下。
例如,当你在代码中使用require(‘./hello‘)来引用当前目录下hello这个文件的时候,它是会默认先去查找名为hello这个文件是否存在,假如存在这个文件(即不带任何后缀),那么,它就会直接读取这个文件的内容,而不是去尝试添加后缀。另外需要注意的是,它这里是将这个无后缀当作js文件来解析的,而不管里面是什么代码。

关于引用文件时路径问题,按照以./按相对路径或绝对路径来解析。

node_modules加载

如果使用require时候,不带任何相对或绝对路径,那么node会尝试从node_modules中去寻找所需要的模块。node查找node_modules的方式是从当前目录找起,一直找到根目录下。即一级一级地先查看是否有node_modules这个文件夹,如果有就从里面寻找对应模块,如果未找到则进入上一级目录查找。

文件夹作为模块

除了在node_modules下文件夹是一个模块之外,你还可以在其它地方放置一个这样的文件夹作为模块,然后以相对或者绝对路径的方式进行引用。

有两种方式(官网上所说三种,其实可并为两种)可以使文件夹作为一个模块引用到。

  • 文件夹下创建一个package.json文件,并使用"main": "abc.js"方式,这样require就会去引用目录下abc.js文件。
  • 当文件夹中无package.json这个文件时,它会在文件夹中尝试寻找index.jsindex.node这两个文件 。如果有,则使用对应文件。

! 这里有一个问题,如果同一级存在同名的文件夹和文件时候,会怎么办呢?首先,真正使用一模一样名字的文件和文件夹在同一级是不能同时存在的。其次,当类似于hi.jshi目录同时存在时呢?它会率先查找使用hi目录,如果目录按照上面形式并未查找到结果时,则使用hi.js这个文件。



由于很多人(包括本人)没认真看过modules模块的介绍,所以对node_modules文件夹有一个潜意识的假设,认为node_modules中存放的都是文件夹模块,不能放单个js文件。
其实,node_modules文件夹中,不仅可以放npm install而来的文件夹模块,还可以放置单个js文件,形成一个模块。

如,将一个test.js文件放入node_modules文件夹中后,就可以直接在代码中使用require(‘test‘)来引用它了,就像引用一个npm模块一样。
这样做的好处是,不用为一个简单的模块而做一个文件夹,同时还可以不带路径进行引用。

其实,关于node中require还有一些必要的知识需要了解,比如引用缓存、互相引用的问题等,这些在modules文档中都有详细说明,这里就不再翻译了。

时间: 2024-12-28 23:54:31

[Node.js]node中的require到底是怎样工作的的相关文章

node.js项目中使用coffeescript的方式汇总

Coffeescript作为Javascript低调的小弟实在是有过人之处,使用它可以增进开发效率,减少代码错误, 关键是能大幅提升开发愉悦感.我越来越觉得只要可能就在自己的项目中把coffee用起来. 然而也许你和我一样,在了解完coffeescript的语法后准备一试身手的时候,却面对如何把它引入项目而犯起愁来. 其实coffeescript这种语言因其可以一对一地翻译为javascript的特性,使用起来其实非常灵活. 将其引入项目的方式也不止一个.这里,我先就node项目引入coffee

windows下node.js+sublime中安装coffeescript

node.js中安装Coffeescript 1.我的node.js安装目录 2.node.js 全局模块所在目录 3.node.js安装coffeescript 1 npm install -g coffee-script 至此理论上node.js中已经安装好coffeescript编译器了,不过我第二次安装时遇到了问题,就是-w参数使用时会报错,Error:watch EINVAL 我在第一安装时,没遇到任何问题,不过那个时候,没有明确的安装步骤.当时找到的一些资料讲的并不明确.不过-c参数

从 Node.js 错误中获得的经验

有多少次你发现自己在终端或监控系统内查看堆栈轨迹,但并不能看出个所以然来?如果你的回答是“很多次”,那么这篇帖子你应该看看.如果你不经常碰上这种情况也没关系,你也可以看看这篇文章解闷. 当处理 Node.js 服务器的复杂数据时,要会从可返回给请求方的错误中总结经验,具备此能力至关重要.在处理一个请求时,一个错误出现会引起链接里另一个错误的出现,于是问题就来了.当此脚本出现时,一旦你生成了新错误,并将它返回到了链接,那你就丢失了与原始错误的所有连接.    达尔文达尔文翻译于 5天前 0人顶 顶

[Node.js] Node.js中的流

原文地址:http://www.moye.me/2015/03/29/streaming_in_node/ 什么是流? 说到流,就涉及到一个*nix的概念:管道——在*nix中,流在Shell中被实现为可以通过 |(管道符) 进行桥接的数据,一个进程的输出(stdout)可被直接作为下一个进程的输入(stdin). 在Node中,流(Stream)的概念与之类似,代表一种数据流可供桥接的能力. pipe 流化的精髓在于 .pipe()方法.可供桥接的能力,在于数据流的两端(上游/下游 或称为 读

Node.js继承中的静态类对象(《node.js开发实战详解》书中一些错误的改正)

今天气真好,最近挂掉一些面试之后心情略失落. 神马都是浮云,要永远做好世界第二. 不多提了,你问我心态为啥变好了.-------都是情怀,,. 嗯啊,最近在研究node. 别人问?你这水平还node... 哈哈哈,好伤心.... 不多提了,言归正传. 神马模块化神马的先就不多讲了,就一个module.export和export区别,后者对象的属性属于前者,逆命题不成立. 还有util.inherits(A,B)这个API注意一下A只会继承B的原型方法,原型以外的不会继承.不是说原型中数据是共享的

[Node.js] Node + Redis 实现分布式Session方案

Session是什么? Session 是面向连接的状态信息,是对 Http 无状态协议的补充. Session 怎么工作? Session 数据保留在服务端,而为了标识具体 Session 信息指向哪个连接,需要客户端传递向服务端发送一个连接标识,比如存在Cookies 中的session_id值(也可以通过URL的QueryString传递),服务端根据这个id 进行存取状态信息. 在服务端存储 Session,可以有很多种方案: 内存存储 数据库存储 分布式缓存存储 分布式Session

[Node.js] Node.js Buffers

>> node >>fs.readFile('finnish.txt', function(err,data){ console.log(data); }); // Output string is not what we want >>fs.readFile('finnish.txt', function(err, data){ console.log(data.toString()); }); // Ouptu is ok /* Encoding */ >&g

node.js模块中exports和module.exports的区别

Node应用由模块组成,采用CommonJS模块规范. 根据这个规范,每个文件就是一个模块,有自己的作用域.在一个文件里面定义的变量.函数.类,都是私有的,对其他文件不可见. CommonJS规范规定,每个模块内部,module变量代表当前模块.这个变量是一个对象,它的exports属性(即module.exports)是对外的接口.加载某个模块,其实是加载该模块的module.exports属性. var x = 5; var addX = function (value) { return

在 Chrome 开发者工具中调试 node.js

命令行工具 devtool ,它可以在 Chrome 的开发者工具中运行 Node.js 程序. 下面的记录显示了在一个 HTTP 服务器中设置断点的情况. 该工具基于 Electron 将 Node.js 和 Chromium 的功能融合在了一起.它的目的在于为调试.分析和开发 Node.js 应用程序提供一个简单的界面. 你可以使用 npm 来安装它: npm install -g devtool 在某种程度上,我们可以用它来作为 node shell 命令的替代品.例如,我们可以这样打开一