fengdayin fengdayin
关注数: 20 粉丝数: 21 发帖数: 890 关注贴吧数: 5
我想给一些菜鸟看看nodejs的代码应该怎么写 var cookie = require('cookie'); module.exports = function (req, res, conf, views, db) { ..var body = req.body, ....id = req.ids[0], ....usid = cookie.parse(req.headers.cookie).usid; ..function redirect () { ....res.writeHead(302, { 'location' : '/accounts' }); ....res.end(); ..} ..function joinpage () { ....res.writeHead(200, { 'Content-Type' : 'text/html;charset=utf-8' }); ....res.write(views.ACCOUNTS_JOIN); ....res.write(views.unit({ ......id : 'accounts_menu', ......name : 'accounts_menu', ........options : { ..........class_id : id ........} ....})); ....res.write(views.unit({ ......id : 'accounts_join', ......name : 'accounts_join', ......options : { ........action : '/accounts/' + id + '/join', ........num : '0' ......} ....})); ....res.end(views.FOOTER); ..} ..db.session(usid, function (state) { ....// 已经建立会话 ....if (state) { ......joinpage(); ......return; ....} ....// 没有建立会话 ....redirect(); ..}); }; ////////////////////////////////////////////////////////////////////////////////////////////////////////// 这段代码,是nodejs其中一个路由处理函数. 使用到了views视图模型,db数据库模型,以及conf全局配置文件. 并且使用了cookie模块来解析会话ID. views视图模型 : 生产HTML界面 [可以随时切换到PC或者移动HTML,接口一致] db数据模型 : 生产数据库数据 conf全局配置文件 :你所需要的全局环境内容 代码的功能: 检测请求 ....是否建立会话? ........是,跳转到"/"路由 ........否,为用户显示登录界面 其中views负责生产视图界面, 在views模型中缓存了大量的常量,类似ACCOUNTS_JOIN,是页面布局。 对于其中的动态内容,采用facebook的bigpipe技术。 views.unit(/*id, name, css, js, content*/)输出script片段,分流到浏览器渲染。 整个服务器端在启动时渲染完毕所有的页面布局体,并缓存到views模型中,动态内容由bigpipe发送到前端渲染。
用闭包来提升几何级的性能 假设你写了一个tooltip,也就是传说中:鼠标放在元素上,弹出提示。 有一个指示器来保存弹出的次数,来做一些特别的用处。 如果页面有1000个元素调用了tooltip,那么该如何写。 (2楼将放上低效的写法作为比较)(为了节省代码,alert()表示弹出tooltip (PS:也许有同学要说,只要写一个命名空间,在这个空间把所有的属性方法全塞到 一起就全搞定了。 但事实是当一个页面有上千行代码的时候,你把这个代码交给别人, 别人完全不知道你其中的add函数是值得什么意思,它涉及到哪些上下文和属性方法。 模块化代码是必需要的:当你需要修改一个方法时,你只需要关注他所在的环境。) 高效版本: /*===================================================================*/ var Tooltip = (function () { // tooltip类 var toolcount = 0; // 计数器 return { addTooltip: function () { // 闭包存储toolcount toolcount++; alert('显示' + toolcount + '次tooltip'); } }; })(); ////////////////////////////////////////// var Element = function () { // 页面的元素类 Tooltip.addTooltip(); }; //////////////////////// var Factory = { // 工厂运行 run: function () { for (var i = 0; i < 1000; i++) { new Element(); } } }; //////////////////////////////////////////// // 运行 Factory.run(); /*===================================================================*/ PS: 通过toolcount的值动态存储到Tooltip的作用域中。 在1000个Element实例对象的每次调用,都把toolcount进行了计算递加。 通过闭包,避免了构造器方式保存1000个Element的指示。 这只是个实例, 针对构造器保存数据的简化方法并不止如此简单。
为什么什么时候用 call() , applay() 函数 一直有人问我 call() , applay() 函数的用法, 感觉是多此一举,基本不用。 那么现在用一个实践说明一下。 有许多时候是只能用call() , applay() 才能有效。 /** * 目标: * (1) 建立一个Poe对象,指代页面上所有的同类标签元素,比如所有的div元素。 * (2) 使用P的each()函数遍历,输出每个div元素的标签名+索引值。 * var p = new Poe('div'); * p.each(function(){ ******alert(this.tagName + ' ' + index); **});********输出DIV0 DIV1 DIV2 ...********** /*===================================================================*/ // 创建P()构造函数 var Poe = function (selector) { /**/this.create(selector); // 构建 }; // 重写P的原型对象 Poe.prototype = { ////初始构建函数 /**/create: function (selector) { /******/this.selector = selector; /******/this.elements = document.getElementsByTagName(selector); /******/this.length = this.elements.length; /**/}, ////遍历函数 /**/each: function (callback) { // 回调函数callback /******/var i = 0, len = this.elements.length; /******/for (; i < len; i++) { /******/ callback.call(this.elements[i], i); // call()函数 /******/} /**/} }; window.onload = function () { /**/var p = new Poe('div'); /**/p.each(function (index) { ////输出每个div的标签名字'DIV'和索引值 /******/alert(this.tagName + ' ' + index); /**/}); }; ////////输出DIV0 DIV1 DIV2 ... //在this.elements[i]中,并没有callback()这个方法, //也就是无法 this.elements[i].callback(); //于是采用借用的方式 callback.call(this.elements[i], i); /*===================================================================*/
1 下一页