2017-03-27 64 views
2

我正在努力使一個庫在NodeJS和ReactNative上工作。一些本地NodeJS模塊在ReactNative中不受支持,所以我試圖有條件地加載它們。然而,這並不工作:有條件地在反應本機中加載模塊

if (true) { 
    require('a'); // module 'a' works in ReactNative 
} else { 
    require('b'); // module 'b' doesn't work in ReactNative 
} 

不幸的是,它們都需要聲明的廣告執行和「B」的裝載拋出異常:(

現在我有以下選擇:

  1. 創建這個庫的新版本,特別針對ReactNative,只使用模塊,在那裏工作
  2. 我聽說你可以在package.json中指定「react-native」,這有助於解決這個問題。找不到文檔a在哪裏,是否有記錄?

如何在一般情況下,你會建議使我的圖書館工作在Node和ReactNative?

謝謝,

回答

2

我想通了 - 這是使用package.json中的「react-native」屬性完成的。在那裏,您可以用另一個模塊替換模塊,或者爲ReactNative禁用它(通過將其值設置爲false)。如果將模塊替換爲另一個模塊,則應將此模塊也添加到依賴關係列表中。

在上面的示例中,對於模塊b中的react-native屬性,您必須將false設置爲值。

在此的package.json可能是這樣的:

"dependencies": { 
    "c": "^1.0.0" 
}, 
"react-native": { 
    "a": "c", 
    "b": false 
} 

上面的代碼將在ReactNative的情況下更換模塊a與模塊c,它會抑制模塊b的加載(它看起來像一個空物體)。

+1

是否有官方文檔/資源的鏈接? – Max

+0

也很想知道這裏的文檔在哪裏。 – Petrogad

+0

沒有關於「react-native」字段的文檔,但它與「browser」字段完全相同:https://github.com/defunctzombie/package-browser-field-spec – jaxoncreed

0

您可以使用此示例的代碼。

'use strict'; 

var _module; 
if (true) { 
    _module = 'lixo'; 
} else { 
    _module = 'express'; 
} 
var A = require('' + _module); 
+0

您是否嘗試過?這不起作用,結果是:ExceptionsManager.js:63未知的命名模塊:'a' – Joachim

+0

是的,我試過了。有用。你在使用ES2015嗎? – Oximer

+0

在ReactNative中它不起作用,並不是它通常不起作用。 – Joachim

2

你可以試試下面的代碼:

if (true) 
{ 
    /* this module will get bundled in react-native app */ 
    require('a'); // module 'a' works in ReactNative 
} else { 
    let b = 'b' 
    /* this module will not get bundled in react-native app */ 
    require(b); // module 'b' doesn't work in ReactNative 
} 
  • 要求( 'A')

    被包含在打包捆在執行JS包之前。它不需要在運行時。 react-native維護所有必需模塊的映射,它通常用id替換模塊名稱。

  • 令B = 'B'

    要求(b)中

    就像是一個動態需要其不受打包器捆紮並是 在運行時所需的。然後它會在它的地圖中搜索這個模塊,因爲這張地圖不會有這個模塊,所以react-native會拋出錯誤。

注: 在你的情況

如果(真)

是永遠不會執行的,如果if-else語句,所以react- else部分的條件本機永遠不會拋出像找不到模塊的錯誤。

+0

是的,這也適用,謝謝!但是,代碼看起來很奇怪,看起來更像是一個比ReactNative構建系統更好的解決方法。看着它,我甚至不知道它爲什麼會起作用。通過審查並不容易,任何開發者都會試圖「簡化」它。我認爲另一種選擇是,package.json中的'react-native'更清晰,不是嗎? – Joachim

+0

@Joachim你可以在你的答案中添加package.json的內容來理解完整的結構嗎? –

+0

我已經添加了我的答案的解釋。 –