Can we use nodejs code inside react native application?

后端 未结 2 1493
陌清茗
陌清茗 2020-12-06 02:47

I want to use node js as a backend in react native project .

相关标签:
2条回答
  • 2020-12-06 03:24

    Yes you can use packages written for Node by using ReactNativify as Big Rich rightfully states. Some things to consider though:

    1) I followed the advice I found in the issue list and split up transformer.js in 2 parts:

    transformers.js (in /config and invoked from rn-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
        };
    };
    

    babel-transformer.js (also in /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) As you can see in the code above, I also demonstrated using the babel-plugin-module-resolver.

    Note, I will use this plugin instead of the one ReactNative uses. It allows you to reference local files, and written with proper quotes allows non-JS-compliant names like 'sodium-universal'

    Note2 Or go for .babelrc solution (maybe cleanest) as outlined in this comment: https://github.com/philikon/ReactNativify/issues/4#issuecomment-312136794

    3) I found that I still needed a .babelrc in the root of my project to make my Jest tests work. See this issue for details: https://github.com/philikon/ReactNativify/issues/8

    0 讨论(0)
  • 2020-12-06 03:46

    The ReactNativify Github project does/did* just this, add a NodeJS runtime into React-Native (RN) projects.

    *currently not working in RN v0.43.3 onwards, April 2017.

    Also see (as of May 2018):

    • rn-nodeify
    • nodejs-mobile-react-native
    0 讨论(0)
提交回复
热议问题