Я настраиваю простое учебное приложение React Native для нескольких студентов на Expo, которое также общается с сервером API, который студент учится кодировать.
Сервер API студента запускается через node server.js
и служит на localhost:3000
на машине студента. Это не имеет ничего общего с выставкой.
Я хочу, чтобы студенты могли запускать свое приложение через любой из expo start --android
, expo start --ios
или expo start --web
на той же машине, где работает их сервер API. Каждый студент работает из дома в другой домашней сети Wi-Fi и не обязательно знает все входы и выходы IP-адресов или сетей.
При использовании expo start --web
мы получаем исключения CORS, если мы не используем пользовательские webpack.config.js
Обход (сначала создайте webpack.config.js
через https://docs.expo.io/guides/customizing-webpack/, затем поместите это в webpack.config.js
):
const createExpoWebpackConfigAsync = require('@expo/webpack-config');
module.exports = async function(env, argv) {
const config = await createExpoWebpackConfigAsync(env, argv);
if (config.mode === 'development') {
config.devServer.proxy = {
'/**': {
target: {
host: 'localhost',
protocol: 'http:',
port: 3000,
},
secure: false,
changeOrigin: true,
logLevel: 'info',
},
};
}
return config;
};
Это здорово, потому что мы можем делать вызовы API на ./end/point
, не зная ip-адреса студента, а веб-пакет devServer, запущенный expo-cli, эффективно проксирует до http://localhost:3000/end/point
на машине разработчика студента.
Между тем, для iOS и Android, Я нашел этот фрагмент:
import Constants from "expo-constants";
const { manifest } = Constants;
const SERVER_URL = "http://"+manifest.debuggerHost.split(`:`).shift().concat(`:3000`)+"/";
, а затем с помощью SERVER_URL
при использовании fetch()
.
Но нам не хватает единого решения, которое работает агности c в какой среде мы находимся (web, ios или android). Прокси webpack, по-видимому, включен и работает только при использовании веб-клиента expo (expo-cli не запускает webpack для ios или android), а второй вариант (A) не работает сразу после установки в Интернете, и (B) в любом случае вызовет исключение CORS.
Как я могу элегантно написать один бит кода или иным образом настроить проект для студентов, чтобы (A) им не нужно было знать IP-адрес своей машины разработчика, или что это значит, и (B) он будет работать независимо от того, находятся ли они в сети, android или ios выставочный клиент?