JavaScript 踩坑心得— 爲了高速(上)

一.前言

不少狀況下,產品的設計與開發人員一直想打造一套高品質的解決方案,從而快速、平穩地適應產品迭代。速度是衡量產品適應性的真正且惟一的標準,並且,這並非筆者的一家之言。javascript

「速度是衡量適應能力的真正指標。」 ——艾瑞克·埃利奧特html

許多公司選擇 JavaScript,就是看中了它靈活、快速的優勢。儘管此言非虛,但若是你在構建 JavaScript 系統時考慮得不夠周全,靈活與高速的特性反而可能將你帶入歧途。前端

一些值得特別關注的問題包括:java

  • 代碼重複
  • 樣式或風格不一致
  • 沒法隨意擴展
  • 工具與模塊選擇阻礙了生產力
  • 測試程序不可靠或缺失
  • 深度繼承(猩猩/香蕉問題)

原做者曾在多個側重 JavaScript 的開發環境中工做了一段時間以後,幾乎經歷了全部擴展 JavaScript 應用可能致使的問題,客戶端與服務器端均不能倖免。如下是對這些問題的總結,但願能幫助你們少走一些彎路。node

二.基礎性原則

在探討與上下文相關的 JavaScript 問題以前,如下是一些與平臺相獨立的建議,確定能幫助你減輕工做負擔。react

1.避免經典的面向對象模式

JavaScript 功能很是強大,它爲對象組合提供了原型繼承與函數式編程功能,使用 JavaScript 的這兩大支柱功能,而不執着於經典的面向對象模式,可以有效發揮 JavaScript 的強勁功能。應用的組合度與模塊化程度越高,從此就越容易重構與擴展。git

2.越懶越好

現而今,NPM 上提供了超過20萬個模塊。時間就是金錢,你花在代碼維護上的時間越多,對僱主而言,你就越昂貴。更況且,許多代碼其實不用你親自編寫。github

在這裏,筆者還建議你使用第三方的運維服務與工具。不必創建本身的分析平臺,除非你的應用擴展到很是大的規模,以至於 Google Analytics,Mixpanel,百度統計等 SaaS 營銷軟件沒法知足你的需求。使用這些服務處理相關任務,能促使你專一於真正重要的東西——產品,並且,如今研發的人力成本愈來愈高,使用適當的 APM 軟件也能減小開發維護網站的任務量,例如 OneAPMNewRelicAPPdynamic 等,這能讓工程師專一於生產價值,而不是管理代碼質量。npm

3.保持一致性

致使生產力嚴重下滑的另外一重要緣由是面對陌生代碼時手足無措,四處翻找。採用統一的風格指南,建立可辨明的樣式,就能解決這一難題。一樣的風格與樣式意味着新的項目看起來也更爲熟悉。編程

筆者尤爲偏心 Airbnb 的風格指南。該指南的貢獻者超過 160 人,每月有16.9萬次的下載。此外,它還提供了一個 ESLint 插件,也就是說,若是你不許備覆蓋什麼的話,無需任何配置就能爲你所用。

與成千上萬名 JavaScript 工程師共享樣式與風格。

此外,使用 linter 以確保團隊內部的樣式一致。目前,ESLint 是筆者最愛的 linter,由於它不只提供了插件能力,還擁有來自開源社區的持續支持。幾乎針對每一種文本編輯器與 IDE,都有 ESLint 插件可用。

Yeoman 也能夠幫你建立在新項目中使用的應用模板,實現更爲深刻的一致性。有了 Yeoman,你能夠在每一個應用中使用相同的基本依賴關係,編碼樣式以及風格。

4.充分利用豐富的工具

JavaScript 是擁有最完備的工具生態系統的編程語言之一。請必定要利用這一點!iron-node,react devtools 和 redux devtools 都是不容錯過的工具。

Electron 與 React Native 提供了訪問原始環境的能力,容許你爲對種平臺建立應用,並且,能有效提升代碼重用率。

三.編寫過程當中的「坑」
1.儘量保持小巧

將應用分爲許多小巧的模塊,能真正實現可組合的 JavaScript。遵循 FIRST 原則(Focused 專一,Independent 獨立,Reusable 可重用,Small 小巧,Testable 可測試),可以下降應用複雜度,同時提高測試能力與重用率。

「不管是客戶端組件仍是服務器端的組件,不管是 Node 模塊仍是一段可視化 UI,龐大的組件老是比小巧的組件更復雜,更難以維護。」 ——阿迪·奧斯馬尼

請記住,模塊的功能越小越好。事實上,模塊越小,其重用率就越高。

2.充分利用 ES2015

將其用於 APIs,SPAs,以及二者的全部中間環節。相似 Bable的工具能給你帶來極大的優點。在今天,使用 ES2015 的能力意味着你能夠用更少、更整潔的代碼建立應用。不要由於懼怕供應商鎖定或這些工具不容易找到而放棄使用它們。

老實說,如今已經沒有理由不適用 Babel 了!Bable 既能夠處理普通的 JavaScript,也能夠處理任何類型的編譯代碼。這意味着,你能夠隨時將模塊移回 ES5。

創建能與 JavaScript 無缺擴展的服務並不是易事。應用越大,快速運行並適應新變化就越難。請確保你正在建造的服務是高度可用,且支持自動擴展的。

3.創建支持 JavaScript 應用的基礎架構

JavaScript 是一種單線程的語言。這意味着,在沒有集羣的狀況下,你的應用只能使用單個 CPU。筆者喜歡將負載平衡工做留給代理或 NGINX 之類的負載平衡器,而不是交由 Node 的集羣模塊處理。此外,筆者還偏好使用較小的服務器來運行應用。這樣,當須要更多資源時,筆者只需增長服務器的數量就能輕易實現橫向擴展。這能幫助筆者最小化當前的運營成本。

4.集裝箱化!集裝箱化!集裝箱化!

如下是部分緣由:

  1. 集裝箱化會迫使你聽從應用開發12大原則
  2. 經過集裝箱化,能夠實現開發、階段、測試以及生產環境的對等。
  3. 集裝箱很是易於橫向擴展。
  4. 你能夠輕易將應用轉移到其餘雲服務上。(防止供應商鎖定,使用其餘支出服務。)

實現環境集裝箱化的理由還有不少不少,一旦掌握了基本知識,集裝箱化就不難實現。若是你想打造在任何平臺都能使用的靈活應用,集裝箱化是必須掌握的第一步。並且,因爲集裝箱在外部是無狀態的,能夠支持無限次複製。

5.打造易於擴展與維護的應用

對於 APIs 與服務,選擇 Hapi 做爲服務器框架,Joi 用於校驗,hapi-swagger 插件用於維護活文檔,是至關不錯的組合。

Hapi 特別適用於模塊化的大型應用,同時也能爲簡單的應用提供支持。此外,最讓它不同凡響的是其提供的封裝能力。Hapi 提供了許多經過依賴注入訪問服務器的「插件」。這樣,你能夠將業務邏輯按照緊密程度進行分組。將應用分解到這些插件中,能極大地提升擴展能力。項目的操縱也變得極爲直白,緣由是不須要學習自定義的插件架構,而 Hapi 自己又提供了豐富的文檔資料。

Joi 是一種驗證模塊,與 Hapi 出自同一班工程師之手(Walmart Labs)。Joi 的 API 與其卓越的功能使得驗證變成小菜一碟。你知道如何創建驗證模式,所以建立驗證模塊也變得很是簡單。用於驗證 UI 中某個表格的一段代碼也能夠用來驗證一個傳入的請求、一個模塊,或測試。的確是很是使人驚奇。

將 hapi-swagger 插入服務器後,你能夠輕易地將任意路徑標記爲 API 的一部分,hapi-swagger 會幫你生成活文檔。更不用說,hapi-swagger 會讀取 Joi 驗證,爲開發者提供細緻的 API 文檔,而你不用費吹灰之力。不過,使用 Express 或 Koa 也可能獲得相同的效果,但筆者仍舊認爲 Hapi 是很是驚人的工具。

四.關於後續

本文主要講的是關於 JavaScript 使用過程當中的一些基礎性的心得體驗,不必定適合每個人,可是確實也是做者的「踩坑之得」,你們在閱讀以後若是有什麼想分享的也能夠在討論區進行回覆,閉門造車老是不行的。

本文的下一個姊妹篇,主要講的內容預計爲關於 JavaScript 使用過程當中如何提升用戶體驗和性能優化這方面的內容,敬請期待~

Browser Insight 是一個基於真實用戶的 Web 前端性能監控平臺,可以幫你們定位網站性能瓶頸,網站加速效果可視化;支持瀏覽器、微信、App 瀏覽 HTML 和 HTML5 頁面。想閱讀更多技術文章,請訪問OneAPM 官方技術博客

本文轉自 OneAPM 官方博客

相關文章
相關標籤/搜索