之前看了朴灵大神的《深入浅出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
8var 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 in
和for 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 | - awake = false |
内联JavaScript
1 | script |
包含
1 | <!--包含views/includes/header.jade文件中的代码--> |
Mixin
mixin代表需要一次一次重复的代码块,比如:1
2
3
4
5
6
7mixin 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);
});