Node与Express开发笔记一

前言

JavaScript、 Node 和 Express 的组合是 Web 团队的理想选择, 这个强大的、 可快速部署的技术栈得到了开发社区和大公司的广泛认可。

Node 和 Express 就像发射 JavaScript 希望之银弹的机关枪。

初识Express

老实说, JavaScript 确实降低了业余选手进入的门槛, 也有很多充斥着各种问题的 JavaScript 代码, 这损坏了 JavaScript 的名声。 用句通俗的话说, 即“ 不是游戏太差, 而是玩家太烂”。

Express 网站上是这样介绍 Express 的:“ 精简的、 灵活的 Node.js Web 程序框架, 为构建单页、 多页及混合的 Web 程序提供了一系列健壮的功能特性。”

单页Web程序

单页 Web 程序是比较新颖的想法。
不像之前的网站, 用户每次访问不同的页面都要发起网络请求, 单页 Web 程序把整个网站( 或很大一部分) 都下载到客户端浏览器上。经过初始下载后, 用户访问不同页面的速度更快了, 因为几乎不需要或者只要很少的服务端通信。
单页程序的开发可以使用 Angular 或 Ember 等流行框架, Express 跟它们都配合得很好。

Express 的缔造者 TJ Holowaychuk 说 Express 是在 Sinatra 的启发下创建的, 后者是一个基于 Ruby 的框架。

Express 从 2.x 升级到 3.0 时做了大量的改写, 从 3.x 到 4.0 时也是这样。 本书会重点介绍版本 4.0。

Node 和传统的 Web 服务器之间的另一个主要区别是: Node 是单线程的。

如果你需要多线程程序的性能, 只需启用更多的 Node 实例, 就可以得到多线程的性能优势。

Node: 一种新型Web服务器

Node 跟其他流行的 Web 服务器, 比如微软的互联网信息服务( IIS) 或Apache, 有很多共同点。 然而更有趣的是探究它的不同之处, 所以我们先从讨论它的不同开始。
Node 实现 Web 服务器的方式跟 Express 很像, 也非常精简。
Node 的搭建和配置非常容易,不像 IIS 或 Apache 要花费多年的时间才能掌握。

Node 程序更像 PHP 或 Ruby。

Node 所用的 JavaScript 引擎( 谷歌的 V8) 确实会将 JavaScript 编译为本地机器码( 更像C 或 C++), 但这一操作是透明的 , 所以从用户的角度来看, 它表现的还是像纯粹的解释型语言一样。 没有单独的编译步骤, 这减少了维护和部署的麻烦。 你所要做的只是更新JavaScript 文件, 然后你的修改就自动生效了。
Node 程序的另一个好处是它的平台无关性。

Node 的生态系统

“ 技术栈” 的缩略语。
比如说, Linux、 Apache、 MySQL 和 PHP 被称为 LAMP 栈。
MongoDB的工程师 Valeri Karpov 发明了一个缩略语 MEAN, 指代 Mongo、 Express、 Angular 和Node。

将所有这些技术结合到一起的是 JavaScript, 所以为了做到兼容并包, 我将其称为“ JavaScript 技术栈”。 对于本书而言, 即指 Node、 Express 和 MongoDB。

授权

GNU通用公共授权( GPL)
GPL 是非常流行的开源授权, 它为保证软件的自由做了精巧的构思。 这意味着如果你在项目中用了 GPL 授权的代码, 那么你的项目必须也是 GPL 授权的。 这自然也就意味着你的项目不能是闭源的。

Apache 2.0
这个授权像 MIT 一样, 你可以为自己的项目使用不同的授权, 包括闭源的授权。 然而,你必须对那些使用 Apache 2.0 授权的组件做出声明。

伯克利软件分发( BSD)
与 Apache 类似, 这个授权允许你为自己的项目使用任何授权, 只是你声明使用了 BSD授权的组件。

从Node开始

npm 是随处可见的 Node 开发包管理器( 我们就是用它获取并安装 Express 的)。“ npm” 跟PHP、 GNU、 WINE 等那些古怪的传统名字不一样, 它不是首字母缩写( 所以也没有大写), 而是“ npm 不是缩写” 的递归缩写。

进入 Node 的首页 http://nodejs.org

npm 是一个快速、高能并且毫不费力的包管理器,包管理器的两个主要职责是安装开发包和管理依赖项。

在使用 npm 时,( 毫无悬念) 最主要的命令是 install。 比如要安装 Grunt( 一个流行的JavaScript 任务执行器), 你将会( 在控制台里) 发起下面这个命令:
npm install -g grunt-cli
标记 -g 的意思是告诉 npm 这个包要全局安装, 即系统全局都可以访问它。

用Node实现的简单Web服务器

Node 所提供的范式跟传统的 Web 服务器不同: 你写的程序就是 Web 服务器。 Node 只是给你提供了一个构建 Web 服务器的框架。

如果你用的是远程的机器( 比如通过 SSH 访问的), 记得浏览 localhost 时访问的不是你眼前的那台机器。

Hello World

  var http = require('http');
http.createServer(function(req,res){
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end('Hello world!');
}).listen(3000);
console.log('Server started on localhost:3000; press Ctrl-C to terminate....');

确保是和 helloWorld.js 在同一个目录下, 输入 node hello World.js。
然后打开浏览器访问http://localhost:3000, 你的第一个 Web 服务器就建成啦!

在开发过程中,每次修改代码保存后,我们都需要手动重启程序,才能查看改动的效果。使用 supervisor 可以解决这个繁琐的问题,全局安装 supervisor:
npm install -g supervisor
运行 supervisor --harmony index 启动程序 。

事件驱动编程Node 的核心理念是事件驱动编程。

路由是指向客户端提供它所发出的请求内容的机制。

var http = require('http');
http.createServer(function(req,res){
var path = req.url.replace(/\/?(?:\?.*)?$/,'').toLowerCase();
switch(path){
    case '':
        res.writeHead(200,{'Content-Type':'text/plain'});
        res.end('Homepage');
    break;
    case '/about':
        res.writeHead(200,{'Content-Type':'text/plain'});
        res.end('About');
    break;
    default:
        res.writeHead(200,{'Content-Type':'text/plain'});
        res.end('Not Found');
    break;
}
}).listen(3000);
console.log('Server started on localhost:3000; press Ctrl-C to terminate');

运行这段代码, 你会发现现在你可以访问首页( http://localhost: 3000) 和关于页面( http://localhost:3000/about)。
所有查询字符串都会被忽略( 所以 http://localhost:3000/?foo=bar 也是返回首页), 并且其他所有 URL( http://localhost:3000/foo) 返回的都是未找到页面。

ejs 有 3 种常用标签:
<% code %>:运行 JavaScript 代码,不输出
<%= code %>:显示转义后的 HTML内容
<%- code %>:显示原始 HTML 内容
注意:<%= code %> 和 <%- code %> 都可以是 JavaScript 表达式生成的字符串,当变量 code 为普通字符串时,两者没有区别。当 code 比如为

hello

这种字符串时,<%= code %> 会原样输出

hello

,而 <%- code %> 则会显示 H1 大的 hello 字符串。

梦想还是要有的,万一实现了呢?