2016-11-16 70 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('。')));' 任何原因为什么? –

相关问题