Bringing your React Web App to native with Capacitor

Rate this content
Bookmark

So, you have a killer React app you've built and want to take it from your web browser to the App Store. Sure, there are a lot of options here, but most will require you to maintain separate apps for each platform. You want your codebase to be as close as possible across Web, Android, and iOS. Thankfully, with Capacitor, you can take your existing web app and quickly create native iOS and Android apps for distribution on your favorite App Store!


This workshop is aimed at intermediate developers that have an existing React application, or are interested in mobile development with React. We will go over:


What is Capacitor

How does it compare to other cross-platform solutions

Using Capacitor to build a native application using your existing web code

Tidying up our application for distribution on mobile app stores with naming conventions, icons, splashscreens and more.

FAQ

Capacitor is used to transform web apps into native mobile apps. It allows web developers to use their existing web skills and libraries to create apps that run on multiple platforms like iOS and Android, utilizing native device features.

Capacitor and Cordova both allow web apps to interact with native device features. However, Capacitor is often seen as a modern successor to Cordova, offering improved performance and better integration with modern web development workflows, including support for popular frameworks like React.

No, React Native libraries are generally not compatible with Capacitor directly because they are built specifically for the React Native environment, which differs architecturally from Capacitor's use of web technologies.

Capacitor allows developers to use a single codebase to build apps for both web and mobile platforms, reducing development time and costs. It also integrates seamlessly with modern JavaScript frameworks and tools, offering a more familiar development experience for web developers.

Yes, Capacitor provides a range of APIs that allow web apps to access native device features such as the camera, geolocation, and more. These are accessible through JavaScript, making it easier for web developers to integrate native functionality into their apps.

Yes, Capacitor supports live reload capabilities, which allows developers to see changes in real time on the device as they update their code. This feature enhances the development process by providing immediate feedback and speeding up the iteration cycle.

Yes, Capacitor is designed to be framework-agnostic, meaning it can be used with any web framework or library, such as React, Angular, or Vue. This flexibility allows developers to choose the tools and frameworks they are most comfortable with.

To convert a web app to a native app using Capacitor, developers need to include the Capacitor core library in their project, configure native platforms like iOS and Android within the project, and use Capacitor's APIs to interact with native features and functionalities.

While Capacitor is powerful, it has limitations in handling highly intensive 3D graphics and some advanced native functionalities that might require direct native code implementations or specialized native frameworks like Unity for 3D games.

Mike Hartington
Mike Hartington
92 min
04 Jul, 2022

Comments

Sign in or register to post your comment.

Video Summary and Transcription

This workshop introduces bringing React web apps to native using Capacitor, a cross-platform development approach. Cordova and React Native are compared in terms of their features and limitations. Capacitor is highlighted as a solution that bridges the native development life cycle while allowing developers to write HTML, CSS, and JavaScript. The performance difference between Cordova and Capacitor is discussed, along with the process of installing and configuring platforms. The benefits of using Capacitor for development, including faster development cycles and easy deployment, are emphasized.

1. Introduction to Cross-Platform Development

Short description:

This workshop introduces bringing React web apps to native using Capacitor. Cross-platform development is a well-tested approach to building products. The goal is to reduce the need to learn new tools, write platform-specific code, and shorten the time to ship. Comparing technologies based on levels of abstraction makes more sense than point-for-point comparisons. The pure web development environment focuses on building responsive web experiences, while pure native is dedicated to building native apps for each platform. Cordova is a project that promotes the write once, run anywhere mantra.

Okay, so, this workshop is bringing your React web app to you native with Capacitor. Like as I said, my name is Mike Hardington. I work on this technology. I work at a company called Ionic. We do cool stuff with not only web technology but native as well. So, we know a thing or two about bringing web apps to native. And bringing some web goodness to native as well.

Quick little notice on some housekeeping. This is being recorded. You'll be able to watch any replay at a later point in time. I'll try to post all of the slides. Though I don't think the slides are going to be too applicable at a later point in time. Most of the conversation that we'll be having here, will be the most important part. I'll try to post what I can afterwards. But don't worry too much about slides and everything. As I said, post your questions. There's a Chat feature, we'll use that. Also use Discord if that's where you feel comfortable. I'll try to meet you where you are, versus forcing you to use any one particular thing.

So, with that out of the way, seems to hit a little con point in attendees. Let's dive in! I want to first dive into this concept because it's going to be the central point for everything we're going to cover today. It's this idea of cross-platform. Cross-platform development is something that is not uncommon. It's done in almost every software specialty. If we think about games, video games, you rarely see people writing a game once for PlayStation, once for Xbox, and then, again, for PC. There is typically some sort of tool that they are using to build their games and then have that essentially be able to run on all of the consoles, the desktop environments. And all they really need to worry about is building their games using these tools, to be able to take advantage of this cross-platform. So this is a very well-tested approach to building a product and to build anything. We're just going to look at it in the context of building an app, and taking your existing web apps to be able to port them to these different platforms. So what we're trying to figure out is how can we reduce having to learn new things, reduce having to ship or create more code that is specific to a different platform and reduce the time it takes for us to actually ship everything because having all of the different technologies choices available to us, it's an amazing thing, but if we're spending a lot of our time having to focus on learning a particular tool and then we never get to ship, it's kind of all for nothing. So reduce our overall knowledge that we need to know, reduce the code we need to write, and then reduce the amount of time it takes for us to ship something.

So when comparing different technologies we have to look at it in terms of abstraction. Too often or not, we get into a situation where folks like to say, x is better than y for these three reasons. I mean, think about how many versus articles exist out there, React Native versus Flutter, Flutter versus the web. All these different technology comparisons are doing a disservice to themselves because they are trying to go point-for-point with the thing that they are comparing themselves against. It doesn't always work out that way. Thinking of it as terms of levels of abstractions to me, makes a little bit more sense. We're going to look at a few of them. The way I tend to think of this is, how far removed from a given target is our technology choice. Here on the left, we have a pure web development environment. You are not even focused on mobile or native mobile. You are only focused on building a good, responsive web experience. On the other side, we have pure native, where we don't care about the web. We are just focused on building a dedicated native app for each platform. And we have plenty of teams that can focus on that, and work in that environment.

So, let's start off with the pure website. And I'm going to look at this one first. Chances are, if you have been a developer for at least five years, you might have heard of this project. It's called Cordova. It was probably one of the first projects to promote this write once, run anywhere mantra.

2. Cordova and React Native

Short description:

Cordova was created to expose native device features through JavaScript, allowing developers to wrap their web apps in a runtime and extend built-in web platform features. They built global APIs and objects for core plugins like the camera. However, using navigator tied everything to Cordova, making it less cross-platform. Cordova had a large ecosystem of plugins and shipped core APIs, but lacked a package manager. The goal was to polyfill the web until browsers added these features, but some are still missing. Cordova also avoided using native IDEs and had complex release scripts. Native projects were not committed to version control, causing permission issues. React Native aimed to provide a truly native app by building abstractions around native controls. The core team relied on the community to add features.

Where they gave you, essentially, a poly fill for native device features. They were a bunch of developers that want to build web apps. But the web at the time was not really a good platform to develop for. It was missing several key features that native devices had right away. So they decided to build this technology to expose these native features through JavaScript, and then let developers go ahead and wrap their web app in this runtime and then provide access to those features by extending built-in web platform features.

For instance, if there was an old geolocation specification, they wrap their own geolocation API on top of that old specification. So they extended a lot of the built-in features that ship with the browser to supplement their own native runtime features. So they started off using this approach realizing that certain APIs don't really map well to built-ins. So eventually they did need to go ahead and create their own global APIs and they built up on top of the Navigator object, for whatever reason, and inside of this they were able to build out essentially objects that had all of the functionalities for the core plug-ins. So one of the first ones that they had was this camera plug-in and then they created a way to take a picture or present a native camera activity to your users directly from your JavaScript. So they had this navigator.camera.getPicture. It had an onSuccess, an onFail callback and then there was a third parameter where they allowed you to set all of the different options for this execution. If the camera call was successful, you'd get the image data back, and if it was, if it failed for whatever reason, you'd get a, an error message returned back to you.

It worked well. Now this approach of using navigator and having everything tied to that fails right away when you realize you need to include Cordova with everything to get this to work. There was, there is no built in camera API currently with the web, although that would be a fantastic new feature. So it's automatically not as cross platform, because if you don't include it in your web browser, or if you try to run this in your web browser right now, it would, it would fail because there is no way to mock camera with something that exists in the browser. The browser. So this is only available when you're essentially targeting iOS or Android.

So the camera was one API but there was this huge ecosystem that came out of Cordova where they have things for Firebase, they had plugins for for...blanking on names, Century, PayPal, they had a lot of success getting people to build plugins and they themselves also shipped a good collection, I believe, like 12 to 14 core APIs that they felt were essential to a device. So geolocation, camera, filesystem access, splash screen controls, status bar controls, all of those types of things. They didn't really have a package manager. Cordova predates NPM, which is pretty hard to imagine an environment where we did not have NPM. And this was also before Bower for the people who remember what Bower was. And they basically had these custom built scripts that they would run anytime you wanted to trigger a release, which were not that great. They had a lot of learning curves, because they were pretty ahead of the time for 2010. So this whole idea was to keep the web, was to polyfill the web until the browser finally added those features. It's 2022, some of these features still don't exist in the browser at the moment. So it's pretty fair to say that their target goal was pretty unsuccessful. They also didn't want you as a developer to ever need to open up a native IDE, which I don't know why. A native IDE is actually a pretty good tool for configuring these native projects. So going back to that custom scripts thing, if you wanted to set your profiles for signing and releasing the app, it all had to be done through pretty obscure script tags or script tasks and passing in different options. Not ideal. But they took this even further and made it so the native projects were things that got destroyed and not committed to version control. If you and a co-worker are trying to work on the same app, you set a permission on your machine, they set a permission on their machine, there is no way those permissions are ever being shared. They are constantly having to be reset. So not ideal. Okay. So that's the very beginning of cross platform. That was going on for a little while. People were pretty happy with it. Sure there were some pain points but for the most part there was the only project in this space. Then came something called React Native and several other quote, unquote compile to native where their main goal was to say, hey, you write in this tool and it will give you a pure native app afterwards. So I put this kind of cheekily saying that, learn once, write anywhere, as the as the kind of initial goal of React Native. Their idea was that trying to do write once, run anywhere was never going to work. So rather than have that, give you an abstraction where you could learn one API or one style of programming and let you write for all these different platforms. They promised it would be a truly native app, which it's not necessarily the case. It's not too different from Cordova, and they built abstractions around native controls. They did provide a nice standard library, so to speak, around these native APIs. But it was basically put upon the community to add more features than the core team actually wanted or any core team from various projects.

QnA

Watch more workshops on topic

React Performance Debugging Masterclass
React Summit 2023React Summit 2023
170 min
React Performance Debugging Masterclass
Top Content
Featured WorkshopFree
Ivan Akulov
Ivan Akulov
Ivan’s first attempts at performance debugging were chaotic. He would see a slow interaction, try a random optimization, see that it didn't help, and keep trying other optimizations until he found the right one (or gave up).
Back then, Ivan didn’t know how to use performance devtools well. He would do a recording in Chrome DevTools or React Profiler, poke around it, try clicking random things, and then close it in frustration a few minutes later. Now, Ivan knows exactly where and what to look for. And in this workshop, Ivan will teach you that too.
Here’s how this is going to work. We’ll take a slow app → debug it (using tools like Chrome DevTools, React Profiler, and why-did-you-render) → pinpoint the bottleneck → and then repeat, several times more. We won’t talk about the solutions (in 90% of the cases, it’s just the ol’ regular useMemo() or memo()). But we’ll talk about everything that comes before – and learn how to analyze any React performance problem, step by step.
(Note: This workshop is best suited for engineers who are already familiar with how useMemo() and memo() work – but want to get better at using the performance tools around React. Also, we’ll be covering interaction performance, not load speed, so you won’t hear a word about Lighthouse 🤐)
Concurrent Rendering Adventures in React 18
React Advanced Conference 2021React Advanced Conference 2021
132 min
Concurrent Rendering Adventures in React 18
Top Content
Featured WorkshopFree
Maurice de Beijer
Maurice de Beijer
With the release of React 18 we finally get the long awaited concurrent rendering. But how is that going to affect your application? What are the benefits of concurrent rendering in React? What do you need to do to switch to concurrent rendering when you upgrade to React 18? And what if you don’t want or can’t use concurrent rendering yet?

There are some behavior changes you need to be aware of! In this workshop we will cover all of those subjects and more.

Join me with your laptop in this interactive workshop. You will see how easy it is to switch to concurrent rendering in your React application. You will learn all about concurrent rendering, SuspenseList, the startTransition API and more.
React Hooks Tips Only the Pros Know
React Summit Remote Edition 2021React Summit Remote Edition 2021
177 min
React Hooks Tips Only the Pros Know
Top Content
Featured Workshop
Maurice de Beijer
Maurice de Beijer
The addition of the hooks API to React was quite a major change. Before hooks most components had to be class based. Now, with hooks, these are often much simpler functional components. Hooks can be really simple to use. Almost deceptively simple. Because there are still plenty of ways you can mess up with hooks. And it often turns out there are many ways where you can improve your components a better understanding of how each React hook can be used.You will learn all about the pros and cons of the various hooks. You will learn when to use useState() versus useReducer(). We will look at using useContext() efficiently. You will see when to use useLayoutEffect() and when useEffect() is better.
React, TypeScript, and TDD
React Advanced Conference 2021React Advanced Conference 2021
174 min
React, TypeScript, and TDD
Top Content
Featured WorkshopFree
Paul Everitt
Paul Everitt
ReactJS is wildly popular and thus wildly supported. TypeScript is increasingly popular, and thus increasingly supported.

The two together? Not as much. Given that they both change quickly, it's hard to find accurate learning materials.

React+TypeScript, with JetBrains IDEs? That three-part combination is the topic of this series. We'll show a little about a lot. Meaning, the key steps to getting productive, in the IDE, for React projects using TypeScript. Along the way we'll show test-driven development and emphasize tips-and-tricks in the IDE.
Web3 Workshop - Building Your First Dapp
React Advanced Conference 2021React Advanced Conference 2021
145 min
Web3 Workshop - Building Your First Dapp
Top Content
Featured WorkshopFree
Nader Dabit
Nader Dabit
In this workshop, you'll learn how to build your first full stack dapp on the Ethereum blockchain, reading and writing data to the network, and connecting a front end application to the contract you've deployed. By the end of the workshop, you'll understand how to set up a full stack development environment, run a local node, and interact with any smart contract using React, HardHat, and Ethers.js.
Designing Effective Tests With React Testing Library
React Summit 2023React Summit 2023
151 min
Designing Effective Tests With React Testing Library
Top Content
Featured Workshop
Josh Justice
Josh Justice
React Testing Library is a great framework for React component tests because there are a lot of questions it answers for you, so you don’t need to worry about those questions. But that doesn’t mean testing is easy. There are still a lot of questions you have to figure out for yourself: How many component tests should you write vs end-to-end tests or lower-level unit tests? How can you test a certain line of code that is tricky to test? And what in the world are you supposed to do about that persistent act() warning?
In this three-hour workshop we’ll introduce React Testing Library along with a mental model for how to think about designing your component tests. This mental model will help you see how to test each bit of logic, whether or not to mock dependencies, and will help improve the design of your components. You’ll walk away with the tools, techniques, and principles you need to implement low-cost, high-value component tests.
Table of contents- The different kinds of React application tests, and where component tests fit in- A mental model for thinking about the inputs and outputs of the components you test- Options for selecting DOM elements to verify and interact with them- The value of mocks and why they shouldn’t be avoided- The challenges with asynchrony in RTL tests and how to handle them
Prerequisites- Familiarity with building applications with React- Basic experience writing automated tests with Jest or another unit testing framework- You do not need any experience with React Testing Library- Machine setup: Node LTS, Yarn

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

A Guide to React Rendering Behavior
React Advanced Conference 2022React Advanced Conference 2022
25 min
A Guide to React Rendering Behavior
Top Content
React is a library for "rendering" UI from components, but many users find themselves confused about how React rendering actually works. What do terms like "rendering", "reconciliation", "Fibers", and "committing" actually mean? When do renders happen? How does Context affect rendering, and how do libraries like Redux cause updates? In this talk, we'll clear up the confusion and provide a solid foundation for understanding when, why, and how React renders. We'll look at: - What "rendering" actually is - How React queues renders and the standard rendering behavior - How keys and component types are used in rendering - Techniques for optimizing render performance - How context usage affects rendering behavior| - How external libraries tie into React rendering
Building Better Websites with Remix
React Summit Remote Edition 2021React Summit Remote Edition 2021
33 min
Building Better Websites with Remix
Top Content
Remix is a new web framework from the creators of React Router that helps you build better, faster websites through a solid understanding of web fundamentals. Remix takes care of the heavy lifting like server rendering, code splitting, prefetching, and navigation and leaves you with the fun part: building something awesome!
React Compiler - Understanding Idiomatic React (React Forget)
React Advanced Conference 2023React Advanced Conference 2023
33 min
React Compiler - Understanding Idiomatic React (React Forget)
Top Content
React provides a contract to developers- uphold certain rules, and React can efficiently and correctly update the UI. In this talk we'll explore these rules in depth, understanding the reasoning behind them and how they unlock new directions such as automatic memoization. 
Using useEffect Effectively
React Advanced Conference 2022React Advanced Conference 2022
30 min
Using useEffect Effectively
Top Content
Can useEffect affect your codebase negatively? From fetching data to fighting with imperative APIs, side effects are one of the biggest sources of frustration in web app development. And let’s be honest, putting everything in useEffect hooks doesn’t help much. In this talk, we'll demystify the useEffect hook and get a better understanding of when (and when not) to use it, as well as discover how declarative effects can make effect management more maintainable in even the most complex React apps.
Routing in React 18 and Beyond
React Summit 2022React Summit 2022
20 min
Routing in React 18 and Beyond
Top Content
Concurrent React and Server Components are changing the way we think about routing, rendering, and fetching in web applications. Next.js recently shared part of its vision to help developers adopt these new React features and take advantage of the benefits they unlock.In this talk, we’ll explore the past, present and future of routing in front-end applications and discuss how new features in React and Next.js can help us architect more performant and feature-rich applications.
(Easier) Interactive Data Visualization in React
React Advanced Conference 2021React Advanced Conference 2021
27 min
(Easier) Interactive Data Visualization in React
Top Content
If you’re building a dashboard, analytics platform, or any web app where you need to give your users insight into their data, you need beautiful, custom, interactive data visualizations in your React app. But building visualizations hand with a low-level library like D3 can be a huge headache, involving lots of wheel-reinventing. In this talk, we’ll see how data viz development can get so much easier thanks to tools like Plot, a high-level dataviz library for quick & easy charting, and Observable, a reactive dataviz prototyping environment, both from the creator of D3. Through live coding examples we’ll explore how React refs let us delegate DOM manipulation for our data visualizations, and how Observable’s embedding functionality lets us easily repurpose community-built visualizations for our own data & use cases. By the end of this talk we’ll know how to get a beautiful, customized, interactive data visualization into our apps with a fraction of the time & effort!