模块化后代码执行顺序|学习笔记

简介: 快速学习模块化后代码执行顺序

开发者学堂课程【Node.js 入门与实战模块化后代码执行顺序】学习笔记,与课程紧密联系,让用户快速学习知识

课程地址https://developer.aliyun.com/learning/course/588/detail/8307


模块化后代码执行顺序

 

基本内容

index.is

context.js

三、router.js

四、handler.js

五、课堂总结

 

一、index.js

// 1.加载http模块

var http =require( 'http);

var context = require(' ./context.js');  

var router = require('./router.js );

console.log('1');

//2.创建服务

http. createServer(function(req, res) {

// count++;//这里的代码每次请求都会执行

console.log('哈哈');  

//Context.js模块的返回值函数),并将reqres对象传递给Context.js模块

context(req, res);

//调用路由模块的返回值(函数),并将req和res 对象传递给router.js 模块

router(req, res);

}).listen(config.port, function() {

console . log( ' http://localhost:‘config.port');

});


二、context.js

//该模块负责对req和res对象进行扩展;

//希望在该模块中做什么:

// 1.为req增加一个query 属性,该属性中保存的就是用户get请求提交过来的数据

// - req. query

//2.为req增加一个pathname属性

// - req .pathname

// 3.为res增加一个render 函数

var url - require('url' ) ;

var fs = require('fs');

var mime = require(‘ mime );

var _ = require( ‘underscore');

console.log('2');

//让当前模块对外暴露一个函数,通过这个函数将index.js 中的req和res传递到当前context.js 这个模块中

module .exports - function(req, res) {

var urlobj . url. parse(req. url. toLowerCase(), true);

//1.req增加query属性

req.query . urlobj . query;

//2.为req增加pathname属性

req. pathname . urlobj. pathname;

// 3.把请求方法req.method 转换为小写

req. method . req . method . toLowerCase();

// 3.为res 增加一个render 函数

res .render . function(filename, tplData) {

fs.readFile(filename, function(err, data) {

if (err) {

res .writeHead(404, 'Not Found', { . Content-Type': . text/html;charset-utf-8' });

res. end( .404, not found.' ) ;

return;

}

//如果用户传递了模板数据,那么就使用 underscore 的 template 方法进行替换

//如果用户没有传递模板数据,那么就不进行替换

if (tplData) {

//如果用户传递了模板数据,表示要进行模板替换

var fn =  _. template(data . toString('utf8’));

data =  fn(tplData);

}

res . setHeader( ' Content-Type ' , mime . getType(filename)) ;

res .end(data) ;

});

});

});

 

三、router.js

//加载 handler.js 模块

var handler = require(' . /handler.js');

module .exports . function(req, res) {

//先根据用户请求的路径(路由),将对应的 HTML 页面显示出来

if (req.pathname === '/'|| req.pathname === ‘/index&&req.method === 'get') {

handler. index(req, res);

}else if (req.url === ’/submit' && req . method===‘get') {

handler . submit(req, res);

}else if (req . pathname=== ’/item' && req. method===’get’) {

handler item(req, res);

}else if (req . pathname=== ’/add' && req. method===’get’) {

handler . addGet(req, res);

}else if (req.url === ’/submit' && req . method===‘get') {

handler . addPost(req, res);

}else if (req. url. startsWith(/resources') &&req . method===m 'get') {

handler . static(req, res);

} else {

handler. handleErrors(req, res);

}

};

 

四、handler.js

var fs = require('fs');

var path = require( path );

var querystring = require(querystring' );

console.log('4');

//处理请求/和/index 的业务方法

module . exports . index = function(req, res) {

// 1.读取 data.json 文件中的数据,并将读取到的数据转换为list数组

readNewsData(function(list) {

// 2.在服务器端使用模板引擎,将 list 中的数据和 index.html 文件中的内容结合渲染给客户端

res.render(path.join(__dirname,'views',index.html'),{list:list});

});

);

//处理请求/submit 的业务方法

module . exports .submit = function(req, res) {

//读取submit.html 并返回

res. render(path. join(__dirname, 'views', submit.html' ));

};

 

五、课堂总结

l 猜测一下,启动程序的时候,1234和哈哈输出的顺序是怎样的呢?

l 答案是2431没有“哈哈”

么“哈哈”在哪里?是在用户request的世界,只有当用户请求的时候才会执行如果服务启动了以后,只要用户不请求,那么“哈哈”这个程序永远都不执行。只有当用户请求的时候才输出

l 为什么第一个2?

:2在 context.js,执行node index.js,需要执行index.js源代码,也就是说index.js 里面代码就会从上到下依次执行,先加载这个核心模块紧接着加载context.js。然后contacts.js里面输出2。

l 二个是4。4handler.js里面,回到index.js,一开始执行context.js的时候加载了2,然后紧接着出台执行 router.js,router .js 里面是先加载了 hander.js; hander.js里面打印出4。

l 下一个是3。hander.js 执行完毕后会打印出来3。

l 最后一个1。当这些全都加载完毕后,这是代码执行的顺序,当多个模块进行配合执行的时候,需要了解每个模块里面代码是在什么时候执行的。

l 同时请注意点,哈哈每次请求都会执行,但是这几个数字只执行了一次。也就是说这个代码,只有在request世界里面的代码才会每次请求都执行,其余皆代码是都只是在启动的时候只执行一次。

// 1.加载http模块

var http =require( 'http);

var context = require(' ./context.js');  

var router = require('./router.js );

console.log('1');

//var count = 0;  //这里的代码只有在第一次启动的时候执行一次

//2.创建服务

http. createServer (function(req, res) {

// count++;    //这里的代码每次请求都会执行

console.log('哈哈');

//Context.js 模块的返回值函数),并将 req res 对象传递给Context.js 模块

context(req, res);

//调用路由模块的返回值(函数),并将req和res 对象传递给router.js 模块。

router(req, res);

}).listen(config.port, function() {

console . log( ' http://localhost:‘config.port');

});

相关文章
|
4月前
|
设计模式 存储 前端开发
React开发设计模式及原则概念问题之自定义Hooks的作用是什么,自定义Hooks设计时要遵循什么原则呢
React开发设计模式及原则概念问题之自定义Hooks的作用是什么,自定义Hooks设计时要遵循什么原则呢
|
4月前
|
Android开发 iOS开发
Android项目架构设计问题之将隐式跳转的逻辑进行抽象和封装如何解决
Android项目架构设计问题之将隐式跳转的逻辑进行抽象和封装如何解决
47 0
|
7月前
|
编译器 Go 持续交付
Go语言模块导入的实践与技巧:提升代码重用与模块化开发效率
【2月更文挑战第9天】在Go语言中,模块导入是实现代码重用和模块化开发的关键环节。本文将介绍Go语言中模块导入的实践与技巧,包括本地模块的导入、远程模块的导入、导入路径的解析与重定向、导入别名与包的重命名等,旨在帮助读者更加高效地进行Go语言的项目开发。
|
7月前
|
存储 前端开发 rax
不一样的编程方式 —— 协程(设计原理与汇编实现)
不一样的编程方式 —— 协程(设计原理与汇编实现)
|
人工智能 大数据 程序员
一文看懂开源图化框架中的循环设计逻辑!
相信大家在日常工作中,已经精通各种循环逻辑的实现。就拿我来说吧,多年的工作经验,已经让我可以熟练的使用 C++,Python,英语等多种语言,循环多次输出“hello word”。不过大家有没有想过一个这样的问题:如何在一个有向无环图(Directed Acyclic Graph,简称dag)中实现循环呢?
758 0
一文看懂开源图化框架中的循环设计逻辑!
|
Java
4.2 内部类在事件处理中的应用:简化代码结构,提高代码可维护性
4.2 内部类在事件处理中的应用:简化代码结构,提高代码可维护性
104 0
|
前端开发 数据库
MVVM框架代码逻辑整合
MVVM框架代码逻辑整合
115 0
|
前端开发 JavaScript API
8 个示例理清宏任务微任务执行顺序
8 个示例理清宏任务微任务执行顺序 , 事件循环相信很多人都了解过,关于宏任务和微任务的介绍和执行顺序也有非常多的介绍,我
8 个示例理清宏任务微任务执行顺序
|
缓存 前端开发 NoSQL
领域驱动编程,代码怎么写?
领域驱动开发最重要的当然是正确地进行领域拆解,这个拆解工作可以在理论的指导下,结合设计者对业务的深入分析和充分理解进行。本文假定开发前已经进行了领域划分,侧重于研究编码阶段具体如何实践才能体现领域驱动的优势。
866 16
领域驱动编程,代码怎么写?
|
JavaScript 前端开发 程序员
前端技术-模块化操作(es5写法) | 学习笔记
快速学习 前端技术-模块化操作(es5写法)
221 0