clojurescript前端實戰(zhàn)-react-native項目(一)

## 步驟

### 創(chuàng)建工程

1. 準備工作(搭建react-native開發(fā)環(huán)境[搭建開發(fā)環(huán)境](https://reactnative.cn/docs/getting-started))

2. 創(chuàng)建一個rn工程 `react-native init trainplatform`

3. 添加`shadow-cljs`依賴`yarn add shadow-cljs`

4. 手動添加shadow-cljs.end文件 `touch shadow-cljs.edn`

### 初始化rn項目

在所建文件夾根目錄下執(zhí)行(默認你已經有一定rn基礎堂竟,至于rn環(huán)境的搭建[請閱讀此教程](https://reactnative.cn/docs/getting-started))

`react-native init trainplatform`

進入reactnative工程下面澄峰,運行rn項目

```

cd reactnative

react-native run-ios

```

稍等片刻,不出所料,rn工程已經運行起來了

![效果圖](https://measure.3vyd.com/Simulator%20Screen%20Shot%20-%20iPhone%2011%20-%202020-05-28%20at%2006.00.09.png)

### 添加必要的依賴庫

還是在reactnative工程目錄下面為rn項目添加`react-dom`庫。

`yarn add react-dom`

添加`shadow-cljs`開發(fā)環(huán)境依賴

`yarn add shadow-cljs --dev`

目前`reactnative`下面的`package.json`文件開起來應該是這樣的

```

{

? "name": "reactnative",

? "version": "0.0.1",

? "private": true,

? "scripts": {

? ? "android": "react-native run-android",

? ? "ios": "react-native run-ios",

? ? "start": "react-native start",

? ? "test": "jest",

? ? "lint": "eslint ."

? },

? "dependencies": {

? ? "react": "16.11.0",

? ? "react-dom": "^16.13.1",

? ? "react-native": "0.62.2"

? },

? "devDependencies": {

? ? "@babel/core": "^7.10.0",

? ? "@babel/runtime": "^7.10.0",

? ? "@react-native-community/eslint-config": "^1.1.0",

? ? "babel-jest": "^26.0.1",

? ? "eslint": "^7.1.0",

? ? "jest": "^26.0.1",

? ? "metro-react-native-babel-preset": "^0.59.0",

? ? "react-test-renderer": "16.11.0",

? ? "shadow-cljs": "^2.9.10"

? },

? "jest": {

? ? "preset": "react-native"

? }

}

```

### 修改shadow-cljs.edn 文件

回到工程root目錄,即`rn-demo`下面,編輯`shadow-cljs.edn`文件。

`vim shadow-cljs.edn`

復制以下內容:

```

;; shadow-cljs configuration

{:source-paths

["src/dev"

? "src/main"

? "src/test"]

:dependencies

[[Reagent "0.9.1"]]

:builds

{:app

? {:target :react-native

? :init-fn rc.app/init

? :output-dir "build"

? :js-options {:js-package-dirs ["reactnative/node_modules"]}}}}

```

注意:依賴一定要添加`Reagent`椎扬。`target`就是rn項目創(chuàng)建的項目名字,咱們起的名字就叫`reactnative`,當然你也可以起別的喜歡的名字具温,`output-dir`就是指定cljs編譯成js之后存放的目錄蚕涤,`js-options`指定`cljs`引用`js`時候的目錄。

保存文件铣猩,我們進入下一步钻趋。

### clojurescript編碼

創(chuàng)建目錄`src/main/rc`,并在此目錄下新建文件`app.cljs`.編輯文件如下:

```

(ns rc.app

? (:require

? ["create-react-class" :as crc]

? ["react-native" :as rn]

? [reagent.core :as r]))

;; must use defonce and must refresh full app so metro can fill these in

;; at live-reload time `require` does not exist and will cause errors

;; must use path relative to :output-dir

(defn root []

[:> rn/Text {:style {:fontSize 90 :marginTop 100}} "hello world" ])

(defonce root-ref (atom nil))

(defonce root-component-ref (atom nil))

(defn render-root [root]

? (let [first-call? (nil? @root-ref)]

? ? (reset! root-ref root)

? ? (if-not first-call?

? ? ? (when-let [root @root-component-ref]

? ? ? ? (.forceUpdate root))

? ? ? (let [Root

? ? ? ? ? ? (crc

? ? ? ? ? ? #js {:componentDidMount

? ? ? ? ? ? ? ? ? (fn []

? ? ? ? ? ? ? ? ? ? (this-as this

? ? ? ? ? ? ? ? ? ? ? (reset! root-component-ref this)))

? ? ? ? ? ? ? ? ? :componentWillUnmount

? ? ? ? ? ? ? ? ? (fn []

? ? ? ? ? ? ? ? ? ? (reset! root-component-ref nil))

? ? ? ? ? ? ? ? ? :render

? ? ? ? ? ? ? ? ? (fn []

? ? ? ? ? ? ? ? ? ? (let [body @root-ref]

? ? ? ? ? ? ? ? ? ? ? (if (fn? body)

? ? ? ? ? ? ? ? ? ? ? ? (body)

? ? ? ? ? ? ? ? ? ? ? ? body)))})]

? ? ? ? (rn/AppRegistry.registerComponent "trainplatform" (fn [] Root))))))

(defn start

? {:dev/after-load true}

? []

? (render-root (r/as-element [root])))

(defn init []

? (start))

```

### 讓react-native加載cljs編譯生成的js代碼

至此,我們就差讓rn項目加載cljs編譯生成的js代碼了剂习,回到reactnative目錄蛮位,打開`index.js`,修改為:

```

///////////////////////////////////////////////////////

// import {AppRegistry} from 'react-native';? ? ? ? //

// import App from './App';? ? ? ? ? ? ? ? ? ? ? ? ? //

// import {name as appName} from './app.json';? ? ? //

//? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //

// AppRegistry.registerComponent(appName, () => App); //

///////////////////////////////////////////////////////

import "./app/index.js";

```

這樣當我們編輯clojurescript代碼的時候,rn就會實時reload鳞绕。最終效果:

![最終效果](https://measure.3vyd.com/%E6%95%88%E6%9E%9C19989.png)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末失仁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子们何,更是在濱河造成了極大的恐慌萄焦,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冤竹,死亡現(xiàn)場離奇詭異拂封,居然都是意外死亡,警方通過查閱死者的電腦和手機鹦蠕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門冒签,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钟病,你說我怎么就攤上這事萧恕「账螅” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵票唆,是天一觀的道長朴读。 經常有香客問我,道長走趋,這世上最難降的妖魔是什么衅金? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮簿煌,結果婚禮上典挑,老公的妹妹穿的比我還像新娘。我一直安慰自己啦吧,他們只是感情好,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布拙寡。 她就那樣靜靜地躺著授滓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪肆糕。 梳的紋絲不亂的頭發(fā)上般堆,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音诚啃,去河邊找鬼淮摔。 笑死,一個胖子當著我的面吹牛始赎,可吹牛的內容都是我干的和橙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼造垛,長吁一口氣:“原來是場噩夢啊……” “哼魔招!你這毒婦竟也來了?” 一聲冷哼從身側響起五辽,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤办斑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后杆逗,有當地人在樹林里發(fā)現(xiàn)了一具尸體乡翅,經...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年罪郊,在試婚紗的時候發(fā)現(xiàn)自己被綠了蠕蚜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡悔橄,死狀恐怖波势,靈堂內的尸體忽然破棺而出翎朱,到底是詐尸還是另有隱情,我是刑警寧澤尺铣,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布拴曲,位于F島的核電站,受9級特大地震影響凛忿,放射性物質發(fā)生泄漏澈灼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一店溢、第九天 我趴在偏房一處隱蔽的房頂上張望叁熔。 院中可真熱鬧,春花似錦床牧、人聲如沸荣回。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽心软。三九已至,卻和暖如春著蛙,著一層夾襖步出監(jiān)牢的瞬間删铃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工踏堡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留猎唁,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓顷蟆,卻偏偏與公主長得像诫隅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子帐偎,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內容