Загрузка ресурса с пользовательским расширением не работает
Я пытаюсь реализовать свое первое приложение на реагирующем языке, и мне нужно открыть базу данных из статического файла, сохраненного в папке моего проекта.
Я прочитал, что мне нужно разрешить загрузку файлов пользовательских расширений из ресурсов, поэтому я добавил следующий фрагмент в свой 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 была простой, но только когда я понял, что проблема. Я последовал приведенному выше руководству. В итоге:
-
expo install @expo/metro-config
- создать
metro.config.js
и позвонить вpush
с любым расширением, которое вы пытаетесь добавить, в моем случае это было (уценка):
const { getDefaultConfig } = require('@expo/metro-config');
const defaultConfig = getDefaultConfig(__dirname);
defaultConfig.resolver.assetExts.push('md');
module.exports = defaultConfig;
- Сбросить кеш на expo (shift + r в окне терминала, в котором он запущен, на Mac)
Typescript (4) был более документирован, но я сделал:
- Создать декларацию (
*.d.ts
), указав уценку как допустимое расширение. - Убедился, что файл находится в одном из моих каталогов
- Добавьте этот файл в
typeRoot
под вtsconfig.json
- импортировать / требовать
md
в моем компоненте
Для меня эти шаги были:
- добавить файл
./app/declaration.d.ts
- Мой
"include"
имелapp
каталог в нем и выглядел так:"include": ["App.js", "app", "test", "storybook"]
- Я добавил это в
compilationOptions
:"typeRoots":["./app/declaration.d.ts"],
-
import newborn from './../../../assets/resources/MY_MD_DOC.md'
Тада!