node.js脚手架搭建
来源:互联网 发布:腾讯员工福利 知乎 编辑:程序博客网 时间:2024/04/30 09:42
我是主攻后端的开发人员,但是项目人手紧缺,我的经历刚好是做过node.js后端,所以我们前后端的分离工作就交到我的头上来了,这次我们采用node.js。前端的使用和后端果然还是很多不同的。
node.js在系统中处的作用我的理解就是分离前后端,后端更多提供一个数据服务,传统的后端可能就是MVC,在我看来C就是控制器,主要的工作就是在参数的校验和数据与视图的整合。这个部分是可以交给前端去做的,让后端与视图分离开。
现在项目中就是页面直接存放在tomcat的webapps下面,这样前端的稍微改动都要整个项目去上线,这样牵扯的东西太多。因此node.js也给前端更多的控制权。不用什么请求都落到后端应用服务器,很多请求在node.js就可以被过滤,因此也可以阻挡一些流量,保证了后端服务器的负载。
搭建前端的node.js我使用了比较流行的框架,这两年Github上javascript的库层出不穷,npm包管理器给node.js的安装也提供了很多便利。我使用了express去提供路由,页面渲染也选择express支持较好的ejs。
脚本语言就是文件的执行,解释执行是一个比较大的特点,node.js很好的把很多功能封装成模块,因为node.js对OO的支持并不是那么好,所以我尽量不去用一些utils.herits等等方法去实现原型链的继承。
首先要建立好node.js目录,分为两个大的部分,静态资源和请求的路由处理。我分别起名route和view,有的叫controller或则public等等,route就是接收请求的处理,并把数据和网页模板等结合起来输出给用户,然后需要启动文件,初始化一些组件,我起名app.js.还有一些工具类或则配置。我用的utils和config,网上貌似也有工具直接可以初始化node.js目录。
这就是我创建的目录:
首先我们编写app.js加载整个项目需要的组件:
// 定义全局变量global.root = __dirname// 依赖模块var express = require('express')var body_parse = require('body-parser')var path = require('path')var router = require('./routes/route.js')var cookies_parser = require('cookie-parser')// 初始化句柄var http = require('http')var app = express()var ejs = require('ejs')// 配置var conf = require('./config/api')// 设置监听端口app.set('port',conf.node_port || 3000)app.set('views',__dirname + "/views/page")// 模版引擎 这里指定默认文件后缀,如果不是html需要指定具体后缀app.set('view engine','ejs')//加载环境变量app.use(body_parse.urlencoded({ extended: false }));app.use(cookies_parser());app.use(express.static(path.join(__dirname,'/views'))); //启动及端口http.createServer(app).listen(app.get('port'),function(){ console.log('server started, listen port : ' + app.get('port'));}); // 路由router(app)//加载错误处理解决办法app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err);});if (app.get('env') === 'development') { app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: err }); });}app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: {} });});//导出app对象module.exports = app;
我在很多文件需要引用项目当中其他模块,当然写相对路径是没问题的,但是node.js提供了全局变量global,我打算放一个根目录的路径进去,照样可以实现功能的,__dirname是node.js内置的变量,是获取当前文件的执行路径。
路由部分
express模块是封装了node.js原生的http请求,我希望的是一个逻辑对应一个子路由文件,例如用户逻辑,但是我希望app.js里引入路由是一个简单的“总“路由,因此采用这样的结构:
其中一个子路由:
var http = require('http')var http_utils = require('../utils/http_utils')var conf = require('../config/api')var host = conf.java_server.host;var port = conf.java_server.port;module.exports = function (app) { // get请求 app.get('/',function(req,res) { // get请求 var get_params = req.query; console.log(JSON.stringify(get_params)); // 第二种获取方式 console.log(JSON.stringify(req.params)); }) app.post('/',function(req,res) { // post请求 var post_params = req.body;l console.log(JSON.stringify(post_params)); res.render("users/demo", {title : "this is title data"}); })}
任何一个请求进来都会遍历所有路由像一个链路一样。路由就这样获取到请求,并且主要做两件事情,一是组织数据,无论是从后端服务器还是其他地方。第二就是找到页面并渲染。这里页面采用
res.render("page",{title : data});
就是找到page页面,并且将title数据替换成data。title是模板中的占位,data是我们获取到的数据。至于page完整的路径是在app.js 中指定。
app.set('views',__dirname + "/views/page")
这样设置之后,框架会自动去寻找__dirname/views/page/下面的对应的页面。
静态资源部分
这里放页面文件和静态的css和js文件。由于在app.js配置了路径:
app.use(express.static(path.join(__dirname,'/views')));
在页面引用资源也可以写css/test.css。这样就可以不用去写相对路径。
ejs模版展示部分网上也有相关的文档语法,就不废话了,据说根php的语法类似。
工具部分
可以把公用的常用的东西封装成工具,例如获取后端服务器的地址。同步发送http请求等等,关于node.js的IO模型为异步非阻塞,我同步的发送http不知道会不会引起一些问题。我采用的sync-request模块。还有promise-request co等工具。有时间再去研究。这次本来打算用vue.js来处理页面相关的数据,但是时间紧迫没去研究。
心得
相信把后端独立出来之后后面前端也可以单独的改造,后端更多关注业务逻辑的实现。前端更多关注视图的变化,这次的迁移也只要把请求后端的接口放在路由去,页面处理下展示即可,代码得到最大程度的复用。
0 0
- node.js脚手架搭建
- vue.js脚手架搭建
- vue.js脚手架环境搭建
- 从零开始搭建一个vue.js的脚手架
- 从零开始搭建一个vue.js的脚手架
- 从零开始搭建一个vue.js的脚手架
- Vue.js 介绍及其脚手架工具搭建
- vue.js脚手架vue-cli的搭建
- 如何使用Grunt脚手架快速创建Node.js项目
- node.js 环境搭建
- Node.js环境搭建
- node.js环境搭建
- Node.js环境搭建
- node.js环境搭建
- Node.js搭建服务器
- Node.JS 环境搭建
- Node.js环境搭建
- node.js搭建服务器
- Js 删掉所有的html标签
- 【Java集合类源码分析】HashMap源码分析一
- ABAP增强总结
- QT常用控件学习
- 1091. Acute Stroke 解析
- node.js脚手架搭建
- 四种波动率
- 比特币的故事(The Story of Bitcoin)
- Unity中实现鼠标拖动旋转物体和鼠标点击旋转物体
- 《Android安全攻防实战》读书笔记——利用App中的漏洞
- HashMap能够调用的方法和事例
- Beatiful sentences
- Unity Shader之剔除、深度测试、alpha测试基础示例
- chm文件打不开解决方法