The problem with adopting create-react-app for production
If all you need is to get your feet wet in React or create a small SPA, this would do. But in real life, your application will not stay within the proposed limits of the create-react-app framework. Sooner or later, your app will grow and you will need to do the dreaded ‘eject’. At this point you are faced with hundreds of npm modules that you have little clue about. create-react-app is a generic framework that need to account for several scenarios. Trimming your build after an eject may be a daunting task.
For production apps that will grow, I will not recommend going the create-react-app route. Start with a basic build environment with webpack. Add in your essentials. (babel, css preprocessors, routing, i10n, hot reloading, TDD workflow, lodash/ramda/moment etc.) As you start developing features you you will need extra third party libraries/packages. Research and team-review every npm module before you add them. How isolated is the usage? How much bloat will this new library add to the production code?
You will move on to other projects/companies at some point. Let’s have some empathy for the ones that succeeds you. Can you reason your build process easily in a TOI session? If not, the app you built so hard will not evolve. It will slowly grow into a big legacy app with feature after feature tacked on without regard for ‘spaghetti-ness’, bloat, performance and latency.
Having said that, create-react-app is great for POCs or quickly churning out a React SPA. It is really magical to create a transpiled, compressed, ‘tree-shaken’ production bundle in a single command line. As long as you are prepared for the possibility of ‘ejecting’ in the future and extending/simplifying your build process manually, go for it.
Edit: Two years later we’ve completely adopted CRA for our large enterprise apps. The orginal sentiment is still valid — If you have to eject, CRA is useless. For our needs, CRA seems to provide everything and they have kept up with it quite well.