Node.js入门经典笔记

之前看了朴灵大神的《深入浅出Node.js》,感觉很多地方都一知半解,遂想着找一本入门的书看一看,于是就找到了《Node.js入门经典》一书。开始吧!

  之前看了朴灵大神的《深入浅出Node.js》,感觉很多地方都一知半解,遂想着找一本入门的书看一看,于是就找到了《Node.js入门经典》一书。开始吧!

一、Node概述

  说几个关键词吧:服务端JS环境基于V8支持C++扩展高性能web服务器单进程异步非阻塞事件驱动
  Node通过npm进行扩展非常方便,这种感觉类似于一夜暴富,瞬间拥有数不尽的模块插件可以使用,exciting!nodeJS的模块分为三类:核心模块文件模块第三方模块。核心模块会预先加载。通过npm install module_name安装的模块默认在项目路径下,使用全局安装需要加参数-g,通常在模块需要全局命令时使用。使用npm doc module_name可以看模块文档。目录下的package.json用于指定依赖关系以及其它模块信息。
  Node采用了事件循环机制,不适用于需要大量计算的应用场景。

二、Node模块

1. HTTP

使用Node发送重定向的代码:

1
2
3
4
5
6
7
8
var http = require('http');

var server = http.createServer(function(req,res){
res.writeHead(301,{ //301表示临时重定向,302表示永久重定向
'Location':'重定向的url'
});
res.end();
});

2. URL

URL模块解析的结果如下:

  • protocol:指定低层使用的协议
  • slashes:是否有协议的双斜线://
  • auth:认证
  • host:HTTP服务器的IP地址或者域名
  • port:端口
  • hostname:主机名
  • hash:hash值,锚点
  • search:查询字符串
  • query:发送给http服务器的数据
  • pathname:访问资源路径名
  • path:访问资源的路径
  • href:完整的超链接

三、Express

安装express生成器的命令:npm install express-generator -g,该命令可以生成一个通用的基本骨架,包括:

  • app.js:包含应用程序配置信息,用来启动应用程序的应用程序文件夹。
  • node_modules:用来保存在package.json中定义并安装的node模块。
  • package.json:包含应用程序信息以及依赖的模块。
  • public:提供给web进行服务的公共文件夹,包括CSS样式、JavaScript和图片,不存在任何程序逻辑。
  • routes:路由,根据请求响应不同的页面。
  • views:视图文件夹定义应用程序的布局。

1. Jade

缩进

Jade是一个基于缩进的模板引擎,express默认使用Jade模板引擎将视图编译为HTML文件。下面是一段html片段和Jade的对应:

1
2
3
4
5
6
7
8
9
10
<div class="wrapper">
<h1>this is head</h1>
<p>hello world!</p>
<img src="xx.jpg" alt="Hi!"/>
</div>
<!--对应的Jade如下-->
div.wrapper
h1 this is head
p hello world!
img (src='xx.jpg', alt='Hi!')

变量

Jade要比HTML更简洁,Jade使用缩进来定义HTML文档的层次结构。Jade中无需使用或关闭标记,模板编译时会自动加入<>字符。模板语言的真正能力在于操纵数据并输出数据到HTML中。Jade使用字符(-)来告诉随后的代码应当被执行,使用(=)来告诉解释器要对代码进行演算、转移和输出。#{变量}这个语法告诉Jade要将变量替换为字符串值,示例:

1
2
3
4
- var foo=bar;  //设置一个变量foo
p foo is: #{foo}! //使用变量
//渲染后的结果如下:
<p>foo is: bar!</p>

循环

循环通常用于对数组和对象进行迭代,Jade中使用each infor in的结构进行循环遍历:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!--使用each in遍历-->
- users = ['A','B','C']
- each user in users
p = user
<!--使用for in遍历-->
- for user in users
p = user
<!--两者编译结果相同:-->
<p>A</p>
<p>B</p>
<p>C</p>

- obj = {first_name:'zhao',surname:'jun'}
- each val,key in obj
li #{key}:#{val}
<!--编译结果:-->
<li>first_name:zhao</li>
<li>surname:jun</li>

条件

1
2
3
4
5
- awake = false
- if(awake)
p res is false!
- else
p res is true!

内联JavaScript

1
2
script
alert("this is script")

包含

1
2
3
4
<!--包含views/includes/header.jade文件中的代码-->
html
body
include includes/header

Mixin

mixin代表需要一次一次重复的代码块,比如:

1
2
3
4
5
6
7
mixin redo(users)
ul
each user in users
li= user
<!--定义好mixin之后就可以使用并且重用它了:-->
- users=['A','B','C']
mixin redo(users)

2. 路由

使用express添加一个GET路由以及POST路由的方式:

1
2
3
4
5
6
7
8
9
10
11
12
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' });
});
/* GET about page. */
router.get('/about', function(req, res, next) {
res.send("hahaha");
});
/* POST 路由. */
router.post('/',function(req,res){
res.send(req.body);
});