node.js模块

在node.js开发中一个文件就可以认为是一个模块。

一、node.js模块分类

核心模块Code Module、内置模块、原生模块

fs

http

path

url

...

所有内置模块在安装node.js的时候就已经编译成二进制文件,可以直接加载运行(速读较快)

部分内置模块,在node.exe这个进程启动的时候就已经默认加载了,所以可以直接使用。

文件模块

按文件后缀来分

如果加载时,没有指定后缀名,那么就按照如下顺序依次加载相应模块

1.js

2.json

4.node(C/c++编写模块)

自定义模块

mime

cheerio

moment

mongo

...

二、加载顺序

1.require(一个路径)

require('./index2')
//index2.js
//index2.json
//index2.node
//index2文件夹->package.json文件->main(入口文件 app.js->index.js/index.json/index.node)->加载失败

在加载index2的时候,require会先去找index2.js文件,没有就去找.json文件,再没有就找node文件,如果这些都没有,它会认为index2是一个文件夹,如果找到了这个文件夹,require还会去找这个文件夹里面是否有package.json,如果没有就加载失败,如果有,就找package.json里的main(),就加载里面的index.js/index.json/index.node,如果没有,也是失败。

在加载文件模块的时候最好写上后缀,这样会省一些步骤

2.require()的参数不是一个路径,直接是一个模块名称

1).现在核心模块中查找,是否有名字一样的模块,如果有,则直接加载该核心模块

如:require('http')

2)如果核心模块中没有该模块,就很认为是一个第三方模块(自定义模块)

先会去当前js文件所在的目录下找node_modules文件夹,当前目录没有,会去当前执行的文件的父目录里面寻找

三、require加载注意事项

1.所以模块第一次加载完毕以后都会有缓存,第二次加载直接读取缓存,避免了二次开销

因为有缓存,所以模块中的代码只在第一次加载的时候执行一次

2.每次加载模块的时候都有限从缓存中加载,缓存中没有才会按照node.js加载模块规则去查找

3.核心模块Node.js源码编译的时候,都已经编译为二进制执行文件,所以加载速度较快(核心模块加载优先级仅次于缓存加载)

4.试图加载一个和核心模块同名的自定义(第三方模块)是不会成功的

自定义模块要么名字不要和核心模块同名,要么使用路径的方式加载

6.核心模块只能通过模块名称来加载

7.require()加载模块使用./相对路径时,是先对当前模块,不受node命令执行路径影响

8.建议在加载文件模块时,尽量添加文件后缀名

四、require加载原理

在a.js文件中

//加载b.js模块
require('./b.js');

在b.js文件中

function add(x,y){
return x+y;
} var result=add(100,1000); console.log(result);

执行a.js

加载自定义模块b.js的时候,会执行一次b.js

修改a.js

//加载b.js模块
require('./b.js'); require('./b.js');
require('./b.js');
require('./b.js');
require('./b.js');
require('./b.js');

执行a.js

由此可见,require模块第一次加载会执行模块代码,后面加载的模块都是从缓存里面获取的,所以不会再去执行模块代码了。

在文件中查找第三方模块时依次查找的路径

 console.log(module.paths);

源代码

1.检查Module.cache里有没有缓存的模块实例,如果缓存里面没有,就创建一个Module实例,将创建的Module保存到缓存里面,供下次使用
2.调用module.load()读取模块内容,然后调用modele.compile()编译执行(封装为一个沙盒)改模块
3.如果加载出错,就从缓存中删除该模块
4.返回module.export

主要做的是通过module._load来加载模块,判断缓存,如果没在缓存里就创建

node——模块分类,require执行顺序,require注意事项,原理的更多相关文章

  1. python导入模块时的执行顺序

    当python导入模块,执行import语句时,到底进行了什么操作?按照python的文档,她执行了如下的操作: 第一步,创建一个新的module对象(它可能包含多个module) 第二步,把这个mo ...

  2. Node async 控制代码执行顺序

    当你有一个集合,你想循环集合,然后对每个集合按照顺序执行相应的方法你可以使用forEachSeries

  3. Nginx 配置指令的执行顺序(十)

    运行在 post-rewrite 阶段之后的是所谓的 preaccess 阶段.该阶段在 access 阶段之前执行,故名preaccess. 标准模块 ngx_limit_req 和 ngx_lim ...

  4. python接口自动化(二十二)--unittest执行顺序隐藏的坑(详解)

    简介 大多数的初学者在使用 unittest 框架时候,不清楚用例的执行顺序到底是怎样的.对测试类里面的类和方法分不清楚,不知道什么时候执行,什么时候不执行.虽然或许通过代码实现了,也是稀里糊涂的一知 ...

  5. pytest(4)-测试用例执行顺序

    前言 上一篇文章我们讲了在pytest中测试用例的命名规则,那么在pytest中又是以怎样的顺序执行测试用例的呢? 在unittest框架中,默认按照ACSII码的顺序加载测试用例并执行,顺序为:09 ...

  6. 用法:node模块都具备的方法(exports、module、require、__filename、__dirname)

    凡是玩弄nodejs的人,都明白,每一个模块都有exports.module.require.__filename.__dirname的方法 清楚了解方法的用法后,玩转node就等于清楚了日常讲话的内 ...

  7. 深入理解PHP之require/include顺序

    深入理解PHP之require/include顺序 作者: Laruence(   ) 本文地址: http://www.laruence.com/2010/05/04/1450.html 转载请注明 ...

  8. day16模块,导入模板完成的三件事,起别名,模块的分类,模块的加载顺序,环境变量,from...import语法导入,from...import *,链式导入,循环导入

    复习 ''' 1.生成器中的send方法 -- 给当前停止的yield发生信息 -- 内部调用__next__()取到下一个yield的返回值 2.递归:函数的(直接,间接)自调用 -- 回溯 与 递 ...

  9. 【Node.js】Event Loop执行顺序详解

    本文基于node 0.10.22版本 关于EventLoop是什么,请看阮老师写的什么是EventLoop 本文讲述的是EventLoop中的执行顺序(着重讲setImmediate, setTime ...

随机推荐

  1. Linux安装pycharm

    1.pycharm包地址:链接:https://pan.baidu.com/s/1uZJDvP0DW-l7FE2J4tB-Pw 密码:5ebi rz上传到服务器 tar -zxvf pycharm-c ...

  2. BJOI2012 最多的方案

    BJOI2012 最多的方案 Description ​ 第二关和很出名的斐波那契数列有关,地球上的OIer都知道:F1=1, F2=2, Fi = Fi-1 + Fi-2,每一项都可以称为斐波那契数 ...

  3. XPath语法简明介绍

    简介: XPath 是一门在 XML 文档中查找信息的语言.XPath 用于在 XML 文档中通过元素和属性进行导航. XPath 路径表达式: XPath 使用路径表达式来选取 XML 文档中的节点 ...

  4. SpProcPool阅读笔记--1

    公司产品用了一个开源的框架,最近出了点问题,细看了这个框架. SpProcPool:  https://github.com/spsoft/spprocpool.git 我们的线程池用的是传递文件描述 ...

  5. SpringBoot 对静态资源的映射规则

    一.所有 /webjars/** ,都去 classpath:/META-INF/resources/webjars/ 找资源 webjars:以jar包的方式引入静态资源,如下:引入 jquery ...

  6. nginx与tomcat搭建集群,负载均衡

    --------------------------------------------------- 搭建环境(在桌面上即可完成测试) 先准备2个tomcat服务器 解压tomcat压缩包 得到 把 ...

  7. 参数化取值策略Unique

    Unique:主要是强调取值的唯一性,如果到最后没有该值了,LR提供了其他解决方案,如图所示: 此处的下拉列表中提供了三种方式,具体如下: About Vuser,当取值次数超过参数的行数时,忽略脚本 ...

  8. 全球级的分布式数据库 Google Spanner原理

    开发四年只会写业务代码,分布式高并发都不会还做程序员?->>>    Google Spanner简介 Spanner 是Google的全球级的分布式数据库 (Globally-Di ...

  9. 【百度语音识别】JavaAPI方式语音识别示例

    https://ai.baidu.com/forum/topic/show/496730

  10. HDU 1757

    简单的矩阵构造题,参看我前几篇的谈到的矩阵的构造法. #include <iostream> #include <cstdio> #include <cstring> ...