Node.js最佳实践 -在2017年如何成为一名更好的Node.js开发者

okbi4515 8年前
   <p>一年前,我发表的 <a href="/misc/goto?guid=4958977611208152690" rel="nofollow,noindex">在2016年如何成为一名更好的Node.js开发者</a> 获得了广泛的欢迎,因此今年我想延续去年的主题,讲讲在2017年,如何成为一名更好的Node.js开发者。</p>    <p>在这篇文章中,我们将回顾2017年Node.js的最佳实践,最热话题,我们需要关注什么,来提升自身能力。让我们开始吧!</p>    <h3>使用 ES2015</h3>    <p>去年,我们也建议大家 使用ES2015 ,和去年相比,今年有很大的改观。</p>    <p>当时,Node.js v4版本作为长期支持版本,仅支持57% ES2015的语法,经过了一年,Node.js v6版本作为长期支持版本,支持了99% ES2015的语法。</p>    <p>也就是说,如果你正在使用最新的长期支持版本的Node,你不需要添加任何的babel,也可以使用ES2015编辑整个项目。</p>    <p>关于更多的Node.js版本对ES2015支持的细节,我推荐大家去Node.js官网</p>    <h3>使用 Promises</h3>    <p>promise的概念早在八十年代就被提出,现在已经是大多数现代编程语言中简化编写的一部分。</p>    <p>假设如下场景,读取一个文件,把它转成JSON并输出文件名,如果用callback回调函数实现,代码如下:</p>    <pre>  <code class="language-javascript">fs.readFile('./package.json', 'utf-8', function (err, data) {      if (err) {      return console.log(err)    }      try {      JSON.parse(data)    } catch (ex) {      return console.log(ex)    }    console.log(data.name)  })</code></pre>    <p>我们用Promises实现这个功能,可以提高代码的可读性:</p>    <pre>  <code class="language-javascript">fs.readFileAsync('./package.json').then(JSON.parse).then((data) => {      console.log(data.name)  })  .catch((e) => {    console.error('error reading/parsing file', e)  })</code></pre>    <p>当然,现如今使用 fs 模块并没有一个返回值为Promise的 <em> readFileAsync </em> API,为了让上述代码正常运行,你需要引入一个类似 promisifyAll 的模块,给它运行的环境。</p>    <h3>使用代码规范</h3>    <p>当代码规范被称为代码规范时,就意味着,至少在公司范围内推行,所以,当你想要改变你的项目时,意味着从0开始,不需要为之前的人的代码而懊恼。</p>    <p>我们RisingStack使用了我们的代码规范 JavaScript Standard Style 构建我们的项目。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/d8b4000a97a117d20f2cbdaa2bb8fe75.jpg"></p>    <p>使用代码规范,你不需要使用 .eslintrc , .jshintrc , 或 .jscsrc 不需要加载其他文件到项目中。 </p>    <h3>使用Docker</h3>    <p>你可以把Docker镜像当成部署容器的工具。Docker就是部署软件运行环境的一个容器,它包含了你软件运行的大部分的基础环境:代码,运行时间,系统工具,系统程序库,任何你能想到需要安装的东西。</p>    <p>为什么应该使用 Docker?</p>    <ul>     <li> <p>隔离了运行环境和项目代码</p> </li>     <li> <p>作为一个安全工具,让你的代码更加安全</p> </li>     <li> <p>轻量的Docker镜像</p> </li>     <li> <p>稳定的部署</p> </li>     <li> <p>通过Docker你可以在本地看到你软件的运行环境</p> </li>    </ul>    <p>你可以参照网站 <a href="/misc/goto?guid=4959741634266569632" rel="nofollow,noindex">official getting started tutorial</a> 完成你的第一个Docker,另外推荐 <a href="/misc/goto?guid=4959741634348256304" rel="nofollow,noindex">Kubernetes best practices</a> 作为补充。</p>    <h3>监视你的程序</h3>    <p>当你的Node进程出现故障时,第一个知道的人应当是开发者,而不是用户。</p>    <p>一个开源的解决方案 Prometheus 可以帮助你解决进程崩溃的问题。 Prometheus是SoundCloud的一个开源工具箱,监听并提示进程崩溃问题。 唯一的缺点是你需要手动挂载在自己开发的域下。</p>    <p>如果你在寻找一个开箱即用的方案,可以关注我们开发的 Trace by RisingStack ,也是一个不错的解决方案。</p>    <p>Trace能为我们做的</p>    <ul>     <li> <p>警告</p> </li>     <li> <p>记录收集项目的CPU数据</p> </li>     <li> <p>分布式追踪,查找错误</p> </li>     <li> <p>性能监测,</p> </li>     <li> <p>保护你的npm包安全</p> </li>    </ul>    <p style="text-align:center"><img src="https://simg.open-open.com/show/cc2a89fd1d46988dfaea8f47889b021f.png"></p>    <h3>进行后台日志管理</h3>    <p>如果你用HTTP发送请求,只要接受停止,整个消息都会丢失。但是,如果逆选择一个持久的传输层,像一个消息队列一样传输消息,你就不会有这个困扰。</p>    <p>如果接收服务停止,消息传输还会继续,将会在稍后发出。如果服务没有挂掉,它会有一个提示, 服务器将会重试,因此没有数据会丢失。</p>    <p>一个例子: 假如你发送了几千封邮件,在每一封里,你都会写一些基础信息,像邮件地址,姓名,签名,这时后台就好像工人一样,整理出一样地址的几百封,一起发到同一个地址。</p>    <p>这样的好处是,你可以随时查看每一封的状态,没有邮件会被寄丢。如果你发现几百封邮件同时丢了,你可以进行后期操作,让他们使用同一队列。</p>    <p>你可以使用借鉴如下日志管理工具:</p>    <ul>     <li> <p><a href="/misc/goto?guid=4958839324027820493" rel="nofollow,noindex">RabbitMQ</a></p> </li>     <li> <p><a href="/misc/goto?guid=4959556433717746134" rel="nofollow,noindex">Kafka</a></p> </li>     <li> <p><a href="/misc/goto?guid=4958861774927051627" rel="nofollow,noindex">NSQ</a></p> </li>     <li> <p><a href="/misc/goto?guid=4959741634515905260" rel="nofollow,noindex">AWS SQS</a></p> </li>    </ul>    <h3>使用最新的稳定的Node.js版本</h3>    <p>为了最好的开发体验,我们最推荐的版本是最新版本和最新稳定版本,在本文中,我们更推荐最新长期稳定版本。就是写这篇文章时的最新版本 <strong>6.9.2</strong> 。</p>    <p>为了更轻松的切换Node版本, 你可以使用 nvm 。 你安装一次, 输入这两个命令:</p>    <pre>  <code class="language-javascript">nvm install 6.9.2    nvm use 6.9.2</code></pre>    <h3>使用语义化的版本</h3>    <p>在几个月前我们进行了一次关于 Node.js Developer Survey 的分享, 我们呼吁并帮助大家认识并使用语义化的Node版本。</p>    <p>不幸的是,我发现只有71%的调查对象使用语义化的版本,在构建他们的项目。 这个比例应当更高,我们的观点是,每个项目都应当使用版本控制。 为什么这么说,当我们更新包的时候,如果没有版本控制,很容易把整个项目搞崩溃。</p>    <p><img src="https://simg.open-open.com/show/7fa8967c40104cb9cc5c6132f5696639.png"></p>    <p>对你的项目和模块做版本控制是很关键的,你的用户必须知道,什么时候发布了新版本,他们需要做什么,来获取新版本。</p>    <p>这就是为什么图片中展示的,为什么这么多人使用语义化的版本控制,你需要在版本控制中包含如下信息 <strong>重点,监听,补丁</strong></p>    <ul>     <li> <p>重点当有不兼容的API更新时,需要通过版本控制兼容</p> </li>     <li> <p>监听在不终止服务的情况下增加新的API</p> </li>     <li> <p>补丁向下兼容,BUG修复</p> </li>    </ul>    <p>npm也用了版本管理来管理你项目的依赖,因此,当你发布模块的时候,一定要确认npm包是否有相应的更新。换个说法,如果不看,你也许会把其他系统弄崩溃。</p>    <h3>维护应用的安全性</h3>    <p>在2017年,保护你的用户信息安全将会是你构建项目的着重点。仅在2016年,就有 数百万用户被账户入侵 ,出现这个现象就是因为安全措施不到位。</p>    <p>作为Node.js安全的初学者, 你可以读我们的博客 Node.js Security Checklist , 包含如下观点:</p>    <ul>     <li> <p>安全的 HTTP Header,</p> </li>     <li> <p>强制保护,</p> </li>     <li> <p>Session管理,</p> </li>     <li> <p>处理依赖关系,</p> </li>     <li> <p>数据管理</p> </li>    </ul>    <p>当你理解了这些基础概念, 你可以在 Surviving Web Security with Node.js !留下你的观点</p>    <h3>学习Serverless</h3>    <p>Serverless是AWS Lambda提出的一个理念。从此以后,这种理念流行起来, 并且有了开放的讨论社区。</p>    <p>明年, serverless 将成为一个关于构建项目的专门的方向。如果你想更上一层楼,你需要从现在开始学习。</p>    <p>一个最流行的解决方案就是 Serverless Framework , 这是由 AWS Lambda部署的一个方案。</p>    <h3>参加研讨会和见面会</h3>    <p>参加研讨会和见面会是一个学习新趋势,开发技巧和最佳实践的好机会。当然也可以认识更多的人。</p>    <p>作为开始的第一步,我建议你参加并在 one of these events 上演讲。</p>    <p>做一个公开的演讲很难,吸引到每一个人的注意力更是难上加难,而且这不是一个好的想法。我推荐去 speaking.io 查看演讲的一些小技巧。</p>    <h2>在2017年成为一名更好的Node.js开发者</h2>    <p>2017年作为- Node.js发力的一年,我们希望大家从Node.js开发中收获更多</p>    <p>我们启动了一个新的项目叫做掌握Node.js,希望从这些方面加深大家对Node.js的理解</p>    <ul>     <li> <p>Node.js异步编程</p> </li>     <li> <p>创建Express服务器</p> </li>     <li> <p>创建Node数据库</p> </li>     <li> <p>使用Node构建结构化,可扩展的APP</p> </li>    </ul>    <p> </p>    <p> </p>    <p>来自:http://www.w3ctech.com/topic/1970</p>    <p> </p>