Cordova + create-react-app without ejecting react

According to many tutorial, when you want to use Cordova with create-react-app you should eject the create-react-app. But that was not the way I wanted to go. So instead of it, I have decided to keep create-react-app, then create cordova project and copy-paste this project into create-react-app project. So far it works like a charm, so here is the tutorial.
Cordova + create-react-app tutorial
- Install Java SKD, note that you need exactly version 8.
- Install the Create React App CLI.
npm install -g create-react-app
- Install the Cordova CLI.
npm install -g cordova
- Create the project.
create-react-app tutorial
- Create Cordova Project
cordova create tutorial com.example.tutorial Tutorial
- And now comes the little trick. Take everything except package.json from your cordova project and paste it into your creat-react-app project. Now you have working cordova in your create-react-app. But some things have to be adjusted in the create-react-app package.json. We have to merge these two.
{
"name": "com.example.tutorial",
"displayName": "Tutorial",
"description": "",
"version": "0.1.0",
"private": true,
"main": "index.js",
"homepage": "./", // <--- Notice this
"dependencies": {
"cordova-android": "^7.0.0",
"cordova-plugin-whitelist": "^1.3.3",
"prop-types": "^15.6.0",
"react": "^16.2.0",
"react-dom": "^16.2.0",
"react-redux": "^5.0.6",
"react-router-dom": "^4.2.2",
"react-scripts": "1.0.17",
"redux": "^3.7.2",
"redux-thunk": "^2.2.0"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"move": "mv build www || move build www", // <--- Notice this
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject"
},
"cordova": {
"plugins": {
"cordova-plugin-whitelist": {},
},
"platforms": [
"android"
]
}
}
Notice the “move” command that is added to scripts. All it does is move content of build folder into www folder. That is the place where Cordova and create-react-app are connected. By default create-react-app builds into the dist folder, but Cordova needs www folder. I think it’s really small shorthand in compare with ejecting create-react-app and you can really easily automate it with any build tool you like.
And notice the “homepage”: “./” . It’s because your files will be served from file:// you have to add this line to your package.json (https://github.com/facebookincubator/create-react-app/issues/1094):
- Add this line to your index.html
<script type="text/javascript" src="cordova.js"></script>
Bonus Tip
If you are using <Router> in your project change that to <HashRouter> otherwise you’ll see a blank display as nothing will get rendered to the screen.
References
[1] https://cordova.apache.org/docs/en/latest/guide/cli/index.html