一、简介

  Nodejs 有一个简单的模块加载系统。在 Nodejs 中,文件和模块是一一对应的(每个文件被视为一个独立的模块),这个文件可能是 JavaScript 代码,JSON 或编译过的C/C++ 扩展,例如:

/**
*foo.js
*将这个js文件导出为模块
*/
exports.hello = function() {
console.log("hello Nodejs!");
}
/**
*main.js
*main.js和foo.js在同一目录下
*在控制台中将会输出:hello Nodejs!
*/
var foo = require("./foo.js"); foo.hello();

二、如何将模块导出—— module.exports 与 exports 的区别

  Nodejs 中的每一个模块都会自动创建一个 module 对象,同时 module 对象下有一个叫 exports 的属性,可以将某个类的实例赋值给 module.exports,从而导出这个类的实例。在模块被执行前,Nodejs 会将 module.exports 的值赋于全局变量 exports ,以便 module.exports.f = ...  可以更简洁的写成 exports.f = ...  。注意:就像所有变量一样,如果重新给 exports 赋值,它就不再绑定到 module.exports 了,也不会导出指定模块

例如:

/**
*foo.js
*导入方式:var foo = require("./foo.js");
*/
function Foo() {}
Foo.prototype.hello = function() {
console.log("hello Nodejs!");
} module.exports = new Foo();
/**
*foo.js
*导入方式:var Foo = require("./foo.js"); var foo = new Foo();
*/
function Foo() {}
Foo.prototype.hello = function() {
console.log("hello Nodejs!");
} module.exports = Foo;
/**
*foo.js
*导入方式:var foo = require("./foo.js");
*/
exports.hello = function() {
console.log("hello Nodejs!");
}

三、require的机制

  假设Y是路径,X是文件名或目录名,当 Nodejs 遇到 require(Y+X) 时,按照下面的顺序处理:

  1、如果 X 是核心模块(例如:require("http"))

  a.返回该模块

  b.不再继续执行

  2、如果Y是以“./”、“/”或“../”开头

  a.把X当成文件,从指定路径开始,依次查找下面文件:X、X.js、X.json、X.node,只要其中一个存在,就返回该文件,不再继续执行

  b.把X当成目录,从指定路径开始,依次查找下面文件:X/package.json(main字段)、X/index.js、X/index.json、X/index.node,只要其中一个存在,就返回该文件,不再继续执行

  3.如果 X 不是核心模块,也没有以“./”、“/”或“../”开头,则Nodejs会从当前模块的父目录开始,尝试从它的 /node_module 目录里加载模块,如果还是没有找到,则移动到再上一层父目录,直到文件系统的根目录

  4.抛出“not found”

Nodejs的模块系统以及require的机制的更多相关文章

  1. nodejs的模块系统(实例分析exprots和module.exprots)

    前言:工欲善其事,必先利其器.模块系统是nodejs组织管理代码的利器也是调用第三方代码的途径,本文将详细讲解nodejs的模块系统.在文章最后实例分析一下exprots和module.exprots ...

  2. nodejs基础 -- 模块系统

    为了让nodejs的文件可以相互调用,nodejs提供了一个简单的模块系统. 模块:是nodejs应用程序的基本组成部分,文件和模块一一对应.即,一个nodejs文件就是一个模块,这个文件可能是jav ...

  3. Nodejs的模块系统

    global对象 浏览器端JavaScript中的全局对象为"window",在浏览器中定义的变量都会成为"window"对象的属性. 不像浏览器端JavaSc ...

  4. 前端笔记之NodeJS(二)路由&REPL&模块系统&npm

    一.路由机制(静态资源文件处理) 1.1 Nodejs没有根目录 MIME类型:http://www.w3school.com.cn/media/media_mimeref.asp 在Apache中, ...

  5. Nodejs中的模块系统

    一.模块化的定义 ①具有文件作用域 ②具有通信规则:加载和导出规则 二.CommonJS模块规范 1.nodejs中的模块系统,具有文件作用域,也具有通信规则,使用require方法加载模块,使用ex ...

  6. 浅谈NodeJs的模块机制

    J历史 我们都知道,js在刚被创建的时候,只是为了在网页上写一些小脚本而已,比如网页特效,表单验证等等,创立者也许没觉悟到以后的js会发展到如此规模.这是web1.0时代. 在web 2.0时代,各种 ...

  7. 初学Node(三)模块系统

    模块系统 Node根据CommonJS规范实现了一套自己的模块机制,可以使用require()导入一个模块,使用module.exports导出一个模块. require使用 在Node中我们可以使用 ...

  8. nodejs cluster模块初探

    大家都知道nodejs是一个单进程单线程的服务器引擎,不管有多么的强大硬件,只能利用到单个CPU进行计算.所以,为了使用多核cpu来提高性能 就有了cluster,让node可以利用多核CPU实现并行 ...

  9. 探索Java9 模块系统和反应流

    Java9 新特性 ,Java 模块化,Java 反应流 Reactive,Jigsaw 模块系统 Java平台模块系统(JPMS)是Java9中的特性,它是Jigsaw项目的产物.简而言之,它以更简 ...

随机推荐

  1. 今天打补丁出问题了,害得我组长被扣了1k奖金。

    今天是第三次给mxdw打补丁和打包,外加公司高管说有一个东西必须要今天之内搞定外放. 我当时问策划为什么这么着急?策划说大佬决定的(这种做事方式真的很不习惯).我等屁民加班加点的搞事情,把功能搞出去了 ...

  2. thinkphp 框架中的一部分方法解析

     1 thinkphp 框架 中判断输入的数值和数据库中的数值是否一致    首先 需要在view文件夹下建一个模板 名为zhuce.html <html> <head> &l ...

  3. HDU4712 Hamming Distance (随机化)

    link:http://acm.hdu.edu.cn/showproblem.php?pid=4712 题意:给1e5个数字,输出这些数中,最小的海明码距离. 思路:距离的范围是0到20.而且每个数的 ...

  4. 基于webpack2.x的vue2.x的多页面站点

    vue的多页面 依旧使用vue-cli来初始化我们的项目 然后修改主要目录结构如下: ├── build │   ├── build.js │   ├── check-versions.js │   ...

  5. RabbitMQ学习2---使用场景

    RabbitMQ主页:https://www.rabbitmq.com/ AMQP AMQP协议是一个高级抽象层消息通信协议,RabbitMQ是AMQP协议的实现.它主要包括以下组件: 1.Serve ...

  6. 在Caffe上运行Cifar10示例

    准备数据集 在终端上运行以下指令: cd caffe/data/cifar10 ./get_cifar10.sh cd caffe/examples/cifar10 ./create_cifar10. ...

  7. 如何设置SecureCRT快捷键

    第一步,打开Tools -> Keymap Editor: 2.用鼠标点击要设置的快捷键,这里以F3为例,然后选择Map Select Key 3.弹出的对话框中,Function一栏选择Run ...

  8. js中new一个对象的过程

    使用new关键字调用函数(new ClassA(-))的具体步骤: 1. 创建空对象{}: 2. 设置新对象的constructor属性为构造函数的名称,设置新对象的__proto__属性指向构造函数 ...

  9. 《安卓网络编程》之第三篇 使用Apache接口

    在Android系统中,提供了一下三种通信接口: 标准的Java 接口:java.net Apache接口:org.apache.http Android网络接口:android.net.http 在 ...

  10. javaWeb学习总结(11)- 监听器(Listener)在开发中的应用

    监听器在JavaWeb开发中用得比较多,下面说一下监听器(Listener)在开发中的常见应用 一.统计当前在线人数 在JavaWeb应用开发中,有时候我们需要统计当前在线的用户数,此时就可以使用监听 ...