10个技巧,让你在 2017 年成为更好的Node开发者

在2012年,我加入了Storify并开始使用Node作为我的主要语言。从那以后,我从未回首过去并觉得我错过了Python,Ruby,Java以及PHP,这些在过去10年里,我在web开发过程中使用的语言。下面我将列出10条建议,这些建议可以帮助你在2017年成为一个更好的Node开发者。其中一些建议是我在日常实践中所学到的,另一些是从那些写了最流行的Node和npm模块的人们身上学到的。
下面是我们将要介绍的内容:

本文是由我们的客座作者Azat Mardan写的。SitePoint引入客座帖子的目的是希望能给你带来web社区里著名作者和演讲者的有趣内容。

在2012年,我加入了Storify并开始使用Node作为我的主要语言。从那以后,我从未回首过去并觉得我错过了Python,Ruby,Java以及PHP,这些在过去10年里,我在web开发过程中使用的语言。

Storify提供给我一个很有趣的工作,因为Storify和其他的公司不太一样,Storify之前(可能到现在也是)所有的代码都是由JavaScript编写的。而大多数公司,特别是大公司,例如PayPal,Walmart(沃尔玛)或者Capital

One(第一资本),只是在某一些特定的部分使用了Node。通常,他们使用Node作为API接口或者用在业务流程层,这样做是很好的。但是作为一个软件工程师,没什么比得上能够完全沉浸在Node环境里。

下面我将列出10条建议,这些建议可以帮助你在2017年成为一个更好的Node开发者。其中一些建议是我在日常实践中所学到的,另一些是从那些写了最流行的Node和npm模块的人们身上学到的。 下面是我们将要介绍的内容:

  1. 避免复杂性 — 尽可能将你的代码块拆到最小,要小到极致。
  2. 使用异步编程 — 像躲避瘟疫般避免使用同步代码。
  3. 避免require阻塞 — 把你所有的require声明都放在文件的顶部,因为require是同步的,会阻塞代码运行。
  4. 了解require缓存 — 了解它则可以利用它,否则它可能会带来bug。
  5. 始终检查错误 — 错误不是足球,任何时候都不要抛出错误或者跳过错误检查。
  6. 只在同步代码中使用try…catch — 在异步代码中try...catch是没有作用的。V8引擎针对try...catch无法进行优化。
  7. 返回callbacks或者使用if … else — 返回一个callback只是为了确保不继续执行。
  8. 监听错误事件 — 几乎所有的Node的类/对象都有event emitter(观察者模式)并且会广播error事件,确保你监听了它们。
  9. 了解你的npm — 使用-S或者-D来安装模块来代替--save或者--save-dev`。
  10. 在package.json中使用精确的版本号: npm在使用-S来安装模块时会自动使用默认的版本号,你需要手动修改去锁定版本号。除非是开源模块,否者不要相信你的项目中的SemVer(语义化版本标准)。
  11. 加分 — 使用不同的依赖。把项目在开发阶段需要的东西放在 devDependencies 中,记得使用 npm i --production。多余的依赖越多,出现问题的风险就越大。

好的,接下来让我们一个个单独地去了解上面的每一点。

避免复杂性

让我看一眼npm的创造者Isaac Z. Schlueter写的一些模块,例如,use-strict,这个模块是用来在Javascript中强制使用严格模式,这个模块仅仅只有三行代码:

所以我们为什么要避免复杂性呢? 一个起源于美国海军的著名短语:KEEP IT SIMPLE STUPID(或者是“Keep it simple, stupid”)。这就是原因。事实说明,人类大脑在任何一个时间只能在其工作记忆中保持五到七个项目。

把你的代码模块化成一个更加小的部分,你和其他的开发者会更加好的理解它。你也可以更加好的去测试它。如下例子,

或者是

我相信大多数人都会喜欢第二个例子,特别是光看名字就能了解其作用。当日,在你编写代码的时候,你可能认为你知道代码是如何运行的。甚至你想要展示你把几个功能连接在一起写在同一行中是多么的机智。但是,这样你是写了一段愚蠢的代码。如果你思考的很复杂去写这代码,那么今后你再去看这段代码将会很难去理解。保证你的代码简单,特别是在Node的异步代码中。

当然也会有left-pad 事件,但是其实它只是影响了依赖于left-pad模块的项目而且11分钟后就发布了替代品。代码的最小化带来的好处超过了它的缺点。npm已经改变了发布策略,任何重要的项目都应该使用缓存或私有的源(作为临时解决方案)。

使用异步编程

在Node中同步代码只要很小的一部分。这些代码大多数都是用于命令行工具或者其他与web应用无关的脚本。Node开发者大多数都是编写web应用,因此使用异步代码可以避免阻塞现场。

例如,当你在编写一个数据库的脚本或者是一个不需要控制并行的任务时,下面这种写法可能是可以的:

但是当你创建一个web应用时,下面这个写法会更好:

这个区别在于你是否需要编写一个并发(通常是长期运行)或者非并发(短期运行)的系统。根据经验来说,总是要在Node中使用异步代码。

避免require阻塞

Node有一个使用了CommonJS模块格式的简单的模块加载系统。它是基于require函数,require函数可以很方便的在不同的文件中引入模块。和AMD/requirejs不同,Node/CommonJS的模块加载时同步的。require的工作方式是:引入一个模块或者一个文件export的内容:

但是大多数的开发者并不知道require是会被缓存的。因此,只要解析的文件名(resolved
filename)没有剧烈的变化(比如npm模块不存在的情况),模块的代码只会被执行并存入变量中一次(在当前进程中)。这是一个很好的优化。当然,即使有了缓存,你最好还是把你的require声明写在开头。下面这段代码,它在路由中真正使用到了axios模块的时候才加载。当请求发送的时候/connect会因为需要加载模块所以会变得慢。

一个更好,性能更优的方式是在服务定义之前就引入模块而不是在路由中:

知道require会被缓存

我在上面一节已经提到了require会被缓存,但是有趣的是我们在module.exports之外也会有代码。举例来说:

从中我们了解到有一些代码只会运行一次,你可以使用这个特性来优化你的代码。

始终检查错误

Node不是Java。在Java中,你可以抛出错误,因为如果发生了错误那么你会希望应用不在继续执行。在Java中,你可以在外层仅仅使用一个简单的try...catch就可以处理多个错误。

但是在Node中并不是这样的。自从Node使用了事件循环和异步执行后,任何的错误发生时都会与错误处理器(例如try...catch)的上下文分离,下面这样做在Node中是没有用的:

但是try...catch在同步代码中是可以被用的。前面的代码片段可以被更好的重构为:

如果我们无法将request的返回内容包裹在try...catch中,那么我们将没有办法去处理请求的错误。Node的开发者通过在返回的参数里面加上error来解决了这个问题。因此,我们需要在每一个回调中手动去处理错误。你可以去检查这些错误(判断error不是null),然后展示错误信息给用户或者展示在客户端上并且记录它,
或者你可以通过调用 callback ,给它传 error 参数,将错误传回给上一级调用栈(如果你在调用栈之上有另一个回调函数)。

一个小技巧是你可以使用okay库。你可以像下面的例子一样使用它去避免在回调地狱中手动去检查错误(你好, 回调地狱).

返回回调或者使用if … else

Node是并行的。但是如果你不够细心也会因为这个特性产生bug。 为了安全起见,应该要使用return来终止代码的继续执行:

这样可以避免一些因为代码逻辑的处理不当导致一些不应该执行的内容(或者错误)被执行。

请确保使用return去阻止代码的继续执行。

监听 error 事件

Node中几乎所有的类/对象都有事件分发器(观察者模式)并且会广播 error 事件。 这是一个很好的特性,可以使开发者在这些讨厌的错误造成巨大后果之前捕捉到它们。

养成一个通过.on()来创建error事件监听的好习惯:

了解你的npm

很多的Node和前端的开发者知道在安装模块的时候使用--save会在安装模块的同时,会在package.json保存一条含有模块版本信息的条目。当然,还有--save-dev可以用于安装devDependencies(在生成环境中不需要的模块)。但是你知道用-S和-D是否可以代替--save 和--save-dev么?答案是可以的。

当你安装模块的时候,你需要删除-S和-D自动为你模块的版本号添加的^标签。否者当你使用npm install(或者npm i)安装模块的时候,就会自动拉取最新的镜像(版本号的第二位数字)。例如v6.1.0就是v6.2.0的一个镜像分支。

npm团队推荐使用semver,但是你最好不要这样。npm团队认为开源开发者会遵守semver所以他们在npm安装时自动加上了^。没有人可以去保证,所以最好是锁定你的版本号。更好的办法是使用shrinkwrap:npm shrinkwrap会生成一个包含依赖的具体版本的文件。

作者:wleonardo 译

来源:51CTO

时间: 2024-10-24 00:15:48

10个技巧,让你在 2017 年成为更好的Node开发者的相关文章

Facebook 教你识别假新闻 10 大技巧

你知道如何去辨别假新闻吗?这一问题已经让各种社交平台非常头疼,特别是 Facebook,该公司已经采取了各种措施来打击假新闻的传播,Facebook 承认用户需要一些帮助来识别该平台上的假新闻. 2017 年 4 月初 Facebook 宣布将在社交平台上的新闻串流资讯加入了提示讯息,给用户提供了一些识别假新闻的建议,2017 年 4 月 12 日这些提示讯息已经正式上线,Facebook 在声明中称,提示讯息不会永久存在,只会上线一段时间,但没有明确更多细节. 用户希望在 Facebook 上

最小化用户差评新手机应用的10个技巧

文章描述:总结Android手机应用UI设计的10个要点. 作者:Guenther Beyer 最近,许多开发者进驻手机领域,小团队也能够构想出优秀和独特的想法,使用业余时间便足够来开发应用. 每个开发循环迟早到会走到应用几近完成这个点.接下来要做什么呢?你可曾听说过"用户体验"这个词?以下这10个技巧能够使新手机应用在发布前提升质量,最大化发掘该应用的潜力,从而最小化用户差评和低下载量这种不良结果. 1.首次开启体验 优秀的网站和手机应用有诸多相似之处.这两者都能够迅速吸引用户或访问

使用Java与XSLT的10条技巧

技巧 在我的新书<Java and XSLT>中介绍了Java与XSLT的技术组合.这篇文章从书中选出了我认为非常重要的10条技巧.但实际上这有限的10条只是粗略的描述了什么是可能的.其中大多数都集中在Java与XSLT的组合上,而不是在XSLT(可扩展样式表转换)技术规范.而更详细的信息,在文章结尾处指出了一些有价值的资源. 基本的XSL转换是非常简单的:一个或多个包含着指令的XSLT样式表,这些指令定义了如何把XML数据转换成其他格式.XSLT处理器完成实际的工作:Sun微系统的Java

ASP.NET应用程序设计的10大技巧

asp.net|程序|技巧|设计 在本篇文章中,我们将讨论编程人员在使用ASP.NET开发应用程序时需要注意的10个技巧,这些技巧涉及从缺省的控件.表单名的改变到StringBuilder类的使用,有助于编程人员能够尽快地适应.NET环境. 1.在使用Visual Studio .NET时,除直接或非引用的对象外,不要使用缺省的名字 .NET带来的好处之一是所有的源代码和配置文件都是纯文本文件,能够使用Notepad或WordPad等任意的文本编辑器进行编辑.如果不愿意,我们并非一定要使用Vis

ASP.NET应用程序设计的10大技巧(一)

  在本篇文章中,我们将讨论编程人员在使用ASP.NET开发应用程序时需要注意的10个技巧,这些技巧涉及从缺省的控件.表单名的改变到StringBuilder类的使用,有助于编程人员能够尽快地适应.NET环境. 1.在使用Visual Studio .NET时,除直接或非引用的对象外,不要使用缺省的名字 .NET带来的好处之一是所有的源代码和配置文件都是纯文本文件,能够使用Notepad或WordPad等任意的文本编辑器进行编辑.如果不愿意,我们并非一定要使用Visual Studio .NET

Windows使用者应该了解的10个技巧

  在过去几年中,Windows系统并未发生重大的改变(至少在桌面效果上),但每一个新版本的更新,都带来了一些细微的调整和提升.当然,Windows是一个庞大而复杂的桌面系统,所以如果你想更好地使用Windows系统,不妨来了解一下本文提到的10个技巧和建议. 1. 升级到Windows 8(8.1)系统 好吧,这肯定是一个最有争议性的建议.可以肯定的是,Windows 8系统在触摸屏设备上的使用效果肯定是要比之前版本更好的,如果你拥有一款触摸屏笔记本或是平板电脑,一定可以感受到.当然,"开始&

加快win7运行速度 提高win7系统运行速度的10大技巧

  虽然win7系统比其他系统安装完运行速度更快,但是随着使用时间越来也就,就会导致系统的运行速度变慢的现象,跟刚装完系统的时候运行速度差距很大,那么要如何加快win7系统运行速度呢?其实方法有很多,下面win7之家小编为大家整理了提高win7系统运行速度的10大技巧,随小编来看看吧. 文档管理系统"> 1.关闭搜索索引功能 进入win7系统控制面板中,点击"索引"选项,并点击修改,删除一些不必要的索引文件类型.另外,你也可以在Windows服务选项中彻底关闭索引服务,

成功部署云计算的关键10个技巧

更多深度文章,请关注:https://yq.aliyun.com/cloud 对于一些组织来说,云计算的使用已经开始,而无论他们知道与否,希望成功部署云计算,制定一个计划是有所帮助的. Consultancy Cloud TechnologyPartners(CTP)公司是帮助客户采用公共IaaS云计算资源的众多公司之一,该公司分享了成功部署云计算的关键10个技巧和提示. 1.达成一致 在组织决定使用IaaS云计算服务之后,需要将企业的重要利益相关者召集在一起召开会议,让每个人都在此有所有帮助.

10个技巧加速Azure网站服务架设WordPress加载速度

速度慢的网站可能会造成您目标客群的流失,而且也会减少他们再次造访网站的机会.许多搜索引擎也将页面加载速度列为排序的考虑,这对 于网站的能见度有很大的影响.如果您已经或正要使用 http://www.aliyun.com/zixun/aggregation/13357.html">Azure 网站服务架设 WordPress,同时也想了解如何提升网站的加载速度,那么下面的一些技巧是您可以考虑的方向.   1. 网站服务与数据库必须在相同的数据中心   在 Azure 网站服务上架设 Word