使用自定义扩展名加载资产不起作用

时间:2018-11-15 07:40:05

标签: reactjs react-native expo

我试图在react-native中实现我的第一个应用程序,我需要从保存在项目文件夹中的静态文件中打开数据库。

我了解到我需要允许从资产加载自定义扩展文件,因此我将以下片段添加到我的app.json文件中:

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

接下来,我尝试使用componentDidMount()方法在App.js组件中导入扩展名为.sqlite或.db的静态文件:

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 个答案:

答案 0 :(得分:2)

以下代码来自以上两个答案

在项目根目录中创建metro.config.js:

add button

答案 1 :(得分:1)

我发现expo有某种错误,但对此提出了PR或批准了PR。对于等不及要修复官方错误的人,还有一种解决方法:

使用assetExts创建metro.config.js文件为我解决了该问题:

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

并导入此文件,可以在您的App.js中说吗?我现在可以从文件打开SQLite数据库。

答案 2 :(得分:0)

转到node_modules Metro-config defaults.js广告扩展类型到assetExts部分完成〜

答案 3 :(得分:0)

在第 40 届世博会 - 这就是我能够让它运行的方式! Expo website source.

注意您必须将文件放在 assets 目录中,并确保您的 app.json 指定了所有需要的扩展名,我的包括所有内容:{{ 1}}

首先,我将把它分成两部分 - 让 Expo 工作,然后让 typescript 工作。

Expo 很简单,但只有当我意识到这是问题所在时。我遵循了上述指南。总结:

  1. "assetBundlePatterns": ["**/*"],
  2. 创建一个 expo install @expo/metro-config 并使用您尝试添加的任何扩展名调用 metro.config.js 方法,在我的例子中它是 push(降价):
md
  1. 在 expo 上重置缓存(在 Mac 上运行它的终端窗口中按 shift + r)

Typescript (4) 有更多文档记录,但我做到了:

  1. 创建声明 (const { getDefaultConfig } = require('@expo/metro-config'); const defaultConfig = getDefaultConfig(__dirname); defaultConfig.resolver.assetExts.push('md'); module.exports = defaultConfig; ) 文件,将 Markdown 指定为有效扩展名。
  2. 确保该文件位于我的 *.d.tstsconfig.json 目录之一中
  3. 将该文件添加到 "include"typeRoot 下的 compilationOptions
  4. 在我的组件中导入/要求 tsconfig.json

对我来说,这些步骤是:

  1. 添加文件 md
  2. 我的 ./app/declaration.d.ts 中有 "include" 目录,如下所示:app
  3. 我将此添加到 "include": ["App.js", "app", "test", "storybook"]compilationOptions
  4. "typeRoots":["./app/declaration.d.ts"],

多田!