1. 程式人生 > >從 React 到 Preact 遷移指南

從 React 到 Preact 遷移指南

作者 | 劉凱

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

專注 Web 前端技術,崇尚一目瞭然的設計。

為什麼選 Preact

Fast 3kB alternative to React with the same ES6 API.

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 屬性(如 classfor),propsstatecontext作為引數傳進了render()等。

除了 Preact,React-like 中比較出名的還有 Inferno,它大小在9kb左右。它和前面兩者相比,還加了一個新的特性就是無狀態元件(stateless components)也支援生命週期事件,從而可以減少class的使用,做到更加輕量。效能比 React 和 Preact 都要好,其它方面和 Preact 差不多。但是有個問題是 Inferno 用了一些相對較新的特性,比如Promise

MapSetWeakMap等,所以瀏覽器相容性比 Preact 要差點。

遷移指南

官方文件

  • 用 Preact 替換 React

官方文件提供了2種途徑,都是在原專案上把 React 替換成 Preact,我們為了保持專案乾淨採用建立新專案的方式來做。

準備

1. 建立專案

Preact 官方提供了2種方式來建立專案:

  1. preact-cli

  2. 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]

0?wx_fmt=png

杏仁技術站

長按左側二維碼關注我們,這裡有一群熱血青年期待著與您相會。


相關推薦

ReactPreact 遷移指南

作者 | 劉凱專注 Web 前端技術,崇尚一目瞭然的設計。為什麼選 PreactFast 3kB

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