Node.Toptal Developers的最佳实践和技巧

Share

该资源包含Node的集合.js best practices and Node.由Toptal网络成员提供的小贴士.

该资源包含Node的集合.我们的Toptal网络成员提供的技巧和最佳实践. As such, 本页将定期更新,以包含更多信息并涵盖新出现的Node.js techniques. 这是一个社区驱动的项目, 所以我们也鼓励你们做出贡献, 我们期待着你们的反馈.

Check out the Toptal resource pages 以获取有关Node的更多信息.js. There is a Node.js job description, common Node.js mistakes, and Node.js interview questions.

如何正确使用承诺

承诺是很棒的——它们使开发人员能够避免级联回调,并使代码更清晰.

However, 当你面对承诺时, 您应该尽可能避免为每个新请求创建新的承诺并自己管理它们.

让我们检查下面的代码:

var makeRequest = function(options){
    var deferred = Q.defer();
    request.调用(options, function(err, result){
        if(err){
            return deferred.reject(err);
        }
        deferred.resolve(result);
    });
    return deferred.promise;
};

var getRequest =函数(url){
    var deferred = Q.defer();
    var options = {
        method: "GET",
        url: url
    };
    makeRequest(options)
        .then(function(result){
            deferred.resolve(result);
        })
        .catch(function(error){
            deferred.reject(error);
        })
    ;
    return deferred.promise;
};

var getMyAccount = function(accountId){
    var deferred = Q.defer();
    getRequest(' /账户/ ' + accountId)
        .then(function(result){
            deferred.resolve(result);
        })
        .catch(function(error){
            deferred.reject(error);
        })
    ;
    return deferred.promise;
};

这里的问题是在每个函数中都创建了一个新的承诺, 但它是根据另一个次级承诺决议来解决的. 这种开发实践产生了不必要的代码,更难以阅读,效率更低. 我们应该将其重构为以下更易于承诺的版本:

var makeRequest = function(options){
    var deferred = Q.defer();
    request.调用(options, function(err, result){
        if(err){
            return deferred.reject(err);
        }
        deferred.resolve(result);
    });
    return deferred.promise;
};

var getRequest =函数(url){
    var options = {
        method: "GET",
        url: url
    };
    返回makeRequest(选项);
};

var getMyAccount = function(accountId){
    返回getRequest(' /账户/ ' + accountId);
};

第二个版本避免在每个级别上创建新的承诺, thus reducing the overhead, 产生错误或处理错误的可能性, and is much more readable. And it works the same.

Contributors

Pierre Killy

Freelance Node.js Developer
Sweden

从八岁开始写代码, 皮埃尔对技术的热爱使他获得了计算机科学硕士学位. 从纯工程到在Viadeo(100多个生产服务器)的高负载基础设施上构建CI和CD流程, 他以首席技术官的身份联合创立了一家初创公司. Pierre is a dedicated, enthusiastic leader, 他是一位富有创造力的解决方案制定者,也是一位拥有十多年经验的网络工程专家.

Show More

从Toptal获取最新的开发人员更新.

订阅意味着同意我们的 privacy policy

使用覆盖工具跟踪可能死的代码

What is dead code? 简单地说,它是永远不会执行的代码.

死亡或未使用的代码往好里说是一种痛苦,往坏里说是问题. 它需要努力维护, including unit tests, 使您的代码库更大,更难以处理, 尤其是对于你雇佣的新工程师. Even worse, 有时,您可能会有高度复杂的死代码(或者给整个系统带来了显著的复杂性), 如果你没有意识到它已经死了, 为了让其他代码与它一起正常工作,您可能最终会“站在你的头上”. And all this for nothing.

幸运的是,存在一些可以提供帮助的死代码识别工具. The problem, though, 是他们静态地分析你的代码,并试图理解哪些代码被使用了,哪些没有.

在我们的示例中,我们将使用 Istanbul package. 这里的想法是根据实际的生产使用来运行它. 实现这一点的方法相当简单:

  1. 从池中取出一个生产服务器.
  2. Shut down your Node.js application.
  3. Run it again using Istanbul; instead of node app.js run 伊斯坦布尔——handle-sigint掩护应用程序.js.
  4. 等待应用程序启动并将服务器放回池中.
  5. 取决于您的交通和架构, 你可以这样放几分钟, hours or days. The --handle-sigint 意味着用于长时间运行的流程,这正是您的web服务器的情况.
  6. 再次将服务器从生产池中取出.
  7. Stop the Istanbul process. Once again the --handle-sigint 选项很有用:您只需要使用 SIGINT signal kill -s SIGINT[伊斯坦布尔PID].
  8. 的代码覆盖率报告 coverage directory and exit.
  9. Start your Node.重新以正常方式运行Js应用程序,并将服务器放回到生产池中.
  10. 浏览HTML覆盖率报告以发现未使用的代码.

您可能会担心响应时间开销. 根据我的经验,运行Istanbul的服务器的响应时间比没有运行Istanbul的服务器的响应时间大约高5%. 在任何情况下,都应该密切监视代码覆盖服务器.

Contributors

Pierre Killy

Freelance Node.js Developer
Sweden

从八岁开始写代码, 皮埃尔对技术的热爱使他获得了计算机科学硕士学位. 从纯工程到在Viadeo(100多个生产服务器)的高负载基础设施上构建CI和CD流程, 他以首席技术官的身份联合创立了一家初创公司. Pierre is a dedicated, enthusiastic leader, 他是一位富有创造力的解决方案制定者,也是一位拥有十多年经验的网络工程专家.

Show More

如何正确使用登录Node.js

在处理新项目时,通常使用方法记录调试消息 console.log. 它在JavaScript中是原生的,并以类似json的样式打印对象.

然而,有一些问题使用 console.log to debug your application:

  • 一旦你建立了你的应用程序, you must remove them all, 除非您想在生产环境中污染日志文件.
  • 您没有过滤它们的选项.

Enter debug, a small Node.基于Node core的调试技术建模的js调试工具. 通过调试,您可以将调试日志保存在代码中,并仅在需要时使用它们.

Here is how it works:

  1. 导入调试模块并用变量引用它: var debug = require('debug')('myWonderfulApp');. 通过这样做,您立即为应用程序设置了一个实例(' myWonderfulApp ')。.
  2. 使用引用来记录消息: 调试(“这些是变量内容”,someVar, someOtherVar);.
  3. 在运行Node时打开您自己的应用程序的调试消息.js application: DEBUG=myWonderfullApp节点应用程序.js. As you can see, 将DEBUG环境变量设置为我们用于初始化调试模块的确切名称.

另外一个非常有用的特性是,你可以使用一个命名空间来声明debug变量,就像这样: var debug = require("debug")("myWonderfulApp:startup");.

这使您能够非常精确地区分项目中的每种类型或级别的调试. Then, 在运行应用程序时, 您可以决定显示调试消息的特定子集(例如.g., DEBUG=myWonderfullApp:启动节点应用程序.js) or all debug messages (e.g., DEBUG=myWonderfullApp:*节点应用程序.js).

Finally, 如果你使用像ExpressJS这样的框架, 你可以像这样启动你的应用程序来激活许多日志: DEBUG=* node app.js. 这将显示来自所有名称空间(包括您的名称空间)的所有调试消息.

Contributors

Pierre Killy

Freelance Node.js Developer
Sweden

从八岁开始写代码, 皮埃尔对技术的热爱使他获得了计算机科学硕士学位. 从纯工程到在Viadeo(100多个生产服务器)的高负载基础设施上构建CI和CD流程, 他以首席技术官的身份联合创立了一家初创公司. Pierre is a dedicated, enthusiastic leader, 他是一位富有创造力的解决方案制定者,也是一位拥有十多年经验的网络工程专家.

Show More

使用代码更改监视器来自动重启你的Node应用

在开发软件时,您希望将新编写的代码立即应用于测试. 必须手动停止和重新启动Node进程既麻烦又浪费时间.

幸运的是,有一些工具可以解决这个问题. 让我们来看看这类工具中最流行的三种. 这三个都提供了非常相似的选项和功能, 所以你的选择可能更多的是个人偏好的问题.

nodemon

nodemon 是在文件更改时自动重新启动Node服务器的工具吗. 您可以通过配置文件的命令行选项来配置它. 它支持监听(或忽略)特定的目录和文件扩展名, 延迟进程重启, 和不同的处理干净的进程退出和应用程序崩溃.

您只需在命令行中将“node”替换为“nodemon”即可运行它, 这使得它使用起来非常简单.

Installation: npm install -g nodemon

forever

forever 提供许多选项来微调其行为, 比如设置工作目录, 将日志追加到文件而不是标准输出, 或将进程ID (PID)保存为 .pid file.

它的用法与nodemon不同,例如,它看起来更像是Unix服务管理 forever start app.js. 它还有更多的扩展选项,如着色输出或退出信号定制.

Installation: npm install -g forever

node-supervisor

node-supervisor (also known simply as supervisor)具有与nodemon和forever相同的功能,并且有几个选项可以微调其行为,例如在错误时不重新启动, for example. Very simple and efficient.

Installation: npm install -g supervisor

Contributors

Pierre Killy

Freelance Node.js Developer
Sweden

从八岁开始写代码, 皮埃尔对技术的热爱使他获得了计算机科学硕士学位. 从纯工程到在Viadeo(100多个生产服务器)的高负载基础设施上构建CI和CD流程, 他以首席技术官的身份联合创立了一家初创公司. Pierre is a dedicated, enthusiastic leader, 他是一位富有创造力的解决方案制定者,也是一位拥有十多年经验的网络工程专家.

Show More

利用内置分析器

性能对任何系统都非常重要. 分析代码可以让您了解代码的时间花在了哪里, 因此,您可以专注于最能从性能优化中获益的代码片段.

V8’s internal profiler comes built-in with Node.js. 它很容易使用,而且效率很高.

让我们看一下如何使用这个分析器.

在启用分析的情况下运行应用程序

It’s very easy to start using profiler; simply add the --prof 选项到你的节点命令:

node --prof app.js

现在让您的任务运行,执行所有HTTP调用或执行代码所需的任何操作. When finished, the profiler will create a “tick file”; a big text file in your current working directory named isolate-0x???????-v8.log.

接下来,我们需要处理这个文件.

Processing your tick file

要处理tick文件,只需运行以下命令:

节点——profi -process isolation -0x???????-v8.log

该命令将输出应用程序的分析结果, 它由几个部分组成(下一节将进一步讨论).

由于此结果可能有点长,因此建议将其管道放入文本文件中.

读取tick文件处理结果

处理后的结果将包含几个部分,包括:

[Shared libraries]
[JavaScript]
[C++]
[Summary]
[C++ entry points]
[由下而上(重)轮廓]

Jump directly to the [Summary] part. 它很短,并给出了进一步挖掘的直接概述. For example:

[Summary]:
   勾起非库的总名称
  15221   58.6%   59.7%  JavaScript
   7630   29.4%   29.9%  C++
    966    3.7%    3.8%  GC
    496    1.9%共享库
   2638   10.2%          Unaccounted

很明显,大部分时间都花在了JavaScript函数上. c++函数也要花很多时间. 值得注意的是:要小心创建massive Date objects, or overuse of the Object.keys() 函数,这两者都会对c++的性能产生不利影响.

以以上总结信息为指导, 然后你可以跳到花了大部分时间的部分. 您将发现一个函数列表,该列表按照在每个函数上花费的时间按降序排序.

现在你知道该把精力集中在哪里了.

Contributors

Pierre Killy

Freelance Node.js Developer
Sweden

从八岁开始写代码, 皮埃尔对技术的热爱使他获得了计算机科学硕士学位. 从纯工程到在Viadeo(100多个生产服务器)的高负载基础设施上构建CI和CD流程, 他以首席技术官的身份联合创立了一家初创公司. Pierre is a dedicated, enthusiastic leader, 他是一位富有创造力的解决方案制定者,也是一位拥有十多年经验的网络工程专家.

Show More

Submit a tip

提交的问题和答案将被审查和编辑, 并可能会或可能不会选择张贴, 由Toptal全权决定, LLC.

* All fields are required

Toptal Connects the Top 3% 世界各地的自由职业人才.

Join the Toptal community.