Можем ли мы использовать код nodejs внутри реагирующего нативного приложения?

Я хочу использовать узел js в качестве бэкэнда в собственном проекте.

2 ответа

Решение

Да, вы можете использовать пакеты, написанные для Node, используя ReactNativify, как справедливо заявляет Big Rich. Некоторые вещи, чтобы рассмотреть, хотя:

1) Я последовал совету, найденному в списке вопросов, и разделился transformer.js в 2-х частях:

transformers.js (в /config и вызывается из 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 (также в /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-совместимые имена, такие как "odium-universal "

Примечание2 или пойти на .babelrc решение (возможно, самое чистое), как указано в этом комментарии: https://github.com/philikon/ReactNativify/issues/4

3) Я обнаружил, что мне все еще нужно .babelrc в корне моего проекта, чтобы мои тесты Jest работали. Подробности смотрите в этом выпуске: https://github.com/philikon/ReactNativify/issues/8

Проект ReactNativify Github делает / делал * именно это, добавляет среду выполнения NodeJS в проекты React-Native (RN).

* в настоящее время не работает в RN v0.43.3 и далее, апрель 2017 г.

Также см. (По состоянию на май 2018 года):

Другие вопросы по тегам