原文出处:近期nodejs-web开发的一些总结php
在node web开发学习和实战的路上兜兜转转,通过半年的学习积累,对nodejs web开发开始以为走上门道了,知道node文件该放在什么路径下,知道怎么分离路由,怎么往模板里塞数据,怎么构造数据库,建哪些字段,怎么构造json数据了。
因为我后端开发经验不足,因此上手node这门后端语言走了很多弯路,好在个人node系统项目终于完成,也算是小有收获。
关于如何快速学习一门新技术,如何快速地进行知识积累,以及进行项目技术选型,一些功能应该交给前端仍是后端处理有了一些新的认识。css
让程序员去学习一门新的技术有两种状况,自我驱动和外部驱动,自我驱动主要依靠自身的兴趣,对新的技术充满好奇因此迫切想去尝试,这种驱动没有时间上的压力。另外一个缘由是外部驱动,外部驱动是老大给你安排了一个新任务,好比说用node+mongodb开发一个内部系统,这种驱动就须要你能快速学习新技能,并快速完成所需技术的知识积累。html
个人建议是看视频
->看博文教程
->clone优秀简单的demo练习
->看官方api文档
。前端
为何第一步是看视频而不是看书呢?以前的学习经验告诉我,看书容易产生注意力不集中,厚厚一本书看下去会产生情绪厌烦感,会让人误认为该技术多少坑多么难,从而产生心理抗拒惧怕动手实践。node
相反,第一步看视频尤为是讲核心理论和项目实践结合的视频,会让你迅速对这个技术着迷,以为这样写代码仍是很容易的,实现什么样的功能原来如此简单。看视频还有一个好处,你能够一边看老师讲解,一遍本身敲代码看效果,由于基本是填鸭式抄代码,不会遇到多少问题,自信心也上去了。这里推荐一个靠谱网站:慕课网,很多技术我都是从这里入门的。git
第二步是看博文教程,谷歌搜索关键词node mongodb best practice能够搜出不少,推荐国外的博客教程,里面一般会附上博主在 github上的代码demo,把这些demo clone下来,本身安装运行跑起来,看看优秀的代码结构是怎样构建的,该功能别人是怎么实现和处理的。程序员
第三步是看优秀开源demo,这个和上面第二步有些重复,看优秀博客教程的同时就会下载博主的示例代码研究,你也能够谷歌搜索关键词找github上star多的入门级demo.
作完以上三步,相信你已经具有了使用新技术构建项目的能力了,经过研究别人的demo也掌握了一些基础功能的实现,好比注册登陆功能。那么,下面你能够大胆开始新项目的编码了!
在项目编码阶段,你须要作的就是看官方api了,个人建议是把api先粗略看过一遍,遇到api写的不够清楚的,能够借助google和stackoverflow搜索答案。github
那么,真的不须要看书吗?web
NO!若是想快速上手作项目,个人建议是看视频比看书上手的快,可是书上的详细的理论知识是视频没法给与的,在我作完这个node项目时,我从新看《深刻浅出node》时,我发现我理解的更加深入了,也更容易理解其中的一些原理了。mongodb
这个技术选型包括项目代码结构的架构和工具、技术的选型。
代码结构的设计是很重要和必要的,代码结构紊乱会随着项目功能增长和复杂度增长产生不少的弊端,也不利于项目的维护。
个人作法是看别人的教程,别人的代码结构是怎样构建的,对于你的项目是否合适。我最终采用了MEAN架构
app里放后端代码,public为前端静态资源,config为路由文件,使用grunt启动项目,编译less,使用grunt插件让项目代码改变自动重启服务。
Node框架我选用了Express,缘由很简单,Express相比Koa发展的更成熟更稳定,文档也更健全,教程资料也更多。对于新手来讲,个人建议是选择更稳定资料更多的框架,不要说什么框架什么技术过期了,对于没接触作过项目的你来讲这些框架、技术都很新。
node开发你只要学会代码调试工具就好,webstorm里的断点调试工具以及一些好用的node服务重启工具,能够参考个人Nodejs Web开发一些好用的工具这篇文章。
当我开发第一个与后端有较多合做的项目时,当时用的是PHP,因此写PHP的同窗在个人html代码里嵌入了不少<?php echo('') ?>
这样的代码,前端和后端同时维护一个文件,这样的处理方式糟糕透了。
使用模板语言,使用RESTful接口,后端来构造RESTful接口,前端在模板里添加数据,这样的方式让先后端分离开来,友好多了。
若是使用MEAN架构,前端的代码所有在/public
文件夹里,放jade/css/js/images/less文件,后端代码在/app
,/config
和app.js
里,处理数据逻辑和路由。
在没作该node项目前,一些功能我都会以为前端能够实现,在作完node项目后,个人理解是这些功能放在后端处理更合适。
Favicon网页图标前端来设置仍是后端?
我之前的作法是前端在<head></head>
里嵌入一段<link rel="shortcut icon" href="/images/favicon.ico" type="image/x-icon">
这样的代码,前端来设置网页图标。
这样的弊端是要给全部html/模板文件
头部添加该link
,该作法纯碎人肉操做,对于html文件太多的项目,一个个手动添加容易遗漏也会死星人。
如今的作法是放在后端来处理,npm install serve-favicon
安装网页图标模块,在app.js
里插入这段代码:
var favicon = require('serve-favicon'); app.use(favicon(__dirname + '/public/images/favicon.ico'));
给项目全局使用该网页图标。
当前页连接hover选中状态前端设置仍是后端设置?
我之前的作法是使用js的switch case判断url是什么给连接添加active样式。
该作法的弊端是,当切换的连接太多时手动一个个增长case显得简单粗暴,并且一些连接是生成的,没法判断连接是什么。
如今个人作法是交给后端判断连接,后端经过req.path判断当前连接,前端经过在模板里的class里判断后端的req.path
里的值和模板里数据是否一致添加active.
具体处理代码以下:
/app/controllers/nav.js
res.locals.activeNav = function(nav){ var result = ''; var _path = req.path; if(nav == _path){ result = 'active'; }else{ result = ''; } return result; }
/app/views/pages/nav.jade
a(href="/admin/line/my",class="#{activeNav('/admin/line/my')}")
分页列表先后端如何配合处理?
后端给前端提供totalPage和currentPage,前端给currentPage的元素的class加上active类。
下面是一些处理的核心代码:
模板代码:
ul.pagination li a(href="/?p=0") span(aria-hidden="true") « span.sr-only Previous - for (var i = 0; i < ((totalPage > 5) ? 5 : totalPage); i++){ if (currentPage == (i+1)) li.active span #{currentPage} else li a(href="/?p=#{i}") #{i+1} - } if(totalPage>5) li a ... li a(href="/?p=#{totalPage-1}") span(aria-hidden="true") » span.sr-only Next
后端代码:
//获取每页数据 var results = issues.slice(index,index+count); if(err){ console.log(err) }else{ res.render('abc',{ title: 'xxx', currentPage: (page+1), //向上舍入取整 totalPage: Math.ceil(issues.length/count), issues: results }) }