科尔多瓦 Android ReactJS

Cordova Android ReactJS

我在构建 Android 应用程序时遇到 Cordova 问题。当我打开我的 cordova 应用程序时,我的 react-router 从未被调用,我不明白为什么。

当我在浏览器中 运行 我的应用程序 运行 非常好,但是当我使用 cordova 构建应用程序时,应用程序只显示一个白屏。

这是我的路由器:

export default (
  <Router history={history}>
    <Route component={ App }>
      <Route name="Calendar" path="calendar" component={ Calendar } ignoreScrollBehavior />
      <Route name="Story" path="story/:id" component={ Story } ignoreScrollBehavior />
      <Redirect from="/" to="calendar" />
      <Redirect from="/index.html" to="calendar" />
    </Route>
  </Router>
);

这是我的 webpack.config:

var path = require('path');
var webpack = require("webpack");

module.exports = {
  context: __dirname + '/app',
  entry: ['./render.js'],
  output: {
    path: __dirname + '/www',
    filename: 'bundle.js'
  },
  resolve: {
    root: [path.join(__dirname, "bower_components")]
  },
  node: {
    console: 'empty',
    fs: 'empty',
    net: 'empty',
    tls: 'empty'
  },
  module: {
    loaders: [
      {
        test: /\.(js|jsx)$/,
        exclude: /(node_modules|bower_components)/,
        loader: 'babel',
        query: {
          optional: ['runtime'],
          stage: 0
        }
      },
      { test: /\.json$/,
        loader: 'json-loader'
      },
      {
        test: /\.(css|scss)$/,
        loader: 'style!css!sass!postcss'
      },
      {
        test: /\.(jpg|png|woff|ttf|eot|svg|otf)$/,
        loader: 'url-loader?limit=100000'
      }
    ]
  },
  plugins: [
    new webpack.ResolverPlugin(
      new webpack.ResolverPlugin.DirectoryDescriptionFilePlugin("bower.json", ["main"])
    )
  ]
};

我的配置文件的render.js入口点:

'use strict';

import './assets/scss/main.scss';
import React from 'react';
import ReactDOM from 'react-dom';
import { Router } from 'react-router';
import routes from './routes.js';
import createBrowserHistory from 'history/lib/createBrowserHistory';

let history = createBrowserHistory();

ReactDOM.render(<Router history={history}>{routes}</Router>, document.getElementById('app'));

最后但同样重要的是我的 index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta content="user-scalable=no, initial-scale=1, maximum-scale=1,
      minimum-scale=1, width=device-width" name="viewport">
   <title>Calendar</title>
  </head>
  <body>
  <div id="app" class="container"></div>
  <script src="bundle.js"></script>
  </body>
</html>

到目前为止,我发现我的应用程序一旦用 cordova 构建,就不再调用路由器,因此永远停留在 index.html 上,没有任何内容。

所以我的问题是我该如何解决这个问题?

您可以使用 cordova 中的 hashHistory 修复它。由于没有服务器会从 cordova 为您的应用程序提供服务(仅加载文件资产并且无法进行重写),因此索引路由将不起作用,由于 ERROR_FILE_NOT_FOUND.

而使您的页面空白

调整您的 render.js 以包含

// since no server is used in the cordova env, use hashHistory there const baseHistory = process.env.CORDOVA ? hashHistory : browserHistory;

并调整您的 webpack 配置以使用 DefinePlugin 设置环境变量

const __CORDOVA__ = process.env.BUILD_TARGET === 'cordova';
...
new webpack.DefinePlugin({
    'process.env': {
        CORDOVA: JSON.stringify(__CORDOVA__),
    },
}),