月盾的博客

让你的Node.js应用跑得更快的10个技巧

月盾

Node.js 受益于它的事件驱动和异步的特征,所以已经很快了。但是,在现代网络中只是快是不行的。如果你打算用 Node.js 开发你的下一个Web应用的话,那么你就应该无所不用,让你的应用更快,异常的快。本文将介绍10条经过检验得知可大大提高Node速度的应用技巧。废话不多说,让我们逐条来看看。

**1.**并行

创建 Web 应用的时候,你可能要多次调用内部 API 来获取各种数据。比如说,假设在 Dashboard 页面上,你要执行下面这几个调用:

  • 用户信息 -getUserProfile().
  • 当前活动 -getRecentActivity().
  • 订阅内容 -getSubscriptions().
  • 通知内容 -getNotifications().

为了拿到这些信息,你应该会为每个方法创建独立的中间件,然后将它们链接到 Dashboard 路由上。不过问题是,这些方法的执行是线性的,上一个没结束之前下一个不会开始。可行解决案是并行调用它们。

如你所知由于异步性,Node.js 非常擅长并行调用多个方法。我们不能暴殄天物。我上面提到的那些方法没有依赖性,所以我们可以并行执行它们。这样我们可以削减中间件数量,大幅提高速度。

我们可以用 async.js 来处理并行,它是一个专门用来调教 JavaScript 异步的 Node 模块。下面代码演示怎样用 async.js 并行调用多个方法的:

如果你想更深入了解 async.js ,请移步它的 GitHub 页面。

2. 异步

根据设计 Node.js 是单线程的。基于这点,同步代码会堵塞整个应用。比如说,多数的文件系统 API 都有它们的同步版本。下面代码演示了文件读取的同步和异步两种操作:

不过要是你执行那种长时间的阻塞操作,主线程就会被阻塞到这些操作完成为止。这大大降低你应用的性能。所以,最好确保你的代码里用的都是异步版本 API,最起码你应该在性能节点异步。而且,你在选用第三方模块的时候也要很小心。因为当你想方设法把同步操作从你代码中剔除之后,一个外部库的同步调用会让你前功尽弃,降低你的应用性能。

3. 缓存

如果你用到一些不经常变化的数据,你应该把它们缓存起来,改善性能。比如说,下面的代码是获取最新帖子并显示的例子:

如果你不经常发贴的话,你可以把帖子列表缓存起来,然后一段时间之后再把它们清理掉。比如,我们可以用 Redis 模块来达到这个目的。当然,你必须在你的服务器上装 Redis。然后你可以用叫做 node_redis 的客户端来保存键/值对。下面的例子演示我们怎么缓存帖子:

看到了吧,我们首先检查 Redis 缓存,看看是否有帖子。如果有,我们从缓存中拿这些帖子列表。否则我们就检索数据库内容,然后把结果缓存。此外,一定时间之后,我们可以清理 Redis 缓存,这样就可以更新内容了。

4. gzip 压缩

开启 gzip 压缩对你的 Web 应用会产生巨大影响。当一个 gzip 压缩浏览器请求某些资源的时候,服务器会在响应返回给浏览器之前进行压缩。如果你不用 gzip 压缩你的静态资源,浏览器拿到它们可能会花费更长时间。

git常用命令

月盾

查看、添加、提交、删除、找回,重置修改文件

git help # 显示command的help

git show # 显示某次提交的内容 git show $id

git co – # 抛弃工作区修改

git co . # 抛弃工作区修改

git add # 将工作文件修改提交到本地暂存区

git add . # 将所有修改过的工作文件提交暂存区

git rm # 从版本库中删除文件

git rm –cached # 从版本库中删除文件,但不删除文件

git reset # 从暂存区恢复到工作文件

mongoose实现翻页

月盾

随着吐槽的内容越来越多,单页显示就显得不够文雅了,分页功能是一个完整系统必备的。所以就决定加上这个功能,不过分页实现起来并不容易,找了下前辈们的资料,感觉都很复杂,所以还是实现一个简单翻页好了,就是只有上一页,下一页这样简单的功能。

首先看下mongoose API,find方法源码:

Model.find = function find (conditions, fields, options, callback){
if("function"==typeof conditions){
    callback = conditions;
    conditions ={};
    fields = null;
    options = null;
}elseif("function"==typeof fields){
    callback = fields;
    fields = null;
     options = null;
 }elseif("function"==typeof options){
     callback = options;
     options = null;
 }
 // get the raw mongodb collection object
   var mq =newQuery({}, options,this,this.collection);
   mq.select(fields);
 if(this.schema.discriminatorMapping && mq._selectedInclusively()){
     mq.select(this.schema.options.discriminatorKey);
 }
 return mq.find(conditions, callback);
 };

其中有4个参数,find(条件,需要查询的字段,选项,回调),这样看着太抽象,来一段实际应用的代码:

router.get("/admin/blogList", function(req, res) {  
    var user = req.session.user;  
    var pageIndex = 1;  
    var pageSize = 5;  
    pageIndex = req.query.pageIndex == undefined ? pageIndex  
            : req.query.pageIndex;  
    pageSize = req.query.pageSize == undefined ? pageSize : req.query.pageSize;  
    Blog.find({}, null, {  
        sort : {  
            "_id" : -1  
        },  
        skip : (pageIndex - 1) \* pageSize,  
        limit : pageSize  
    }, function(err, docs) {  
        if (err)  
            res.send(err.message);  
        res.render("admin/bloglist", {  
            blogList : docs,  
            user : user,  
            pageIndex : pageIndex,  
            pageCount : docs.length  
        });  
    });  
});

其中Blog.find({},null,{sort:{"_id":-1}, skip :( pageIndex -1)* pageSize, limit : pageSize },function)
这一段第一个参数为空,意思查询所有,第二个参数null,查询所有字段,第三个参数有倒序,分页。
然后就是页面上两个翻页按钮:

NodeJs中的express框架获取http参数

月盾

express获取参数有三种方法:官网介绍如下

hecks route params (req.params), ex: /user/:id

Checks query string params (req.query), ex: ?id=12

Checks urlencoded body params (req.body), ex: id=12

1、例如:127.0.0.1:3000/index,这种情况下,我们为了得到index,我们可以通过使用req.params得到,通过这种方法我们就可以很好的处理Node中的路由处理问题,同时利用这点可以非常方便的实现MVC模式;

2、例如:127.0.0.1:3000/index?id=12,这种情况下,这种方式是获取客户端get方式传递过来的值,通过使用req.query.id就可以获得,类似于PHP的get方法;

3、例如:127.0.0.1:300/index,然后post了一个id=2的值,这种方式是获取客户端post过来的数据,可以通过req.body.id获取,类似于PHP的post方法;

下面举例介绍下这三个方法:

如下一个test.html代码

<form action="/index" method="get">
   <input type="text" name="login_name" />
   <input type="submit" value="Sign In" />
</form>

在nodeJs中我们要自定义HTTP,因此创建index.js

app.post('/:key',
function(req, res) {
    console.log(req.params.key); //输出index
    console.log(req.body.login_name); //输出表单post提交的login_name
    res.send('great you are right for post method!'); //显示页面文字信息
});
app.listen(3000);

转自:http://handyxuefeng.blog.163.com/blog/static/454521722012921287791

程序员如何留住健康?

月盾

相信大家已经注意到了,程序员的大部分时间都花在电脑桌前编程,这会损害程序员的健康。其实不需要多么复杂的养生,你只需每天做一些小小的改变,就可以摆脱病痛、保持健康。

变换姿势

虽然站立桌、昂贵的椅子和一些基于人体工程学的玩意的确很酷,哪怕 LINUS(linux 创始人)都在踏步机前工作,而事实上你并不需要这些。

关键是要变换姿势,如果你保持一个姿势数个小时不活动,你的脖子在数天后疼痛是必然的。每 15 分钟站起、坐下、跳、蹲下、活动一下手脚、放松一下眼睛;每小时变换一下姿势;每天走一走,爬一些楼梯,保证你的健康会得到很大的改善,关节的僵硬和肌肉 的疼痛都会得到缓解。

我个人拥有一个电动站立式办公桌, 每个小时我都变换一下姿势。而且我运行一个程序来提醒我每 15 分钟做一个小休息,每个小时做时间较长的休息。对于苹果X操作系统而言,有个“Time out”应用非常好,在 windows 上,我一般采用“Big Stretch Reminder”。

锻炼

锻炼是改善健康最好的方法之一,但是必须用正确的方法锻炼。首先要确保不要在无用的事情上浪费时间。

不要跑步

跑步被广泛当作一种锻炼方式,其实并不适用于所有人。在决定通过跑步来锻炼以前,你需要确认两件事情:1 你的身体状态足以满足跑步锻炼所需,一个严酷的事实是大部分程序员达不到跑步锻炼所需的身体条件。(译者注:对胖程序猿来说,跑步极有可能会损伤膝关 节)2 跑步锻炼需要掌握正确的跑步姿势和跑步方法。

我曾经常跟随在街道跑步的人们,紧跟他们的步伐和僵硬的背部(译者注:作者可能指一部分跑步的人姿势不对,背部僵硬),不正确的跑步姿势极有可 能损伤背部和膝部。如果你想跑步锻炼,请先确保体重不要过大,学习正确的姿势和方法,以慢速跑和短距离跑开始练习。所有超过 5 公里的跑步练习都是过度的,最好是不要以跑步来锻炼(译者注:对长期缺乏锻炼的程序员而言?)

不要骑自行车

你都在电脑前坐了一天了,锻炼的时候又坐在自行车上,哈哈。多么有才的选择啊,先生!如果你真的喜欢骑自行车,那么去骑吧,但不要期望能从中得到什么。

不要到健身房健身

高强度的健身方式适用于有意保持健美外形或有意取得某种特定目标的职业人士。通常,高强度训练不适合程序员们。

我们都有自己的职业目标和适合自己的使命,所以就不要玩健身了嘛。

没有效果,太多疼痛和受伤。健康的程序员不需要高强度健身。

应该步行健身

步行比跑步和其他的方式更好。步行简单、安全而且有效。我每天步行5-10 公里,这个习惯给我的健康带来很大的改善。请买双薄鞋底的好鞋子(仔细看好,不要买仿制经典篮球鞋)开始步行锻炼吧!

如果感到太单调,跑步时可听电子书或者播客。边学习边锻炼,多么充实!

更强壮更灵活

你开始步行锻炼了?很好。让我们进入下一级。首先学会正确的腹式呼吸。这可能需要花几天甚至几个星期的时间来养成这个锻炼时的呼吸习惯,这个技能非常必须,可有效缓解颈部和上背部的疼痛。

程序员们花了太多时间坐在电脑前,可能都忘记怎么运动了。建议从头开始,但不需要任何额外的器材,你只需要在视频网站上搜索运动操视频,然后跟着一起运动即可。

当你的移动变得自然平稳,当你走路柔软得像老虎,当你采用腹式呼吸,你的身材正在变得优雅,而大部分疼痛都将离你而去。我建议以下简单的辅助练习:

俯卧撑、下蹲、引体向上和桥式运动。使所有事情简化而不是复杂化。设定小的目标,百分之百关注在动作技巧上。如果你有兴趣,请阅读《The Naked Warrior by Pavel Tsatsouline (裸体战士》 这本书有很多智慧技巧能帮助你进步。

睡眠

最后,我必须指出的是优质睡眠。大家知道,但却实践的少。使你自己在一个结实的床垫上度过一整晚。不要在晚上还盯着电脑或者手机和平板,至少保证睡前一小时不使用这些电子产品。10 点上床,6 点半起床,你就是个快乐程序员!

结论:

你已经知道了,获得健康很容易。只需保持以下习惯:

  • 变换姿势
  • 经常休息
  • 不做蠢事,比如高强度器材健身
  • 更多的步行
  • 正确呼吸
  • 训练灵活性和力量
  • 更多的睡眠

只要坚持几个月,你就会看到收获。