首頁 >web前端 >js教程 >10個Node.js的最佳實踐:節點大師的啟蒙

10個Node.js的最佳實踐:節點大師的啟蒙

Joseph Gordon-Levitt
Joseph Gordon-Levitt原創
2025-02-17 09:26:09148瀏覽

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