前言

对nodejs入门之后,我们经常会发现,代码中经常会出现require(’’)这样的代码,nodejs菜鸟教程的创建的第一个应用就使用到了require指令来载入http模块,并将实例化的http赋值给变量http。那么所谓的模块又是什么?今天将从require开始,进入模块的世界

require(’’)方法

require()是接收模块标识符参数,然后node根据一定的规则引入该模块之后,就可以使用模块中定义的方法和属性了。node引入模块是有规则的。
nodejs模块包含三种:
内置模块:也就是nodejs提供的模块,例如http,fs等。这些模块在node源码编译的过程中就编译进了二进制执行文件,在node进程启动的时候,部门核心模块就直接加载进内存中,只需要经历路径分析步骤,而且路径分析中是有限判断的,所以加载速度较快。
第三方模块:
自定义模块(一个js一个模块):文件模块使用的时候需要按需加载,需要经历路径分析、文件定位、编译执行三个步骤。

优先从缓存中加载

node对引入过的模块会进行缓存,node是缓存编译执行之后的对象而不是静态文件,是因为 我们对一个对象引入两次,得到的对象是相等的。跟Java不同,如果你对Java的一个对象new两次,那么你得到的是两个不同的对象。
验证代码如下:
module.js

let sayHello=function(){console.log('hello');
}let sayBye=function(){console.log('Bye~');
}module.exports={sayHello:sayHello,sayBye:sayBye
}

testmodule.js

var moduleTest1=require('./module1');
var moduleTest2=require('./module1');console.log(moduleTest2);
console.log(moduleTest1===moduleTest2);

运行结果如下:

解析:虽然我们两个引入了module1的模块,但是模块中的代码其实只执行了一遍。那么moduleTest1和moduleTest2指向的是同一个对象,结果才会是TRUE。–可以查看Module._load的源码进行分析

路径分析

nodejs会根据require是相对路径还是非相对路径做出不同的行为。
require(Y+X)
1、如果X是核心模块,例如(require(“http”))
* 返回该模块 * 不在继续执行
2、如果Y是以’./’,’/‘或者’…/‘开头
(1)优先从缓存中加载
(2)X当做文件,从制定路径开始,依次查找下面文件:X、X.js、X.json、X.node,只要其中一个存在,就返回该文件,不在继续执行
(3)把X当成目录,从执行路径开始,一次查找下面文件:X/package.json(main字段)、X/index.js、X/index.json、X/index.node,只要其中一个存在,就返回该文件,不在继续执行
3、如果X不是核心模块,也没有’./’,’/‘或者’…/'开头,则nodejs会从当前模块的父目录开始,尝试从它的/node_module目录里加载模块,如果还没有找到,则移动到再上一层父目录,直到文件系统的根目录。
4、抛出Error: Cannot find module

清除缓存

require第一步是将模块加载到内存的,用于提升第二次加载的性能。但是,如果修改了被引入模块的代码之后,再次引入,就发现还是之前的代码。

module模块

每个文件就是一个模块,每个模块中都有一个module对象。module对象的属性以下图片是打印出来的module对象值:

由图可知,module对象有以下属性
(1)id:当前模块的bi
(2)path:文件所在位置
(3)exports:暴露给外部的值,由代码值,此暴露了2个函数
(4)parent:一个对象,表示调用当前模块的模块
(5)filename:模块的绝对路径
(6)loaded:布尔值,表示当前模块是否已经被完全加载
(7)paths:从当前文件目录开始查找node_modules目录;然后依次进入父模块,查找父目录下的node_modules目录,直到根目录下的node_modules目录。

module.exports

经过上面的解析,发现nodule对象有一个exports属性,该属性就是用来对外暴露变量、方法或这个模块的。当使用require调用的时候,其实就是调用的exports属性

exports对象

module.exports和exports对象的联系和区别:
1、module.exports和exports对象的都是引用类型的变量,两个对象指向同一块内存地址。并且两者一开始都是指向一个空对象
2、exports只能使用,语法类向外暴露内部变量 export.xxx=xxx,而module.exports可以使用语法或者对象的形式输出

module.exports.xxx=xxx;
module.exports={xxx:yyy}

如果以对象输出的的话只能module.exports

3、module对象中包含了exports对象,所以exports不能直接赋予对象类型的值,因为这样会改变exports的指向,从而找不到module.exports和exports不是一个对象,也就是说给exports赋值会切断与module.exports之间的联系

tips:exports=module.exports=xxx //code
这种方式的实现其实就是赋值module.exports后不忘把exports也同时指向这块新内存了,即module.exports指向新对象以后,exports断开了对module.exports的引用,后面的做法主要是让exports重新指向module.exports

Nodejs模块化开发相关推荐

  1. 前端学习(1288):nodejs模块化开发

  2. nodejs快速入门(一)-模块化开发

    随着网站开发的复杂度越来越高,js代码和js文件的增多,出现了开发者头疼的两个问题:① 命名冲突:②文件依赖. js模块化开发可以解决这些问题. ①变量命令冲突 在js文件中,如下创建一个变量并赋予一 ...

  3. JavaScript模块化开发技术概述

    2019独角兽企业重金招聘Python工程师标准>>> 什么是模块化开发? 前端开发中,起初只要在script标签中嵌入几十上百行代码就能实现一些基本的交互效果,后来js得到重视,应 ...

  4. 前端模块化开发学习之gulpbrowserify篇

     随着web应用的发展,前端的比重占得越来越多,编写代码从而也越来越复杂.而通常我们需要将不同功能或者不同模块的代码分开写,最后在html中一起加载,这样做是可以的,但是当你需要进行维护或者是二次开发 ...

  5. JS三教九流系列-require.js-网站模块化开发

    为什么80%的码农都做不了架构师?>>>    js开发的模块化就是module处理 简单理解js模块化的开发就是让我们的web项目对js进行分类的处理 我们在开发网站的时候,里面会 ...

  6. 【模块化开发】之 模块化概述

    项目说明 模块化开发,是当下最重要的前端开发范式之一.模块化只是一个思想.一个理论. 笔记来源:拉勾教育 大前端高薪训练营 阅读建议:内容较多,建议通过左侧导航栏进行阅读 模块化过程 早期模块化完全依 ...

  7. Js模块化开发的理解

    Js模块化开发的理解 模块化是一个语言发展的必经之路,其能够帮助开发者拆分和组织代码,随着前端技术的发展,前端编写的代码量也越来越大,就需要对代码有很好的管理,而模块化能够帮助开发者解决命名冲突.管理 ...

  8. js 多个定时器_Node.js系列深入浅出Node模块化开发——CommonJS规范

    前言 本文将为大家透彻的介绍关于Node的模块化--CommonJS的一切. 看完本文可以掌握,以下几个方面: 什么是模块化,以及没有模块化会带来哪些问题,是如何解决的: JavaScript的设计缺 ...

  9. 前端JAVASCRIPT模块化开发

    什么是模块化开发? 前端开发中,起初只要在script标签中嵌入几十上百行代码就能实现一些基本的交互效果,后来js得到重视,应用也广泛起来了,jQuery,Ajax,Node.Js,MVC,MVVM等 ...

最新文章

  1. 蓝桥杯练习系统习题-算法提高2
  2. VTK修炼之道38:图像平滑_中值滤波器
  3. 修改centos7容器的时间和宿主机时间一致
  4. 腾讯视频视频下载_如何下载腾讯视频
  5. 职业人应该“这山望着那山高”
  6. 线程通信:生产者消费者问题
  7. 电脑系统还原怎么操作?这个方法在电脑设置里就可以还原
  8. 使用Robomongo 连接MongoDB 3.x 报 Authorization failed 解决办法(转)
  9. 磊科全功能路由器上网行为管理配置指南 -- 路由器
  10. 免费得了一套做自媒体教程,免费分享给大家
  11. 魔兽争霸dota内外网p2p联机玩游戏-不需要对战平台的联机
  12. 透明显示屏(隐形显示屏)简述
  13. Uboot代码结构详细分析
  14. HTML用五角星打分,jQuery鼠标滑过五角星打分星级评分代码
  15. sed在行首插入tab制表符
  16. STM32中0x1u 0u的含义
  17. PRML翻译 Chap1 Introduction
  18. python多路分支_用于多个参数的python multiprocessing pool.map
  19. Nginx封禁恶意IP
  20. w3school SQL教程整理

热门文章

  1. C语言实现(封装、继承和多态)
  2. Tensorrt实现solov2加速
  3. Vertx简单表单上传
  4. MySQL索引之全文索引(FULLTEXT)之创建和删除
  5. 上手python之json数据格式
  6. 如何选择时间序列预测模型
  7. 从人生迷茫到确定方向,为什么他能做到?
  8. 1. windows上安装antlr4(code generation target为Java)
  9. [JSP暑假实训] 五.MyEclipse+Servlet+JSP实现火车票网站注册操作及登陆验证
  10. 项目经理和项目成员招募