node.js笔记之 'hello world'

当我们刚接触到node.js的时候第一个例子免不了hello world,这里我们可以通过两种方式去实现;

方法一:打开命令行模式(cmd),输入node,然后输入hello world

这里写图片描述

很显然我们平时如果想运行js程序肯定是离不开浏览器环境,因为浏览器内核里面包括了js引擎,例如chrome的BLink内核的v8引擎,让页面就可以‘动’起来,不再是以前的静态展示页面(纯html+css);后面google又把v8移植到了服务器端,这样就使得js在服务器端有了可以运行的环境,能够实现服务器功能,就是现在的node.js,当然肯定没我说得那么简单,不过对于初学者我们先有一个印象;

我们还有必要去了解一下页面渲染的原理:友情链接

方法二:创建一个node.js服务器,浏览器作为客户端,请求带有hello world的页面

node.js笔记之 'hello world'_第1张图片

创建一个js文件,并在命令行中使用node去执行—> node index.js
文件代码:(这算得上是我们写的第一个服务器端的程序了)

var http=require('http');
http.createServer(function(req,res){
    res.writeHead(200,{'Content-type':'text/plain'});
    res.end('Hello World\n');
}).listen(3000);

虽然是一个很简单的程序,但是对于新手的我们来说也能学到知识;


模块

     首先我们是需要了解模块的概念:对于js代码的量级,作为客户端语言和服务器端语言是不一样的,浏览器这边很有可能就是实现一个简单的小功能,大不了几百上千行,一个页面可能就只需要一个脚本文件;但是一个服务器端的程序并不是简简单单一个功能,而是多个功能之间互相协作,这样代码量自然会上来,所以就产生了模块的概念,将一个单独的功能归为一个模块进行编码和维护;(现在浏览器端的js代码也是愈来愈繁重,事实证明一个好的代码需要引入模块化概念,工程化思想,这样对代码的维护和编写有极大的好处)

//如果我想封装一个乘法功能,这里可以运用一个最简单的模块概念去实现
var module=(function(mod){
	mod.mul=function(num,multiple){
    	return num*multiple
      }
    return mod;
})(module||{})
//modlue可以作为一些的功能模块的集合,其中mul为乘法,我们还可以在其上面添加除法,加法等等,这样使得一些复用的功能可以很好的封装起来,也很好解决了变量名污染的情况
module.mul(2,6)//12

     当我们引入了模块的慨念后就不得不面对一个模块引用方式的问题,因为当我们将功能划分为模块后,就需要对模块进行引用,很多时候一个文件就是一个模块,一个模块可能还依赖其他模块。这样就会涉及到大量的文件请求,作为服务器端来说完全可以同步加载文件,因为文件都是存在本地,硬盘读取,速度取决于硬盘读取速度;而作为客户端浏览器来说,请求文件是通过http网络加载,这样速度就很依赖于当前网络的情况,而且浏览器的重点又在于展示,如果进入页面后由于需要加载大量文件会导致页面渲染很慢,严重影响用户体验,所以就需要异步去请求文件;

这里先举一个node.js中模块的小例子:创建2个js文件a.js、b.js
a.js:

var x = 5;
var addX = function (value) {
  return value + x;
};
module.exports.x = x;
module.exports.addX = addX;

/*
exports.x = x;
exports.addX = addX;
*/

/*
module.exports={
    x:x,
    addX:addX
}
*/
/*上面三种导出方式都可以,但是不能exports=xx这样去赋值,
因为:	    
exports=module.exports 
exports只是一个引用*/

b.js:

var a = require('./a.js');
console.log(a);
console.log(a.x); // 5
console.log(a.addX(1)); // 6

然后node b.js

这里写图片描述

当然这只是模块的冰山一角 友情链接


http模块API

(先简单了解一下)

看一下这个极简版的http服务器代码

var http=require('http');
http.createServer(function(req,res){
    res.writeHead(200,{'Content-type':'text/plain'});
    res.end('Hello World\n');
}).listen(3000);

引用了http模块,调用createServer创建http服务器。这个函数只有一个参数,是一个回调函数,服务器每次收到http请求后都会调用这个回调哈数。这个请求回调会接收到两个参数,请求和响应对象,通常简写为req和res:

req是node对客户端http的请求头的解析,将会作为对象,提供给请求回调函数;我们可以从中获取客户端请求的具体方式,method包括:POST、 GET、 DELETE、 PUT,分别跟由URL指定的资源的创建,获取,删除,更新相对应,这也符合RESTful Web的概念,我们再根据不同的请求方式来做处理;

switch (req.method) {
	case 'POST':
	 //do something
	 break;
	case 'GET'://GET作为默认的一种方式
	 //do something
	 break;
    case 'DELETE':
	 //do something
	 break;
    case 'PUT':
	 //do something
	 break;
}

**res.writeHead( )**用来设置响应头。这里必须返回一个Conten-Type头,让浏览器知道要把结果作为什么类型来渲染,一般分为text/html与text/plain,分别是把结果当作html或者纯文本来渲染;然后就需要返回状态码,这边使用了默认的状态码200;
你可以试一下下面两种的区别:

res.writeHead(200,{'Content-type':'text/plain'});
res.end('

Hello World

'); //or res.writeHead(200,{'Content-type':'text/html}); res.end('

Hello World

');

这里需要说一下关于Content-Length的设定,这个为设置响应主体的具体字节数,为了提高响应速度,如果可能的话,应该设置其值,不过我们需要传的是具体字节数,需要使用Buffer.byteLength( )方法。如果设置字节和真实返回的字节不一致则报错ERR_CONTENT_LENGTH_MISMATCH

case 'GET':
     var body="liuzj";
     res.writeHead(200,{
           'Content-Length':Buffer.byteLength(body),
           'Content-Type':'text/plain'
          })          
     res.end(body)
 break;

res.write( )<用来将响应数据写到socket中>和res.end( )<用来结束响应>,我们可以合起来缩成一条语句。
最后我们再绑定一个端口,让服务器可以监听接入的请求。

重新回过头来看最开始的服务器代码,我们大致可以看明白在写什么了,首先请求了http模块,然后调用了其createServer方法去创建服务器,并指定了回调函数处理浏览器的请求,返回http头,状态码,最后返回具体的信息给浏览器进行渲染,这样一个最简单的http服务器就完成了~

Node的策略是提供小而强的网络API,本身只提供了 一些重要的组件,比如HTTP服务器,TCP服务器和流,在目前还未使用框架的情况下,很多模块都需要去第三方下载或者自己实现。(例如像会话这种高级概念以及HTTP cookies这样的基础组件都没有包含在Node的内核中,需要第三方模块提供)所以后面才会出现Express,Koa等框架,将我们需要的基础组件都封装好,方便使用;

异步

当js用于服务器中的时候不可避免会频繁遇到读取文件,请求数据等异步事件,所以学会异步编程的显得格外重要了。异步的难点也就是如何去实现异步事件完成后服务器的响应逻辑,和异步的流程控制;由于这块内容是重点,需要好好学习,认真总结;(待续吧)

你可能感兴趣的:(node.js修炼笔记)