2017-04-11 26 views
7

Tôi đã tạo ứng dụng ReactJs với ứng dụng tạo phản ứng và sau đó tạo bản dựng sản xuất với npm run build. Trong thư mục www của tôi được tạo bằng Cordova, tôi chỉ sao chép tất cả các tệp từ thư mục xây dựng ứng dụng tạo phản ứng và điều đó là tốt.Cordova with Create-react-app

Tôi muốn biết làm thế nào để móc vào các sự kiện Cordova của ví dụ như:

function startApp() { 
    // your app logic 
} 
if (window.cordova) { 
    document.addEventListener('deviceready', startApp, false); 
} else { 
    startApp(); 
} 

Ví dụ tôi muốn gọi các tập tin JS minified bên startApp(). Hoặc có bất kỳ quy trình làm việc nào khác có thể được sử dụng để giúp các sự kiện Cordova hoạt động với ứng dụng phản ứng.

Một ví dụ nhỏ sẽ hữu ích.

Có thể sử dụng tệp xây dựng ở tất cả và chỉ sử dụng Ứng dụng React trực tiếp bên trong Cordova không? Tôi không chắc chắn làm thế nào mà sẽ làm việc cho rằng có cài đặt Webpack mà transpiles mã ES6 ES5 và tất cả.

Tôi mới với Cordova và đang vật lộn với khía cạnh tích hợp này.

+0

Tôi đã tìm ra cách để làm cho cả hai hoạt động và sẽ Đăng ở đây cho bất kỳ ai khác đang tìm kiếm cùng một câu trả lời. Nó là khá tầm thường và có thể có các phương pháp khác, nhưng đây là những gì wprked cho tôi khá tốt. –

Trả lời

10

Tôi đã tìm thấy để làm cho hai công việc và sẽ đăng bài ở đây cho bất cứ ai khác tìm kiếm giống nhau. Có lẽ các phương pháp khác để làm điều này, nhưng đây là những gì làm việc cho tôi.

Vì vậy, về cơ bản chúng ta sẽ tạo ra một ứng dụng Cordova sử dụng (nói): cordova tạo testapp com.test.testapp testapp này sẽ cung cấp cho tôi một cấu trúc thư mục như vậy:

testapp 
     --hooks 
     --platforms 
     --plugins 
     --www 
     --config.xml 

Bây giờ bên trong thư mục testapp chúng tôi chạy: create-react-app teastappReact Điều này sẽ thêm ứng dụng phản ứng của tôi vào trong thư mục testapp. Ứng dụng phản ứng của bạn sẽ có một index.js chính trong thư mục/src.

tôi các index.js hãy chắc chắn để quấn logic chính của bạn bên trong một hàm và sau đó gọi hàm cùng với đối tượng Cordova như vậy:

import React from 'react'; 
import ReactDOM from 'react-dom'; 
import App from './App'; 
import './index.css'; 


const startApp =() => { 
ReactDOM.render(
    <App />, 
    document.getElementById('root') 
); 
} 

if(!window.cordova) { 
    startApp() 
} else { 
    document.addEventListener('deviceready', startApp, false) 
} 

Điều đó sẽ làm gì bây giờ ứng dụng của bạn sẽ có cơ dụ Cordova cùng với các đối tượng Thiết bị như navigator.camera bên trong ứng dụng của bạn.

Cũng trong ứng dụng phản hồi index.html có thể được tìm thấy trong thư mục công cộng sao chép html từ index.html mà bạn sẽ tìm thấy trong thư mục Codova www. Bây giờ chúng ta có thể xóa tất cả các tập tin từ thư mục www. Sau đó chúng tôi sẽ tự tay hoặc thông qua một kịch bản sao chép tất cả các tập tin từ ứng dụng phản ứng xây dựng thư mục để Cordova www thư mục.

Vì vậy, index.html của tôi sẽ trông giống như dưới đây, hãy lưu ý tệp tin cordova.js được bao gồm dưới dạng tập lệnh.

<!DOCTYPE html> 
<!-- 
    Licensed to the Apache Software Foundation (ASF) under one 
    or more contributor license agreements. See the NOTICE file 
    distributed with this work for additional information 
    regarding copyright ownership. The ASF licenses this file 
    to you under the Apache License, Version 2.0 (the 
    "License"); you may not use this file except in compliance 
    with the License. You may obtain a copy of the License at 

    http://www.apache.org/licenses/LICENSE-2.0 

    Unless required by applicable law or agreed to in writing, 
    software distributed under the License is distributed on an 
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
    KIND, either express or implied. See the License for the 
    specific language governing permissions and limitations 
    under the License. 
--> 
<html> 

<head> 
    <!-- 
     Customize this policy to fit your own app's needs. For more guidance, see: 
      https://github.com/apache/cordova-plugin-whitelist/blob/master/README.md#content-security-policy 
     Some notes: 
      * gap: is required only on iOS (when using UIWebView) and is needed for JS->native communication 
      * https://ssl.gstatic.com is required only on Android and is needed for TalkBack to function properly 
      * Disables use of inline scripts in order to mitigate risk of XSS vulnerabilities. To change this: 
       * Enable inline JS: add 'unsafe-inline' to default-src 
     --> 
    <meta http-equiv="Content-Security-Policy" content="default-src * 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *; img-src * data: content:;"> 
    <meta name="format-detection" content="telephone=no"> 
    <meta name="msapplication-tap-highlight" content="no"> 
    <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width"> 
    <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico"> 

    <!-- Latest compiled and minified CSS --> 
    <title>React App</title> 
</head> 

<body> 
    <div id="root"></div> 
    <script type="text/javascript" src="cordova.js"></script> 
</body> 

</html> 

Cuối cùng trong bạn phản ứng package.json ứng dụng thêm dòng sau: .... 'trang chủ': "../www" .... này sẽ đảm bảo bạn xây dựng chính thức tệp đang trỏ vào đường dẫn bên phải. chúng tôi cũng có thể thêm các dòng sau trong kịch bản xây dựng package.json của bạn.

"scripts": { 
    "start": "react-scripts start", 
    ***"build": "react-scripts build && robocopy .\\build ..\\www /MIR",*** 
    "test": "react-scripts test --env=jsdom", 
    "eject": "react-scripts eject", 
    "deploy": "npm run build&&gh-pages -d build" 
    } 

Nó có thể là robocopy hoặc cp-r dựa trên hệ điều hành (Windows/Linux, v.v ..).

Chúng tôi sẽ có ứng dụng Cordova của chúng tôi sẵn sàng để xây dựng với cordova xây dựng android/ios.

5

Tôi đã giải quyết được vấn đề. Dưới đây là những gì tôi đã làm trong một định dạng step-by-step cho bất cứ ai tìm kiếm các giải pháp:

  1. Copy/Tạo-một-mới React dự án (được tạo ra sử dụng create-react-app) chỉ bên trong thư mục Cordova ứng dụng.
  2. Xóa tất cả nội dung của www thư mục của Cordova ứng dụng.
  3. cd để Phản hồi thư mục dự án (mà bạn vừa sao chép/tạo) & mở package.json.
  4. Trước dependencies thêm "homepage": "./", & bên trong các kịch bản thay đổi build để "build": "react-scripts build && robocopy .\\build ..\\www /MIR",
  5. Do npm run build trong cùng (React 's) thư mục & quay trở lại cha mẹ (Cordova) thư mục sau đó buildemulate dự án của bạn trong nền tảng mong muốn.
  6. Đồng thời, nếu bạn đang sử dụng <Router> trong dự án, hãy thay đổi thành <HashRouter> nếu không bạn sẽ thấy màn hình trống vì không có gì sẽ được hiển thị trên màn hình.