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

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

开发者学堂课程【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');

});

相关文章
|
8月前
模块功能提高可读性
模块功能提高可读性
57 4
|
3月前
|
设计模式 Java 测试技术
优雅代码,建议掌握这 11个编程原则!
高质量的代码不仅让人信服,还能提升开发效率。本文总结了多位高手的经验,提炼出11条编码基本原则:DRY(避免重复)、KISS(简洁至上)、重构(优化代码)、SOLID(设计原则)、文档编写、创建优于继承、YAGNI(避免过度设计)、委托原则、始终保持代码清洁、封装变化以及优先使用组合而非继承。遵循这些原则,你的代码将更加优雅和高效。
75 3
|
7月前
|
数据安全/隐私保护 Python
Python装饰器是高阶函数,用于在不修改代码的情况下扩展或修改函数行为。它们提供可重用性、模块化和无侵入性的功能增强。
【6月更文挑战第20天】Python装饰器是高阶函数,用于在不修改代码的情况下扩展或修改函数行为。它们提供可重用性、模块化和无侵入性的功能增强。例如,`@simple_decorator` 包装`my_function`,在调用前后添加额外操作。装饰器还能接受参数,如`@logged("INFO", "msg")`,允许动态定制功能。
50 6
|
8月前
|
编译器 Go 持续交付
Go语言模块导入的实践与技巧:提升代码重用与模块化开发效率
【2月更文挑战第9天】在Go语言中,模块导入是实现代码重用和模块化开发的关键环节。本文将介绍Go语言中模块导入的实践与技巧,包括本地模块的导入、远程模块的导入、导入路径的解析与重定向、导入别名与包的重命名等,旨在帮助读者更加高效地进行Go语言的项目开发。
|
Java
4.2 内部类在事件处理中的应用:简化代码结构,提高代码可维护性
4.2 内部类在事件处理中的应用:简化代码结构,提高代码可维护性
107 0
|
开发者
重构的核心-让代码保持整洁
很久之前团队师兄向我推荐了《重构:改善既有代码的设计》这本书,粗略翻阅看到很多重构的细节技巧,但当时还处于未接触过工程代码,只关注代码功能,不太考虑后期维护的阶段,读起来觉得枯燥无味,几乎没有共鸣,一直没有细细阅读。在工作一年后,终于在师兄的督促下,利用一个月左右的早起时光读完了这本书,收获很多,感谢师兄的督促,感谢这本书陪伴我找回了阅读习惯。把这本书推荐给已经接触了工程代码、工作一年左右的新同学,相信有了一定的经验积累,再结合日常项目实践中遇到的问题,对这本书的内容会有很多自己的思考感悟
40598 4
重构的核心-让代码保持整洁
|
前端开发
案例14-代码结构逻辑混乱,页面设计不美观
代码结构逻辑混乱,页面设计不美观
|
前端开发 JavaScript API
8 个示例理清宏任务微任务执行顺序
8 个示例理清宏任务微任务执行顺序 , 事件循环相信很多人都了解过,关于宏任务和微任务的介绍和执行顺序也有非常多的介绍,我
8 个示例理清宏任务微任务执行顺序
|
小程序
小程序模块化开发
小程序模块化开发
262 0
小程序模块化开发
|
前端开发
模块化操作
模块化操作
139 0