许多刚刚开始接触 Node.js 后端开发的友人,在运用原生 http 模块编写完几个接口之后,常常会感觉到处理静态页面、路由分发这类基础工作格外繁杂。
写代码时,每一行都得亲自去编写,判断 MIME 类型时,每一个都要自己来进行判定,如此一来开发效率着实不算高。
这时候,一个轻量级的 Web 框架就能派上大用场。

当下,在 GitHub 上,收获了 47.7k 星的 Express,其下载量始终处于遥遥领先的态势,它是极为适合用于快速搭建中小型应用的一种选择。
生成器快速建起项目骨架
靠自身动手去搭建 Express 的项目架构,虽说也能够运行起来,然而远远比不上运用官方工具来得迅速。
那种名为 express - generator 的脚手架工具,能够协助我们去自动生成被推荐的标准目录,其中涵盖 routes 文件夹、views 文件夹以及各种各样的配置文件。
要是你已然拥有一个项目目录,例如此前创建的 forms 文件夹,那就径直在终端当中进入这个目录,运行 express 命令便可完成。
系统会给出目录非空的提示,询问你是否要继续,在这个时候,输入 y 进行确认便可以了。
跟着继续运行 npm install 去安装依赖包等,待项目启动之后,于浏览器将 http://localhost:3000 打开,可以看到生成好的默认主页!
整个过程从零到看到页面,甚至用不了五分钟。
静态页面不用再自己读文件
D:ProjectsnodejsNodeDemoforms>npm install express --save
npm WARN forms@1.0.0 No description
npm WARN forms@1.0.0 No repository field.
+ express@4.17.1
added 50 packages from 37 contributors and audited 127 packages in 11.149s
found 0 vulnerabilities
要是处于没有框架的状况下,要返回一个 HTML 页面,那就得借助 fs 模块去读取文件,并且还得手动去设置 Content-Type。
用 Express 处理静态页面,逻辑被大幅简化。
D:ProjectsnodejsNodeDemoforms>npm install -g express-generator
D:Program Filesnodejsnode_globalexpress -> D:Program Filesnodejsnode_globalnode_modulesexpress-generatorbinexpress-cli.js
+ express-generator@4.16.1
added 10 packages from 13 contributors in 6.346s
仅仅是要在与之对应的路由文件之中去调用 res.render 这个方法,把模板文件的名称传递进去,如此一来框架便会自动在 views 目录里将相应的模板找寻到并且进行渲染使其呈现出来。
D:ProjectsnodejsNodeDemoforms>express
warning: the default view engine will not be jade in future releases
warning: use `--view=jade' or `--help' for additional options
destination is not empty, continue? [y/N] y
create : public
create : publicjavascripts
create : publicimages
create : publicstylesheets
create : publicstylesheetsstyle.css
create : routes
create : routesindex.js
create : routesusers.js
create : views
create : viewserror.jade
create : viewsindex.jade
create : viewslayout.jade
create : app.js
create : package.json
create : bin
create : binwww
install dependencies:
> npm install
run the app:
> SET DEBUG=node10:* & npm start
比如在入口文件 app.js 当中,借助 app.use('/',indexRouter) 这般的代码,将路径与路由进行绑定。
在 /routes/index.js 里,存在着真正的处理逻辑,其代码十分简洁,不存在来回绕圈的判断,仅仅用几行代码,便达成了从请求直至页面返回的操作。
动态接口用 res.send 快速响应
D:ProjectsnodejsNodeDemoforms>npm install
added 4 packages from 3 contributors, removed 2 packages, updated 16 packages and audited 141 packages in 12.091s
found 0 vulnerabilities
D:ProjectsnodejsNodeDemoforms>npm start
> forms@0.0.0 start D:ProjectsnodejsNodeDemoforms
> node ./bin/www
GET / 200 17.703 ms - 207
GET /stylesheets/style.css 200 5.473 ms - 111
不只是页面,做 API 接口同样方便。
倘若打算去做一条 /users 路径,使之返回某些动态数据,于 app.js 之中引入用户路由然后进行挂载。

在与之对应的 /routes/users.js 文件里头,借助 res.send 这个方法,直接将 JSON 数据或者字符串,返还给客户端。
这种处理方式特别适合开发初期快速验证逻辑。
曾经,我针对 Java Blueprint EJB 去做一项简易的增删改查操作,仅仅是配置服务器,以及调试各类 web server,就耗费了两天时间。
//引入 express
var express = require('express');
var router = express.Router();
/* 获取静态页面 */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' });
});
//导出抹开
module.exports = router;
Express 一举将 HTTP 服务器与应用代码融合在一起,开发者凭借代码去操控服务器行为,如此便节省了大量繁杂累赘的环境配置所需时间。
路由设计让代码结构更清晰
稍微大那么一点儿的项目,一旦把所有那样不同的接口都一股脑地堆放在同一个文件当中,到了后期进行维护的时候,就会变得极其令人头疼不已。
Express 的路由系统天然支持模块化拆分。
var indexRouter = require('./routes/index');
于 app.js 里面,借助 app.use 来加载各异的路由模块,各个路由模块仅仅关注自身所负责的路径。
app.set('views', path.join(__dirname, 'views'));
......
//中间省略数行代码
......
app.use(express.static(path.join(__dirname, 'public')));
比如说,那所有跟首页有关联的逻辑,都放置在 index.js 里面,而所有和用户相关的接口,则是放在 users.js 当中。
在每一个路由文件当中,针对于不一样的 HTTP 方法,那像 GET、POST 这些,能够去撰写单独的处理函数呢。
app.use('/', indexRouter);
此以约定大于配置的形式,使得新人接手项目之际,也能够迅速找寻到相应的代码位置。
不少随后流行起来的 Node.js 框架,像 Koa 这般,尽管是由原班人马所打造,然而在设计思路方面,依旧能够察觉到 Express 简洁路由的那种影子。
开发效率提升的真实感受
router.get('/', function(req, res, next) {
res.send('respond with a resource');
});
就实际开发体验而言,运用 Express 去构建一个简易的 CRUD 应用,的确能够将时间缩短至几个小时乃至更短的时长。
var usersRouter = require('./routes/users');
app.use('/users', usersRouter);
不需要纠结服务器软件的安装,不需要反复调试连接池配置。
当然了,若所面对的是实实在在 的大规模企业级的应用,牵涉复杂的分布式事务以及海量的并发情况,我个人内心还是更加倾向于 Java 生态。

但针对于中小型的应用情况,以及内部所使用的工具,还有快速进行原型验证的需求而言,Node.js 与 Express 绝对是属于首选的那种组合。
在下一篇当中,我们会进一步深入探讨,讲讲在 Express 这个环境里,怎样去获取从前端传递过来的各类参数,以及如何与模板引擎协同,进而实现更为复杂的页面渲染操作。

Comments NOTHING