首页 > web前端 > js教程 > 正文

帮助 React Native 开发者的脚本

WBOY
发布: 2024-09-07 06:36:32
原创
561 人浏览过

A Script To Help React Native Developers

您好!

如果您一直在使用 React Native,您可能遇到过模拟器问题。您运行 React Native 命令,但未检测到模拟器。即使在 .zshrc、.bash_profile 或类似文件中设置了所有必要的环境变量后,它仍然无法工作。

以下是一些常见问题和修复方法:

  1. 找不到模拟器:如果 Android SDK 路径设置不正确,可能会发生这种情况。仔细检查 ANDROID_HOME 和 PATH 环境变量是否指向正确的目录。您可以将这些行添加到 .zshrc 或 .bash_profile 中:

    export ANDROID_HOME=$HOME/Library/Android/sdk
    export PATH=$PATH:$ANDROID_HOME/emulator
    export PATH=$PATH:$ANDROID_HOME/tools
    export PATH=$PATH:$ANDROID_HOME/tools/bin
    export PATH=$PATH:$ANDROID_HOME/platform-tools
    
    登录后复制

    进行这些更改后,重新启动终端或运行 source ~/.zshrc (或 source ~/.bash_profile)。

  2. Watchman 错误:有时,Watchman(Facebook 的文件监视服务)可能会导致陈旧文件缓存出现问题。要解决此问题,请运行:

    watchman watch-del-all
    
    登录后复制

    然后,重新启动你的 React Native 服务器。

  3. adb 反向连接到本地主机:如果您的应用无法从 Android 模拟器内连接到本地主机,您可能需要运行:

    adb reverse tcp:8081 tcp:8081
    
    登录后复制

    此命令将流量从模拟器路由到本地计算机。确保可以从您的终端访问 adb。

  4. 清除缓存并重建:如果您仍然遇到问题,请尝试清除缓存并重建项目:

    npm start -- --reset-cache
    cd android && ./gradlew clean
    cd ios && xcodebuild clean
    
    登录后复制

    然后再次运行您的 React Native 应用程序。

  5. 直接使用react-native run-android 或 run-ios:如果模拟器无法从 IDE 或终端正确启动,请尝试直接使用以下命令运行应用程序:

    npx react-native run-android
    npx react-native run-ios
    
    登录后复制

调试这些问题可能会令人沮丧,但这些步骤帮助我解决了许多常见问题。

我也创建了一个易于使用的脚本

const {spawn, exec} = require('child_process');
const path = require('path');

// Define paths
const projectPath = path.resolve();

// Define commands
const watchDelCommand = `watchman watch-del '${projectPath}'`;
const watchProjectCommand = `watchman watch-project '${projectPath}'`;

// Function to execute commands
const clearWatchman = () => {
  // Execute watch-del command
  exec(watchDelCommand, (error, stdout, stderr) => {
    if (error) {
      console.error(`Error executing watch-del command: ${error.message}`);
      return;
    }
    if (stderr) {
      console.error(`stderr: ${stderr}`);
      return;
    }
    console.log(`watch-del command executed successfully: ${stdout}`);

    // Execute watch-project command
    exec(watchProjectCommand, (error, stdout, stderr) => {
      if (error) {
        console.error(
          `Error executing watch-project command: ${error.message}`,
        );
        return;
      }
      if (stderr) {
        console.error(`stderr: ${stderr}`);
        return;
      }
      console.log(`watch-project command executed successfully: ${stdout}`);
    });
  });
};

async function reverseAdb() {
  console.log('Running... adb reverse tcp:8080 tcp:8080');
  // After the emulator has started  adb reverse tcp:8080 tcp:8080
  const adbReverse = spawn('adb', ['reverse', 'tcp:8080', 'tcp:8080']);
  await new Promise((resolve, reject) => {
    let output = '';
    adbReverse.stdout.on('data', data => {
      output += data.toString();
    });
    adbReverse.on('close', () => {
      resolve();
    });
    adbReverse.stderr.on('error', reject);
  }).catch(error => console.error('Error  reversing ADB port to 8080:', error));
}

async function runEmulator() {
  try {
    clearWatchman();
    // Check for running emulator
    const adbDevices = spawn('adb', ['devices']);
    const devices = await new Promise((resolve, reject) => {
      let output = '';
      adbDevices.stdout.on('data', data => {
        output += data.toString();
      });
      adbDevices.on('close', () => {
        resolve(output.includes('emulator'));
      });
      adbDevices.stderr.on('error', reject);
    });

    if (devices) {
      console.log('Emulator is already running');
      reverseAdb();
      return;
    }

    // Get list of available emulators
    const emulatorList = spawn('emulator', ['-list-avds']);
    const emulatorName = await new Promise((resolve, reject) => {
      let output = '';
      emulatorList.stdout.on('data', data => {
        output += data.toString();
      });
      emulatorList.on('close', () => {
        const lines = output.split('\n').filter(Boolean); // Filter out empty lines
        if (lines.length === 0) {
          reject(new Error('No AVDs found'));
        } else {
          resolve(lines[lines.length - 1]); // Get the last non-empty line
        }
      });
      emulatorList.stderr.on('error', reject);
    });

    // Start the emulator in detached mode
    const emulatorProcess = spawn('emulator', ['-avd', emulatorName], {
      detached: true,
      stdio: 'ignore',
    });

    emulatorProcess.unref(); // Allow the parent process to exit independently of the child

    reverseAdb();

    console.log(`Starting emulator: ${emulatorName}`);
  } catch (error) {
    console.error('Error running emulator:', error);
  }
}

runEmulator();


// package.json

  "scripts": {
    ...

    "dev:android": "yarn android:emulator && npx react-native@latest start",
    "android:emulator": "node runEmulator.js",

    ...
  },

登录后复制

通过使用上面的脚本,您可以同时运行模拟器和React Native。

感谢您的阅读!

以上是帮助 React Native 开发者的脚本的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!