对于Node.js开发者的7点建议


原文作者:

  •     Node.js的发展很是喜人,也很有趣。现在已经有35000个module可供我们开发的时候选择了。总的来说,搭建一个易于扩展的应用对于node.js来说是小菜一碟的事。
  •     然而,对于刚开始node.js开发的人来说,在学习的道路上还是会遇到很多的坑。在这篇简短的文章中,我会涉及到一些我自己学习node.js遇到的难题与疑问。 

  • 1.开发用nodemon,实际应用用pm2 

当我们开始开发node.js的时候,有一件事是让我们容易抓狂的——我们需要无数次的输入node [file].js这个命令。我开始这些操作的十分痛苦,尤其是每次修改代码都都要ctrl+c.

    还好我发现了一个工具Nodemon(译者一直用supervisor的,,大汗),https://github.com/remy/nodemon,你可以通过npm install -g nodemon 安装。

   Nodemon是一个很炫的工作,一旦你在全局安装了它,你可以通过nodemon [file].js的方式来运行它。这样一来它便可以监控你的js文件,以及与你修改的内容有联系的所有文件。对于node.js开发者来说,这种工具毋庸置疑的提高了开发速度。

   那么在实际应用中呢?除非你用Heroku, Nodejitsu 或者其他优秀的Node.js服务商,也许你也会用EC2或其他的云服务来运行你的node.js应用。你又怎么确保你的应用可以一直运行呢?

   答案是你可以用PM2这个工具。https://github.com/Unitech/pm2。PM2是类似Nodemon那样的工具,只是它是用于实际开发的。它跟Nodemon相似的是可以监控你代码的修改并重新部署,然后不同的是,当它遇到系统崩溃的时候,它会立刻重启你的应用。

   PM2更强大的作用体现在你需要扩展你的应用到多进程应用。PM2有一个内置的“load balancer”,可以让你轻松的定义应用运行的实例数目。

     pm2 start app.js -i max

   -i这个参数是让你定义运行实例的数量,另外,PM2有一个内置的max常量,它会自动将应用数目扩展到你拥有的进程数目。记住node.js是单线程的哦。

2.Async or Q

    你写得越多的node.js应用,就越快可以感受到它回调带来的痛苦。如果你还没经历过这种痛苦,这里有个例子:

function register(name, password, cb){
  checkIfNameExists(name, function(err, result){
   if(err){
    return cb(“error”);
   }
   checkIfPasswordGood(password, function(err, result){
    if(err){
     return cb(“error”);
    }
    
    createAccount(name,password, function(err,result){
     if(err){
      return cb(“error”);
     }
     createBlog(name, function(err, result){
      sendEmail(name, function(err, result){
       callback(result);
      });
     });
    });
   });
  });
 }
    虽然这不是很有用或者没美妙的代码,但是它传达了回调这个痛苦的现实。然而你怎么避免这种情况呢?

    一个简单的方法是采用事件(events),我个人并不喜欢这种方法。因为你使用它来调用私有函数,而这种私有函数对于函数是一种弊端。

    那么要用什么方法呢?这里有两个库:async.js和Q。它们都是用来改善回调带来的不良情况。

     Async.js  https://github.com/caolan/async或者叫async,它可以让你很容易地线性执行函数,或者平行执行函数,而不需要将他们嵌套起来使用。

    下面是从async.js的说明中支持的几种模式。对于所有的模式列表,async.js都接受repo的查看。

 async.map([‘file1',’file2',’file3'], fs.stat, function(err, results){
  // results is now an array of stats for each file
 });
 
 async.filter([‘file1',’file2',’file3'], fs.exists, function(results){
 // results now equals an array of the existing files
});
 
 async.parallel([
  function(){ … },
  function(){ … }
  ], callback);
 
 async.series([
  function(){ … },
  function(){ … }
  ]);
 
 async.waterfall([
  function(callback){
   callback(null, ‘one’, ‘two’);
  },
  function(arg1, arg2, callback){
   callback(null, ‘three’);
  },
  function(arg1, callback){
 // arg1 now equals ‘three’
 callback(null, ‘done’);
 }
 ], function (err, result) {
 // result now equals ‘done’ 
});
    如果我们事先声明了(注册)函数,我们可以在async里面使用waterfall方法。这种做的结果是我们可以避免金字塔一样的代码结构,从而写出可读性很好的代码。

    另外一个好用的库就是Q https://github.com/kriskowal/q.它是通过promise来定义的。promise本质是一个对象。用它调用的函数,最终会返回一个值。这种纽带联系在是node.js和javascript中是很整洁的。

    下面的是从Q的repo页面中拿出的一个例子。

    

 promiseMeSomething()
 .then(function (value) {
 }, function (reason) {
 });
    promiseMeSomething 会立刻返回一个对象。调用then会让你调用你传进参数的那个函数,并且返回你想要的结果。另外就是你可以添加一个函数,来处理返回结果失败的情况。

    这是一种很工整的方法,避免了回调的痛苦。另外,我会用匿名内部函数,然后传that做参数来取代then的使用,不过使用权在你。

    总之,要是你开始意识到你正在给自己制造回调的痛苦,这就是你要用asnc.js或者Q的时候啦。

    我更喜欢哪一个?一直都是Q,哈哈。

3.轻松调试你的Node.js应用

    假如你拥有用笨重的IDE调试c#或者java的经验的话,你可能会对nodejs的调试产生困扰。新手中最多人采取"flow"的调试模式,而那种方式最好用的莫过于console.log了。

    然而这里有更好的选择来常规地调试node.js。Node.js有自带的debugger,你可以用node debugger来调用它。但是我喜欢的是node-inspector。

    摘自github repo上的介绍:"Node inspector 是一个使用Blink Developer Tools(前身是WebKit Web Inspector)的调试接口"

    无论你用什么编辑器或者chrome web工具,你都可以用它来调试应用。太风骚了!

    Node inspector提供一系列好用的功能,例如动态修改代码、逐步调试、作用域嵌套以及其他酷炫的东西。

    安装它可能有点复杂,所以我建议你根据以下步骤来安装:https://github.com/node-inspector/node-inspector

4.Nodefly

    一旦你的node.js应用上线运行,你也会想到怎么可以监控它的性能以及怎么评测它是否处于最佳运行速度。答案是Nodefly,我正在使用地一个优秀的工具。

    只要简单地在命令行启动后,你就可以用它来监控应用内存泄露,测量查询redis,mongo(db)花了多长时间,还有其他一系列功能。

http://strongloop.com/
5.用npm管理你的模块

     在node开发的时候最常用的莫过于用npm来的安装模块了。node拥有一个令人赞叹的模块管理部件,你可以安装在package.json声明文件上的所有模块。不过有一点你需要记住,对于你正在使用的模块,你要在package.json保持更新。

    要是每一次安装一个模块,你都要去更新package.json,这样的确有点痛苦了。然后有多少人知道npm可以帮你完成这个工作?

    只要运行npm install —save module_name,npm就会帮你自动更新package.json,修改模块名字和版本。

npm install —save module_name

6.不要上传你node_modules文件夹

当我们谈论npm和磨快的时候,有多少人知道不应该将node_modules文件夹上传。(不这样做)最大原因是你根本不需要公开你的node_modules文件夹。任何时候有人check out你的源码的时候,只要用npm install 就可以下载安装所有的模块了。

你可能会说上传了也没什么大不了。但如果check out你源码的那个人用的是不同的操作系统,然后用(这个操作系统)编译了你应用的其中一个模块,会发生什么?你的应用会崩溃,而他也不知道原因。

例如一些模块如bcrypt何sentimental,它们会在安装的时候再本机编译,那是因为它们有内置的c代码,需要在本地运行。

避免上传你的node_modules文件夹最好的方式是把他加到.gitignore上。

// .gitignore node_modules/*

7不要忘了return语句

几乎所有的node初学者都会犯的一个错误就是,在回调之后没有return语句。有时候这样不会有影响,但是很多时候你会遇到奇怪的情况,因为你回调了两次。

让我们看一个简单的例子:

function do(err,result, callback){
 if(err){
 callback(“error”);
 }
 callback(“good”);
 }
咋一看,这代码是说得通的:如果有error,就回调发动"error",没有就回调发送"good".但是执行回调不是停止函数竞争来执行。也就是说,callback("good')无论如何都会执行的。


Node.js是一个快速发展的平台。如果在你开发、调试或者生产开发的时候记着这7点,你将会省下很多时间,还有就是,好吧,头发依然靓丽。

原文链接:

https://medium.com/tech-talk/e7c0b0e5ce3c

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值