菜单

从零开始学习Node

2020年3月19日 - 首页

本文实例讲述了Node.js文本提交与显示方法。分享给大家供大家参考,具体如下:

这里只讨论支持并行下载的浏览情况,大致分为两种,一种是按加向DOM树中加的顺序执行,另一种按下载完成的先后顺序执行;这样如果js文件间有依赖关系的话,且是按下载顺序执行,且在没有缓存的情况下就会报错(通常的情况下第一次执行会报错,http返回状态200,如果缓存未禁用,http状态是304,就不会报错了)
而ie就是按http下载完成的先后顺序执行js代码的,首先看下面的代码: 复制代码 代码如下:

var server = require;var router = require;var requestHandlers = require;var handle = {}handle["/"] = requestHandlers.start;handle["/start"] = requestHandlers.start;handle["/upload"] = requestHandlers.upload;server.start;

var http = require;var url = require;function start { function onRequest { var postData = ""; var pathname = url.parse.pathname; console.log("Request for " + pathname + " received."); request.setEncoding; request.addListener("data", function { postData += postDataChunk; console.log("Received POST data chunk '"+ postDataChunk + "'."); }); request.addListener { console.log("data received ending" + pathname); route(handle, pathname, response, postData); }); } http.createServer.listen; console.log("Server has started.");}exports.start = start;

Model

requestHandlers.js

其中动态加载的alert.js文件中内容为:alert;
经过测试,可以发现弹出的内容先后为:loaded、in alert.js、complete
查资料可得ie下向DOM中添加script时有onreadystatechange事件,而事件中js.readyState的状态变化为:loading、complete
从代码中可以看出我是在事件中才向DOM中添加创建的scrip结点的……
因此可以得出ie在创建scrip结点并给src赋值时就开始有http下载了,这与其它浏览器完全不同(其它浏览器是要把script结点加到DOM中才会有http下载的),而把scrip结点向DOM树中添加后才开始执行代码。
有了这些结论我们就可以解决ie下并行下载顺序执行的问题了;有两种方案:一种是边下载边顺序执行,另一种是全下载完再顺序执行。
两种各有好处,这里给出后一种情况的代码: 复制代码 代码如下: /* * Author: JaiHo */ {
var DOMLoader = { var DOMLoader = function(){ return new
DOMLoader.prototype.init(); }; DOMLoader.prototype = { jsList:[],
js_all:0, loaded_js:0, head:document.getElementsByTagName[0],
init:function(){ }, create_node:function{ var js =
document.createElement; js.type = ‘text/javascript’; this.bindWait;
this.jsList[this.jsList.length] = js; js.src = src; },
loadJS:function{ len = list.length; for{ if this.js_all = len;
this.create_node; } return this; }, bindWait:function{
if(arguments.callee.caller!==this.create_node) return; var that = this;
if{ js.onreadystatechange = function(){ if( js.readyState == ‘loaded’ ){
that.loaded_js++; if( that.js_all == that.loaded_js ){
that.head.appendChild ); } } if ( js.readyState == “complete” ){
js.onreadystatechange = null; if{ that.head.appendChild ); } } }; }else{
js.onload = function(){ alert; }; } return this; } };
DOMLoader.prototype.init.prototype = DOMLoader.prototype; return
window.DOMLoader = DOMLoader; }); 测试例子如下: 复制代码 代码如下:

var querystring = require;function start { console.log("Request handler 'start' was called."); var body = ''+ ''+ ''+ ''+ ''+ ''+ ''+ ''; response.writeHead(200, {"Content-Type": "text/html"}); response.write;}function upload { console.log("Request handler 'upload' was called."); response.writeHead(200, {"Content-Type": "text/plain"}); response.write("You've sent the text: "+ querystring.parse; response.end();}exports.start = start;exports.upload = upload;

function route(handle, pathname, response, postData) { console.log("About to route a request for " + pathname); if (typeof handle[pathname] === 'function') { handle[pathname]; } else { console.log("No request handler found for " + pathname); response.writeHead(404, {"Content-Type": "text/plain"}); response.write; response.end(); }}exports.route = route;

Loader

知识点:

可以看出加载的3个js文件是并行下载的。
对于其它浏览器有动态加载js文件的并行下载和顺序执行问题的情况,目前还没有相对完美的解决方案,单从这个方面,个人觉得ie的这个onreadystatechange事件方案相对好些。

require和exports的用法:

index.js中代码

var Hello = require;hello = new Hello();hello.setName;hello.sayHello();

hello.js中代码

function Hello(){ var name; this.setName = function{ name = thyName; } this.sayHello = function(){ console.log; }}//exports.Hello = Hello; //此时我们在其他文件中需要通过 require.Hello来获取Hello对象,这种写法有点冗余module.exports = Hello; //输出的就是Hello对象本身,不是上面的exports,上面的是暴露.Hello,.Hello赋予了Hello对象

希望本文所述对大家nodejs程序设计有所帮助。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图