如何編寫漂亮的 React 代碼?

2021-01-20 網易

  作者 | Vinícius Andrade

  譯者 | 張健欣

  策劃 | 田曉旭

  React 代碼很難看。我不是在談論這個框架的任何技術特性;我說的是直觀的美學,代碼在我屏幕上的樣子,以及它所喚起的感覺。

  代碼美學通常並不是開發人員關注的問題。我們要操心更重要的問題。美學是主觀的,很難衡量,追求它的好處也並不明確。你很少會看到一個開發人員舉手在站例會上告訴他們的同事他們對代碼在屏幕上的樣子不滿意。我不確定是否有人會這麼做,但我的看法有所不同。

  我是在從事一個副業項目時,開始考慮 React 的美觀問題的。作為大多數以編碼為職業和愛好的程式設計師,工作和休閒之間的區別是由你所享受到的快樂所決定的。當然,我們的職業生涯目標是讓這兩者一致,儘管有時候這兩者是一致的,但是當這兩者不一致時,你仍然希望你的「編碼放鬆」時間儘可能地愉悅。

  當然,如果出於某種原因,React 對我來說是不愉快的,而我想要花時間編寫代碼來獲得樂趣,那麼最明顯的做法就是不要使用 React。而我大多數時間就是不用 React 的。但是,眾所周知,編碼是多方面的:你有代碼、工件、你向計算機輸入的符號行,但你也有代碼結果,它的輸出,你用程式語言表達的想法的現實意義。可以從我的代碼與現實世界的交互中獲得同等甚至更大的樂趣,我對此比較在乎。

  結果是,儘管有時我發現一種程式語言、框架、工具不太好看或不好用,但我需要它來在合理的時間內讓我的代碼描述現實的某件事。也許這就是大型社區圍繞這些工具創建東西的原因,或者其它一些技術特性。不管什麼原因,我的編碼作為業餘愛好的時間很少,而且儘管我想讓它變得愉快,但我也希望充分利用這些時間,這意味著使用不總是符合我的審美標準的東西。React 就是這樣的東西。

  有一天,當我思考這個話題的時候,突然想到一個問題:我能在保持高生產力的同時,寫出既美觀又令人愉悅的 React 代碼嗎?我知道在其它程式語言和框架中,這個問題有非常有價值的答案。所有那些方法都會有不同程序的相同權衡,例如學習難度、能從 React 生態系統獲益的多少、圍繞它的工具如何等等。所有這些權衡都要根據項目的目標進行不同的衡量。

  我對這個問題的答案通常是一些非 React 的其它東西。但每隔一段時間,你會比較每一個權衡;你從不同的角度看待你的項目;你試著重新考慮你設想的特性和你的需求;最後,React 會是你的答案。考慮到這些情況,我將原來的問題重新設定為:「在保持 React 代碼不變的同時,我還能在多大程度上使 React 代碼更好看?」

  「在保持 React 代碼不變的同時,我還能在多大程度上使 React 代碼更好看?」

  為了開始回答這問題,我創建了一個 Create React App 項目,使用了一些簡單的 React 代碼作為參考。我希望它有一點兒抽象,足夠簡單,這樣就不會妨礙測試不同的東西。我選擇了官方的 React 教程代碼,你可以在這裡找到。

  聚焦這段代碼的最簡單的 React 組件,Square 組件,我們看到如下代碼:

  
function Square(props) { return ({props.value});}

  而這就是比較主觀的一點:我對這段代碼很不滿意。我不是在討論這段代碼的技術屬性。當我說它難看的時候,我只是在試圖表達它在我心中喚起的一套感覺,而這在很大程度上是基於我對世界的總體體驗,特別是編程。從這個角度來看,第一個讓我抓狂的問題是 JSX。

  自從 JSX 推出以來,它已經被討論了很多,但是為了闡明我的觀點,我將快速說明一下。JSX 很混亂,但它也是一種現實產物。它源於前端技術的自然演變,從一開始就有某種形式的 XML 語言來定義標籤。不同之處在於,JSX 通常位於 JavaScript 代碼中。

  與口語語言進行粗略的類比,JSX 就好像某一特定語言的使用者開始使用其它語言的一整套單詞和短語來表達自己。例如,當一個特定的主題是某一特定文化所固有的時候,這種情況就經常發生。當文化之外的人,說不同語言的人,面對表達關於這個主題的想法的挑戰時,他們通常會缺乏詞彙來處理這個問題,重複使用那些「產生」這個話題的人所說的語言來解決這個問題。語言純粹主義者很快就會生氣,指出你怎麼能不需要外來詞彙就可以說那些話題。但人們仍然會使用這些詞,其中一些詞最終會被納入官方語言。JSX 誕生於 JavaScript 開發人員對於表達 UI 標籤的需要。

  繼續上面語言使用者的類比,一些靈魂將語言用於審美目的和自我表達。詩人和文學作家通常就是這樣。他們如何看待外語單詞?好吧,他們毫無疑問會有不同的看法。他們的觀點與我這裡的觀點類似,因為這不僅從語言表達思想的能力來看待語言,同時還從美學角度考慮。從這個角度來看,JSX 的使用是不必要的:它增加了噪音,並且對於它表達思想沒有幫助。

  所有這些都是說,我朝著一種更愉快的方式編寫 React 的第一步就是擺脫 JSX。

  無 JSX 版本的 button 組件如下所示:

  
const e = React.createElement;function Square({ onClick, value }) { return e(『button』, { className: 『square』, onClick }, value);}

  代碼的一致性和簡潔性帶來了實質上的美學提升。而且我們可以在無 JSX 路上走得更遠。我遠不是第一個討論是否採用 JSX 的人。對於 JSX 的厭惡可能和 JSX 本身一樣古老。我打賭 JSX 最初的團隊至少有人說過這是不必要的。你會發現大量關於 JSX 糟糕的原因以及不使用 JSX 的好處的閱讀資料。令人高興的是,你也可以找到技術上的替代品。一個突出的例子是 Hyperscript,它是 React 團隊 在他們的文檔中 推薦的。這是一個簡單的工具,可以幫助你使用 JavaScript 構建超文本。它的 React 版本帶來了比 createElement 更吸引人的 API。我決定將它與一個稱作 hyperscript-helpers 的小工具庫一起使用試試,我發現這些工具對代碼美觀的貢獻相當不錯:

  
function Square({ onClick, value }) { return button({ className: 『square』, onClick }, value);}

  取代 JSX 是帕累託原則在 React 代碼美觀方面的應用。省力,效果好。如果想要更漂亮的 React 代碼,每個人都應該採取行動。繼續探索如何在框架領域美化 React 代碼,我發現了一個死胡同。雖然我可以探索一些設計模式和簡單的慣例,但它們需要根據具體情況評估它們的技術含義,而我正在尋找更通用的方法。因此,下一步需要在 JavaScript 層探索。

  JavaScript 是一種非常靈活的語言,這是一把雙刃劍。這也可以從美學角度來探索。有許多不同的方法可以編寫有效的代碼,但會有明顯的風格差異和技術意義。許多工具可以幫助你自定義和強制你所選擇風格,在這些工具中,我最喜歡:StandardJS。StandardJS 是一個用於自動將一系列合理的編碼樣式選擇應用到你的代碼的一個工具。在這些選擇中最具有美學意義的一點是去掉了分號。

  我發現,分號在 JS 代碼中是一種不必要的噪音,我很樂意冒險不使用它們。在我將 StandardJS 合併到我的參考示例後,是下面這樣:

  
function Square ({ onClick, value }) { return button({ className: 『square』, onClick }, value)}

  現在就 JavaScript 代碼而言,這是我所能得到的最好的代碼了。回顧到目前為止我所做的東西,一切看起來還都不錯。這些更改實現很簡單,可以很容易地集成到我的默認副業項目的 React 配置中。另一方面,這在美學上與我在其它不同語言中的體驗仍然相去甚遠。我已經討論過其它語言的情況,重點是我想在 JS 世界中使用 React。除非有什麼東西能給 JavaScript 增添一些優雅的光彩,同時又保持 JavaScript 的樣子,否則很難達到我設定的界限。

  「就像 JavaScript 一樣。」當試圖發揮我的創造力去尋找不同的可能性時,這句話讓我回到了十年前。我正在學習 Web 開發,而且剛剛碰到 Ruby on Rails。那時,Rails 在發布時通常會內置附帶一種不同類型的 JavaScript,稱作 CoffeeScript。CoffeeScript 有一條黃金法則:「這只是 JavaScript。」就是那樣,CoffeeScript 可以滿足我的標準,因此我決定看看這個項目進展如何並嘗試一下。

  我知道,自從 ES5 以來,CoffeeScript 的一些好的特性被整合到 JS 標準中,因此從技術上講,人們採用 CoffeeScript 的理由更少了。隨著編譯器的出現,使得每個人都可以使用甚至還不是標準的 JS 特性,即使是不得不支持舊瀏覽器的開發人員現在也可以從最新的語言特性中受益。這使得 CoffeeScript 的流行程度大不如前。但是我的興趣不是技術性的。我想找到一個令人愉快的美學方案,使得我可以編寫看起來不錯的 React 代碼,同時還是 JavaScript,而不需要學習一種新語言或者框架。

  從文檔來看,CoffeeScript 與 JavaScript 非常接近,我可以忽略學習曲線,而且它在美學方面給代碼帶來了顯著改進。我一直懷疑它是否還在維護,事實證明它確實還在維護。其最新版本在今年初完成。它的最新主版本包含了新的 JS 特性,甚至支持 JSX。因此,我決定將它集成到我的示例項目中。為此,我不得不將我的 Creact React App 配置彈出,這樣我就可以為 CoffeeScript 增加一個 Webpack 加載器。除此之外,轉換非常簡單。

  這就是設計的 Button 組件最終代碼的樣子:

  
Square = ({ onClick, value }) -> button 『.square』, { onClick }, value

  如果你對整個代碼最終的樣子感到好奇,你可以在這裡找到它。

  在美學方面,我認為這個代碼對於我最初的代碼是巨大的進步。語法簡潔,看起來乾淨。

  關於美的追求,更少就是更美,人們已經說了很多。我很認同這一點。結果發現,我的美觀探索基本上就是用更少的 React 代碼表達思想。CoffeeScript 帶來的卓越改進——也是其它語言使用的方式——就是去掉無意義的標記。這種認識在最後會很明顯,但最初不怎麼明顯。它的目的是總體上增強 less 的力量。

  從務實的角度來看,乍一看,採用這種風格似乎不會影響生產力。CoffeeScript 推出已經有一段時間了,而且我期望它有一些像樣的工具。我在做這個快速實驗時沒有感到意外。不過,有一件事讓我無法完全採用它:那就是與 TypeScript 一起使用的能力。我知道如何讓它起效,但是我決定在這一點上停止探索。不管怎樣,如果你喜歡這個情景,就會有興趣採用相似的方案,並且會對它如何與 TypeScript 一起工作感到好奇,可以留言告訴我。

  總結:從代碼美學的角度來看,Hyperscript 和 CoffeeScript 的結合是編寫漂亮的 React 代碼的一種很好的方式。

  作者介紹

  Vinicius Andrade,學會編碼,學會思考,學會行動,學會等待——在 https://vicnicius.com 記錄所思所感。

  https://medium.com/javascript-in-plain-english/writing-beautiful-react-code-using-a-good-old-mate-ca1450c0dc06

特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺「網易號」用戶上傳並發布,本平臺僅提供信息存儲服務。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關焦點

  • React系列(一) -邂逅React開發
    React開發依賴開發React必須依賴三個庫:react:包含react所必須的核心代碼react-dom:react渲染在不同平臺所需要的核心代碼babel:將jsx轉換成React代碼的工具第一次接觸React會被它繁瑣的依賴搞蒙,對於Vue來說,我們只是依賴一個vue.js文件即可,但是react
  • React-redux數據傳遞是如何實現的?
    主要內容React數據傳遞reduxReact-redux其他學習目標第一節 react數據傳遞react 中組件之間數據傳遞1. 父傳子2. 子傳父(狀態提升)3.2.使用純函數來執行修改如何改變 state tree ,你需要編寫 reducers。它接收先前的 state 和 action,並返回新的 state3.State 是只讀的唯一改變 state 的方法就是觸發 action,action 是一個用於描述已發生事件的普通對象。執行上面純函數。3.
  • 如何編寫簡潔美觀的Python代碼
    介紹你有沒有遇到過一段寫得很糟糕的Python代碼?我知道你們很多人都會點頭的。編寫代碼是數據科學家或分析師角色的一部分。另一方面,編寫漂亮整潔的Python代碼完全是另一回事。作為一個精通分析或數據科學領域(甚至軟體開發)的程式設計師,這很可能會改變你的形象。
  • 如何以及為什麼應該使用React Query
    使用react-query的自定義hook簡化數據獲取。而如果你能減少數據獲取所需編寫的模板代碼量呢?我們將在這裡深入探討的另一種解決方案是React Query。這個庫將幫助你獲取、同步、更新和緩存你的遠程數據,同時通過為你提供兩個簡單的hooks和一個實用函數來減少你需要編寫的代碼量。
  • 移動開發者如何更好地學習 React Native?| 技術頭條
    其實是有套路的,有經驗的程式設計師會說這就是思想,下面主要從移動開發這幾個方面調研:計算機語言工具環境搭建UI繪製基本布局方式基本tab + navigator的APP框架搭建網絡請求(http, https, 上傳,下載等)緩存, 本地存儲圖片平臺特性處理:例如推送,支付等等iOS,安卓不同的平臺代碼如何處理調試工具:好的調試工具不但可以事半功倍,還可以給開發者愉悅的心情開發靜態代碼檢查
  • Typescript + React 新手篇
    · TS 類型聲明讓提高代碼的可讀性、結構清晰· IDE的提示更加智能目標完成td的媒體模塊(基於react+umi+ant design),重構以前的ES6代碼為TS代碼· umi-typescript 腳手架· 跑通代碼· 新建媒體頁面· 創建媒體model· 媒體service
  • React系列十六 - Redux(二)react-redux
    來源| coderwhy一. react結合redux1.1. redux融入react代碼目前redux在react中使用是最大的,所以我們需要將之前編寫的redux代碼,融入到react自定義connect函數上面的代碼是否可以實現react組件和redux結合起來呢?
  • React 路由 react-router 入門實踐
    一、前言react 的 react-router 和 vue-router 非常像,都是做一個頁面跳轉的操作。二、代碼>1.首先編寫頁面組件AmericaPage.jsimport React, { Component, Fragment } from &39;class AmericaPage extends Component { constructor(props) { super(props
  • 十大最受歡迎的 React Native 應用開發編輯器
    作者丨 Murtaza Basrai譯者 丨 安翔市面上用於開發工作的編輯器非常多,筆者會經常因為不同的程式語言該如何選擇好用的編輯器而感到糾結。而在隨後從事 React Native 開發工作過程中,對相應的編輯器做了一些探索和研究,本文總結了一些非常適合移動應用開發的編輯器和 IDE。1.
  • 如何在一小時內用 React 編寫出簡單的小遊戲?
    最近有個很火的視頻叫做「5 分鐘編寫貪吃蛇」。視頻很不錯,這種快速編程的方法也很有意思,所以我決定自己也做一個。    通過 create-react-app(https://github.com/facebook/create-react-app)來創建 React 項目非常方便:  $ npm install -g create-react-app$ create-react-app react-gameoflife   不到一分鐘的時間,react-gameoflife
  • React 0.14 發布,拆分為 react 和 react-dom
    React 0.14 正式發布,此版本包括一些重要的改進,主要是簡化代碼編寫,提供更好的支持環境,比如 React Native。
  • Facebook 發布 React Native for Android
    React Native 讓開發者使用 JavaScript 和 React 編寫應用,利用相同的核心代碼就可以創建 Web,iOS 和 Android 平臺的原生應用。React Native 的宗旨是,學習一次,高效編寫跨平臺原生應用。
  • React學習筆記(一)
    這樣,在保證性能的同時,開發者將不再需要關注某個數據的變化如何更新到一個或多個具體的DOM元素,而只需要關心在任意一個數據狀態下,整個界面是如何Render的。編寫第一個react應用程式react開發需要引入多個依賴文件:react.js、react-dom.js,分別又有開發版本和生產版本,create-react-app裡已經幫我們把這些東西都安裝好了。
  • kbone 基礎Kbone + React 項目手工搭建流程
    2、編寫 webpack 配置2.1 webpack.mp.config.js在項目跟目錄下創建文件夾 build,在 build 下面新建一個 webpack.mp.config.js 文件,用於小程序端代碼的構建,文件內容如下
  • 記一次從 react-native到flutter的換血
    [精釀筆記]是我在2016年開發的產品,客戶端採用的是react-native,之後再一次時隔比較長的版本升級中,我發現升級過程中,出現好多問題,無奈只能重新創建,這導致我又花了很多時間處理引入庫的問題,而且對於realm資料庫在國內升級緩慢的問題,長列表刷新滾動問題,我也一直很討厭,但當時沒有找到更好的解決方案。
  • 2020年Flutter和 React Native如何選擇
    流行度react是2015年發布的,flutter是2018年發布的,因此,目前react的社區是比flutter的社區更強大些。不過在亞洲地區,flutter還是有著很大的用戶社區的,似乎谷歌的產品在亞洲都有著不錯的口碑。
  • 如何用 React Native 開發一款電商 App?
    本文編譯自Hackernoon,原文標題為:Building an e-commerce search app with react native,推薦有一定編程基礎的讀者閱讀。今天我們來聊一聊是如何在RN平臺開發一款用於查找圖書資料庫的電子商務移動app。如果你之前沒有使用過RN,那麼現在就跟我一起開啟你的移動端Javascript開發之旅吧。
  • 程式設計師如何掌握 React 開發的黃金法則?| 技術頭條
    自然組件:如果你被要求一張照片,你的「自然組件」就是這些用來顯示這張照片的代碼,你不需要知道如何獲得數據的細節,也不需要知道它在應用程式中的位置,所有你需要知道的是它應該起作用。外部世界:這裡指的是你的應用程式所擁有的任何資源(例如Redux Store),而這些資源是可以被轉換以滿足你的自然組件的props。
  • 2020年Flutter和 React Native如何選擇
    flutter vs react native如果我們想要進行跨平臺開發,那麼Flutter流行度react是2015年發布的,flutter是2018年發布的,因此,目前react的社區是比flutter的社區更強大些。不過在亞洲地區,flutter還是有著很大的用戶社區的,似乎谷歌的產品在亞洲都有著不錯的口碑。
  • VSCode 中的熱門好使的 React 代碼生成插件
    一、前言有一些代碼,基本固定成套,若不使用代碼模板,將是一個耗時無益的操作。二、安裝搜索react,如圖所示,便是reac代碼生成插件: 三、使用下面分享幾個常用的代碼生成代號1.imrc完成react基本依賴導入import React, { Component } from &39;2.