nodejs的模块化就相当于其他语言的类文件的导入和使用。

require方法与页面js的导入外部js文件不同。你在页面从外部导入一个js文件,比如:

server.js:

var http=require("http");function start(){function reqts(r,rsp){console.log("Request received");rsp.writeHead(200,{"Content-Type":"text/plaint"});rsp.write("Hello World");rsp.end();}http.createServer(reqts).listen(8888);console.log("Server has started.");
}

你在页面直接可以这样使用:

start();

但是在nodejs,你用require引入一个js文件,你不能使用的。

比如在index.js引入这个server.js:

var server=require("./server.js");

这个和页面js有什么不同?有:

第一,这个require返回了一个对象,这个对象是什么内容暂时未知,至少我们知道有一个对象;

第二,如果你在引入之后直接调用:start();是不行的,说明这个require不知简单的把代码包含进来那么简单。

官方推荐是这样使用的:

server.js:

var http=require("http");function start(){function reqts(r,rsp){console.log("Request received");rsp.writeHead(200,{"Content-Type":"text/plaint"});rsp.write("Hello World");rsp.end();}http.createServer(reqts).listen(8888);console.log("Server has started.");
}<span style="color:#ff0000;">exports.start=start;</span>

在index.js这样写:

var server=require("./server");
<span style="color:#ff0000;">server.start();</span>

经过测试,发现如果没有exports.start=start;这个赋值,后面这个server.start();调用不会成功,说明他们存在因果关系。

推测,这个require返回的就是exports对象,把代码稍微修改一下:

server.js:

var http=require("http");function start(){function reqts(r,rsp){console.log("Request received");rsp.writeHead(200,{"Content-Type":"text/plaint"});rsp.write("Hello World");rsp.end();}http.createServer(reqts).listen(8888);console.log("Server has started.");
}<span style="color:#ff0000;">exports.sta=start;</span>

index.js:

var server=require("./server");
<span style="color:#ff0000;">server.sta();</span>

运行成功,证实了require返回exports的猜测。

更进一步,这个require是如何引用这个代码的?因为不能直接访问server.js里面的变量以及函数,猜测可能是闭包了,改造一下,直接把start函数暴露出来试试:

server.js:

var http=require("http");<span style="color:#ff0000;">start=function()</span>{function reqts(r,rsp){console.log("Request received");rsp.writeHead(200,{"Content-Type":"text/plaint"});rsp.write("Hello World");rsp.end();}http.createServer(reqts).listen(8888);console.log("Server has started.");
}

index.js:

var server=require("./server");
<span style="color:#ff0000;">start();</span>

运行成功,说明真的是被闭包了。

nodejs模块加载的猜想相关推荐

  1. nodejs模块加载分析(1).md

    前言 上篇 nodejs 启动流程分析中,遗留了几个问题.这一篇,主要讲讲模块加载流程.大家都应该熟悉 timer 模块的相关功能.我们就以 timer 为引子,一步步看下去吧. C++ init 方 ...

  2. nodejs学习巩固笔记-nodejs基础,Node.js 高级编程(核心模块、模块加载机制)

    目录 Nodejs 基础 大前端开发过程中的必备技能 nodejs 的架构 为什么是 Nodejs Nodejs 异步 IO Nodejs 事件驱动架构 全局对象 全局变量之 process 核心模块 ...

  3. 大前端 - nodejs 基础(核心模块、模块加载机制)

    node基础 一 nodejs 核心模块.模块加载机制 nodejs异步io和事件循环 nodejs单线程 nodejs实现api服务 nodejs核心模块和api使用 提供应用程序可直接调用库,例如 ...

  4. nodejs动态加载路由

    Nodejs动态加载路由,Nodejs遍历目录,Nodejs路由工具 工具来源: Nodejs需要手动加载路由文件,如果一个个添加,项目逐渐扩大,比较麻烦. 尤其在项目route目录下,增加模块文件夹 ...

  5. Node 模块加载汇总

    Nodejs 模块大概可分为4种: a) builtin module Nodejs中以C++形式提供的文件模块. b) constant module Nodejs中定义常量的文件模块. c) na ...

  6. Node.js(一、Node.js基础、模块加载机制、包等)

    Node.js(一.Node.js基础.模块加载机制.包等) 1.Node.js基础 1.1.Node是什么 1.2.Node环境安装失败解决方法 1.2.1.Node环境搭建 1.2.2.错误代码2 ...

  7. javascript模块化、模块加载器初探

    最常见网站的javascript架构可能是这样的: 一个底层框架文件,如jQuery 一个网站业务框架文件,包含整站公用业务模块类(如弹框.ajax封装等) 多个业务文件,包含每个具体页面有关系的业务 ...

  8. FreeSwitch 的初始化及其模块加载过程

    FS 主函数main() Freeswitch的主函数是在文件switch.c中定义的,该文件的260行是整个程序的入口,主函数主要完成的功能是包括,命令行解析,初始化apr库,构建全局内存池,模块加 ...

  9. javascript 异步模块加载 简易实现

    在javascript是没有类似java或其他语言的模块概念的,因此也不可能通过import或using等关键字来引用模块,这样造成了复杂项目中前端代码混乱,变量互相影响等. 因此在复杂项目中引入AM ...

最新文章

  1. php 重新载入类文件夹,php-如何配置Behat从应用程序特定文件夹自动加载类
  2. Java爬虫--json数据处理:JSONObject的使用
  3. 通过Python实现某个目录下所有文件(包含子目录中的文件)的列出
  4. 漳州市2021高考成绩查询,漳州市招生管理系统2021漳州中考成绩查询入口
  5. css3属性:美化表单、点击元素产生的背景与边框怎么去掉,滚动回弹效果
  6. 【转】FireFox与IE js脚本差异 小结
  7. P3206 [HNOI2010]城市建设
  8. qt将光标相对于桌面的位置转换为相对于窗口的位置
  9. python怎么开发软件_怎么使用python进行软件开发
  10. python初学者用什么软件_初学者编写python用什么软件
  11. sql如何遍历几百万的表_SQl SERVER 2000 遍历表中数据的方法
  12. File类里的静态字段
  13. VMC to Hyper-V Import Tool 简体中文版.VZPEDIA首发
  14. 数据归一化mapminmax
  15. 概率论在实际生活的例子_概率论在实际生活中的应用
  16. LeetCode题解(1564):把箱子放进仓库里I(Python)
  17. PD虚拟机设置替代ALT+F4(关闭窗口)的快捷键的方法
  18. 前端是什么,是干嘛的
  19. 清除DataGridView的全部内容,包括标题行
  20. Java ee 链接mysql 数据库完整步骤

热门文章

  1. 最详细最容易理解的HMM文章
  2. 全球及中国组织工程医疗产品行业深度分析及十四五前景预测报告2022年版
  3. STC51系列单片机不断电自动下载程序
  4. OpenStack+Ceph存储空间回收
  5. 纯CSS实现回到顶部的功能
  6. 矩阵连乘 动态规划_如何构建移动营销时代的“动态矩阵”?
  7. matlab中模型预测控制工具箱中m文件optimizer代码里面有个built in kalman 的选项
  8. 保存数据时报:Incorrect string value: '\xF0\x9F\x91\x8D' for column 'f_char_name' at row 1
  9. matplotlib中cmap_Matplotlib:imshow中cmap的功能是什么?
  10. 腾讯云直播功能(云直播为例)