2016-11-16 71 views
3

我想使用節點js作爲反應原生項目的後端。我們可以在反應本機應用程序中使用nodejs代碼嗎?

+0

如果您想要構建WebService,則可以執行所有操作,因爲您的應用程序及其後端將通過http進行通信... – Hitmands

+0

感謝您的回覆,請查看此鏈接(http: //www.w3resource.com/node.js/nodejs-sqlite.php)我想要完全一樣的,但在原生反應。 –

+0

我不想爲Web服務使用單獨的代碼,我想在反應原生項目中使用節點js代碼。所以有可能? –

回答

3

是的你可以通過使用ReactNativify爲Big Rich正確地使用爲Node編寫的包。 有些事情要考慮,雖然:

1)我跟着我的問題列表中找到的建議和2份分手transformer.js

transformers.js(在/configrn-cli.config.js調用):

const babelTransformer = require('./babel-transformer'); 

module.exports.transform = function(src, filename, options) { 

    const extension = String(filename.slice(filename.lastIndexOf('.'))); 
    let result; 

    try { 

    result = babelTransformer(src, filename); 

    } catch (e) { 

    throw new Error(e); 
    return; 
    } 

    return { 
    ast: result.ast, 
    code: result.code, 
    map: result.map, 
    filename 
    }; 
}; 

巴貝爾-transformer.js(也在/config):

'use strict' 

const babel = require('babel-core'); 

/** 
* This is your `.babelrc` equivalent. 
*/ 
const babelRC = { 
    presets: ['react-native'], 
    plugins: [ 

    // The following plugin will rewrite imports. Reimplementations of node 
    // libraries such as `assert`, `buffer`, etc. will be picked up 
    // automatically by the React Native packager. All other built-in node 
    // libraries get rewritten to their browserify counterpart. 

    [require('babel-plugin-rewrite-require'), { 
     aliases: { 
      constants: 'constants-browserify', 
      crypto: 'react-native-crypto', 
      dns: 'mock/dns', 
      domain: 'domain-browser', 
      fs: 'mock/empty', 
      http: 'stream-http', 
      https: 'https-browserify', 
      net: 'mock/net', 
      os: 'os-browserify/browser', 
      path: 'path-browserify', 
      pbkdf2: 'react-native-pbkdf2-shim', 
      process: 'process/browser', 
      querystring: 'querystring-es3', 
      stream: 'stream-browserify', 
      _stream_duplex: 'readable-stream/duplex', 
      _stream_passthrough: 'readable-stream/passthrough', 
      _stream_readable: 'readable-stream/readable', 
      _stream_transform: 'readable-stream/transform', 
      _stream_writable: 'readable-stream/writable', 
      sys: 'util', 
      timers: 'timers-browserify', 
      tls: 'mock/tls', 
      tty: 'tty-browserify', 
      vm: 'vm-browserify', 
      zlib: 'browserify-zlib' 
     }, 
     throwForNonStringLiteral: true 
    }], 

    // Instead of the above you could also do the rewriting like this: 

    ["module-resolver", { 
     "alias": { 
     "mock": "./config/mock", 
     "sodium-universal": "libsodium" 
     } 
    }] 
    ] 
}; 

module.exports = (src, filename) => { 

    const babelConfig = Object.assign({}, babelRC, { 
    filename, 
    sourceFileName: filename 
    }); 

    const result = babel.transform(src, babelConfig); 
    return { 
    ast: result.ast, 
    code: result.code, 
    map: result.map, 
    filename 
    }; 
} 

2)正如你在上面的代碼中看到的,我也使用了babel-plugin-module-resolver

注意,我將使用此插件而不是一個ReactNative使用。它可以讓你引用本地文件,並用適當的引號書面允許像非JS兼容的名字「鈉鹽萬能」

注2或去.babelrc解決方案(也許乾淨)如本意見所列:https://github.com/philikon/ReactNativify/issues/4#issuecomment-312136794

3)我發現我仍然需要在我的項目的根目錄中使用.babelrc以使我的Jest測試正常工作。有關詳細信息,請參閱此問題:https://github.com/philikon/ReactNativify/issues/8

+0

PS我試圖將端口綁定到Node上,因此我現在正在研究一種不同的方法:[將NodeJS編譯爲Android上的本機庫](https://stackoverflow.com/q/ 45459909/8295283) –

+0

非常有幫助的總結,謝謝。 –

+0

@ArnoldSchrijver謝謝你的總結,我試着採用你的方法,但我得到'錯誤:捆綁失敗:TypeError:無法在transform.js中讀取undefined'屬性'slice'。特別是'const extension = String(filename.slice(filename.lastIndexOf('。')));' 任何原因爲什麼? –

相關問題