從 React 到 Preact 遷移指南
作者 | 劉凱
專注 Web 前端技術,崇尚一目瞭然的設計。
為什麼選 Preact
React 的 3kb 輕量化方案,擁有同樣的 ES6 API
體積小。React v15.6.1 有 49.8kb,最新的 React v16.0 小了很多,有 34.8kb。而 Preact 官網聲稱只有 3kb,實測 v8.2.5 版本有4.1kb,但這已經比 React 小了至少 30kb,在移動端網頁開發中佔了不少優勢。
效能高。是最快的虛擬 DOM 框架之一,具體可以檢視 Results for js web frameworks benchmark – round 6。
生態好。官方提供 preact-compat,可以無縫使用 React 生態系統中的各類元件。
更方便。相比 React,Preact 添加了幾個更為便捷的特性,包括可以直接使用標準的 HTML 屬性(如
class
和for
),props
,state
和context
作為引數傳進了render()
等。
除了 Preact,React-like 中比較出名的還有 Inferno,它大小在9kb左右。它和前面兩者相比,還加了一個新的特性就是無狀態元件(stateless components)也支援生命週期事件,從而可以減少class
的使用,做到更加輕量。效能比 React 和 Preact 都要好,其它方面和 Preact 差不多。但是有個問題是 Inferno 用了一些相對較新的特性,比如Promise
Map
、Set
、WeakMap
等,所以瀏覽器相容性比 Preact 要差點。
遷移指南
官方文件
用 Preact 替換 React
官方文件提供了2種途徑,都是在原專案上把 React 替換成 Preact,我們為了保持專案乾淨採用建立新專案的方式來做。
準備
1. 建立專案
Preact 官方提供了2種方式來建立專案:
preact-cli
Preact Boilerplate / Starter Kit
官方推薦用方式一,但我們為了方便定製採用了方式二來建立,去掉了 preact-compat
等暫時沒用到庫。
2. 複製程式碼
建立完專案,把原專案中 src
目錄下的程式碼(index.js、元件等)拷貝到新專案src
這樣準備工作就做好了,當然現在專案還是跑不起來,會各種報錯,接下來我們需要修改程式碼。
修改程式碼
react
把 react
替換成preact
:
import React from 'react';
// =>
import { h } from 'preact';
Preact 的 h()
相當於 React 中的createElement()
,可以閱讀WTF is JSX瞭解更多。
import { render } from 'react-dom';
// =>
import { render } from 'preact';
import { Component } from 'react';
// =>
import { Component } from 'preact';
redux
直接替換成 preact-redux 就可以,其它都一樣:
import { Provider } from 'react-redux';
// =>
import { Provider } from 'preact-redux';
router
我們原專案採用的是 React Router v3,Preact 官方提供了 preact-router,它並不是 React Router 的 preact 相容版本,而是另一種輕量級的路由方案。如果你還是想用 React Router,可以它的 v4 版本,因為 v4 版本可以直接和 Preact 一起使用,而不需要 preact-compat 來做相容。
所以如果你有比較複雜的需求的話,比如路由巢狀、檢視合成等等,可以考慮用 React Router v4;如果只是想要比較基本的路由需求的話,那就用 preact-router 好了。我們專案路由需求不復雜,為了追求輕量,就採用了 preact-router,畢竟 React Router 比 preact-router 大了很多。
因為不相容,所以改動也是比較大的:
import { Router, Route, IndexRoute } from 'react-router';
// =>
import Router from 'preact-router';
import { hashHistory } from 'react-router';
// =>
import createHashHistory from 'history/createHashHistory';
const hashHistory = createHashHistory();
const routes = ( <Router history={hashHistory}> <IndexRoute component={Home} /> <Route path="about" component={About} /> <Route path="inbox" component={Inbox} /> </Router>
);
// =>
const routes = ( <Router history={hashHistory}> <Home path="/" /> <About path="/about" /> <Inbox path="/inbox" /> </Router>
);
原 <Route/>
的onEnter
/onLeave
鉤子也沒了,不過沒關係,因為用元件的生命週期才是更合理的。
這樣做完路由配置之後,元件中用到路由的部分也不一樣了。原先取當前頁面的 URL 或者 query 是這樣的:
class Home extends Component {
componentWillMount() { const { router } = this.context; const { params } = this.props; const url = router.location.pathname; const { id } = params; }}
現在就只需要:
class Home extends Component {
componentWillMount() { const { url, id } = this.props; }}
是不是更簡單了。preact-router 引入了更少的 API,語法也更加簡潔。
有了路由,當然也少不了連結。原先我們會寫成這樣:
import { Link } from 'react-router';
<Link to="/about">關於</Link>
現在只需要寫成普通的 <a/>
標籤就可以了,因為 preact-router 會自動匹配<a/>
標籤到路由:
<a href="/about">關於</a>
當然如果你要修改啟用狀態樣式的話還是可以用 <Link/>
,但注意這裡用的是href="/"
而不是to="/"
:
import { Link } from 'preact-router/match';
<Link activeClassName="active" href="/">Home</Link>
總結
上面只是梳理了我們在做遷移時需要改動的地方,因為之前並沒有用第三方的 React 元件,所以也沒有用 preact-compat,除了 router 改得比之前更簡單了,其它基本不需要怎麼改動,整體來說遷移成本不高。
遷移後效果最明顯的就是編譯出來的 js 小了很多,基本是之前的1/3,所以移動端網頁開發推薦用 Preact 替換 React。
全文完
以下文章您可能也會感興趣:
我們正在招聘 Java 工程師,歡迎有興趣的同學投遞簡歷到 [email protected] 。
杏仁技術站
長按左側二維碼關注我們,這裡有一群熱血青年期待著與您相會。
相關推薦
從 React 到 Preact 遷移指南
作者 | 劉凱專注 Web 前端技術,崇尚一目瞭然的設計。為什麼選 PreactFast 3kB
Spring Cloud Alibaba遷移指南(一):一行程式碼從 Hystrix 遷移到 Sentinel
自 Spring Cloud 官方宣佈 Spring Cloud Netflix
Spring Cloud Alibaba遷移指南2:一行程式碼從Hystrix遷移到Sentinel
開發十年,就只剩下這套架構體系了! >>>
D3.js從入門到“放棄”指南
局限 .text 技術 綁定 作圖 ansi 實現 了解 selectall 前言 近期略有點諸事不順,趁略有閑余之時,玩起D3.js。之前實際項目中主要是用各種chart如hightchart、echarts等,這些圖形庫玩起來貌都是完美的,一切皆可配置
使用vmware vconverter從物理機遷移系統到虛擬機P2V(多圖)
ensure 網卡通信 src block 用戶界面 vswitch sp2 winrar select zhuan:https://segmentfault.com/a/1190000002697929 本文完整記錄了如何從物理服務器,保持所有環境配置信息,紋絲不
多租戶:在Oracle12.2中 從Non-CDB遷移到PDB,從PDB遷移另一個CDB中
oracle12c 多租戶 遷移 PDB 1、從PDB或者Non-CDB遷移到另一個CDB的PDB準備從PDB或者Non-CDB遷移到CDB容器數據庫中PDB,由於PDB和Non-CDB遷移到CDB的步驟幾乎相同,PDB和Non-CDB遷移非常相似,共同進行處理。準備:CDB1:目標pdb數據
React JS和React-Native學習指南
cno example part div roman javascrip add pull tree 自己在學習React-Native過程中整理的一份學習指南,包含 教程、開源app和資源網站等,還在不斷更新中。歡迎pull requests! React-Native學
[python] 從python2.x遷移到python3.x的常見操作
print 'something' > print('something') xrange() > range() 除法division python 2.x : 整數 / 整數 python 3.x : 整數 // 整數 這個很難發現,因為python弱
從React Redux的實際業務場景來看有限狀態機
寫在前面 上一篇:從Promise的實現來看有限狀態機 上一篇講到了一個簡單的,利用了有限狀態機的前端實現Promise。Promise的有限狀態機除了start以及finish兩個狀態,其核心的三個狀態其實就是一個非同步行為的三種狀態:PENDING、FULFILLED、REJECTED。通過非同步行為
redis 遷移工具 redis-port 從阿里雲遷移到aws
對於 redis 的 遷移我在網上看到了很多方法,有使用redis-dump 的,有使用 aof匯入方式,有rdb檔案遷移方式,和redis-port。 由於我是將 redis 從阿里雲遷移到AWS,那麼很多方法都被pass掉了,最後我想使用的方法是redis-dump&n
從單體架構遷移到微服務,8個關鍵的思考、實踐和經驗
隨著微服務架構的持續火熱,網路上針對微服務和單體架構的討論也是越來越多。去年的時候,社群更多的關注點是在二者的區別以及優缺點辨析上,而今年,越來越多的人開始關注如何從單體架構遷移到微服務上。毋庸置疑,微服務的理念正在席捲整個開發者社群,像Netflix、Uber這樣的公司都是非常成功的應用案例。
React Hooks 實用指南
前言 在React Conf 2018會議中,Dan Abramov 介紹了 React Hooks。官方的描述為 Hook是一項新功能提案,可讓您在不編寫類的情況下使用狀態和其他React功能。 它們目前處於React v16.7.0-alpha中。計劃將在 2019 Q1 推出到主版本中。 痛點 以下
微信公眾號從測試號遷移到正式號
微信公眾號開發流程一般是先在測試號上開發,待開發完成後再遷移到正式號上。 一、繫結公眾號到開放平臺 如果有多個微信系產品(含微信小程式、公眾號)且需要打通使用者,即需要先在微信開放平臺繫結該微信公眾號,來確保打通unionid。 二、配置並啟用開發
漫談何時從單體架構遷移到微服務?
-m 嘗試 客戶 完全 部署方式 互調 積累 多個 朋友 面對微服務如火如荼的發展,很多人都在了解,學習希望能在自己的項目中幫得上忙,當你對微服務的廬山真面目有所了解後,接下來就是說服自己了,到底如何評估微服務,什麽時候使用微服務,什麽時間點最合適,需要哪些技術儲備和資
React,遷移到 Vue 的心路歷程
前幾年我一直在使用 React。最初僅有 React,後來使用 Redux 和 React 的其他庫(react-router、react-redux、prop-types 等)配合使用。我喜歡 React 的簡單和方便,使用 React 的時光一直都很快樂。我喜歡這個時
zendao禪道管理從本地服務遷移到阿里雲
zendao禪道管理從本地服務遷移到阿里雲 描述: 因為本地辦公室沒有使用專業企業寬頻,對外的IP經常再變,導致在本地部署的禪道系統只能在辦公室可以使用,而且直接使用內網IP加埠的形式也不太好記。於是把禪道部署到阿里雲,並且把歷史資料也遷移上去。 在ECS上安裝禪道 參考:h
資料搬遷,從GCP Storage 遷移到阿里雲儲存(OSS) « 關於網路那些事...
通常在建構系統中,擴充新服務,在遷移過程,有時會需要將雲端資料進行搬移 最近剛好一個系統需要將GCP上面的Storage資料遷移到阿里雲OSS 在這裡做一個紀錄
關於舊基於xml的web服務專案從python2.7遷移到python3.6.2
https://www.jianshu.com/p/4e26007990f3 首先學一下前人經驗 對git進行提交,然後在pycharm或者終端用conda 進行 activate的虛擬環境進行切換. 1其實最多的處理應該會是那些print了. SyntaxError: Mis
Spring Framework 4.0 遷移指南 (官方文件翻譯)
看到Spring Framework4.0釋出的訊息,看了下new future,OneCoder很喜歡spring這種追“時髦”的風格,groovy指令碼配置和Java8都支援了。順便就翻譯了一下官方的遷移指南。對一般使用來說,遷移沒什麼難度。
Thymeleaf 3 遷移指南
如果你是打算從Thymeleaf2遷移到Thymeleaf3的使用者。首先,一個好訊息是你當前的Thymeleaf模板與Thymeleaf3完全相容。所以,如果要進行遷移,你只要做一些配置上的修改。 Thymeleaf 3.0 BETA