Загрузка ресурса с пользовательским расширением не работает

Я пытаюсь реализовать свое первое приложение на реагирующем языке, и мне нужно открыть базу данных из статического файла, сохраненного в папке моего проекта.

Я прочитал, что мне нужно разрешить загрузку файлов пользовательских расширений из ресурсов, поэтому я добавил следующий фрагмент в свой app.json файл:

"packagerOpts": {
    "assetExts": ["sqlite", "db"]
},

Затем я пытаюсь импортировать этот статический файл с расширением.sqlite или.db внутри моего компонента App.js в componentDidMount() метод:

componentDidMount = async () => {
  await Expo.FileSystem.downloadAsync(
    Expo.Asset.fromModule(require("./assets/db/local.db")).uri,
    `${Expo.FileSystem.documentDirectory}SQLite/local.db`
  );

  SQLite.openDatabase("local.db");
};

но выставочный строитель продолжает говорить Unable to resolve "./assets/db/local.db" from "App.js", Любое предложение, пожалуйста?

4 ответа

Следующий код из 2 ответов выше

создайте metro.config.js в корневом каталоге проекта:

const defaultAssetExts = require("metro-config/src/defaults/defaults").assetExts;

module.exports = {
  resolver: {
    assetExts: [
      ...defaultAssetExts,
      // 3D Model formats
      "dae",
      "obj",
      "mtl",
      // sqlite format
      "db"
    ]
  }
};

Зайдите в node_modules metro-config defaults.js и продлите тип до раздела assetExts Готово ~

Я обнаружил, что на выставке есть какая-то ошибка, но для этого есть PR, поднятый / одобренный. Для тех, кто не может дождаться официального исправления ошибки, есть и обходной путь:

Создание файла metro.config.js с assetExts устранило проблему для меня:

module.exports = {
  resolver: {
    assetExts: ["db", "mp3", "ttf"]
  }
}

и импортировать этот файл, скажем, в вашем App.js? Теперь я могу открыть базу данных SQLite из файла.

На Expo 40 - вот как я смог запустить его!Источник на сайте выставки.

Обратите внимание, что вам нужно будет поместить файлы в assets каталог и убедитесь, что ваш app.json указывает все необходимые расширения, мой включает все: "assetBundlePatterns": ["**/*"],

Сначала я разделю его на две части - заставить Expo работать, а затем заставить работать машинописный текст.

Expo была простой, но только когда я понял, что проблема. Я последовал приведенному выше руководству. В итоге:

  1. expo install @expo/metro-config
  2. создать metro.config.js и позвонить в push с любым расширением, которое вы пытаетесь добавить, в моем случае это было (уценка):
      const { getDefaultConfig } = require('@expo/metro-config');

const defaultConfig = getDefaultConfig(__dirname);

defaultConfig.resolver.assetExts.push('md');

module.exports = defaultConfig;
  1. Сбросить кеш на expo (shift + r в окне терминала, в котором он запущен, на Mac)

Typescript (4) был более документирован, но я сделал:

  1. Создать декларацию ( *.d.ts), указав уценку как допустимое расширение.
  2. Убедился, что файл находится в одном из моих каталогов
  3. Добавьте этот файл в typeRoot под в tsconfig.json
  4. импортировать / требовать md в моем компоненте

Для меня эти шаги были:

  1. добавить файл ./app/declaration.d.ts
  2. Мой "include" имел app каталог в нем и выглядел так: "include": ["App.js", "app", "test", "storybook"]
  3. Я добавил это в compilationOptions: "typeRoots":["./app/declaration.d.ts"],
  4. import newborn from './../../../assets/resources/MY_MD_DOC.md'

Тада!

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