前言

准备整理node 系列,先把一些基础含义放出来。

在学习node 的时候我们一般加载模块都是require,那么require 是如何运行的呢?

正文

通常,在Node.js里导入是通过 require函数调用进行的。 Node.js会根据 require的是相对路径还是非相对路径做出不同的行为。

绝对路径没什么可说,那么看下相对路径吧。

例如,假设有一个文件路径为 /root/src/moduleA.js,

包含了一个导入var x = require("./moduleB"); Node.js以下面的顺序解析这个导入:

检查/root/src/moduleB.js文件是否存在。

检查/root/src/moduleB目录是否包含一个package.json文件,且package.json文件指定了一个"main"模块。

在我们的例子里,如果Node.js发现文件 /root/src/moduleB/package.json包含了{ "main": "lib/mainModule.js" },

那么Node.js会引用/root/src/moduleB/lib/mainModule.js,这个也就是我们告诉require的加载路径。

如果没有的话,那么会检查/root/src/moduleB目录是否包含一个index.js文件。 这个文件会被隐式地当作那个文件夹下的"main"模块。

然后顺便扩展一下require:

require 引用是同步的,没有异步这么一说。

setouttime(function(){

export=a;

})

如果我们require的时候,那么这个时候是请求到{}的,也就是没有暴露任何的元素.

require 循环引用这里是一个重点了。

require 循环引用,很有可能是个坑。

直接看官方例子:

a.js:

console.log('a starting');
exports.done = false;
const b = require('./b.js');
console.log('in a, b.done = %j', b.done);
exports.done = true;
console.log('a done');

b.js:

console.log('b starting');
exports.done = false;
const a = require('./a.js');
console.log('in b, a.done = %j', a.done);
exports.done = true;
console.log('b done');

main.js:

console.log('main starting');
const a = require('./a.js');
const b = require('./b.js');
console.log('in main, a.done = %j, b.done = %j', a.done, b.done);

执行得到的结果如下:

$ node main.js
main starting
a starting
b starting
in b, a.done = false
b done
in a, b.done = true
a done
in main, a.done = true, b.done = true

其实很简单,当请求a的时候,a按照顺序执行。

然后a中请求b的时候,会阻塞a,执行b,当b执行完后才开始执行a。

node require 运行步骤的更多相关文章

  1. 【Node.js安装步骤】

    "Node.js是一个Javascript运行环境(runtime environment),发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装.本文详 ...

  2. 使用nvm安装node,运行node报错 node: command not found

    1. 使用nvm安装node之后,直接运行node命令会报错 node: command not found 需要使用nvm ls  查询一下当前使用的安装的node版本,然后使用node use 版 ...

  3. Qt creator自定义编译运行步骤

    一直用Qt creator开发.无它,只是因为linux下C++ IDE选择不多.同时因为我抛弃了MFC,平时写个小工具还得靠Qt,正好一举两用. 用Qt creator开发一般的工程,是不用修改编译 ...

  4. Optaplanner - 从探究示例中的hello world,初步认识规划引擎的运行步骤。

    上一篇我们成功以把Opotaplanner规划引擎下载回来,并把它的示例运行起来,简单解析了一下它的Cloud balance示例.这一篇我们这些示例的源代码导入到Eclipse中,看看它在后台是怎么 ...

  5. 【ARM-Linux开发】【Qt开发】Qt Creator自定义编译运行步骤

    原文:http://www.linuxidc.com/Linux/2015-04/115763.htm 一直用Qt Creator开发.无它,只是因为linux下C++ IDE选择不多.同时因为我抛弃 ...

  6. node.js运行配置(vs code非控制台输出)

    node.js运行配置(vs code非控制台输出) node  配置 简化  vs code 是非常强大的编译器,皆因它有有各种各样好用的插件. 在没有安装code runner插件之前,想要执行n ...

  7. Elasticsearch后台运行步骤

    Elasticsearch后台运行步骤 1.cmd 到elasticsearch 中bin目录下 2.elasticsearch-service 出现  3.安装服务 elasticsearch-se ...

  8. kubernetes:用label让pod在指定的node上运行(kubernetes1.18.3)

    一,为什么要为node指定label? 通常scheduler会把pod调度到所有可用的Node,有的情况下我们希望能把 Pod 部署到指定的 Node, 例如: 有的Node上配备了速度更快的SSD ...

  9. Windows准备Node.js运行与开发环境

    如何在Windows环境下搭建Node.js开发环境:1.下载Node.js windows安装版http://www.nodejs.org/download/ 2.正常安装完成后,在系统环境变量已经 ...

  10. Sublime Text3 配置Node.js运行命令

    ­ 在Sublime Text中可以很容易配置新的编译运行命令,下面的截图是汉化版的中文菜单,英文菜单请直接对照. 首先需要在本地安装Node,默认的Node会加入到系统的环境变量,这样执行Node命 ...

随机推荐

  1. rust简要笔记

    第一个程序, 我们不用安装编辑器,直接在现成的网页编辑器上运行  https://play.rust-lang.org/

  2. Java面向对象(中)--super/多态/向下转型/equals/toString/包装类/单元测试工具

    java对象 方法重写 子类继承父类以后,可以对父类同名同参数的方法,进行覆盖操作 重写后,当创建子类对象以后,通过子类对象调用子父类中同名同参数的方法时,执行的是子类重写父类的方法. 如何区分方法重 ...

  3. Redis稳定性之战:AOF日志支撑数据持久化

    ★ Redis24篇集合 1 介绍 AOF(Append Only File)持久化:以独立日志的方式存储了 Redis 服务器的顺序指令序列,并只记录对内存进行修改的指令. 当Redis服务发生雪崩 ...

  4. MYSQL 主从不一致的原因分析

    数据库作为存储数据的组件,数据的一致性一定是要保证的前提,今天给出两个场景来分析数据不一致的原因. binlog同步模式导致主从不一致 在MYSQL 中主库向从库同步数据是利用binlog记录修改操作 ...

  5. CMake 用法总结(转载)

    原文地址 什么是 CMake All problems in computer science can be solved by another level of indirection. David ...

  6. RTMP、X264与交叉编译

    RTMP.X264与交叉编译 ​ 与HTTP(超文本传输协议)同样是一个基于TCP的Real Time Messaging Protocol(实时消息传输协议).由Adobe Systems公司为Fl ...

  7. SVN 提交文件报错:svn: E155015: Aborting commit:

    svn 提交文件报错: svn: E155015: Commit failed (details follow): svn: E155015: Aborting commit: '文件名称' rema ...

  8. 【个人笔记】Nestjs使用TypeORM注意点

    在Nestjs使用TypeORM还是有一些注意点. entities路径配置注意点 在nestjs中使用TypeORM,需要配置数据库连接(以MySQL为例).需要特别注意的是配置参数里面的entit ...

  9. Kotlin 协程基础使用学习

    原文: Kotlin 协程基础使用学习-Stars-One的杂货小窝 本篇阅读可能需要以下知识,否则可能阅读会有些困难 客户端开发基础(Android开发或JavaFx开发) Java多线程基础 ko ...

  10. 02.Android崩溃Crash库之App崩溃分析

    目录总结 01.抛出异常导致崩溃分析 02.RuntimeInit类分析 03.Looper停止App就退出吗 04.handleApplicationCrash 05.native_crash如何监 ...