Не удается разрешить модуль при сборке псевдонимов response-native .apk, babel-plugin-module-resolver

Я использую https://github.com/tleunen/babel-plugin-module-resolver для решения ../../../ ад. В моем .babelrc у меня есть:

{
  "presets": [
    "react-native",
    "babel-preset-react-native-stage-0/decorator-support",
    "react-native-dotenv"
  ],
  "env": {
    "development": {
      "plugins": [
        ["module-resolver", {
          "cwd": "babelrc",
          "extensions": [
            ".js",
            ".ios.js",
            ".android.js"
          ],
          "alias": {
            "@assets": "./src/assets",
            "@features": "./src/features",
            "@common": "./src/common",
            "@config": "./src/config",
            "@services": "./src/services"
          }
        }],
        "transform-react-jsx-source"
      ]
    }
  }
}

Пример использования: import { Text } from '@common'

И все это прекрасно работает в режиме разработки, однако, когда я пытаюсь выпустить.apk файл Android с cd android && ./gradlew assembleRelease && cd .. Я получаю ошибку:

Unable to resolve module @common from /home/ppozniak/Projects/project-name/src/Root.js: Module does not exist in the module map

Кажется, что Gradlew не использует мой.babelrc?

версии

   "babel-plugin-module-resolver": "^3.0.0",
   "babel-preset-react-native": "^4.0.0",
   "react-native": "0.50.3",
   "react": "16.0.0",

Заранее спасибо.

2 ответа

Решение

Ладно, только я был немного глупым. Глядя на мой.babelrc вы можете

"env": {
    "development": {

И это было проблемой. После этого в Android появились другие ошибки, но в итоге мне удалось их исправить.

Итак, урок на будущее: следите за своими делами.

Мой babelrc сейчас:

{
  "presets": [
    "react-native",
    "babel-preset-react-native-stage-0/decorator-support",
  ],
  "plugins": [
    "transform-react-jsx-source", ["module-resolver", {
      "extensions": [
        ".js",
        ".ios.js",
        ".android.js"
      ],
      "alias": {
        "@assets": "./src/assets",
        "@features": "./src/features",
        "@common": "./src/common",
        "@config": "./src/config",
        "@services": "./src/services"
      }
    }]
  ]
}

Я подозреваю, что это потому, что когда вы выполняете задание Gradle assembleReleaseон также вызывает файл Gradle внутри node_modules/react-native/react.gradle, Это означает, что когда вы находитесь в режиме разработки (обслуживаете пакет js через сервер), вы используете .babelrc файл, но когда вы выполняете в режиме релиза, он вообще не использует babel. Реагировать нативно использовать свои собственные полифилы.

Моя идея состоит в том, чтобы передать несколько дополнительных командных аргументов react-native bundle Команда, чтобы попытаться определить свой корень .babelrc файл путем изменения корней проекта:

Так:

Создайте новую папку в вашем корневом проекте и поместите туда babelrc (давайте назовем эту папку native-config)

Тогда на вашем ./android/app/build.gradle, Добавь это:

project.ext.react = [
    entryFile: "index.android.js", /* Your entry file */
    extraPackagerArgs: "--projectRoots ../../native-config,../../"
]

/* 
 * Make sure this next line is AFTER the above 
 * also, the line below is the command that runs react-native bundle
 * and don't use babel. Each key in the array above is an extra
 * CLI arg 
 */
apply from: "../../node_modules/react-native/react.gradle"

По словам этого парня, этот странный проект Root может сделать свое дело.

Желаем удачи в этом, надеюсь, что это даст вам хотя бы ощущение того, что происходит.

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