Cordova 错误地解析了 Javascript 执行期间构建的图像元素的路径

Cordova incorrectly resolving paths of image elements constructed during Javascript execution

我正在尝试使用 Cordova 和 React 构建跨平台应用程序。但是,我很难让应用程序始终如一地从 www 中找到图像,这些图像的路径是在 JSX 中定义的。

设置

目前调查

可能的解决方案

  1. Cordova 运行 是网络服务器还是我真的在网络视图中浏览文件系统?看起来问题与在文件系统上下文中未正确解析的相对路径有关,因此它查看 file:///static 而不是 file://path/to/application/static/.

  2. 我试过以下方法

    import myImage from './../../assets/my_image.jpg'
    
    let cordova = window.cordova;
    ...
    <img src={`${cordova.file.applicationDirectory}${myImage}`}/>
    

但是我收到一个 React 错误

Attempted to update component V that has already been unmounted (or failed to mount).

我想我需要某种有效的方法来在 运行 时引用 Javascript 中的完整路径。

类似问题

有什么想法吗?

事实证明,解决方案 #2 是正确的。

cordova.file.applicationDirectory 给了我应用程序根目录的正确路径,但它需要以下步骤:

  1. 使用 cordova plugin add cordova-plugin-file
  2. 安装插件
  3. 确保 <script type="text/javascript" src="cordova.js"></script>index.html
  4. 确保您的 React 代码在 deviceready 之后开始。在我的例子中,我将 index.js 设置为以下内容:

    import React from 'react';
    import ReactDOM from 'react-dom';
    import './css/index.css';
    import App from './App';
    import registerServiceWorker from './registerServiceWorker';
    
    document.addEventListener('deviceready', () => {
      ReactDOM.render(<App />, document.getElementById('root'));
      registerServiceWorker();
    }, false);
    

然后创建了一个 cordova_globals.js 文件:

let FILE_PATH = '';

document.addEventListener('deviceready', () => {
  FILE_PATH = `${window.cordova.file.applicationDirectory}www`;
}, false);

export {FILE_PATH};

现在在我的 JSX 中,我可以这样引用本地图像:

import {FILE_PATH} from 'cordova_globals.js'

<img src={`${FILE_PATH}${myImage}`}/>