一个简单的页面输出实现代码
安装过程就不说了。如果成功是能使用结节的命令node.js。调试是非常方便的。每种后台语言都有一个向那个黑黢黢的控制台团输出语用的命令node.js。沿用消防那套东西,也就是安慰对象与其方法。我们首先建一个示例。射流研究…文件,内容如下,然后在控制台打开它。复制代码代码如下:控制台。日志(' hello节点。js ')用于(控制台中的var I){控制台。log(I ' ' console[I])}节点示例。js。你千万不要在node.js使用警报进行调试,那是浏览器带的全局方法,不报错才怪。输出结果如下:复制代码代码如下: var log=function(){ process。标准输出。写入(格式。应用(这个,参数)' \ n ');} var info=function(){ process。标准输出。写入(格式。应用(这个,参数)' \ n ');} var warn=function(){ WriteError(格式。应用(这个,参数)' \ n ');} var error=function(){ write error(格式。应用(这个,参数)' \ n ');} var dir=function(object){ var util=require(' util ');过程。标准输出。write(util。inspect(object)' \ n ');} var time=function(label){ times[label]=date。now();} var timeEnd=函数(标签){ var duration=日期。now()-times[label];出口。日志('未定义的: NAMs ',标签,持续时间);} var trace=函数(标签){//TODO一旦//被公开,可能可以用V8的调试对象更好地做到这一点var err=新错误;err . name=' Tracerr . message=label | | error . capturestackTrace(err,参数。呼叫者);控制台。错误(错误。堆栈);} var assert=function(expression){ if(!表达式){ var arr=array。原型。切片。呼叫(参数,1);需要(“断言”).ok(false,format.apply(this,arr));} } 通过这些函数,我们大概了解到node.js在全局作用域添加了些什么,如要求、处理。但也不能武断说是,因为它们可能是某个作用域的私有对象。不过,了解这些全局对象,并从这些对象上出发去了解其他对象,非常有助于我们了解node.js的生态结构。在前端,每当浏览器升级,我就遍历一下窗户对象以及其个元素节点就得知它又增加了什么方法与属性,然后再查文档。那些更新日志不可能把全部细节都告诉你的,必须自己动手遍历一下,这样你就比别人知道得更多。好了,我们去找node.js的全局对象node.js。的文档告诉我们,有如下几个全局对象:全局,进程,必需,_ _文件名,_ _目录名,模块但我们为什么能直接使用控制台。日志呢?经验告诉我们控制台肯定是某全局对象的成员,正如我们可以警惕,也可以窗口。警报。好了,我们选遍历一下全球的这个名字取得非常霸气的对象复制代码代码如下:用于(全局中的var I){控制台。日志(' var ' I '='全局[i]) }结果如下:复制代码代码如下: var GLOBAL=[对象全局]var流程=[对象事件发射器]var GLOBAL=[对象全局]var root=[对象全局]变量缓冲=函数缓冲(主题、编码、偏移量){ //太长了,省略} var setTimeout=function(){ var t=native module。需要('计时器');返回t.setTimeout.apply(这个,参数);} var setInterval=function(){ var t=native module。需要('计时器');返回t.setInterval.apply(this,arguments);} var clear time out=function(){ var t=native module。需要('计时器');返回t.clearTimeout.apply(这个,参数);} var clearInterval=function(){ var t=native module。需要('计时器');返回t.clearInterval.apply(这个,参数);} var控制台=[对象对象]发现全球的与浏览器的窗户一样,都有个指向自身的同名成员window===window.window,global===global.global。但node.js早期设计得不好,又一搞了个多余的全球的成员。
console . log(global===global . global)//true console . log(global===global . global)//true我们再次遍历模块对象:复制的代码如下: for(var i in module)。{ console . log(' var ' I '=' module[I])}结果如下:复制代码的代码如下: var id=。var exports=[object object]var parent=null var Filename=/home/cheng 19840218/node/existed . js var loaded=false var existed=false var children=var path=/home/cheng 19840218/node/node _ modules,/home/cheng 19840218/node _ modules,/home/node _ modules var load=function(Filename){//太长,省略只要穿过它,你会发现许多有趣的事情。但是不要以为秘密就暴露在你的眼皮底下,有很多非遍历的属性。例如,当我遍历上面的全局对象时,只能计算几个成员。我们可以使用ecma262v5的新方法来调查:console . log(object . getownpropertynames(global))。结果如下:复制的代码如下: ['clearInterval '。TypeError ',' decodeURI ',' Buffer ',' parseFloat ',' Number ',' URIError ',' RangeError ',' ReferenceError ',' RegExp ',' Array ',' isNaN ',' setTimeout ',' console ',' Date ',' Infinity ',' Boolean ',' Error ',' root ',' NaN ',' String ',' Function ',' Math ',' undefined ',' encodeURI ',' escape ',' process ',' decodeURIComponent ',' EvalError ',' clearTimeout ',' GLOBAL ','也有一些语法是模仿火狐的:_ _ define getter _ _ _ _ _ define setter _ _ _ _ _ lookupgetter _ _ _ _ _ lookback ter _ _ set get _ _ proto _ _,但是我不推荐任何以“_ _”开头的语法,比如set和get,它们是最新的浏览器支持的,比如IE9。您可以在其开发人员工具下尝试以下脚本:复制代码如下: var a={ getlatest(){ if(this . log . length 0){ return this . log[this . log . length-1];} else { return null} },log :[]} a . log[0]=' a ';a . log[1]=' b ';Console.log(a.latest)在node.js中基本没有兼容性问题(如果不从早期的node.js开始玩的话),原生对象添加了这么多扩展,加上node.js的库,每个模块都提供了各种各样的API。如果还不够,github上有几千个插件。这对于想要尝试后端编程的JSer来说非常有诱惑力。有人可能会说,后端不是参与数据库操作吗?与前端的DOM兼容性相比,这一点不值一提。如果有任何文件夹和文件操作,可以将其视为特殊的数组操作。所以你可以义愤填膺!好吧,让我们言归正传。Node.js最初是一个http服务器,与前端交互,所以有两个对象:请求和响应。请求和响应显然是异步的事情,因为我们不知道前端什么时候会发送请求,响应也不能马上发送到前端。我们要做日志,读写数据库等等。因此,对于javascript来说,这最好通过回调函数来实现。那么谁会接受这次回调呢?一个服务器对象!复制代码如下: var http=require(' http ');http.createServer(函数(请求,响应){ response.writeHead(200,{ ' Content-Type ' : ' text/plain ' });response . write(' Hello node . js ');response . end();}).听(8888);Node.js对于同步加载其他模块的对象有一个特殊的要求,类似于其他语言的require,import。同步就好,不像前端。然后用一个函数实例化一个服务器对象,然后监听端口8888。这是node.js官网最初的例子,大家都写得不好。
但这样的程序在现实中一无是处,我们在地址栏上输入网址,你起码要返回一个完整页面给我吧!对此,我们首先要进行模块化。模块化是以文件为单位的,把示例。射流研究…更名为server.js,然后再把里面的内容改为一个模块。对于一个node.js的文件,其实它里面的内容是在一个封闭的环境中执行。要想共享给其他模块使用,就必须绑定在出口对象上。复制代码代码如下: var http=require(' http ');出口。开始=函数(){ http。createserver(函数(请求,响应){ console.log('收到请求. ');response.writeHead(200,{ ' Content-Type ' : ' text/plain ' });回应。写(' Hello节点。js’);回应。end();}).听(8888);console.log('服务器启动.');} 然后我们再建一个index.js作为入口(index.js与server.js放在同一目录下)。复制代码代码如下: var服务器=必需(' ./server’);服务器。start();然后建一个index.html页面。复制代码代码如下:doctype html html标题索引/标题元内容=' IE=8 ' http-equiv=' X-UA-Compatible '/元http-equiv=' Content-Type ' Content=' text/html;charset=UTF-8 '/头体氘这是首页/h2 /body /html现在我们就在要请求过来时,把此页的内容读出来,返给用户。这时我们就要用到满量程模块的方法了。复制代码代码如下: var http=require(' http ');var fs=require(' fs ');出口。开始=函数(){ http。CreateServer(函数(请求,响应){ fs.readFile(')./index.html ',' utf-8 ',函数(错误,数据){//读取内容if(err)throw err;response.writeHead(200,{ ' Content-Type ' : ' text/html ' });//注意这里response.write(数据);回应。end();});}).听(8888);console.log('服务器启动.');} 好了,这时我们重启再次输入地址,就看到一个完整的页面了。但一个页面除了超文本标记语言结构层外,还有爪哇岛描述语言与css。那么,我们在当前目录建一个文件夹javascripts,里面建index.js,内容如下:复制代码代码如下:窗口。onload=function(){ var p=document。创建元素(' p ');' p.innerHTML='这是动态添加的文件。尸体。append child(p);} 再建一个风格目录,里面建index.css,内容如下:复制代码代码如下: html,正文{ background: # 3671A5高度: 100% }然后在index.html引入这两个文件:复制代码代码如下:doctype html html标题索引/标题元内容=' IE=8 ' http-equiv=' X-UA-Compatible '/元http-equiv=' Content-Type ' Content=' text/html;charset=UTF-8 ' link type=' text/CSS ' rel='样式表href=' style/index。CSS '/script src=' http :/JavaScript/index。js '/脚本/头体H2这是首页/h2 /body /html重新打开,发现没有改变,谷歌,说要处理射流研究…与钢性铸铁文件的请求。没有办法,取得request.url属性,再判定后缀名,为它进行文件读取与设置首部。复制代码代码如下: var http=require(' http ');var fs=require(' fs ');var URL=必选(' URL ');出口。开始=函数(){ http。CreateServer(函数(请求,响应){ var pathname=URL。解析(请求。网址).路径名;var ext=pathname.match(/(\).[^.] |)$/)[0];//取得后缀名switch(ext){ case ' .css':大小写。js': fs.readFile(' . 'request.url,' utf-8 ',函数(错误,数据){//读取内容if(err)throw err;response.writeHead(200,{ "内容类型": {)。CSS“:”文本/css ",js ' : ' application/JavaScript ',}[ext]});response.write(数据);回应。end();});打破;default: fs.readFile(' ./index.html ',' utf-8 ',函数(错误,数据){//读取内容if(err)throw err;response.writeHead(200,{ ' Content-Type ' : ' text/html ' });response.write(数据);回应。end();});} }).听(8888);console.log('服务器启动.');}
至此,本文的目的已经达到。有三个node.js文件,一个普通js文件,一个css文件和一个html文件。下一个目标是拥有多个页面。网站由多种用途组成。它包含以下内容:它可以处理ajax请求,上传文件,支持Session和Cookie,日志,MIME识别,路由和调度,缓存系统.要做的事情太多了,所以有人一上来就开始装框,就像学习JS一样,甚至还没熟悉API就用jQuery了,学点东西吧!回顾上面server.js的中间部分,我们实际上需要将MIME和路由分开。但最重要的是,如何处理这种函数的无限嵌套?我认为这和我的模块加载系统没有什么不同。下次让我们从这里开始。
版权声明:一个简单的页面输出实现代码是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。