送给Node.js新手的7个开发小技巧

jopen 11年前

nodejs.png

 

或者当我开始学习的时候,我希望知道的。

Node.js的开发相当有趣和令人愉快的。有超过3万5千个模块可供选择,并且更重要的是用node开发的很容易扩展。

对于刚接触 Node.js 的开发者,免不了一些磕磕碰碰。在这篇简短的文章中,我提到了一些我学习 Node.js 时遇到的问题。

 

技巧 1 :开发环境使用 nodemon,生产环境使用 pm2

当你着手 Node.js 开发时,非常尴尬的是,必须一遍又一遍的运行 node [file].js 。在我开始学 node 时,这点相当令我很不耐烦。特别是每次修改一点东西,都要 control + C一下 。幸运的是我发现了一个非常棒的工具 Nodemon 。运行以下命令安装它:npm install -g nodemon

Nodemon 是个很好的工具,一旦全局安装了它,你可以通过 nodemon [file].js 运行 node.js 脚本。nodemon 会监控你的代码,以及所有依赖代码的变化。如此开发 Node.js ,开发效率瞬间提高。

生产环境呢?除非你用了 Heroku,Nodejitsu 或者其它不错的 Node.js 托管服务,否则你可以试试 EC2 或者其它的云服务,通过它们运行你的 Node.js 应用。如何保证 Node.js 应用一直运行呢?PM2 像 nodemon ,用于在生产环境运行 node 应用。它会监控你的 app 变化并重新部署它们,不同之处在于,如果 PM2 遇到事故,它将立刻重启你的 node.js 应用。

当你的应用需要多核处理的时候,凸显出了 PM2 的优势。PM2 内部集成的“负载均衡”让你轻松指定 Node 应用运行几个实例。

pm2 start app.js -i max

-i 参数用来指定运行多少个实例,此例中 PM2 使用了一个常量 max 自动扩展你的 app 运转到最大核数,不要忘记 Node 平时只运行在单核上!

 

技巧 2 :Async 或者 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 ,我个人不建议这么做,它违背了一个函数的观点,可以用 events 调用只有一个用途的私有方法。

所以怎么做呢?有两个相互竞争的库:async.jsQ ,它们均可以避免回调出现。

Async.js 或者 “async”可以轻松执行连续或者平行的函数,不需要一层一层的嵌套。

下面是 Async 支持的模式,readme 有记录。想了解 async 支持的所有模式,看看它们的代码仓库。

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 ,这个库用到了 promises 的概念。Promise 是一个含有‘promise’方法的返回对象,他提供了一个最终返回值,非常优雅的将 javascripts 的异步特性和 node.js 紧密联系起来。

从 Q 的代码仓库中拿来的例子。

promiseMeSomething()   .then(function (value) {   }, function (reason) {   });

promise me 函数立刻返回一个对象,调用 then 将返回传入 value 值的函数。它也带一个回调函数,处理未能返回值的情况。

用非常整洁的方式避免了回调。如果重写原来的例子,当 then 执行的时候才调用每个函数。

Q.fcall(checkIfNameExists)   .then(checkIfPasswordIsGood)   .then(createAccount)   .then(createBlog)   .then(function (result) {   // Do something with the result   })   .catch(function (error) {   // Handle any error from all above steps   })   .done();

如前面所说,我不喜欢创建单一目标函数。取而代之,用 “then”传递函数,仅传递一个匿名函数,当然选择器在你手中。

总之,当你掉入回调地狱时,是该关注下 async.js 或者 Q 了。

“我个人喜好?一直是 Q!”

 

技巧 3 :轻松调试 Node.js 应用

如果你从一个 IDE 重度集成的语言比如 java 或者 C# 转来调试 Node.js,你一定会感到很困扰。大多数新的 node 开发者采用 “flow”调试模式,你最好的帮手是 console.log 。

但是肯定有更便利的调试方式,Node.js 内置了一个调试器你可以叫它 node debug,不过我更喜欢的 node-inspector

它们的 github 仓库提到“Node Inspector 是使用了 Blink 开发工具的 node.js 调试工具界面(先前的 WebKit Web Inspector)。”

简而言之,无论你选择哪个编辑器和 chrome web tools ,node-inspector 都可以调试你的应用。Node Inspector 可以做一些真正酷的东西,比如实时代码修改,单步调试,作用域注入和一堆很酷的功能。

它涉及到一些设置,可以按照这里 https://github.com/node-inspector/node-inspector 的说明做。

 

技巧 4 :Nodefly

一旦你的应用正常运行,你可能会问自己,如何监控它的性能,如何通过分析确保它以最佳速度运行呢。最简单的回答是使用非常棒的 Nodefly 服务。

通过一行简单的代码,Nodefly 开始监控应用程序的内存泄露, 测量 redis 用了多久,mongo 查询和一堆其他很酷的东西。

http://www.nodefly.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 文件夹,最大的原因是没有必要提交。当别人检出你的代码,他们可以用 npm 安装所需模块。

你也许会说提交 node_modules 文件夹无伤大雅,但是如果检出你代码的人用跟你不同的操作系统呢,通过 npm 安装的模块是编译过的?你的应用会崩溃,检出你代码的人完全不知道为什么!

举例来说,当你安装过 bcrypt 和 sentimental 模块后,它们在主机上是编译过的,因为它们的原始组件是用 C 写的。

最优的作法是把 node_modules 文件夹加到 .gitignore 里,避免提交它。
// .gitignore node_modules/*

 

技巧 7 :不要忘记 return

刚入门的 node 开发者通常容易犯个错误,callback 回调函数后面忘加 return 。虽然有时候没什么影响,多数情况你会遇到奇怪的问题,callback 回调执行了两次。

看个简单的例子:

function do(err,result, callback){   if(err){   callback(“error”);   }   callback(“good”);   }

乍一看,没什么问题。如果有错误,把 “error”传入 callback,没错则传递“good”。但是调用 callback 以后并没有停止执行,会接着调用 callback(“good”) 。在复杂的代码中,加上 return 会节约数小时的调试时间。

 

Node.js 是个很赞的开发平台,如果你谨记这 7 条技巧,开发,调试和部署到生产环境时,可以节省不少时间,防止头发尽早变灰白。

 

 

 

原文:https://medium.com/tech-talk/7-tips-for-a-node-dot-js-padawan/ by Faisal Abid
来自:http://www.lembed.com/7-node-js-skills/