nodejs模块加载的猜想
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模块加载的猜想相关推荐
- nodejs模块加载分析(1).md
前言 上篇 nodejs 启动流程分析中,遗留了几个问题.这一篇,主要讲讲模块加载流程.大家都应该熟悉 timer 模块的相关功能.我们就以 timer 为引子,一步步看下去吧. C++ init 方 ...
- nodejs学习巩固笔记-nodejs基础,Node.js 高级编程(核心模块、模块加载机制)
目录 Nodejs 基础 大前端开发过程中的必备技能 nodejs 的架构 为什么是 Nodejs Nodejs 异步 IO Nodejs 事件驱动架构 全局对象 全局变量之 process 核心模块 ...
- 大前端 - nodejs 基础(核心模块、模块加载机制)
node基础 一 nodejs 核心模块.模块加载机制 nodejs异步io和事件循环 nodejs单线程 nodejs实现api服务 nodejs核心模块和api使用 提供应用程序可直接调用库,例如 ...
- nodejs动态加载路由
Nodejs动态加载路由,Nodejs遍历目录,Nodejs路由工具 工具来源: Nodejs需要手动加载路由文件,如果一个个添加,项目逐渐扩大,比较麻烦. 尤其在项目route目录下,增加模块文件夹 ...
- Node 模块加载汇总
Nodejs 模块大概可分为4种: a) builtin module Nodejs中以C++形式提供的文件模块. b) constant module Nodejs中定义常量的文件模块. c) na ...
- 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 ...
- javascript模块化、模块加载器初探
最常见网站的javascript架构可能是这样的: 一个底层框架文件,如jQuery 一个网站业务框架文件,包含整站公用业务模块类(如弹框.ajax封装等) 多个业务文件,包含每个具体页面有关系的业务 ...
- FreeSwitch 的初始化及其模块加载过程
FS 主函数main() Freeswitch的主函数是在文件switch.c中定义的,该文件的260行是整个程序的入口,主函数主要完成的功能是包括,命令行解析,初始化apr库,构建全局内存池,模块加 ...
- javascript 异步模块加载 简易实现
在javascript是没有类似java或其他语言的模块概念的,因此也不可能通过import或using等关键字来引用模块,这样造成了复杂项目中前端代码混乱,变量互相影响等. 因此在复杂项目中引入AM ...
最新文章
- php 重新载入类文件夹,php-如何配置Behat从应用程序特定文件夹自动加载类
- Java爬虫--json数据处理:JSONObject的使用
- 通过Python实现某个目录下所有文件(包含子目录中的文件)的列出
- 漳州市2021高考成绩查询,漳州市招生管理系统2021漳州中考成绩查询入口
- css3属性:美化表单、点击元素产生的背景与边框怎么去掉,滚动回弹效果
- 【转】FireFox与IE js脚本差异 小结
- P3206 [HNOI2010]城市建设
- qt将光标相对于桌面的位置转换为相对于窗口的位置
- python怎么开发软件_怎么使用python进行软件开发
- python初学者用什么软件_初学者编写python用什么软件
- sql如何遍历几百万的表_SQl SERVER 2000 遍历表中数据的方法
- File类里的静态字段
- VMC to Hyper-V Import Tool 简体中文版.VZPEDIA首发
- 数据归一化mapminmax
- 概率论在实际生活的例子_概率论在实际生活中的应用
- LeetCode题解(1564):把箱子放进仓库里I(Python)
- PD虚拟机设置替代ALT+F4(关闭窗口)的快捷键的方法
- 前端是什么,是干嘛的
- 清除DataGridView的全部内容,包括标题行
- Java ee 链接mysql 数据库完整步骤
热门文章
- 最详细最容易理解的HMM文章
- 全球及中国组织工程医疗产品行业深度分析及十四五前景预测报告2022年版
- STC51系列单片机不断电自动下载程序
- OpenStack+Ceph存储空间回收
- 纯CSS实现回到顶部的功能
- 矩阵连乘 动态规划_如何构建移动营销时代的“动态矩阵”?
- matlab中模型预测控制工具箱中m文件optimizer代码里面有个built in kalman 的选项
- 保存数据时报:Incorrect string value: '\xF0\x9F\x91\x8D' for column 'f_char_name' at row 1
- matplotlib中cmap_Matplotlib:imshow中cmap的功能是什么?
- 腾讯云直播功能(云直播为例)