首页 >web前端 >js教程 >10个Node.js的最佳实践:节点大师的启蒙

10个Node.js的最佳实践:节点大师的启蒙

Joseph Gordon-Levitt
Joseph Gordon-Levitt原创
2025-02-17 09:26:09151浏览

10个Node.js的最佳实践:节点大师的启蒙

钥匙要点

  • >利用NPM脚本来组织诸如构建,测试和启动应用程序之类的任务。当开发人员查看一个新项目时,这提供了一个真实的来源。 从项目的早期阶段,
  • 使用环境变量,例如process.env.node_env。这确保了敏感信息不会泄漏,并从一开始就正确构建了代码。>
  • >了解事件循环以及如何使用setimMediate()或settimeout()将CPU密集型任务卸载到下一个事件循环周期。
  • >使用功能继承来简单,并避免原型继承或类的复杂性。这是许多多产节点贡献者中的首选方法。
  • >
  • 考虑JavaScript的替代方案,例如Typescript,Flow,Elm,Clojurescript或CoffeeScript,具体取决于专业知识级别和应用程序的性质。这可能会通过很少的设置使团队受益。
  • >
>在我以前的第10条提示成为2017年更好的节点开发人员的提示中,我介绍了10个节点。这篇文章继续以另外10种最佳实践为基础,以帮助您将节点技能提升到一个新的水平。这就是我们要涵盖的内容:10个Node.js的最佳实践:节点大师的启蒙
  1. 使用NPM脚本 - 当您可以通过NPM脚本和节点更好地组织它们时,请停止编写Bash脚本。例如,NPM运行构建,启动和测试。 NPM脚本就像节点开发人员查看一个新项目时的真实来源一样。
  2. 使用env vars - 通过将其设置为开发或生产来利用process.env.node_env。有些框架也将使用此变量,因此可以按照大会进行播放。
  3. >
  4. >了解事件循环 - setimMediate()不是立即的,而下一个nexttick()不是下一个。使用setimMediate()或settimeout()将CPU密集型任务卸载到下一个事件循环周期。
  5. >使用功能性继承 - 避免进行无意识的辩论,并通过使用功能继承来进行调试和理解原型继承或类的脑部流血陷阱,例如某些最多产的节点贡献者所做的。
  6. >适当地命名事物 - 给出有意义的名称,将其用作文档。另外,请不要大写文件名,如果需要,请使用破折号。文件名中的大写不仅看起来很奇怪,而且会引起跨平台问题。>
  7. >考虑不使用JavaScript -ES6/7是可悲的补充,这是在我们已经有一个更好的JavaScript的6年会议中出生的,称为Coffeescript。如果您想要更快的船代码,请使用它,停止浪费时间来辩论var/const/let,semi-colons,class和其他参数。
  8. 提供本机代码 - 使用转侧时,提交本机JS代码(构建结果),因此您的项目可以在没有构建的情况下运行
  9. 使用Gzip - du! NPM I压缩-s和理智的记录 - 并不是很少,因为环境的不同。 NPM I Morgan -S
  10. 从您的节点开发的第一天开始,开始考虑聚类并拥有无状态服务。使用PM2或Strongloop的群集控制
  11. >缓存请求 - 通过将它们隐藏在静态文件服务器(例如nginx和/或请求级别的缓存)等静态文件服务器之后,从您的节点服务器中获取最大果汁。
  12. >让我们分符,并单独查看每个人。我们可以吗?>>
  13. >使用NPM脚本
  14. >现在几乎是为构建,测试和最重要的启动应用程序创建NPM脚本的标准。这是节点开发人员遇到新节点项目时的第一个位置。有些人(1、2、3、4)甚至抛弃了咕unt声,吞咽和喜欢更低级但更可靠的NPM脚本。我完全可以理解他们的论点。考虑到NPM脚本具有前后挂钩,您可以达到非常复杂的自动化级别:
  15. <span>"scripts": {
    </span>  <span>"preinstall": "node prepare.js",
    </span>  <span>"postintall": "node clean.js",
    </span>  <span>"build": "webpack",
    </span>  <span>"postbuild": "node index.js",
    </span>  <span>"postversion": "npm publish"
    </span><span>}
    </span>

    >通常是为前端开发时,您想运行两个或多个手表过程以重新构建代码。例如,一个用于WebPack,另一个用于Nodemon。您可以使用&&执行此操作,因为第一个命令不会发布提示。但是,有一个名为同时的方便的模块,可以同时产生多个过程并同时运行它们。

    另外,安装Dev命令行工具,例如WebPack,Nodemon,Gulp,Mocha等。您可以指向./node_modules/.bin/mocha,或将此行添加到您的bash/zsh配置文件(路径!):

    > >使用env vars

    即使在项目的早期阶段,也要利用环境变量,以确保敏感信息没有泄漏,并从一开始就正确构建代码。此外,某些库和框架(我知道Express肯定会做到这一点)将吸引诸如Node_env之类的信息以修改其行为。将其设置为生产。还设置您的mongo_uri和api_key值。您可以创建一个shell文件(例如start.sh),然后将其添加到.gitignore:>
    <span>export <span>PATH</span>="./node_modules/.bin:<span>$PATH"</span>
    </span>

    了解事件循环

    强大而聪明的事件循环是使节点一直使用的所有时间使节点变得如此快,出色的原因,而这本来可以浪费的,等待输入和输出任务完成。因此,节点非常擅长优化I/O结合系统。
    <span>NODE_ENV=production MONGO_URL=mongo://localhost:27017/accounts API_KEY=lolz nodemon index.js
    </span>
    >

    >如果您需要执行CPU密集型(例如,计算,密码的哈希或压缩),则除了为这些CPU任务传递新的过程外,您可能还需要探索任务的推迟,并使用SETIMMIDIATIE进行递延。 ()或settimeout() - 他们的回调中的代码将继续在下一个事件循环周期中继续。 NextTick()在相同的周期上工作,与名称相反。 argh!

    <span>{
    </span>  <span>"env": {
    </span>    <span>"NODE_ENV": "production",
    </span>    <span>"MONGO_URL": "mongo://localhost:27017/accounts"
    </span>  <span>}
    </span><span>}
    </span>
    >这是伯特·贝尔德(Bert Belder)的图表,他在活动循环中工作。他清楚地知道事件循环是如何工作的!

    >

    使用功能继承

    > JavaScript支持原型继承,即对象从其他对象继承时。班级运营商还使用ES6添加了该语言。但是,与功能性继承相比,它非常复杂。大多数节点专家都喜欢后者的简单性。它是由简单功能工厂模式实现的,并且不需要使用新的或新的原型。当您更新原型时,没有隐含的效果(导致所有实例也更改),因为在功能继承中,每个对象都使用其自己的方法副本。

    考虑TJ Holowaychuk的代码,TJ Holowaychuk是Express,Mocha,Connect,Superegent和数十个其他节点模块背后的多产天才。 Express使用功能性继承(完整源代码):

    <span>"scripts": {
    </span>  <span>"preinstall": "node prepare.js",
    </span>  <span>"postintall": "node clean.js",
    </span>  <span>"build": "webpack",
    </span>  <span>"postbuild": "node index.js",
    </span>  <span>"postversion": "npm publish"
    </span><span>}
    </span>

    是客观的,核心节点模块经常使用原型继承。如果您遵循该模式,请确保您知道它的工作原理。您可以在此处阅读有关JavaScript继承模式的更多信息。

    >

    >适当地命名

    这是显而易见的。好名字用作文档。您想要哪一个?

    >

    <span>export <span>PATH</span>="./node_modules/.bin:<span>$PATH"</span>
    </span>
    >我不知道Dexter仅查看app.use()时在做什么。如何有意义的名称:

    <span>NODE_ENV=production MONGO_URL=mongo://localhost:27017/accounts API_KEY=lolz nodemon index.js
    </span>
    >以相同的方式,文件名必须正确反映内部代码的目的。如果您查看Node(github链接)的LIB文件夹,该文件夹与平台捆绑在一起的所有核心模块,那么您将看到文件/模块的清晰命名(即使您对所有内容都不熟悉

    > all 核心模块):

    <span>{
    </span>  <span>"env": {
    </span>    <span>"NODE_ENV": "production",
    </span>    <span>"MONGO_URL": "mongo://localhost:27017/accounts"
    </span>  <span>}
    </span><span>}
    </span>
    内部模块用下划线标记(_debugger.js,_http_agent.js,_http_client.js),就像代码中的方法和变量一样。这有助于警告开发人员这是一个内部界面,如果您使用的是它,则您是您自己的 - 如果它被重构甚至删除,请不要抱怨。

    考虑不使用JavaScript

    吧?您刚刚正确阅读了吗?但是怎么了?是的。没错。即使具有ES6和ES2016/ES7添加的两个功能,JavaScript仍然具有其怪癖。除JavaScript外,还有其他选择,您或您的团队几乎没有设置可以从中受益。根据应用程序的专业知识级别和性质,您可能会更好地使用打字条或流量,从而提供强大的打字。在另一端,纯粹是功能性的ELM或Clojurescript。 Coffeescript是另一个很棒的战斗测试选择。您也可以看一下Dart 2.0。

    当您只需要几个宏时(宏允许您

    构建

    完全是您想要的语言),而不是整个新语言,然后考虑将做到这一点的sweet.js,可以做到这一点 - 允许您编写生成代码的代码。

    如果您走了非javascript路线,请仍然包含您的编译代码,因为某些开发人员可能无法很好地理解您的语言无法正确构建它。例如,VS代码是最大的打字稿项目之一,也许是在Angular 2之后,并且代码使用TypeScript使用类型进行补丁节点的核心模块。在VS代码回购的VSCODE/SRC/VS/BASE/NODE/NODE/NODE/NODE/NODE(链接)中,您可以看到熟悉的模块名称,例如加密,流程等,但使用TS扩展名。存储库中还有其他TS文件。但是,它们还包括带有本机JavaScript代码的VSCODE/build。

    >知道Express Middleware

    Express是一个很棒且非常成熟的框架。它的才华来自允许无数其他模块配置其行为。因此,您需要了解最常用的中间件,并且需要知道如何使用它

    。那么,为什么不抓住我的快递备忘单。我在那里列出了主要的中间件模块。例如,NPM I压缩-s将通过放气响应来降低下载速度。 logger('tiny')或logger('common')分别提供较少的(dev)或更多(prod)日志。> 向上

    由于其非阻滞I/O,因此> 例如,这就是您可以从PM2开始的方式:

    >

    然后,您可以启动同一服务器的四个实例:

    <span>"scripts": {
    </span>  <span>"preinstall": "node prepare.js",
    </span>  <span>"postintall": "node clean.js",
    </span>  <span>"build": "webpack",
    </span>  <span>"postbuild": "node index.js",
    </span>  <span>"postversion": "npm publish"
    </span><span>}
    </span>
    对于Docker,PM2版本2具有PM2-Docker。因此,您的Dockerfile看起来可以这样:

    <span>export <span>PATH</span>="./node_modules/.bin:<span>$PATH"</span>
    </span>
    >官方Alpine Linux PM2图像在Docker Hub中。>缓存请求
    <span>NODE_ENV=production MONGO_URL=mongo://localhost:27017/accounts API_KEY=lolz nodemon index.js
    </span>
    >这是一个最佳练习,可以使您从节点实例中获得更多的果汁(您使用PM2或类似的果汁,请参见上文)。要走的方法是让节点服务器执行应用程序工作,例如提出请求,处理数据并执行业务逻辑并将流量从静态文件中卸载到另一个Web服务器,例如Apache HTTPD或Nginx。同样,您可能应该使用Docker进行设置:

    >我喜欢使用Docker组成来制作多个容器(Nginx,节点,Redis,MongoDB)。例如:

    摘要
    <span>{
    </span>  <span>"env": {
    </span>    <span>"NODE_ENV": "production",
    </span>    <span>"MONGO_URL": "mongo://localhost:27017/accounts"
    </span>  <span>}
    </span><span>}
    </span>

    >在当今的开源软件时代,没有任何借口不从公开的受信任和测试的代码中学习。您无需进入内心圈子就可以进入。学习永远不会停止,我敢肯定,我们很快就会根据我们将经历的失败和成功获得不同的最佳实践。保证它们是。

    exports <span>= module.exports = createApplication;
    </span><span>// ...
    </span><span>function createApplication() {
    </span>  <span>var app = function(req<span>, res, next</span>) {
    </span>    app<span>.handle(req, res, next);
    </span>  <span>};
    </span>
      <span>mixin(app, EventEmitter.prototype, false);
    </span>  <span>mixin(app, proto, false);
    </span>
      app<span>.request = { __proto__: req, app: app };
    </span>  app<span>.response = { __proto__: res, app: app };
    </span>  app<span>.init();
    </span>  <span>return app;
    </span><span>}
    </span>
    >最后,我想写有关软件如何饮食世界以及JavaScript如何吃软件的信息……有很多很棒的事情,例如年度标准版本,很多NPM模块,工具和会议……但是相反,我将完成有一个谨慎的态度。

    我看到越来越多的人追逐下一个新的框架或语言。这是闪亮的物体综合征。他们每周都会学习一个新图书馆和每个月的新框架。他们强迫检查Twitter,Reddit,Hacker News和JS Weekly。他们利用JavaScript世界中压倒性的活动水平来拖延。他们有空的公共github历史。

    学习新事物是好的,但不要因为实际构建东西而混淆。 重要的是,您的薪水实际上是在建立东西。停止工程。您不是在构建下一个Facebook。 Promises vs. Generator vs. Async等待着我对我来说是一个疑问,因为当有人回复讨论中的线程时,我已经写了我的回调(并使用CoffeeScript的速度比普通的ES5/6/7快2倍! )。

    >最终的最佳实践是使用最佳实践,最好的方法是掌握基本面。阅读源代码,尝试代码新事物,最重要的是自己编写大量代码。现在,在这一点上,停止阅读并进行重要的船舶代码!

    ,以防万一这篇文章还不够,这里有更多关于最佳节点实践的阅读:

    https://blog.risingstack.com/nodejs-at-scale-npm-best-practices
    • https://devcenter.heroku.com/articles/node-best-practices
    • https://blog.risingstack.com/node-js-best-practices
    • https://expressjs.com/en/advanced/best-practice-performance.html
    • https://www.codementor.io/nodejs/tutorial/nodejs-best-practices
    • >
    • >用于Node.js开发的最重要的最佳实践是什么?其中包括使用异步编程,该编程允许进行非阻滞操作并改善性能。正确处理错误以防止应用程序崩溃也是至关重要的。其他最佳实践包括使用衬里来执行代码质量,使用环境变量进行配置以及编写小模块以使您的代码库可管理且易于理解。
    如何改善node.js应用程序的性能? 🎜>

    有几种方法可以提高node.js应用程序的性能。最有效的方法之一是使用群集模块,该模块使您可以创建所有共享服务器端口的子进程。通过允许同时处理更多请求,这可以显着提高应用程序的性能。此外,您可以使用pm2之类的工具来管理和监视node.js应用程序,可以帮助您识别和解决性能问题。 >

    使用node.js开发时要避免的一些常见错误包括阻止事件循环,不正确处理错误,而不是使用诸如linters之类的工具来强制代码质量。阻止事件循环会导致性能问题,因为它可以防止其他操作执行。无法正确处理错误可能会导致应用程序崩溃,而不使用衬里可能会导致不一致的代码质量和潜在的错误。

    >如何确保我的node.js应用程序安全?

    >确保您的node.js应用程序的安全性涉及几种最佳实践。其中包括使用HTTP进行安全通信,验证和消毒用户输入以防止注射攻击,并使用安全标头来防止常见的Web漏洞。保持依赖关系的最新状态也很重要,因为过时的依赖关系可能包含已知的安全漏洞。

    >

    >测试Node.js应用程序的一些最佳实践是什么? Node.js开发,并且有几种最佳实践值得关注。其中包括编写单元测试以测试应用程序的各个组件,集成测试以测试这些组件如何交互,以及端到端测试以整体测试您的应用程序。每当对您的代码库进行更改时,使用连续集成(CI)系统也很重要。 NODE.JS通常使用NPM,NPM,NPM,node.js的默认软件包管理器完成。重要的是要在软件包中指定依赖项的确切版本。您还应该定期更新依赖项,以从错误修复和安全补丁中受益。

    >

    >在Node.js中进行错误处理的最佳实践是什么? JS开发。最佳实践包括使用试用/捕获块来捕获同步错误,使用错误优先回调来处理异步错误,并使用集中式错误处理机制来处理一个地方的所有错误。记录错误以进行调试目的并使用适当的错误消息响应客户端也很重要。

    >

    >我如何确保Node.js?

    >确保Node.js中的代码质量质量涉及几种最佳实践。其中包括使用衬里来执行代码质量,遵循一致的编码样式以及编写测试以尽早捕获错误。使用版本控件(如Git)来跟踪您的代码库的更改并执行代码评论以捕获潜在问题也很重要。

    >如何缩放我的node.js应用程序?可以通过多种方式实现Node.js应用程序。一种常见的方法是使用群集模块创建共享服务器端口的子进程,从而使您的应用程序同时处理更多请求。您还可以使用负载平衡来通过多个服务器分发传入的网络流量,以及根据您的需求,水平缩放(添加更多机器)或垂直缩放(向单个机器添加更多资源)。

    >部署node.js应用程序的最佳实践是什么?这些包括使用环境变量进行配置,使用PM2之类的流程管理器来管理您的应用程序,并在对代码库进行更改时使用连续集成(CI)系统自动部署应用程序。监视您的应用程序以识别和解决绩效问题也很重要。

以上是10个Node.js的最佳实践:节点大师的启蒙的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn