2017-08-08 39 views
1

我已經開始將我的項目轉換爲打字稿,同時我決定改進node.js後端之間的代碼重用,響應web客戶端和反應原生移動客戶端。在後端,響應和反應原生客戶端之間共享打字稿代碼

這裏是我的項目結構:

├ commons (code shared between backend and frontend, mostly type definitions and utils 
├ clients (code shared between web and mobile clients, depends on commons: containers, utils, forms...) 
├ backend (express server, depends on commons) 
├ web (create-react-app, not ejected, no SSR needed, depends on clients) 
├ mobile (react-native client, depends on clients) 

我試過到目前爲止:

  • 符號鏈接。無法讓他們使用反原生工具(請參閱metro bundler issue)。 這可能可以通過使用拖運來解決,但通過使用打字稿拖運工作增加了額外的複雜性。此外,拖運似乎不適用於移動中心,我用它來發布移動應用程序
  • 在tsconfig.json中使用rootDirspaths。 Typescript編譯器不會合並/捆綁輸出,所以這意味着我需要支持3種不同的解決方案來合併生成的代碼。也不適合我的IDE。
  • 使用WML。我嘗試了兩種方法:
    • commonsclients鏈接到web/mobile/server的node_modules內的包。要做到這一點,我必須生成聲明,因爲它需要公開所有導入(參見this issue),所以會產生負擔。用紗線也不能很好地發揮作用,每次安裝新產品時都會移除鏈接的包裝。
    • 鏈接commonsclients將web,mobile和後端的源文件夾內的源文件夾分開。這是我在我的項目的當前JS版本中使用的。它的工作原理,但它也有一些缺點:
      • 長期相對進口
      • WML有時打破了底色(也許可以通過支持對模塊的別名3個不同的解決方案來解決),這導致了一些混亂雖然容易發現錯誤
      • 不熱重裝

我正在尋找一個解決方案,它是不是太複雜很好地工作(需要M在web/mobile/backend端配置最小配置),並且可以和Webstorm一起使用。 它現在可能不存在,所以我想聽聽其他解決方案的人在這裏用於類似的項目設置。

回答

1

在類似的情況,你的我做了以下內容:

  1. commons被髮布爲一個單獨的npm package。如有必要,您可以將其設爲私人。

  2. clients依賴於commons包併發布到npm。再次 - 私人如果需要。

  3. webmobile項目都重用上面創建的npm包。
+0

因此,每次在這些軟件包中更改內容時,您必須發佈'commons'和'clients',然後必須更新'web'和'mobile'和'backend'中的依賴關係?如果手動完成,這是煩人的,尤其是現在當我經常遷移和改變時。此外,這種方法也受到聲明問題的影響。不過,如果共享代碼不會經常更改,我認爲這是理智的做法。 –

+0

你是對的。在我的情況下,當項目穩定時 - 變化不會經常發生,因此這不是問題。當然,正如你所說 - 如果它的麻煩,你總是可以編寫一個腳本來同時運行這些操作。 – Amid

相關問題