<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Shivam Sharma</title>
    <description>The latest articles on DEV Community by Shivam Sharma (@shivams136).</description>
    <link>https://dev.to/shivams136</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F592540%2Ff3b617f7-ad4c-41bb-b18f-515134e176c8.jpeg</url>
      <title>DEV Community: Shivam Sharma</title>
      <link>https://dev.to/shivams136</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shivams136"/>
    <language>en</language>
    <item>
      <title>What I learned building a payments page with no payment processor - A free, self-hosted, zero commission donation platform</title>
      <dc:creator>Shivam Sharma</dc:creator>
      <pubDate>Tue, 11 Aug 2026 07:01:09 +0000</pubDate>
      <link>https://dev.to/shivams136/what-i-learned-building-a-payments-page-with-no-payment-processor-a-free-self-hosted-zero-lne</link>
      <guid>https://dev.to/shivams136/what-i-learned-building-a-payments-page-with-no-payment-processor-a-free-self-hosted-zero-lne</guid>
      <description>&lt;p&gt;I just shipped &lt;a href="https://github.com/shivams136/buy-me-a-chai" rel="noopener noreferrer"&gt;buy-me-a-chai&lt;/a&gt;: an open-source "Buy Me a Coffee"-style donation page for Indian creators that charges &lt;strong&gt;0% commission, forever&lt;/strong&gt;. Not as a promotion — as architecture. There is no backend, no database, no accounts, and no payment processor anywhere in the project. It's a static site template: fork it, edit one YAML file, deploy free on GitHub Pages, and donors pay your bank account directly.&lt;/p&gt;

&lt;p&gt;Building a &lt;em&gt;payments&lt;/em&gt; page with &lt;em&gt;no payment infrastructure&lt;/em&gt; sounds like a contradiction. It's not — but only because of one deliberate trade-off, and getting there taught me more about URL encoding, mobile browser policy, and Unicode than any project I've done. Here's the tour.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Template Repo: &lt;a href="https://github.com/ShivamS136/buy-me-a-chai" rel="noopener noreferrer"&gt;github.com/ShivamS136/buy-me-a-chai&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Demo Page: &lt;a href="https://shivams136.github.io/buy-me-a-chai/" rel="noopener noreferrer"&gt;shivams136.github.io/buy-me-a-chai&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;My Chai Page: &lt;a href="https://shivams136.github.io/chai-for-me/?utm_source=dev&amp;amp;utm_medium=blog&amp;amp;utm_campaign=launch&amp;amp;utm_content=post" rel="noopener noreferrer"&gt;shivams136.github.io/chai-for-me&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  UPI in 90 seconds (for readers outside India)
&lt;/h2&gt;

&lt;p&gt;UPI (Unified Payments Interface) is India's instant payment system — public infrastructure that moves money bank-to-bank in seconds, for free, between any two people. It processes more transactions than any comparable system on earth, and the street vendor selling you chai accepts it via a paper QR code taped to their cart.&lt;/p&gt;

&lt;p&gt;That QR code encodes a standardized URI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;upi://pay?pa=creator@bank&amp;amp;pn=Creator%20Name&amp;amp;am=150.00&amp;amp;cu=INR&amp;amp;tn=Thanks%20for%20the%20blog
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;pa&lt;/code&gt; is the payment address (a "VPA" like &lt;code&gt;shivam@okaxis&lt;/code&gt;), &lt;code&gt;am&lt;/code&gt; the amount, &lt;code&gt;tn&lt;/code&gt; a note. Any UPI app — Google Pay, PhonePe, Paytm, BHIM — opens this URI with everything pre-filled. The payer confirms with their PIN, and money moves directly between bank accounts.&lt;/p&gt;

&lt;p&gt;Read that again: &lt;strong&gt;a plain-text URI is a complete payment request.&lt;/strong&gt; No API keys, no SDK, no server. My entire "payments integration" is string concatenation.&lt;/p&gt;
&lt;h2&gt;
  
  
  The trade-off that makes 0% possible
&lt;/h2&gt;

&lt;p&gt;So why do donation platforms in India still take ~5% of a ₹20 chai?&lt;/p&gt;

&lt;p&gt;Because UPI person-to-person payments have &lt;strong&gt;no callback API&lt;/strong&gt;. Nothing tells your page "payment completed." To confirm payments you must become a payment aggregator — a regulated intermediary the money routes &lt;em&gt;through&lt;/em&gt; — and that's where commissions, KYC, and platform risk come from.&lt;/p&gt;

&lt;p&gt;Every platform treats the missing confirmation as the gap they exist to fill. I went the other way: &lt;strong&gt;accept that the page never knows whether anyone paid.&lt;/strong&gt; In exchange:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No money ever touches the project → nothing to take a cut of&lt;/li&gt;
&lt;li&gt;No server → nothing to host, nothing to breach, ₹0/month&lt;/li&gt;
&lt;li&gt;No accounts → nothing to sign up for, no donor data at all&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The constraint isn't a limitation of the product. The constraint &lt;em&gt;is&lt;/em&gt; the product. (It also imposes an honesty rule that's now a hard rule in the repo: the page must never show "Thank you for your donation!" — we can't know. The most it says is: "QR scanned? Payment happens in your UPI app.")&lt;/p&gt;
&lt;h2&gt;
  
  
  Landmine #1: &lt;code&gt;URLSearchParams&lt;/code&gt; silently corrupts UPI links
&lt;/h2&gt;

&lt;p&gt;The obvious way to build that URI is the standard library:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URLSearchParams&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;pa&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;vpa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;pn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;tn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;note&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="s2"&gt;`upi://pay?&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Don't. &lt;code&gt;URLSearchParams&lt;/code&gt; implements the WHATWG &lt;em&gt;form-urlencoded&lt;/em&gt; serializer, which encodes a space as &lt;code&gt;+&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URLSearchParams&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;tn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;thanks for the blog&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// "tn=thanks+for+the+blog"&lt;/span&gt;

&lt;span class="nf"&gt;encodeURIComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;thanks for the blog&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// "thanks%20for%20the%20blog"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;UPI apps decode the query string with plain percent-decoders. They do not treat &lt;code&gt;+&lt;/code&gt; as a space. So the donor's note — and worse, the creator's &lt;em&gt;name&lt;/em&gt; on the payment screen — shows up as &lt;code&gt;thanks+for+the+blog&lt;/code&gt;. It looks broken at the exact moment someone is deciding whether to send you money.&lt;/p&gt;

&lt;p&gt;The fix is &lt;code&gt;encodeURIComponent&lt;/code&gt;, plus escaping the five characters it leaves alone (&lt;code&gt;!'()*&lt;/code&gt;) so the payload is strictly RFC 3986 unreserved:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;encodeUpiComponent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="nf"&gt;encodeURIComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;!'()*&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`%&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;charCodeAt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;One more subtlety: encode &lt;code&gt;pn&lt;/code&gt; and &lt;code&gt;tn&lt;/code&gt; &lt;strong&gt;only&lt;/strong&gt;. The VPA in &lt;code&gt;pa&lt;/code&gt; is emitted verbatim — percent-encoding its &lt;code&gt;@&lt;/code&gt; breaks apps with naive parsers that never decode the field.&lt;/p&gt;
&lt;h2&gt;
  
  
  Landmine #2: the deeplink that fails silently
&lt;/h2&gt;

&lt;p&gt;On mobile, the dream UX is a "Pay now" button that's just &lt;code&gt;&amp;lt;a href="upi://pay?..."&amp;gt;&lt;/code&gt;. Tap, UPI app opens pre-filled, done.&lt;/p&gt;

&lt;p&gt;Here's what the docs won't tell you: &lt;strong&gt;Google Pay and PhonePe restrict &lt;code&gt;upi://&lt;/code&gt; intents launched from mobile browsers to personal (non-merchant) VPAs.&lt;/strong&gt; It's an anti-fraud policy, it's undocumented, and it fails &lt;em&gt;silently&lt;/em&gt; — sometimes nothing happens, sometimes the app opens and ignores the amount, sometimes you get a cryptic "exceeds limit for this merchant" for someone who isn't a merchant.&lt;/p&gt;

&lt;p&gt;You cannot fix this from a web page. What you can do is stop pretending. The design that survived:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;QR code&lt;/strong&gt; and &lt;strong&gt;Copy UPI ID&lt;/strong&gt; button are the primary paths — they work everywhere, because scanning from &lt;em&gt;inside&lt;/em&gt; a UPI app isn't subject to browser-intent policy.&lt;/li&gt;
&lt;li&gt;The deeplink still exists, but demoted: mobile-only, visually the quietest element, labeled honestly ("works on most UPI apps").&lt;/li&gt;
&lt;li&gt;Nothing is ever hidden behind the deeplink — that's a hard rule in the repo, because a fallback you reach &lt;em&gt;after&lt;/em&gt; a silent failure is a fallback nobody finds.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's a related trap in the URI itself: never add merchant params (&lt;code&gt;mc&lt;/code&gt;, &lt;code&gt;tr&lt;/code&gt;) to a P2P intent — they can trigger merchant-verification failures against unregistered VPAs. And amounts are whole rupees only: several apps drop or round the paise component of &lt;code&gt;am&lt;/code&gt; on P2P intents, and "₹1.50 on the page, ₹1 in the app" is a trust break I have no confirmation channel to even detect.&lt;/p&gt;
&lt;h2&gt;
  
  
  The scariest bug class: a typo'd payment address
&lt;/h2&gt;

&lt;p&gt;A one-character typo in a UPI ID doesn't error. It sends every donation to a stranger, unrecoverably. For a template that thousands of people configure by hand, this is the catastrophic failure mode — so it's defended twice:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. An invalid VPA fails the build, not the donor.&lt;/strong&gt; The config file is parsed with Zod inside a Vite plugin, and a throw during the build is the feature:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;✖ chai.config.yaml invalid&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;creator.vpa       → Invalid UPI ID "shivam okaxis". Expected format&lt;/span&gt;
                      &lt;span class="s"&gt;like name@bank. Double-check in your UPI app → profile.&lt;/span&gt;
  &lt;span class="s"&gt;chai.basePrice    → Expected integer ≥ 1, got &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Every error reports at once (not fail-fast — a config with two problems should say both), unknown keys get Levenshtein-powered "did you mean &lt;code&gt;creator&lt;/code&gt;?" suggestions, and because validation runs at build time, Zod never ships to the browser — the page receives a plain, already-validated object.&lt;/p&gt;

&lt;p&gt;One rule I had to &lt;em&gt;stop&lt;/em&gt; myself from adding: no case normalization. VPAs are case-insensitive, but silently rewriting what the creator typed is exactly the class of mutation this bug lives in. Validate loudly; never "fix" quietly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The ₹1 self-test.&lt;/strong&gt; The setup guide's final step is mandatory: scan your own live QR and send yourself ₹1 before sharing the page. Software validation proves the format; only a real payment proves the &lt;em&gt;destination&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Bonus round: the note field is a Unicode minefield
&lt;/h2&gt;

&lt;p&gt;The donor's message rides along as &lt;code&gt;tn&lt;/code&gt;. Sanitizing 60 characters of free text turned out to be its own adventure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bidi override characters&lt;/strong&gt; (&lt;code&gt;U+202E&lt;/code&gt; and friends) inside a note can visually &lt;em&gt;reverse&lt;/em&gt; the text shown in the payer's app — a spoofing vector, stripped.&lt;/li&gt;
&lt;li&gt;But you can't blanket-strip "invisible" characters: &lt;strong&gt;ZWNJ is semantically required in Devanagari conjuncts&lt;/strong&gt;, and ZWJ is how family and profession emoji compose. Strip those and you've corrupted every Hindi note. 🙃&lt;/li&gt;
&lt;li&gt;Truncation slices &lt;strong&gt;code points, not UTF-16 units&lt;/strong&gt; — cutting a surrogate pair in half leaves a lone surrogate, and &lt;code&gt;encodeURIComponent&lt;/code&gt; &lt;em&gt;throws&lt;/em&gt; on one. Since the URI rebuilds on every keystroke, that's a crash in a React render path, triggered by typing an emoji in the wrong spot.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  What shipped
&lt;/h2&gt;

&lt;p&gt;A page that renders a live QR (client-side, regenerated on every amount/note change), a one-tap Copy UPI ID, and an honestly-labeled deeplink — all pointing at a UPI ID that provably parsed, on a site with no backend to pay for or trust. Vite + React + TypeScript + Tailwind, MIT-licensed, ~100% branch coverage on the URI builder because string concatenation is the entire payment stack.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/ShivamS136" rel="noopener noreferrer"&gt;
        ShivamS136
      &lt;/a&gt; / &lt;a href="https://github.com/ShivamS136/buy-me-a-chai" rel="noopener noreferrer"&gt;
        buy-me-a-chai
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Zero commission. Zero platform. Zero signup. Your donation page, your UPI, your host.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;☕ buy-me-a-chai&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://github.com/shivams136/buy-me-a-chai/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/shivams136/buy-me-a-chai/actions/workflows/ci.yml/badge.svg" alt="CI"&gt;&lt;/a&gt;
&lt;a href="https://github.com/shivams136/buy-me-a-chai/actions/workflows/deploy-pages.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/shivams136/buy-me-a-chai/actions/workflows/deploy-pages.yml/badge.svg" alt="Deploy to Pages"&gt;&lt;/a&gt;
&lt;a href="https://github.com/ShivamS136/buy-me-a-chai/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9c382dc94a6a60a5ef577dd848bdc95eaf92712678a315f4dd47c7e9613ee615/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d433436323244" alt="License: MIT"&gt;&lt;/a&gt;
&lt;a href="https://github.com/ShivamS136/buy-me-a-chai/.nvmrc" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c90b6fa0d91f77a4981aac18e5cc1bb62863d4c8c780f88f19b2bf268861f6fd/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6e6f64652d32342d433436323244" alt="Node"&gt;&lt;/a&gt;
&lt;a href="https://github.com/ShivamS136/buy-me-a-chai#the-honest-fine-print" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f2091276229753dc5c876677077e08d5840e6723779286618aebbe4f211e204f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f636f6d6d697373696f6e2d302532352d433436323244" alt="Commission"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Zero commission. Zero platform. Zero signup. Your donation page, your UPI, your host.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A self-hosted "Buy Me a Chai" page for Indian creators. Fork it, edit one config file, deploy free on GitHub Pages or Vercel. Donors pay you &lt;strong&gt;directly&lt;/strong&gt; over UPI — scan a QR, copy your UPI ID, or one-tap into their UPI app. No middleman ever touches the money, so no one can take a cut.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why not Buy Me a Coffee / buymeachai.in / chai4.me?&lt;/strong&gt; They sit between you and your supporters — commissions, bugs, privacy questions, platform risk. UPI P2P is already free and instant. This project just gives it a beautiful, embeddable face that &lt;em&gt;you&lt;/em&gt; own.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://shivams136.github.io/buy-me-a-chai/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FShivamS136%2Fbuy-me-a-chai%2FHEAD%2Fdocs%2Fassets%2Fscreenshot.png" alt="buy-me-a-chai — donation page screenshot"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🔗 &lt;a href="https://shivams136.github.io/buy-me-a-chai/" rel="nofollow noopener noreferrer"&gt;Live demo&lt;/a&gt;&lt;/strong&gt; — this repo, deployed as-is&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;🪙 &lt;strong&gt;True 0% fees&lt;/strong&gt; — plain UPI P2P (&lt;code&gt;upi://pay&lt;/code&gt; intents). We can't take a cut of what we never touch.&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;Live in ~15 min&lt;/strong&gt; —…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/ShivamS136/buy-me-a-chai" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;One ask.&lt;/strong&gt; Per-app &lt;code&gt;upi://&lt;/code&gt; deeplink behavior (GPay vs PhonePe vs Paytm vs BHIM, Android vs iOS) is the worst-documented thing on the Indian internet, and I'm building a community-sourced compatibility matrix in the repo's &lt;code&gt;COMPAT.md&lt;/code&gt;. If you have a UPI app and 30 seconds, &lt;a href="https://shivams136.github.io/buy-me-a-chai/" rel="noopener noreferrer"&gt;the live demo&lt;/a&gt; plus an issue report would genuinely help.&lt;/p&gt;

&lt;p&gt;And if this saved you a platform commission — you know exactly what kind of page to thank me on. ☕&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>react</category>
      <category>fullstack</category>
    </item>
    <item>
      <title>Run Android Emulator (AVD) Without Installing Android Studio — Updated Guide (Android CLI Edition)</title>
      <dc:creator>Shivam Sharma</dc:creator>
      <pubDate>Thu, 21 Nov 2024 16:09:12 +0000</pubDate>
      <link>https://dev.to/shivams136/run-android-emulator-without-installing-android-studio-3ji</link>
      <guid>https://dev.to/shivams136/run-android-emulator-without-installing-android-studio-3ji</guid>
      <description>&lt;p&gt;Android Studio bundles the AVD (Android Virtual Device) Emulator, but if all you need is an emulator — for React Native, Flutter, CI pipelines, or plain APK testing — installing the full IDE is overkill. Google officially supports a command-line-only workflow, and with the release of Android 17 (June 2026) they've shipped a new unified &lt;strong&gt;Android CLI&lt;/strong&gt; (&lt;code&gt;android&lt;/code&gt; binary) that makes this even cleaner.&lt;/p&gt;

&lt;p&gt;This guide works on &lt;strong&gt;macOS (Intel &amp;amp; Apple Silicon)&lt;/strong&gt; and &lt;strong&gt;Linux&lt;/strong&gt;, and reflects Google's current recommendations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The new &lt;strong&gt;&lt;code&gt;android&lt;/code&gt; CLI&lt;/strong&gt; is now the primary tool — &lt;code&gt;sdkmanager&lt;/code&gt; is officially deprecated (&lt;code&gt;android sdk&lt;/code&gt; replaces it). Legacy commands still work, but new setups should use the new CLI.&lt;/li&gt;
&lt;li&gt;New package syntax uses &lt;code&gt;/&lt;/code&gt; separators (&lt;code&gt;platforms/android-36&lt;/code&gt;) instead of the old &lt;code&gt;;&lt;/code&gt; — no more quoting gymnastics in your shell.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ANDROID_HOME&lt;/code&gt; is the &lt;strong&gt;recommended&lt;/strong&gt; SDK variable; &lt;code&gt;ANDROID_SDK_ROOT&lt;/code&gt; is &lt;strong&gt;deprecated&lt;/strong&gt; (this reversed from a few years ago — many old guides get this backwards).&lt;/li&gt;
&lt;li&gt;Command line tools must live under &lt;code&gt;cmdline-tools/latest/&lt;/code&gt; — officially documented layout.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JDK 17+&lt;/strong&gt; is the baseline. You don't need Oracle JDK — any OpenJDK build works.&lt;/li&gt;
&lt;li&gt;Pick your system image ABI by CPU: &lt;code&gt;arm64-v8a&lt;/code&gt; for Apple Silicon, &lt;code&gt;x86_64&lt;/code&gt; for Intel Macs and most Linux machines. A mismatched ABI runs painfully slow or not at all.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Install Java (JDK 17 or newer)
&lt;/h2&gt;

&lt;p&gt;The SDK tooling is Java-based. Install any OpenJDK 17+ build:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;macOS (Homebrew, recommended):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; temurin@21
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Ubuntu/Debian:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;openjdk-21-jdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;java &lt;span class="nt"&gt;-version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Prefer Homebrew/apt over the Oracle installer — easier upgrades, no license prompts, and &lt;code&gt;JAVA_HOME&lt;/code&gt; tooling (&lt;code&gt;/usr/libexec/java_home&lt;/code&gt; on macOS) picks it up automatically.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  2. Download the Command Line Tools
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to the &lt;a href="https://developer.android.com/studio#command-line-tools-only" rel="noopener noreferrer"&gt;Android Studio download page&lt;/a&gt; → scroll to &lt;strong&gt;"Command line tools only"&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Download the zip for your OS (&lt;code&gt;commandlinetools-mac-*_latest.zip&lt;/code&gt; or &lt;code&gt;commandlinetools-linux-*_latest.zip&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Create your SDK directory and extract there:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# macOS convention (same location Android Studio would use):&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/Library/Android/sdk
&lt;span class="c"&gt;# Linux convention:&lt;/span&gt;
&lt;span class="c"&gt;# mkdir -p ~/Android/sdk&lt;/span&gt;

unzip commandlinetools-&lt;span class="k"&gt;*&lt;/span&gt;_latest.zip &lt;span class="nt"&gt;-d&lt;/span&gt; ~/Library/Android/sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Restructure into &lt;code&gt;latest/&lt;/code&gt;&lt;/strong&gt; — this exact layout is required by Google's docs, otherwise you'll hit the infamous &lt;em&gt;"Could not determine SDK root"&lt;/em&gt; error:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/Library/Android/sdk/cmdline-tools
&lt;span class="nb"&gt;mkdir &lt;/span&gt;latest
&lt;span class="nb"&gt;mv &lt;/span&gt;bin lib NOTICE.txt source.properties latest/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Final path check — both of these must exist:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;~/Library/Android/sdk/cmdline-tools/latest/bin/android      #&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;new CLI
&lt;span class="gp"&gt;~/Library/Android/sdk/cmdline-tools/latest/bin/sdkmanager   #&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;legacy &lt;span class="o"&gt;(&lt;/span&gt;deprecated&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Set Environment Variables
&lt;/h2&gt;

&lt;p&gt;Add to &lt;code&gt;~/.zshrc&lt;/code&gt; (or &lt;code&gt;~/.bashrc&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;######## Android ########&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANDROID_HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/Library/Android/sdk"&lt;/span&gt;   &lt;span class="c"&gt;# Linux: $HOME/Android/sdk&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ANDROID_HOME&lt;/span&gt;&lt;span class="s2"&gt;/cmdline-tools/latest/bin:&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ANDROID_HOME&lt;/span&gt;&lt;span class="s2"&gt;/platform-tools:&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ANDROID_HOME&lt;/span&gt;&lt;span class="s2"&gt;/emulator:&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Do NOT set &lt;code&gt;ANDROID_SDK_ROOT&lt;/code&gt; anymore.&lt;/strong&gt; It's deprecated, and if both variables are set and ever disagree, Gradle/Android tooling will warn or fail. &lt;code&gt;ANDROID_HOME&lt;/code&gt; alone is correct today.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Reload and verify:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/.zshrc
android &lt;span class="nt"&gt;--version&lt;/span&gt;        &lt;span class="c"&gt;# new CLI&lt;/span&gt;
android info             &lt;span class="c"&gt;# shows which SDK path is in use&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep the CLI itself current with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;android update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Install Emulator, Platform Tools &amp;amp; a System Image
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;platform-tools&lt;/code&gt; gives you &lt;code&gt;adb&lt;/code&gt;; &lt;code&gt;emulator&lt;/code&gt; is the emulator engine itself. Note the &lt;strong&gt;new &lt;code&gt;/&lt;/code&gt; package syntax&lt;/strong&gt; — no quotes needed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;android sdk &lt;span class="nb"&gt;install &lt;/span&gt;platform-tools emulator
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now install a system image for Android 16 (API 36 — the latest stable-channel SDK level). Pick the &lt;strong&gt;ABI matching your CPU&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Apple Silicon (M-series):&lt;/span&gt;
android sdk &lt;span class="nb"&gt;install &lt;/span&gt;system-images/android-36/google_apis_playstore/arm64-v8a platforms/android-36

&lt;span class="c"&gt;# Intel Mac / Linux x86_64:&lt;/span&gt;
android sdk &lt;span class="nb"&gt;install &lt;/span&gt;system-images/android-36/google_apis_playstore/x86_64 platforms/android-36
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Which image variant?&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variant&lt;/th&gt;
&lt;th&gt;Use when&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;google_apis_playstore&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;You need Play Store apps. &lt;strong&gt;adb root is disabled&lt;/strong&gt; on these images.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;google_apis&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;You need Google APIs + root access for debugging. Best for most dev work.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;default&lt;/code&gt; (AOSP)&lt;/td&gt;
&lt;td&gt;Lightest, no Google services.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Explore what's available (supports regex patterns):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;android sdk list system-images         &lt;span class="c"&gt;# filter by pattern&lt;/span&gt;
android sdk list &lt;span class="nt"&gt;--all&lt;/span&gt;                 &lt;span class="c"&gt;# everything&lt;/span&gt;
android sdk update                     &lt;span class="c"&gt;# update all installed packages&lt;/span&gt;
android sdk remove &amp;lt;package-name&amp;gt;      &lt;span class="c"&gt;# uninstall a package&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;android-36&lt;/code&gt; = Android 16, the latest API level with &lt;strong&gt;stable-channel SDK packages&lt;/strong&gt; as of this writing. Android 17 (API 37) has shipped as an OS, but its SDK platform/system images may still be in pre-release channels — verify with &lt;code&gt;android sdk list&lt;/code&gt; before defaulting to it (see next section).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Testing newer releases (API 37 / 37.1)
&lt;/h3&gt;

&lt;p&gt;Android now ships a &lt;strong&gt;major SDK release in Q2 and a minor one in Q4&lt;/strong&gt; (API 37 = Android 17; API 37.1 expected ~December 2026 with Android 17 QPR2). Until a level's packages reach the stable channel, they only exist under &lt;code&gt;--beta&lt;/code&gt;/&lt;code&gt;--canary&lt;/code&gt; — the new CLI makes opting in trivial:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check which channel a given API level is actually in:&lt;/span&gt;
android sdk list &lt;span class="nt"&gt;--beta&lt;/span&gt; &lt;span class="nt"&gt;--canary&lt;/span&gt; system-images

&lt;span class="c"&gt;# Install a pre-release image (drop --beta once it reaches stable):&lt;/span&gt;
android sdk &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--beta&lt;/span&gt; system-images/android-37/google_apis_playstore/arm64-v8a platforms/android-37
&lt;span class="c"&gt;# fall back to --canary if it's not in beta yet&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then create a separate AVD against it — keep your stable API 36 device untouched so you always have a known-good baseline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;avdmanager create avd &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"Pixel9_API37_preview"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--package&lt;/span&gt; &lt;span class="s2"&gt;"system-images;android-37;google_apis_playstore;arm64-v8a"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--device&lt;/span&gt; &lt;span class="s2"&gt;"pixel_9"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once API 37 packages reach stable, just swap &lt;code&gt;android-36&lt;/code&gt; → &lt;code&gt;android-37&lt;/code&gt; everywhere in this guide.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Legacy equivalents (sdkmanager — deprecated but still functional)&lt;/b&gt;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sdkmanager &lt;span class="s2"&gt;"platform-tools"&lt;/span&gt; &lt;span class="s2"&gt;"emulator"&lt;/span&gt;
sdkmanager &lt;span class="s2"&gt;"system-images;android-36;google_apis_playstore;arm64-v8a"&lt;/span&gt; &lt;span class="s2"&gt;"platforms;android-36"&lt;/span&gt;
sdkmanager &lt;span class="nt"&gt;--licenses&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  5. Create the AVD
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Option A — New CLI (quick, profile-based):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;android emulator create &lt;span class="nt"&gt;--list-profiles&lt;/span&gt;          &lt;span class="c"&gt;# see available device profiles&lt;/span&gt;
android emulator create &lt;span class="nt"&gt;--profile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;medium_phone   &lt;span class="c"&gt;# creates the device&lt;/span&gt;
android emulator list                            &lt;span class="c"&gt;# verify&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Option B — avdmanager (fine-grained control over device + system image pairing):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Still fully supported, and useful when you need a specific Pixel profile matched to a specific system image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;avdmanager list device

avdmanager create avd &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"Pixel9_API36"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--package&lt;/span&gt; &lt;span class="s2"&gt;"system-images;android-36;google_apis_playstore;arm64-v8a"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--device&lt;/span&gt; &lt;span class="s2"&gt;"pixel_9"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When asked &lt;em&gt;"Do you wish to create a custom hardware profile?"&lt;/em&gt; — say &lt;code&gt;no&lt;/code&gt;. Tweak later in &lt;code&gt;~/.android/avd/&amp;lt;name&amp;gt;.avd/config.ini&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="py"&gt;hw.ramSize&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;4096&lt;/span&gt;
&lt;span class="py"&gt;hw.keyboard&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="py"&gt;hw.gpu.enabled&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="py"&gt;hw.gpu.mode&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;auto&lt;/span&gt;
&lt;span class="py"&gt;disk.dataPartition.size&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;8G&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;hw.keyboard=yes&lt;/code&gt; is what lets you type with your laptop keyboard — it's off by default when you decline the custom hardware profile. See §7.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  6. Run the Emulator
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;New CLI:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;android emulator start medium_phone       &lt;span class="c"&gt;# or your AVD name&lt;/span&gt;
android emulator stop emulator-5554       &lt;span class="c"&gt;# stop by serial number&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Known issue: &lt;code&gt;android emulator&lt;/code&gt; commands are currently &lt;strong&gt;disabled on Windows&lt;/strong&gt; — Windows users should use the legacy &lt;code&gt;emulator&lt;/code&gt; command below.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Legacy launcher (still needed for advanced flags):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;emulator &lt;span class="nt"&gt;-avd&lt;/span&gt; Pixel9_API36 &lt;span class="nt"&gt;-no-snapshot-load&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Handy flags for the legacy launcher:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Flag&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-no-snapshot-load&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cold boot (fresh state) instead of resuming a snapshot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-no-snapshot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Don't load &lt;em&gt;or&lt;/em&gt; save snapshots at all&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-gpu host&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Force host GPU acceleration (default &lt;code&gt;auto&lt;/code&gt; is usually fine)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-netdelay none -netspeed full&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No simulated network throttling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-wipe-data&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Factory reset the AVD on boot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-no-window&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Headless mode — perfect for CI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Verify &lt;code&gt;adb&lt;/code&gt; sees the running device:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb devices
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  7. Type With Your Laptop Keyboard
&lt;/h2&gt;

&lt;p&gt;Out of the box you'll be pecking at the on-screen keyboard with your mouse, which gets old within about thirty seconds. Hardware keyboard passthrough is a &lt;strong&gt;per-AVD&lt;/strong&gt; setting (&lt;code&gt;hw.keyboard&lt;/code&gt;), and it's disabled by default on AVDs created through &lt;code&gt;avdmanager&lt;/code&gt; when you decline the custom hardware profile.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enable the flag
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Path matches your AVD name; new-CLI profiles live here too (e.g. medium_phone.avd)&lt;/span&gt;
&lt;span class="nv"&gt;CFG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;~/.android/avd/Pixel9_API36.avd/config.ini

&lt;span class="c"&gt;# Replace if present, append if not&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="s1"&gt;'^hw.keyboard='&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CFG&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt; &lt;span class="s1"&gt;'s/^hw.keyboard=.*/hw.keyboard=yes/'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CFG&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'hw.keyboard=yes'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CFG&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s1"&gt;'^hw.keyboard'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CFG&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;sed -i ''&lt;/code&gt; is the BSD/macOS form of in-place edit — on Linux use plain &lt;code&gt;sed -i&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The related keys, for reference:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="py"&gt;hw.keyboard&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="py"&gt;hw.keyboard.charmap&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;qwerty2&lt;/span&gt;
&lt;span class="py"&gt;hw.keyboard.lid&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;no&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;charmap&lt;/code&gt; is already &lt;code&gt;qwerty2&lt;/code&gt; on modern images; only touch it if keys land in the wrong place.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cold boot — this is the step people miss
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;config.ini&lt;/code&gt; is read at boot, and a Quick Boot snapshot restores the &lt;em&gt;previous&lt;/em&gt; hardware config wholesale. Restart normally and the flag will appear to do nothing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;emulator &lt;span class="nt"&gt;-avd&lt;/span&gt; Pixel9_API36 &lt;span class="nt"&gt;-no-snapshot-load&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Any snapshots you saved before this change still carry the keyboard-less config — re-record them after cold booting once.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hide the on-screen keyboard
&lt;/h3&gt;

&lt;p&gt;Even with hardware keys working, Android keeps the soft IME up by default and it eats half the screen:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb shell settings put secure show_ime_with_hard_keyboard 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or via the UI: &lt;strong&gt;Settings → System → Keyboard → Physical keyboard → Show virtual keyboard&lt;/strong&gt; (off). Set the value back to &lt;code&gt;1&lt;/code&gt; when you specifically want to test IME layout and window-inset behaviour in your app.&lt;/p&gt;

&lt;p&gt;This is a &lt;code&gt;secure&lt;/code&gt; setting on the userdata partition, so &lt;code&gt;-wipe-data&lt;/code&gt; resets it — add the &lt;code&gt;adb&lt;/code&gt; line to your boot script if you script your runs.&lt;/p&gt;

&lt;h3&gt;
  
  
  What routes where
&lt;/h3&gt;

&lt;p&gt;Typing, Backspace, Tab, Enter and the arrow keys all go into the focused field. A few keys are claimed by the emulator itself rather than by Android — the ones you'll notice on macOS:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Goes to&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Cmd + C&lt;/code&gt; / &lt;code&gt;Cmd + V&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Host↔guest clipboard sharing (enable under Extended controls → Settings if unresponsive)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Esc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Back&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;F2&lt;/code&gt; / &lt;code&gt;Cmd + P&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Power button&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl + Cmd + arrows&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Rotate / fold&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If a keystroke gets swallowed by host window focus, fall back to &lt;code&gt;adb&lt;/code&gt; — also the right choice for anything scripted or repeatable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adb shell input text &lt;span class="s1"&gt;'hello%sworld'&lt;/span&gt;          &lt;span class="c"&gt;# %s encodes a space&lt;/span&gt;
adb shell input keyevent KEYCODE_TAB
adb shell input keyevent KEYCODE_ENTER
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;Error: Could not load devices from .../devices.xml&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;You may hit this when creating an AVD:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: Could not load devices from &amp;lt;sdk&amp;gt;/system-images/android-36/google_apis_playstore/arm64-v8a/devices.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cause:&lt;/strong&gt; &lt;code&gt;avdmanager&lt;/code&gt; scans every installed system-image directory for an &lt;em&gt;optional&lt;/em&gt; &lt;code&gt;devices.xml&lt;/code&gt; (extra device definitions), but some cmdline-tools builds treat the missing file as fatal instead of skipping it. Google ships this file in some image zips and not others (the android-36 playstore arm64 &lt;code&gt;r07&lt;/code&gt; image, for example, doesn't include it) — so a perfectly good download still fails.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; drop an empty-but-valid stub into the image directory — avdmanager just needs parseable XML, and device profiles like &lt;code&gt;pixel_9&lt;/code&gt; come from its built-in list anyway:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$ANDROID_HOME&lt;/span&gt;/system-images/android-36/google_apis_playstore/arm64-v8a/devices.xml &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;d:devices xmlns:d="http://schemas.android.com/sdk/devices/7"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&amp;gt;
&amp;lt;/d:devices&amp;gt;
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Adjust the path if your image variant/ABI differs. If you get a schema/namespace error after this, change &lt;code&gt;devices/7&lt;/code&gt; to &lt;code&gt;devices/8&lt;/code&gt; in the stub.)&lt;/p&gt;

&lt;p&gt;Then clean up any half-created AVD from the failed attempts and recreate — don't just re-run with &lt;code&gt;--force&lt;/code&gt;, as that can carry the broken state forward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;avdmanager delete avd &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"Pixel9_API36"&lt;/span&gt; 2&amp;gt;/dev/null
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/.android/avd/Pixel9_API36.avd ~/.android/avd/Pixel9_API36.ini

avdmanager create avd &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"Pixel9_API36"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--package&lt;/span&gt; &lt;span class="s2"&gt;"system-images;android-36;google_apis_playstore;arm64-v8a"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--device&lt;/span&gt; &lt;span class="s2"&gt;"pixel_9"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Still stuck?&lt;/strong&gt; Two escape hatches: use the new CLI's own creation path, which doesn't trip on this (&lt;code&gt;android emulator create --profile=medium_phone&lt;/code&gt;), or install the &lt;code&gt;google_apis&lt;/code&gt; (non-playstore) image variant, which is a different zip and often ships the file.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;Error: Could not determine SDK root&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Your cmdline-tools aren't in the &lt;code&gt;latest/&lt;/code&gt; sub-directory. Revisit step 2.4 — the binaries must live at &lt;code&gt;cmdline-tools/latest/bin/&lt;/code&gt;, not &lt;code&gt;cmdline-tools/bin/&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  AVD created but &lt;code&gt;emulator -list-avds&lt;/code&gt; shows nothing
&lt;/h3&gt;

&lt;p&gt;Some environments split AVD storage between &lt;code&gt;~/.android/avd&lt;/code&gt; and &lt;code&gt;~/.config/.android/avd&lt;/code&gt;. Check both, and if needed pin the location explicitly by exporting &lt;code&gt;ANDROID_AVD_HOME="$HOME/.android/avd"&lt;/code&gt; in your shell profile.&lt;/p&gt;

&lt;h3&gt;
  
  
  Laptop keyboard still does nothing after setting &lt;code&gt;hw.keyboard=yes&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Almost always a stale Quick Boot snapshot restoring the old hardware config. Boot with &lt;code&gt;-no-snapshot-load&lt;/code&gt; (or &lt;code&gt;-no-snapshot&lt;/code&gt; to also stop it saving state on exit). Also confirm you edited the &lt;code&gt;config.ini&lt;/code&gt; of the AVD you're actually launching — &lt;code&gt;~/.android/avd/&amp;lt;name&amp;gt;.avd/config.ini&lt;/code&gt;, not the &lt;code&gt;&amp;lt;name&amp;gt;.ini&lt;/code&gt; pointer file that sits beside it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hardware Acceleration Note
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Apple Silicon Macs:&lt;/strong&gt; acceleration works out of the box via the Hypervisor framework — use &lt;code&gt;arm64-v8a&lt;/code&gt; images.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intel Macs:&lt;/strong&gt; use &lt;code&gt;x86_64&lt;/code&gt; images; Hypervisor.framework is used automatically (HAXM is dead/deprecated).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linux:&lt;/strong&gt; ensure KVM is enabled: &lt;code&gt;sudo apt install qemu-kvm&lt;/code&gt; and add yourself to the &lt;code&gt;kvm&lt;/code&gt; group (&lt;code&gt;sudo adduser $USER kvm&lt;/code&gt;), then re-login.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without acceleration the emulator is unusably slow, so don't skip this if things feel sluggish.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus: What Else the New CLI Does
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;android&lt;/code&gt; CLI goes beyond SDK/AVD management — worth knowing even for emulator-only setups:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;android run &lt;span class="nt"&gt;--apks&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;app-debug.apk          &lt;span class="c"&gt;# deploy an APK to a device/emulator&lt;/span&gt;
android screen capture &lt;span class="nt"&gt;--output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ui.png    &lt;span class="c"&gt;# screenshot a connected device&lt;/span&gt;
android docs search &lt;span class="s1"&gt;'emulator performance'&lt;/span&gt; &lt;span class="c"&gt;# search official Android docs from terminal&lt;/span&gt;
android create &lt;span class="nt"&gt;--output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;./my-app          &lt;span class="c"&gt;# scaffold a new project from a template&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set persistent defaults in &lt;code&gt;~/.androidrc&lt;/code&gt; (one flag per line), e.g. &lt;code&gt;--sdk=&amp;lt;path&amp;gt;&lt;/code&gt; to pin an SDK.&lt;/p&gt;

&lt;h2&gt;
  
  
  Steps Summary (TL;DR)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Install JDK 17+ — &lt;code&gt;brew install --cask temurin@21&lt;/code&gt; / &lt;code&gt;apt install openjdk-21-jdk&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Download &lt;a href="https://developer.android.com/studio#command-line-tools-only" rel="noopener noreferrer"&gt;Command line tools only&lt;/a&gt;, extract to &lt;code&gt;~/Library/Android/sdk&lt;/code&gt; (Linux: &lt;code&gt;~/Android/sdk&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Restructure: contents of &lt;code&gt;cmdline-tools/&lt;/code&gt; → &lt;code&gt;cmdline-tools/latest/&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;In &lt;code&gt;~/.zshrc&lt;/code&gt;, set &lt;strong&gt;only&lt;/strong&gt; &lt;code&gt;ANDROID_HOME&lt;/code&gt; (not &lt;code&gt;ANDROID_SDK_ROOT&lt;/code&gt;) and add &lt;code&gt;cmdline-tools/latest/bin&lt;/code&gt;, &lt;code&gt;platform-tools&lt;/code&gt;, &lt;code&gt;emulator&lt;/code&gt; to &lt;code&gt;PATH&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;source ~/.zshrc&lt;/code&gt; → verify with &lt;code&gt;android --version&lt;/code&gt; → &lt;code&gt;android update&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;android sdk install platform-tools emulator&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;android sdk install system-images/android-36/google_apis_playstore/arm64-v8a platforms/android-36&lt;/code&gt; (use &lt;code&gt;x86_64&lt;/code&gt; on Intel/Linux)&lt;/li&gt;
&lt;li&gt;Create AVD: &lt;code&gt;android emulator create --profile=medium_phone&lt;/code&gt; — or &lt;code&gt;avdmanager create avd --name "Pixel9_API36" --package "system-images;android-36;google_apis_playstore;arm64-v8a" --device "pixel_9"&lt;/code&gt; for full control&lt;/li&gt;
&lt;li&gt;Enable the laptop keyboard: set &lt;code&gt;hw.keyboard=yes&lt;/code&gt; in &lt;code&gt;~/.android/avd/&amp;lt;name&amp;gt;.avd/config.ini&lt;/code&gt;, cold boot once, then &lt;code&gt;adb shell settings put secure show_ime_with_hard_keyboard 0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Run: &lt;code&gt;android emulator start medium_phone&lt;/code&gt; — or &lt;code&gt;emulator -avd Pixel9_API36 -no-snapshot-load&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it — a full Android emulator setup in under ~2 GB of downloads instead of the multi-gigabyte Android Studio install, now with Google's modern unified CLI.&lt;/p&gt;

</description>
      <category>android</category>
      <category>tutorial</category>
      <category>productivity</category>
      <category>learning</category>
    </item>
    <item>
      <title>Advanced Promise: JS Promises on next level</title>
      <dc:creator>Shivam Sharma</dc:creator>
      <pubDate>Fri, 25 Mar 2022 15:15:07 +0000</pubDate>
      <link>https://dev.to/shivams136/advanced-promise-js-promises-on-next-level-2eik</link>
      <guid>https://dev.to/shivams136/advanced-promise-js-promises-on-next-level-2eik</guid>
      <description>&lt;p&gt;Hi JS Developers,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Have you ever needed to &lt;strong&gt;abort a JS Promise&lt;/strong&gt; or any fetch request before completion?&lt;/li&gt;
&lt;li&gt;Did you want to &lt;strong&gt;know the current status of a Promise&lt;/strong&gt; but felt helpless?&lt;/li&gt;
&lt;li&gt;Have you ever felt that if there's a way to &lt;strong&gt;bind some data to the promise&lt;/strong&gt; so that it can be accessed if promise variables are handled from outside?&lt;/li&gt;
&lt;li&gt;Have you ever wanted to &lt;strong&gt;resolve/reject a promise from the outside&lt;/strong&gt; instead after completion?&lt;/li&gt;
&lt;li&gt;I bet you wanted to have a &lt;strong&gt;timeout feature in Promises&lt;/strong&gt; or JS Fetch requests but couldn't find any.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I have created a single, huge but tiny size solution for that, which is an NPM package named &lt;strong&gt;&lt;a href="https://www.npmjs.com/package/@shivams136/advanced-promise" rel="noopener noreferrer"&gt;advanced-promise&lt;/a&gt;&lt;/strong&gt;. It's a very simple extension to the JS Promise class. Very easy to use and &lt;em&gt;open source&lt;/em&gt;. Must check once. More details are in the link.&lt;/p&gt;

&lt;p&gt;Any Open Source contribution is welcomed.😊 &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@shivams136/advanced-promise" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3tsc200x64oguqw80fbt.png" alt="Advanced-Promise" width="800" height="195"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>opensource</category>
      <category>webdev</category>
      <category>npm</category>
    </item>
    <item>
      <title>Hybrid App Development: Comparison among React Native, Ionic and Flutter</title>
      <dc:creator>Shivam Sharma</dc:creator>
      <pubDate>Mon, 03 Jan 2022 15:07:20 +0000</pubDate>
      <link>https://dev.to/shivams136/hybrid-app-development-comparison-among-react-native-ionic-and-flutter-1lb</link>
      <guid>https://dev.to/shivams136/hybrid-app-development-comparison-among-react-native-ionic-and-flutter-1lb</guid>
      <description>&lt;p&gt;I am a web developer and performed this research in May 2021 for my organization. We currently have separate Android, iOS, and web teams. We thought to create a new platform that can be served as a separate website and can be embedded into the current website and native apps. We were not trying to build and launch a separate App. So below R&amp;amp;D is done keeping that thing in mind. I thought it should be shared with the community so here it is.&lt;/p&gt;

&lt;p&gt;I have compared them from a web developer's point of view and provided medals(Gold, Silver, Bronze) which is purely based on my understanding and my scenario, it can be different for you.&lt;/p&gt;

&lt;p&gt;So get ready for &lt;strong&gt;React Native vs Ionic vs Flutter&lt;/strong&gt; 🎆&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sections:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Comparison&lt;/li&gt;
&lt;li&gt;Medal Tally&lt;/li&gt;
&lt;li&gt;Cheat sheet&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;li&gt;Articles&lt;/li&gt;
&lt;li&gt;How to Contribute to this&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Comparison &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;We will be comparing all the three options &lt;a href="https://reactnative.dev/" rel="noopener noreferrer"&gt;&lt;strong&gt;React Native&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://ionicframework.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Ionic&lt;/strong&gt;&lt;/a&gt; and &lt;a href="https://flutter.dev/" rel="noopener noreferrer"&gt;&lt;strong&gt;Flutter&lt;/strong&gt;&lt;/a&gt; on the basis of below parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Language&lt;/li&gt;
&lt;li&gt;Learning Curve&lt;/li&gt;
&lt;li&gt;Initial Release&lt;/li&gt;
&lt;li&gt;Powered By&lt;/li&gt;
&lt;li&gt;Community&lt;/li&gt;
&lt;li&gt;Github Issues Opened&lt;/li&gt;
&lt;li&gt;Performance&lt;/li&gt;
&lt;li&gt;Popularity&lt;/li&gt;
&lt;li&gt;Framework Nature&lt;/li&gt;
&lt;li&gt;Coding Architecture&lt;/li&gt;
&lt;li&gt;Supported Platform&lt;/li&gt;
&lt;li&gt;Pricing&lt;/li&gt;
&lt;li&gt;Integration&lt;/li&gt;
&lt;li&gt;Build size&lt;/li&gt;
&lt;li&gt;Testing&lt;/li&gt;
&lt;li&gt;Code Reusability&lt;/li&gt;
&lt;li&gt;UI Components&lt;/li&gt;
&lt;li&gt;StackOverflow Questions Trend&lt;/li&gt;
&lt;li&gt;Udemy Trends&lt;/li&gt;
&lt;li&gt;Developer Availability&lt;/li&gt;
&lt;li&gt;Last 2 years' Share in Hybrid Frameworks used&lt;/li&gt;
&lt;li&gt;Poll&lt;/li&gt;
&lt;li&gt;OTA(Over the air) Update&lt;/li&gt;
&lt;li&gt;SEO&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Language &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Language&lt;/th&gt;
&lt;th&gt;Medal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React Native&lt;/td&gt;
&lt;td&gt;JavaScript &amp;amp; React&lt;/td&gt;
&lt;td&gt;🥈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ionic&lt;/td&gt;
&lt;td&gt;HTML+CSS+JSS (with React/Angular/Vue)&lt;/td&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flutter&lt;/td&gt;
&lt;td&gt;Dart&lt;/td&gt;
&lt;td&gt;🥉&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Ionic and React Native uses JS which matches with the tech stack used by a web developer usually. Dart is by google and it has C language-like syntax which is not similar to JS. So we might need devs who can learn Dart if we go for Flutter. Ionic can be written in Vanilla JS as well.&lt;/p&gt;




&lt;h3&gt;
  
  
  Learning Curve &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Time required to learn (for Web Developers):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Time to Learn&lt;/th&gt;
&lt;th&gt;Medal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React Native&lt;/td&gt;
&lt;td&gt;Low (React Dev), Medium (other Web Dev)&lt;/td&gt;
&lt;td&gt;🥈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ionic&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flutter&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;🥉&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Flutter and Dart are new so it might take more time to learn.&lt;/p&gt;




&lt;h3&gt;
  
  
  Initial Release &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Release Year&lt;/th&gt;
&lt;th&gt;Medal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React Native&lt;/td&gt;
&lt;td&gt;2015&lt;/td&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ionic&lt;/td&gt;
&lt;td&gt;2013&lt;/td&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flutter&lt;/td&gt;
&lt;td&gt;2017&lt;/td&gt;
&lt;td&gt;🥈&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Flutter is relatively new but gaining popularity rapidly.&lt;/p&gt;




&lt;h3&gt;
  
  
  Powered By &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Powered By&lt;/th&gt;
&lt;th&gt;Medal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React Native&lt;/td&gt;
&lt;td&gt;Facebook&lt;/td&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ionic&lt;/td&gt;
&lt;td&gt;Drifty Co.&lt;/td&gt;
&lt;td&gt;🥈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flutter&lt;/td&gt;
&lt;td&gt;Google&lt;/td&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All are Open Source so community support is there, but React-Native and Flutter have the upper hand here.&lt;/p&gt;




&lt;h3&gt;
  
  
  Community &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Github Stars&lt;/th&gt;
&lt;th&gt;Github Forks&lt;/th&gt;
&lt;th&gt;Medal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/facebook/react-native" rel="noopener noreferrer"&gt;React Native&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;100K&lt;/td&gt;
&lt;td&gt;21.6K&lt;/td&gt;
&lt;td&gt;🥈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/ionic-team/ionic-framework" rel="noopener noreferrer"&gt;Ionic&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;45.9K&lt;/td&gt;
&lt;td&gt;13.5K&lt;/td&gt;
&lt;td&gt;🥉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/flutter/flutter" rel="noopener noreferrer"&gt;Flutter&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;134K&lt;/td&gt;
&lt;td&gt;20K&lt;/td&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;React and Ionic has old and strong communities. Flutter is relatively new, however, it has made its space and attracted developers to learn Dart.&lt;/p&gt;




&lt;h3&gt;
  
  
  Github Issues Opened &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Github Issues Opened/Total&lt;/th&gt;
&lt;th&gt;Medal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/facebook/react-native/issues" rel="noopener noreferrer"&gt;React Native&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;1.9K / 20.3K&lt;/td&gt;
&lt;td&gt;🥈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/ionic-team/ionic-framework/issues" rel="noopener noreferrer"&gt;Ionic&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;673 / 18.8K&lt;/td&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/flutter/flutter/issues" rel="noopener noreferrer"&gt;Flutter&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;9.9K / 53.3K&lt;/td&gt;
&lt;td&gt;🥉&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Flutter is new and attracted more developers recently but still, 9.9K+ is a high number of issues opened.&lt;/p&gt;




&lt;h3&gt;
  
  
  Performance &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;As far as I understood in terms of performance of these frameworks while interacting with the Native OS as an App:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Performance&lt;/th&gt;
&lt;th&gt;Medal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React Native&lt;/td&gt;
&lt;td&gt;Bridge Based&lt;/td&gt;
&lt;td&gt;🥈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ionic&lt;/td&gt;
&lt;td&gt;Plugin Based&lt;/td&gt;
&lt;td&gt;🥉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flutter&lt;/td&gt;
&lt;td&gt;Native Channels&lt;/td&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Communication via Bridge and Plugins takes more time, though React is working on resolving Bridge Jam situations. Flutter works via direct platform channels so it's faster. Flutter team states that Flutter Web is for Web Apps not for static or minimal sites. &lt;em&gt;So for small web apps, Flutter gets -ve there.&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Popularity &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;In this section we'll be seeing some of the top products using these frameworks:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Popularity&lt;/th&gt;
&lt;th&gt;Medal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React Native&lt;/td&gt;
&lt;td&gt;Most Popular &lt;br&gt;&lt;em&gt;(Facebook, Instagram, Pinterest, Skype, Tesla, Uber, Walmart, Salesforce, Vogue)&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ionic&lt;/td&gt;
&lt;td&gt;Popular among web developers &lt;br&gt;&lt;em&gt;(MarketWatch, Pacifica, Sworkit, Nationwide)&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;🥈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flutter&lt;/td&gt;
&lt;td&gt;Gaining popularity faster &lt;br&gt;&lt;em&gt;(Alibaba, Hamilton Musical, Greentea, Google Ads. eBay, BMW)&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;React Native is more popular than the other two as many tech giants are using it in their production environment. Ionic is very popular among web and mobile app developers due to its easy learning curve. Flutter has just entered the market but has grown in popularity in very little time.&lt;/p&gt;




&lt;h3&gt;
  
  
  Framework Nature &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Framework Nature&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React Native&lt;/td&gt;
&lt;td&gt;App First&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ionic&lt;/td&gt;
&lt;td&gt;Web First&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flutter&lt;/td&gt;
&lt;td&gt;App First&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;App and Web have different UI structures, so choosing "first platform" may help to decide the framework. If you want your product to be a website first then Ionic is +ve there else -ve.&lt;/p&gt;




&lt;h3&gt;
  
  
  Coding Architecture &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Coding Architecture&lt;/th&gt;
&lt;th&gt;Medal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React Native&lt;/td&gt;
&lt;td&gt;Component based, &lt;br&gt;Hot Reloading, &lt;br&gt;React JS UI&lt;/td&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ionic&lt;/td&gt;
&lt;td&gt;One codebase, &lt;br&gt;Plugin based, &lt;br&gt;Web UI&lt;/td&gt;
&lt;td&gt;🥈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flutter&lt;/td&gt;
&lt;td&gt;Hot Reloading, &lt;br&gt;Different achitecture with Dart, &lt;br&gt;Enhanced graphics &amp;amp; UI&lt;/td&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All have their qualities, but due to hot reloading, development and Unit testing are faster on React-Native and Flutter.&lt;/p&gt;




&lt;h3&gt;
  
  
  Supported Platform &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Supported Platform&lt;/th&gt;
&lt;th&gt;Medal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React Native&lt;/td&gt;
&lt;td&gt;Android, iOS, UWP (Windows 10) &lt;br&gt;&lt;br&gt;Web support by github pkg &lt;a href="https://github.com/necolas/react-native-web" rel="noopener noreferrer"&gt;react-native-web&lt;/a&gt;(18.8K Stars), used by some org on production like MMT, Twitter Lite, Flipkart Lite, Uber Eats&lt;/td&gt;
&lt;td&gt;🥈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ionic&lt;/td&gt;
&lt;td&gt;Web, Android, iOS &lt;br&gt;&lt;br&gt;Native support via plugins Capacitor, Cordova&lt;/td&gt;
&lt;td&gt;🥈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flutter&lt;/td&gt;
&lt;td&gt;Android, iOS, Web, Microsoft Desktop &lt;br&gt;&lt;br&gt;Web support is launched in Mar'21, Microsoft support is in beta&lt;/td&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Web support on React is by open-source package, on Flutter it's new and Native support on Ionic is via plugins. So a trade-off to choose from.  &lt;/p&gt;

&lt;p&gt;RNW example &lt;a href="https://necolas.github.io/react-native-web/docs/about-project/" rel="noopener noreferrer"&gt;source.&lt;/a&gt; Flipkart Lite &lt;a href="https://tech.flipkart.com/the-journey-of-react-native-flipkart-47dcd0c3d1c6" rel="noopener noreferrer"&gt;Source&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Pricing &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Pricing&lt;/th&gt;
&lt;th&gt;Medal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React Native&lt;/td&gt;
&lt;td&gt;Free and Open Source&lt;/td&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ionic&lt;/td&gt;
&lt;td&gt;Open Source with Paid Support&lt;/td&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flutter&lt;/td&gt;
&lt;td&gt;Free and Open Source&lt;/td&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All are Open Source.&lt;/p&gt;




&lt;h3&gt;
  
  
  Integration &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Hereby Integration I mean how easily can a hybrid sub-app be integrated into an already built mobile app (Android/iOS).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Integration&lt;/th&gt;
&lt;th&gt;Medal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React Native&lt;/td&gt;
&lt;td&gt;Only a single app can be integrated &lt;br&gt;If multiple, then need to be merged first&lt;/td&gt;
&lt;td&gt;🥈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ionic&lt;/td&gt;
&lt;td&gt;Only a single app can be integrated &lt;br&gt;If multiple, then need to be merged first&lt;/td&gt;
&lt;td&gt;🥈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flutter&lt;/td&gt;
&lt;td&gt;Only a single app can be integrated &lt;br&gt;If multiple, then need to be merged first&lt;/td&gt;
&lt;td&gt;🥈&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;So for all the options, if there are multiple Hybrid Apps available then they need to be merged first. Merge time depends on, how merge-friendly the separate apps are written. So Merging guidelines will be needed to make integration smooth.&lt;/p&gt;




&lt;h3&gt;
  
  
  Build size &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Here I created the "Hello World!" app by using these frameworks and the below calculation is the size of the build for the android app. &lt;em&gt;(Not a Mac User so can't create the iOS app)&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Build size&lt;/th&gt;
&lt;th&gt;Medal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React Native&lt;/td&gt;
&lt;td&gt;7MB&lt;/td&gt;
&lt;td&gt;🥈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ionic&lt;/td&gt;
&lt;td&gt;3.5MB&lt;/td&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flutter&lt;/td&gt;
&lt;td&gt;7.5MB&lt;/td&gt;
&lt;td&gt;🥉&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For small apps, Ionic size is smaller but for bigger apps, it gets worse due to separate HTML+CSS+JS files. For bigger apps, Flutter works best. (&lt;a href="https://medium.com/android-news/comparing-apk-sizes-a0eb37bb36f" rel="noopener noreferrer"&gt;Source&lt;/a&gt;)&lt;/p&gt;




&lt;h3&gt;
  
  
  Testing &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Testing&lt;/th&gt;
&lt;th&gt;Medal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React Native&lt;/td&gt;
&lt;td&gt;Ranges between unit testing to automated testing &lt;br&gt;Testing frameworks are available&lt;/td&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ionic&lt;/td&gt;
&lt;td&gt;Ranges between component testing and end-to-end testing &lt;br&gt;Ionic CLI and Browser based&lt;/td&gt;
&lt;td&gt;🥈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flutter&lt;/td&gt;
&lt;td&gt;Multiple testing frameworks are available&lt;/td&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For big applications, component or widget level testing is helpful. React-Native and Flutter have many Testing Frameworks available, while Ionic has normal web-based testing.&lt;/p&gt;




&lt;h3&gt;
  
  
  Code Reusability &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Code Reusability&lt;/th&gt;
&lt;th&gt;Medal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React Native&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;td&gt;🥈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ionic&lt;/td&gt;
&lt;td&gt;98%&lt;/td&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flutter&lt;/td&gt;
&lt;td&gt;&amp;lt;90%&lt;/td&gt;
&lt;td&gt;🥉&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;As Ionic uses HTML+CSS+JS for all platforms, It has most of the code reusable, In React-Native components can be reused, but when we add web support then only the components without native functionality can be reused. Same for Flutter.&lt;/p&gt;




&lt;h3&gt;
  
  
  UI Components &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;UI Components&lt;/th&gt;
&lt;th&gt;Medal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React Native&lt;/td&gt;
&lt;td&gt;The same feel as Native UI component, UI Libraries also available&lt;/td&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ionic&lt;/td&gt;
&lt;td&gt;Big set of pre-built and pre-styled components.&lt;/td&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flutter&lt;/td&gt;
&lt;td&gt;SKIA engine powered UI in the app and Flutter web engine for web, Extensive list of widgets. &lt;br&gt;&lt;br&gt;Flutter web pages are not usual web pages, they are on canvas default but using HTML renderer it can be like a normal HTML web page.&lt;/td&gt;
&lt;td&gt;🥈&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Flutter Web Pages in Canvas can lead to bad SEO and compatibility issue on very old browsers. React Native provides a Native feel and can be styled with external libraries.&lt;/p&gt;




&lt;h3&gt;
  
  
  StackOverflow Questions Trend &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Here we can see the number of questions on StackOverflow for the tags of these Hybrid Frameworks. This indirectly shows how much developers are working on the particular framework actively.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Mar'18&lt;/th&gt;
&lt;th&gt;Mar'19&lt;/th&gt;
&lt;th&gt;Mar'20&lt;/th&gt;
&lt;th&gt;Mar'21&lt;/th&gt;
&lt;th&gt;Medal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React Native&lt;/td&gt;
&lt;td&gt;2053&lt;/td&gt;
&lt;td&gt;2370&lt;/td&gt;
&lt;td&gt;2861&lt;/td&gt;
&lt;td&gt;2808&lt;/td&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ionic&lt;/td&gt;
&lt;td&gt;1084&lt;/td&gt;
&lt;td&gt;865&lt;/td&gt;
&lt;td&gt;751&lt;/td&gt;
&lt;td&gt;467&lt;/td&gt;
&lt;td&gt;🥉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flutter&lt;/td&gt;
&lt;td&gt;590&lt;/td&gt;
&lt;td&gt;1857&lt;/td&gt;
&lt;td&gt;3764&lt;/td&gt;
&lt;td&gt;5185&lt;/td&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fasm2omyjxxirc6b0ryc7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fasm2omyjxxirc6b0ryc7.png" alt="SO Questions trend" width="783" height="578"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;React Native seems consistently popular among developers while Ionic seems losing its fame. However, Flutter is gaining a lot of attraction. &lt;a href="http://sotagtrends.com/?tags=ionic-framework+react-native+flutter&amp;amp;relative=false" rel="noopener noreferrer"&gt;(Source)&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Udemy Trends &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Udemy is one of the most popular learning platforms with a high number of students and teachers. Below stats tells about the active status of students and teachers on these frameworks:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Courses&lt;/th&gt;
&lt;th&gt;Students&lt;/th&gt;
&lt;th&gt;Medal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.udemy.com/topic/react-native/" rel="noopener noreferrer"&gt;React Native&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;132+&lt;/td&gt;
&lt;td&gt;1M+&lt;/td&gt;
&lt;td&gt;🥈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.udemy.com/topic/ionic/" rel="noopener noreferrer"&gt;Ionic&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;103+&lt;/td&gt;
&lt;td&gt;649K+&lt;/td&gt;
&lt;td&gt;🥉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.udemy.com/topic/google-flutter/" rel="noopener noreferrer"&gt;Flutter&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;292+&lt;/td&gt;
&lt;td&gt;1.9M+&lt;/td&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.udemy.com/topic/dart-programming-language/" rel="noopener noreferrer"&gt;Dart&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;64+&lt;/td&gt;
&lt;td&gt;796K+&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;So Dart and Flutter are gaining popularity with enough resources available. &lt;a href="https://www.thedroidsonroids.com/blog/flutter-vs-react-native-what-to-choose-in-2021" rel="noopener noreferrer"&gt;(Source)&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Developer Availability &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;This is the number of people available in India and globally as per Linkedin Search via my account.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;In India&lt;/th&gt;
&lt;th&gt;Worldwide&lt;/th&gt;
&lt;th&gt;Medal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React Native&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.linkedin.com/search/results/people/?geoUrn=%5B%22102713980%22%5D&amp;amp;keywords=%22react%20native%22&amp;amp;origin=GLOBAL_SEARCH_HEADER" rel="noopener noreferrer"&gt;42K+&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.linkedin.com/search/results/people/?keywords=%22react%20native%22&amp;amp;origin=FACETED_SEARCH" rel="noopener noreferrer"&gt;235K+&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ionic&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.linkedin.com/search/results/people/?geoUrn=%5B%22102713980%22%5D&amp;amp;keywords=%22ionic%22&amp;amp;origin=GLOBAL_SEARCH_HEADER" rel="noopener noreferrer"&gt;26K+&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.linkedin.com/search/results/people/?keywords=%22ionic%22&amp;amp;origin=FACETED_SEARCH" rel="noopener noreferrer"&gt;172K+&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;🥉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flutter&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.linkedin.com/search/results/people/?geoUrn=%5B%22102713980%22%5D&amp;amp;keywords=%22flutter%22&amp;amp;origin=GLOBAL_SEARCH_HEADER" rel="noopener noreferrer"&gt;44K+&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.linkedin.com/search/results/people/?keywords=%22flutter%22&amp;amp;origin=FACETED_SEARCH" rel="noopener noreferrer"&gt;175K+&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;🥈&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Last 2 years' Share in Hybrid Frameworks used &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;in 2019&lt;/th&gt;
&lt;th&gt;in 2020&lt;/th&gt;
&lt;th&gt;Medal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React Native&lt;/td&gt;
&lt;td&gt;42%&lt;/td&gt;
&lt;td&gt;42%&lt;/td&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ionic&lt;/td&gt;
&lt;td&gt;28%&lt;/td&gt;
&lt;td&gt;18%&lt;/td&gt;
&lt;td&gt;🥉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flutter&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;td&gt;39%&lt;/td&gt;
&lt;td&gt;🥈&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Flutter's share is increasing sharply while for Ionic it's decreasing in the same trend. &lt;a href="https://www.statista.com/statistics/869224/worldwide-software-developer-working-hours/" rel="noopener noreferrer"&gt;(Source: Statista)&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Poll &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;I conducted a poll on LinkedIn for the same, but with a short description of my need,  it didn't get that many responses but this sample response seems to verify my above research:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Vaotes Received&lt;/th&gt;
&lt;th&gt;Medal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React Native&lt;/td&gt;
&lt;td&gt;50.53%&lt;/td&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ionic&lt;/td&gt;
&lt;td&gt;7.37%&lt;/td&gt;
&lt;td&gt;🥉&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flutter&lt;/td&gt;
&lt;td&gt;42.11%&lt;/td&gt;
&lt;td&gt;🥈&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Total Votes: 95&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/posts/shivams136_hybridweb-hybridnative-rnd-activity-6802937489939165184-4VOq" rel="noopener noreferrer"&gt;&lt;strong&gt;Public Voting:&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9r5d9pi266jwqht66hcq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9r5d9pi266jwqht66hcq.png" alt="Public Poll Results" width="568" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/feed/update/urn:li:activity:6802932767106703360" rel="noopener noreferrer"&gt;&lt;strong&gt;Technical group Voting:&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkxt3jtjxjj8nuzae2eqy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkxt3jtjxjj8nuzae2eqy.png" alt="Group Poll Result" width="570" height="288"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  OTA(Over the air) Update &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;OTA Compatibility&lt;/th&gt;
&lt;th&gt;Medal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React Native&lt;/td&gt;
&lt;td&gt;Via CodePush (&lt;a href="https://pagepro.co/blog/react-native-over-the-air-updates/" rel="noopener noreferrer"&gt;Source&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ionic&lt;/td&gt;
&lt;td&gt;Via CodePush (&lt;a href="https://ionicframework.com/docs/native/code-push" rel="noopener noreferrer"&gt;Source&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;🥇&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flutter&lt;/td&gt;
&lt;td&gt;Very &lt;a href="https://flutter.dev/docs/cookbook/networking/update-data" rel="noopener noreferrer"&gt;Limited OTA support&lt;/a&gt;, App release is required (&lt;a href="https://stackoverflow.com/questions/63759459/how-to-automatically-update-a-flutter-mobile-app-to-newer-version-when-the-appli" rel="noopener noreferrer"&gt;Source&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;🥉&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  SEO &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;I know, I'm not that good at this point but still mentionable.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;SEO&lt;/th&gt;
&lt;th&gt;Medal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React Native&lt;/td&gt;
&lt;td&gt;Same like React App (Doable)&lt;/td&gt;
&lt;td&gt;🥈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ionic&lt;/td&gt;
&lt;td&gt;Doable&lt;/td&gt;
&lt;td&gt;🥈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flutter&lt;/td&gt;
&lt;td&gt;Doable with Router&lt;/td&gt;
&lt;td&gt;🥈&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;SEO can be achieved like other SPA frameworks but not as simple as a PHP website.&lt;/p&gt;




&lt;h2&gt;
  
  
  Medal Tally &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;🥇&lt;/th&gt;
&lt;th&gt;🥈&lt;/th&gt;
&lt;th&gt;🥉&lt;/th&gt;
&lt;th&gt;Total Score &lt;br&gt;(3G+2S+1B)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React Native&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ionic&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flutter&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Cheat sheet &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;You can find the cheat sheet of this article &lt;a href="https://github.com/ShivamS136/hybrid-app-comparison/blob/main/cheatsheet.md" rel="noopener noreferrer"&gt;here&lt;/a&gt;. This has just the medals awarded for each attribute and the final medal tally and score.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;As a developer, for my use case, I found React Native better so I went for that and created a sample React Native App: &lt;a href="https://github.com/ShivamS136/harry-potter-dictionary" rel="noopener noreferrer"&gt;Harry Potter Dictionary&lt;/a&gt; with &lt;a href="https://github.com/ShivamS136/hp-dict-web-demo" rel="noopener noreferrer"&gt;web support&lt;/a&gt;. Now my organization is working on replacing some modules in android with React Native sub-apps.&lt;/p&gt;




&lt;h2&gt;
  
  
  Articles &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;For this research, I've read some articles, which can be found &lt;a href="https://github.com/ShivamS136/hybrid-app-comparison/blob/main/articles.md" rel="noopener noreferrer"&gt;here&lt;/a&gt;. You can also have a look at them.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Contribute to this &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;You can simply create your valuable pull request to &lt;a href="https://github.com/ShivamS136/hybrid-app-comparison" rel="noopener noreferrer"&gt;this Github repo&lt;/a&gt; with an optional &lt;a href="https://github.com/ShivamS136/hybrid-app-comparison/issues" rel="noopener noreferrer"&gt;issue&lt;/a&gt; having the detail of the changes, I'll merge them and modify &lt;a href="https://dev.to/shivams136/hybrid-app-development-comparison-among-react-native-ionic-and-flutter-1lb"&gt;this article&lt;/a&gt; as well.&lt;/p&gt;

&lt;p&gt;You can start a &lt;a href="https://github.com/ShivamS136/hybrid-app-comparison/discussions" rel="noopener noreferrer"&gt;discussion&lt;/a&gt; as well to discuss with other community members.&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>flutter</category>
      <category>ionic</category>
    </item>
    <item>
      <title>How to install Android SDK and build Android App without Android Studio</title>
      <dc:creator>Shivam Sharma</dc:creator>
      <pubDate>Sun, 13 Jun 2021 14:24:54 +0000</pubDate>
      <link>https://dev.to/shivams136/how-to-install-android-sdk-without-android-studio-ff2</link>
      <guid>https://dev.to/shivams136/how-to-install-android-sdk-without-android-studio-ff2</guid>
      <description>&lt;p&gt;This article is about installing Android SDK in Windows system and run React Native App without Android Studio. Android SDK is required to build, run and debug Android Apps on your machine. So I needed it too to build and run React Native app for android in my windows system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;But Android SDK comes with Android Studio!!!&lt;/em&gt;&lt;/strong&gt; Yes, you are right but not every system can handle &lt;a href="https://developer.android.com/studio#system-requirements-a-namerequirementsa" rel="noopener noreferrer"&gt;Android Studio&lt;/a&gt; :) My system is also behind the minimum system requirements so I had to go for Android SDK separately.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Install Chocolatey
&lt;/h2&gt;

&lt;p&gt;In the &lt;a href="https://reactnative.dev/docs/environment-setup" rel="noopener noreferrer"&gt;official React Native Documentation&lt;/a&gt;, &lt;a href="https://chocolatey.org/" rel="noopener noreferrer"&gt;Chocolatey&lt;/a&gt; is recommended for downloading Node and Java. If you already have that downloaded and configured then you can skip this step.&lt;/p&gt;

&lt;p&gt;You can either follow the complete &lt;a href="https://chocolatey.org/install" rel="noopener noreferrer"&gt;Chocolatey Installation Doc&lt;/a&gt; or just run below command in your &lt;strong&gt;&lt;em&gt;Windows Powershell Window&lt;/em&gt;&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Set-ExecutionPolicy Bypass &lt;span class="nt"&gt;-Scope&lt;/span&gt; Process &lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;System.Net.ServicePointManager]::SecurityProtocol &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;System.Net.ServicePointManager]::SecurityProtocol &lt;span class="nt"&gt;-bor&lt;/span&gt; 3072&lt;span class="p"&gt;;&lt;/span&gt; iex &lt;span class="o"&gt;((&lt;/span&gt;New-Object System.Net.WebClient&lt;span class="o"&gt;)&lt;/span&gt;.DownloadString&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'https://chocolatey.org/install.ps1'&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will get Chocolatey installed and Environment Variables set.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Install Java
&lt;/h2&gt;

&lt;p&gt;As per the &lt;a href="https://reactnative.dev/docs/environment-setup" rel="noopener noreferrer"&gt;official React Native Documentation&lt;/a&gt;,  You can use Chocolatey to install Java. If you already have that, skip this step. Just run below command in command prompt to install Node and Java. You can skip the package you have already installed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;choco &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; nodejs.install openjdk8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you must have &lt;code&gt;JAVA_HOME&lt;/code&gt; set in your environment variables, if not then you can set. To go to environment variable you can follow below steps:&lt;/p&gt;

&lt;p&gt;1: Go To &lt;em&gt;Properties&lt;/em&gt;:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9e86gd3vhtu2pzcp4dti.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9e86gd3vhtu2pzcp4dti.png" alt="Properties" width="320" height="314"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;2: Go to Advance System Settings&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F69c10q8gz6b71rrvv0bv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F69c10q8gz6b71rrvv0bv.png" alt="AdSySt" width="340" height="296"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3: Go to Environment Variables&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa4yu6idd01cf38xc80m2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa4yu6idd01cf38xc80m2.png" alt="EV" width="416" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4: List of Environment Variables can be accessed here&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftchcvv9u4i4cphye6sab.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftchcvv9u4i4cphye6sab.png" alt="EV" width="624" height="593"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 3: Install SDK Manager
&lt;/h2&gt;

&lt;p&gt;Now firstly we need to install &lt;a href="https://developer.android.com/studio/command-line/sdkmanager" rel="noopener noreferrer"&gt;Android SDK Manager&lt;/a&gt; to install Android SDK and other tools. For that &lt;a href="https://developer.android.com/studio#span-idcommand-toolsa-namecmdline-toolsacommand-line-tools-onlyspan" rel="noopener noreferrer"&gt;visit the official site&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; Download &lt;code&gt;sdkmanager&lt;/code&gt; compressed file.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsfrq4nq7jbqyi44lau6g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsfrq4nq7jbqyi44lau6g.png" alt="CLT" width="758" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; Now you need to create a folder, where you want to keep your all SDK packages. I created &lt;code&gt;C:\Android&lt;/code&gt; for my case. Unzip the downloaded folder in this directory. Now I'm having the folder structure as &lt;code&gt;C:\Android\cmdline-tools\&amp;lt;unzipped files&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; &lt;strong&gt;&lt;em&gt;IMPORTANT:&lt;/em&gt;&lt;/strong&gt; Now, we need to move all the unzipped files in a single folder. the name of the folder will be determined by the &lt;code&gt;source.properties&lt;/code&gt; file's content, which is one of these unzipped files. Open this file and It'll be looked like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pkg.Revision=4.0
Pkg.Path=cmdline-tools;4.0
Pkg.Desc=Android SDK Command-line Tools
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice the first line, the value &lt;code&gt;4.0&lt;/code&gt; is going to be our folder name.&lt;/p&gt;

&lt;p&gt;So create a folder named as &lt;code&gt;4.0&lt;/code&gt;  inside &lt;code&gt;C:\Android\cmdline-tools\&lt;/code&gt; and move all other files into this folder. So now full directory structure will be &lt;code&gt;C:\Android\cmdline-tools\4.0\&amp;lt;bin | lib&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt; Now we'll set 2 Environment variables: &lt;code&gt;ANDROID_HOME&lt;/code&gt; and &lt;code&gt;Path&lt;/code&gt; for &lt;code&gt;cmdline-tools&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Set &lt;code&gt;ANDROID_HOME&lt;/code&gt; to the path of the directory you made in above point 2, in my case it's &lt;code&gt;C:\Android&lt;/code&gt;.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fux3wi951lhq2u42ahmfp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fux3wi951lhq2u42ahmfp.png" alt="Android_HOME" width="666" height="592"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add &lt;code&gt;C:\Android\cmdline-tools\4.0\bin&lt;/code&gt; and &lt;code&gt;C:\Android\cmdline-tools\4.0&lt;/code&gt; in &lt;code&gt;Path&lt;/code&gt; Variable.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqldrcbpnt6ke2dyicmgx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqldrcbpnt6ke2dyicmgx.png" alt="cmdline_tools" width="622" height="595"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 4: Install Android SDK packages
&lt;/h2&gt;

&lt;p&gt;We'll now install the required packages via &lt;code&gt;sdkmanager&lt;/code&gt;. For that, open Command Prompt.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Install Platform Tools (ADB &amp;amp; Fastboot)
&lt;/h3&gt;

&lt;p&gt;Firstly we need to install &lt;a href="https://developer.android.com/studio/command-line/adb" rel="noopener noreferrer"&gt;&lt;code&gt;adb&lt;/code&gt;&lt;/a&gt;, for that we can install &lt;code&gt;platform-tools&lt;/code&gt; pkg via &lt;code&gt;sdkmanager&lt;/code&gt;. Run below command or get it from &lt;a href="https://developer.android.com/studio/releases/platform-tools" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sdkmanager &lt;span class="s2"&gt;"platform-tools"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now add path of &lt;code&gt;platform-tools&lt;/code&gt; in Environment Variable &lt;code&gt;Path&lt;/code&gt; which is &lt;code&gt;C:\Android\platform-tools&lt;/code&gt; in my case.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Install Platform
&lt;/h3&gt;

&lt;p&gt;Use the below command to install the Android 10 (API level 30) using the SDK manager. You can download any API level by changing the name.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sdkmanager &lt;span class="s2"&gt;"platforms;android-30"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aceept T&amp;amp;C and it'll be installed.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Add System Image
&lt;/h3&gt;

&lt;p&gt;I am adding the most recent default 64-bit system image by running below command. Accept T&amp;amp;C and it'll be installed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sdkmanager &lt;span class="s2"&gt;"system-images;android-30;google_apis;x86_64"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are some projects which need Google Play Services. We need system image specific to Google Play Services. We can add that via command as shown below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sdkmanager &lt;span class="s2"&gt;"system-images;android-30;google_apis_playstore;x86_64"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  4. Install Build Tools
&lt;/h3&gt;

&lt;p&gt;I am adding the most recent &lt;code&gt;build-tools&lt;/code&gt; &lt;code&gt;30.0.3&lt;/code&gt; via below command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sdkmanager &lt;span class="s2"&gt;"build-tools;30.0.3"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  5. Install Emulator (Optional)
&lt;/h3&gt;

&lt;p&gt;If you want to run your apps inside emulator instead of physical device then you can install emulator and system images to run that. But obviously, it requires good system specs. We'll cover this in very short, please comment if you want detailed article on that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; Install Emulator&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sdkmanager &lt;span class="nt"&gt;--channel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3 emulator
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; Create emulator&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;// Create the emulator with name em30 using default system image
avdmanager create avd &lt;span class="nt"&gt;-n&lt;/span&gt; em30 &lt;span class="nt"&gt;-k&lt;/span&gt; &lt;span class="s2"&gt;"system-images;android-30;google_apis;x86_64"&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; &lt;span class="s2"&gt;"google_apis"&lt;/span&gt;

// Create emulator with name em30ps using Google Play Services system image
avdmanager create avd &lt;span class="nt"&gt;-n&lt;/span&gt; em30ps &lt;span class="nt"&gt;-k&lt;/span&gt; &lt;span class="s2"&gt;"system-images;android-30;google_apis_playstore;x86_64"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will ask many questions, answer as per yoyr need.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; Add emulator path in &lt;code&gt;Path&lt;/code&gt; environment variable, in my case it's &lt;code&gt;C:\Android\emulator&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt; List emulator devices installed&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;emulator &lt;span class="nt"&gt;-list-avds&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;5.&lt;/strong&gt; Run emulator&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;// Run Emulator named em30
emulator &lt;span class="nt"&gt;-avd&lt;/span&gt; em30
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  6. How to use my device instead of emulator
&lt;/h3&gt;

&lt;p&gt;You can follow the official documentation &lt;a href="https://reactnative.dev/docs/running-on-device" rel="noopener noreferrer"&gt;here&lt;/a&gt; and a related troubleshooting &lt;a href="https://stackoverflow.com/a/60304825/8494462" rel="noopener noreferrer"&gt;here&lt;/a&gt;. I'll be adding article for my version of the same soon.&lt;/p&gt;




&lt;p&gt;So everything is set now and you'll be having Android SDK set up in your system. Below are some other related and useful commands.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;// list all packages available &lt;span class="k"&gt;in &lt;/span&gt;sdkmanager
sdkmanager &lt;span class="nt"&gt;--list&lt;/span&gt;

// list installed packages via sdkmanager
sdkmanager &lt;span class="nt"&gt;--list_installed&lt;/span&gt;

// Update installed packages
sdkmanager &lt;span class="nt"&gt;--update&lt;/span&gt;

// Uninstall packages
sdkmanager &lt;span class="nt"&gt;--uninstall&lt;/span&gt; &amp;lt;package name&amp;gt;

// Delete Emulator
avdmanager delete avd &lt;span class="nt"&gt;-n&lt;/span&gt; &amp;lt;emulator name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cover Photo by &lt;a href="https://unsplash.com/@redaquamedia?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Denny Müller&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/android?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>reactnative</category>
      <category>react</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to create React Native App for Android, iOS and Web without Expo</title>
      <dc:creator>Shivam Sharma</dc:creator>
      <pubDate>Sat, 12 Jun 2021 15:47:03 +0000</pubDate>
      <link>https://dev.to/shivams136/create-react-native-app-for-android-ios-and-web-without-expo-48lc</link>
      <guid>https://dev.to/shivams136/create-react-native-app-for-android-ios-and-web-without-expo-48lc</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This article is updated on 08-Aug-2021, to solve &lt;a href="https://stackoverflow.com/questions/68014681/react-native-run-android-error-in-emulator-could-not-get-batchedbridge-make-su" rel="noopener noreferrer"&gt;this StackOverflow issue&lt;/a&gt;, In this update, Creation of &lt;code&gt;.babelrc&lt;/code&gt; is removed, &lt;code&gt;babel.config.js&lt;/code&gt; &amp;amp; &lt;code&gt;webpack.config.js&lt;/code&gt; are updated. The changes are equivalent to &lt;a href="https://github.com/ShivamS136/react-native-web-setup/commit/c73b8c4139f0b86fc3d1734f1bc8a7014d00e24b" rel="noopener noreferrer"&gt;this commit&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;In this article, we are going to see, how to create a React Native App which can run on Android, iOS and Web Browser. We'll NOT be using &lt;a href="https://expo.io/" rel="noopener noreferrer"&gt;Expo&lt;/a&gt; in this process. For web support, we'll be using the package &lt;a href="https://github.com/necolas/react-native-web" rel="noopener noreferrer"&gt;react-native-web&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I am using a Windows machine so I'll be showing the project run in Android and Web only. I am assuming that you have already downloaded and setup Node, NPM, Android SDK, Java and Emulator/Device for build and debugging purpose. If not, don't worry &lt;a href="https://dev.to/shivams136/how-to-install-android-sdk-without-android-studio-ff2"&gt;follow this article&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My Environment:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OS:&lt;/strong&gt; Windows 10 (64 Bit)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Node:&lt;/strong&gt; 16.3.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NPM:&lt;/strong&gt; 7.17 &lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;In case, if you want to explore more about which Hybrid App Development Framework to choose then you can have a look at this article: &lt;a href="https://dev.to/shivams136/hybrid-app-development-comparison-among-react-native-ionic-and-flutter-1lb"&gt;React Native vs Ionic vs Flutter&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Init a React Native Application:
&lt;/h2&gt;

&lt;p&gt;This step is same as the &lt;a href="https://reactnative.dev/docs/environment-setup#:~:text=Creating%20a%20new%20application" rel="noopener noreferrer"&gt;official React Native Doc&lt;/a&gt;. So to &lt;code&gt;init&lt;/code&gt; a React Native app:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdibxex97wzxh76d7gm3m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdibxex97wzxh76d7gm3m.png" alt="Command-Prompt-Screenshot" width="676" height="669"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open command Prompt and go to the path where you want to create the project, In my case the path is &lt;code&gt;C:\Users\shivam\Desktop\React&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Init App:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx react-native init AwesomeProject
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Your folder will be looking like &lt;a href="https://github.com/ShivamS136/react-native-web-setup/commit/f66c8f85665ab1eb0bbef563b069762ad54baf5d" rel="noopener noreferrer"&gt;this commit&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;You'll find a new folder &lt;code&gt;AwesomeProject&lt;/code&gt; in the current Directory, Now open this folder using any editor, I am using &lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;Visual Studio Code&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Step 2: Run this new app in Android (optional)
&lt;/h2&gt;

&lt;p&gt;If you have Android setup done and an emulator or device connected, then you can simply run the app in android by simply running below command using command prompt in the folder &lt;code&gt;AwesomeProject&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx react-native run-android
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 3: Web Setup
&lt;/h2&gt;

&lt;p&gt;As already mentioned we'll be using  the package &lt;a href="https://github.com/necolas/react-native-web" rel="noopener noreferrer"&gt;react-native-web&lt;/a&gt; for web support. So you can find short setup instructions in &lt;a href="https://necolas.github.io/react-native-web/docs/" rel="noopener noreferrer"&gt;the official doc of this package&lt;/a&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. Add Web packages
&lt;/h3&gt;

&lt;p&gt;Add the package &lt;a href="https://www.npmjs.com/package/react-native-web" rel="noopener noreferrer"&gt;&lt;code&gt;react-native-web&lt;/code&gt;&lt;/a&gt; for web APIs and &lt;a href="https://www.npmjs.com/package/react-dom" rel="noopener noreferrer"&gt;&lt;code&gt;react-dom&lt;/code&gt;&lt;/a&gt; for browser.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;react-dom react-native-web
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you see any error saying &lt;code&gt;unable to resolve dependency tree&lt;/code&gt; then you can use the &lt;code&gt;--legacy-peer-deps&lt;/code&gt; option like below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;react-dom react-native-web &lt;span class="nt"&gt;--legacy-peer-deps&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  2. Babel Plugin for build time optimization
&lt;/h3&gt;

&lt;p&gt;As per official doc's recommendation, use the &lt;a href="https://babeljs.io/" rel="noopener noreferrer"&gt;babel&lt;/a&gt; plugin &lt;a href="https://www.npmjs.com/package/babel-plugin-react-native-web" rel="noopener noreferrer"&gt;&lt;code&gt;babel-plugin-react-native-web&lt;/code&gt;&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; babel-plugin-react-native-web
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  3. Babel Module Aliasing
&lt;/h3&gt;

&lt;p&gt;As we are going to alias &lt;code&gt;react-native&lt;/code&gt; as &lt;code&gt;react-native-web&lt;/code&gt; so as &lt;a href="https://babeljs.io/" rel="noopener noreferrer"&gt;Babel&lt;/a&gt; supports module aliasing using &lt;a href="https://www.npmjs.com/package/babel-plugin-module-resolver" rel="noopener noreferrer"&gt;babel-plugin-module-resolver&lt;/a&gt;, we'll be using this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; babel-plugin-module-resolver
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, to set alias, we'll use this package in webpack configuration. &lt;em&gt;(These settings will be inside &lt;code&gt;web/webpack.config.js&lt;/code&gt;, we'll introduce this file later in this article)&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Mock Jest
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://facebook.github.io/jest/" rel="noopener noreferrer"&gt;Jest&lt;/a&gt; can be configured using the provided preset. This will map &lt;code&gt;react-native&lt;/code&gt; to &lt;code&gt;react-native-web&lt;/code&gt; and provide appropriate mocks. &lt;br&gt;
For this, in &lt;code&gt;/package.json&lt;/code&gt; file, update the value of the key &lt;code&gt;"jest"&lt;/code&gt; from &lt;code&gt;"react-native"&lt;/code&gt; to &lt;code&gt;"react-native-web"&lt;/code&gt;. Final value:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;/package.json&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  // Other Settings
  "jest": {
    "preset": "react-native-web"
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  5. Configure Flow
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://flow.org/" rel="noopener noreferrer"&gt;Flow&lt;/a&gt; is  a static type checker for Javascript like &lt;a href="https://www.typescriptlang.org/" rel="noopener noreferrer"&gt;TypeScript&lt;/a&gt;. It's used by React-Native by default if you don't init the project using TypeScript template. &lt;/p&gt;

&lt;p&gt;It can be configured to understand the aliased module. For this we need to add some config text under &lt;code&gt;[options]&lt;/code&gt; key inside the file &lt;code&gt;/.flowconfig&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;/.flowconfig&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;options&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="c1"&gt;# Alias the package name&lt;/span&gt;
&lt;span class="s"&gt;module.name_mapper='^react-native$' -&amp;gt; 'react-native-web'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Flow can be configured to pull types from React Native for Web’s source code. For that add below config text also in the &lt;code&gt;[options]&lt;/code&gt; key.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;/.flowconfig&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;options&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="c1"&gt;# Point flow to the 'module' field by default&lt;/span&gt;
&lt;span class="s"&gt;module.system.node.main_field=module&lt;/span&gt;
&lt;span class="s"&gt;module.system.node.main_field=main&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  6. Package Optimization
&lt;/h3&gt;

&lt;p&gt;We added a package &lt;a href="https://www.npmjs.com/package/babel-plugin-module-resolver" rel="noopener noreferrer"&gt;babel-plugin-module-resolver&lt;/a&gt; in step-3, It is recommended for build-time optimizations and to prune modules not used by your application. To config this we'll use webpack configurattions so your &lt;code&gt;/babel.config.js&lt;/code&gt; file should look something like below.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;/babel.config.js&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;presets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;module:metro-react-native-babel-preset&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  7. Create Entry Files
&lt;/h3&gt;

&lt;p&gt;For web version, we need to create 2 entry files, First one is &lt;code&gt;index.html&lt;/code&gt; and second one is &lt;code&gt;index.web.js&lt;/code&gt;, both needs to be placed at root path.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;/index.html&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"utf-8"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Testing React Native on the Web!&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"initial-scale=1,width=device-width"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;httpEquiv=&lt;/span&gt;&lt;span class="s"&gt;"X-UA-Compatible"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"IE=edge"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
      &lt;span class="c"&gt;/* These styles make the body full-height */&lt;/span&gt;
      &lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
      &lt;span class="nf"&gt;#root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;/*&lt;/span&gt; &lt;span class="nt"&gt;These&lt;/span&gt; &lt;span class="nt"&gt;styles&lt;/span&gt; &lt;span class="nt"&gt;disable&lt;/span&gt; &lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="nt"&gt;scrolling&lt;/span&gt; &lt;span class="nt"&gt;if&lt;/span&gt; &lt;span class="nt"&gt;you&lt;/span&gt; &lt;span class="nt"&gt;are&lt;/span&gt; &lt;span class="nt"&gt;using&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ScrollView&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;*/&lt;/span&gt;
      &lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;overflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;hidden&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="c"&gt;/* These styles make the root element flex and column wise filling */&lt;/span&gt;
      &lt;span class="nf"&gt;#root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nl"&gt;flex-direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"react-native-web-app"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text/javascript"&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"/bundle.web.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice the script name &lt;code&gt;src="/bundle.web.js"&lt;/code&gt;, We'll be using this file name while configuring webpack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;/index.web.js&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;AppRegistry&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./src/components/App&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;appName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./app.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;AppRegistry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;registerComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;appName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;AppRegistry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;runApplication&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;appName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;rootTag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native-web-app&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you notice this almost same as &lt;code&gt;index.js&lt;/code&gt; except the last line. As you can see above, we are using an App component &lt;em&gt;but from where did it came?&lt;/em&gt; So it's the same &lt;code&gt;App.js&lt;/code&gt; file copied with the name &lt;code&gt;App.jsx&lt;/code&gt; inside the path &lt;code&gt;/src/components/&lt;/code&gt;, It's just to demonstrate an important concept which we'll learn later in this article, as this file will be creating some problems.  So &lt;code&gt;/src/components/App.jsx&lt;/code&gt; will look like below:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; As in many Editors/IDE the same App.js file can show errors as the file is using Flow syntax for type definitions and this syntax might not be supported in your IDE, to solve this you can either add Flow Language support via extensions or remove the flow specific code. I have removed the flow specific code in the below example for saving your time in troubleshooting.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;/src/components/App.jsx&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 *
 * @format
 * @flow strict-local
 */&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;SafeAreaView&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;ScrollView&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;StatusBar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;StyleSheet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;useColorScheme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;View&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;DebugInstructions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Header&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;LearnMoreLinks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;ReloadInstructions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native/Libraries/NewAppScreen&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Section&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isDarkMode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useColorScheme&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dark&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sectionContainer&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;
        &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sectionTitle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;isDarkMode&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;white&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;black&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;
        &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sectionDescription&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;isDarkMode&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;light&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dark&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isDarkMode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useColorScheme&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dark&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;backgroundStyle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;backgroundColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;isDarkMode&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;darker&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lighter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;SafeAreaView&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;backgroundStyle&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;StatusBar&lt;/span&gt; &lt;span class="na"&gt;barStyle&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;isDarkMode&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;light-content&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dark-content&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ScrollView&lt;/span&gt;
        &lt;span class="na"&gt;contentInsetAdjustmentBehavior&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"automatic"&lt;/span&gt;
        &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;backgroundStyle&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Header&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;
          &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;backgroundColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;isDarkMode&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;black&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;white&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Section&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Step One"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            Edit &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;highlight&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;App.js&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; to change this
            screen and then come back to see your edits.
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Section&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Section&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"See Your Changes"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ReloadInstructions&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Section&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Section&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Debug"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;DebugInstructions&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Section&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Section&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Learn More"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            Read the docs to discover what to do next:
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Section&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;LearnMoreLinks&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;ScrollView&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;SafeAreaView&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;styles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;StyleSheet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;sectionContainer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;marginTop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;paddingHorizontal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;sectionTitle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;fontWeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;600&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;sectionDescription&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;marginTop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;fontWeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;400&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;highlight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;fontWeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;700&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  8. Configuring and budling
&lt;/h3&gt;

&lt;p&gt;We'll be using &lt;a href="https://www.npmjs.com/package/webpack" rel="noopener noreferrer"&gt;Webpack&lt;/a&gt; for bundling and &lt;a href="https://babeljs.io/" rel="noopener noreferrer"&gt;Babel&lt;/a&gt; for transpiling along with &lt;code&gt;babel-loader&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install Webpack and related dependencies:&lt;/strong&gt; Run below command in the terminal to install packages for dev environment.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; babel-loader url-loader webpack webpack-cli webpack-dev-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Tree-Shaking:&lt;/strong&gt; React Native’s Babel preset rewrites ES modules to CommonJS modules, preventing bundlers from automatically performing “tree-shaking” to remove unused modules from your web app build. To help with this, you can install the following Babel plugin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; babel-plugin-react-native-web
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Webpack Configuration:&lt;/strong&gt;&lt;br&gt;
This cofiguration is picked from &lt;a href="https://necolas.github.io/react-native-web/docs/multi-platform/" rel="noopener noreferrer"&gt;the official doc&lt;/a&gt; and slightly modified to add &lt;code&gt;.jsx&lt;/code&gt; support and &lt;code&gt;module-resolver&lt;/code&gt; we added above via &lt;code&gt;babel-plugin-module-resolver&lt;/code&gt;. So to configure Webpack create a file at &lt;code&gt;/web/webpack.config.js&lt;/code&gt;. We will be using &lt;a href="https://www.npmjs.com/package/webpack-cli" rel="noopener noreferrer"&gt;&lt;code&gt;webpack-cli&lt;/code&gt;&lt;/a&gt; to diffrentiate between development and production builds, if you want to manage this via script then you can use &lt;a href="https://webpack.js.org/guides/production/" rel="noopener noreferrer"&gt;this guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;/web/webpack.config.js&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;webpack&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;webpack&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;appDirectory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// This is needed for webpack to compile JavaScript.&lt;/span&gt;
&lt;span class="c1"&gt;// Many OSS React Native packages are not compiled to ES5 before being&lt;/span&gt;
&lt;span class="c1"&gt;// published. If you depend on uncompiled packages they may cause webpack build&lt;/span&gt;
&lt;span class="c1"&gt;// errors. To fix this webpack can be configured to compile to the necessary&lt;/span&gt;
&lt;span class="c1"&gt;// `node_module`.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;babelLoaderConfiguration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\.(&lt;/span&gt;&lt;span class="sr"&gt;js&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;|&lt;/span&gt;&lt;span class="se"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;jsx&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="c1"&gt;// Add every directory that needs to be compiled by Babel during the build.&lt;/span&gt;
  &lt;span class="na"&gt;include&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;appDirectory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;index.web.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;appDirectory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;src&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;appDirectory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node_modules/react-native-uncompiled&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;use&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;babel-loader&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;cacheDirectory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="c1"&gt;// The 'metro-react-native-babel-preset' preset is recommended to match React Native's packager&lt;/span&gt;
      &lt;span class="na"&gt;presets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;module:metro-react-native-babel-preset&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="c1"&gt;// Re-write paths to import only the modules needed by the app&lt;/span&gt;
      &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native-web&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;module-resolver&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;alias&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
              &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^react-native$&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native-web&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// This is needed for webpack to import static images in JavaScript files.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;imageLoaderConfiguration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\.(&lt;/span&gt;&lt;span class="sr"&gt;gif|jpe&lt;/span&gt;&lt;span class="se"&gt;?&lt;/span&gt;&lt;span class="sr"&gt;g|png|svg&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;use&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;url-loader&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[name].[ext]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;esModule&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="c1"&gt;// load any web API polyfills&lt;/span&gt;
    &lt;span class="c1"&gt;// path.resolve(appDirectory, 'polyfills-web.js'),&lt;/span&gt;
    &lt;span class="c1"&gt;// your web-specific entry file&lt;/span&gt;
    &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;appDirectory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;index.web.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;

  &lt;span class="c1"&gt;// configures where the build ends up&lt;/span&gt;
  &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bundle.web.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;appDirectory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dist&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="c1"&gt;// ...the rest of your config&lt;/span&gt;

  &lt;span class="na"&gt;module&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;babelLoaderConfiguration&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;imageLoaderConfiguration&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="na"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// This will only alias the exact import "react-native"&lt;/span&gt;
    &lt;span class="na"&gt;alias&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native$&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native-web&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="c1"&gt;// If you're working on a multi-platform React Native app, web-specific&lt;/span&gt;
    &lt;span class="c1"&gt;// module implementations should be written in files using the extension&lt;/span&gt;
    &lt;span class="c1"&gt;// `.web.js`.&lt;/span&gt;
    &lt;span class="na"&gt;extensions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.web.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.jsx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  9. Scripts to run on web
&lt;/h3&gt;

&lt;p&gt;Now we are going to add some scripts to run our web app with short command instead of full webpack-cli command. For this, we need to add below two options in the file &lt;code&gt;/package.json&lt;/code&gt; inside &lt;code&gt;"scripts"&lt;/code&gt; key.&lt;/p&gt;

&lt;p&gt;To know more about &lt;code&gt;webpack-cli&lt;/code&gt; options for webpack-5 go &lt;a href="https://github.com/webpack/webpack-cli/blob/master/OPTIONS.md" rel="noopener noreferrer"&gt;here&lt;/a&gt; and to know more about dev-tool go &lt;a href="https://webpack.js.org/configuration/devtool/" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;/package.json&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"web"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"webpack serve -d source-map --mode development --config &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;./web/webpack.config.js&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; --inline --color --hot"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"build:web"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"webpack --mode production --config &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;./web/webpack.config.js&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; --hot"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  10. RUN OUR WEBAPP
&lt;/h3&gt;

&lt;p&gt;So, Finally we are here, as we have set shortcut in our &lt;code&gt;package.json&lt;/code&gt; for script so now we can simply run below command to start our webapp in browser.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run web
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;Wait a minute!!!&lt;/em&gt;&lt;/strong&gt; I'm getting error, like below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ERROR &lt;span class="k"&gt;in&lt;/span&gt; ./node_modules/react-native/Libraries/NewAppScreen/components/DebugInstructions.js 11:12
Module parse failed: Unexpected token &lt;span class="o"&gt;(&lt;/span&gt;11:12&lt;span class="o"&gt;)&lt;/span&gt;
You may need an appropriate loader to handle this file &lt;span class="nb"&gt;type&lt;/span&gt;, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
|  &lt;span class="k"&gt;*&lt;/span&gt;/
|
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; import &lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;Node&lt;span class="o"&gt;}&lt;/span&gt; from &lt;span class="s1"&gt;'react'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
| import &lt;span class="o"&gt;{&lt;/span&gt;Platform, StyleSheet, Text&lt;span class="o"&gt;}&lt;/span&gt; from &lt;span class="s1"&gt;'react-native'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
| import React from &lt;span class="s1"&gt;'react'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 @ ./node_modules/react-native/Libraries/NewAppScreen/index.js 17:0-63 20:0-27:2
 @ ./src/components/App.jsx 1:864-910
 @ ./index.web.js 1:261-292
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So this is the error we talked about in &lt;strong&gt;Step 7&lt;/strong&gt;. I literally spent 3-4 days to find a solution for this. And then the creator and maintainer of &lt;code&gt;react-native-web&lt;/code&gt; package, &lt;a href="https://github.com/necolas" rel="noopener noreferrer"&gt;Nicolas Gallagher&lt;/a&gt; helped me via &lt;a href="https://github.com/necolas/react-native-web/discussions/2052" rel="noopener noreferrer"&gt;this discussion&lt;/a&gt;. &lt;br&gt;
So the issue is in the &lt;code&gt;import&lt;/code&gt; statement on line 21 of &lt;code&gt;src/components/App.jsx&lt;/code&gt;, where we are trying to do something like below:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This line in the stack trace is telling us that we're trying to bundle RN internal code in our web bundle: &lt;code&gt;node_modules/react-native/Libraries/NewAppScreen/index.js&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;First, we should not be loading any of the RN package on web, especially not parts that aren't part of the public API . Second, as mentioned in the inline comments of the config &lt;code&gt;web/webpack.config.js&lt;/code&gt;, we need to explicitly list everything in &lt;code&gt;node_modules&lt;/code&gt; that needs compiling. &lt;/p&gt;


&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="nx"&gt;DebugInstructions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="nx"&gt;Header&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="nx"&gt;LearnMoreLinks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="nx"&gt;ReloadInstructions&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native/Libraries/NewAppScreen&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;All this code of the problem. We should not import from Libraries. This is not part of the public API.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To solve this, remove the dependency on the library: &lt;code&gt;react-native/Libraries&lt;/code&gt;, for that update the code of &lt;code&gt;/src/components/App.jsx&lt;/code&gt; as below:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;/src/components/App.jsx&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 *
 * @format
 * @flow strict-local
 */&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;SafeAreaView&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;ScrollView&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;StatusBar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;StyleSheet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;useColorScheme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;View&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-native&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// import {&lt;/span&gt;
&lt;span class="c1"&gt;//   Colors,&lt;/span&gt;
&lt;span class="c1"&gt;//   DebugInstructions,&lt;/span&gt;
&lt;span class="c1"&gt;//   Header,&lt;/span&gt;
&lt;span class="c1"&gt;//   LearnMoreLinks,&lt;/span&gt;
&lt;span class="c1"&gt;//   ReloadInstructions,&lt;/span&gt;
&lt;span class="c1"&gt;// } from 'react-native/Libraries/NewAppScreen';&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;white&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#fff&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;black&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;light&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#ddd&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;dark&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#333&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;lighter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#eee&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;darker&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#111&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Section&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isDarkMode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useColorScheme&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dark&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sectionContainer&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;
        &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sectionTitle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;isDarkMode&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;white&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;black&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;
        &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sectionDescription&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;isDarkMode&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;light&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dark&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isDarkMode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useColorScheme&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dark&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;backgroundStyle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;backgroundColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;isDarkMode&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;darker&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lighter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;SafeAreaView&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;backgroundStyle&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;StatusBar&lt;/span&gt; &lt;span class="na"&gt;barStyle&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;isDarkMode&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;light-content&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dark-content&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ScrollView&lt;/span&gt;
        &lt;span class="na"&gt;contentInsetAdjustmentBehavior&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"automatic"&lt;/span&gt;
        &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;backgroundStyle&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* &amp;lt;Header /&amp;gt; */&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;
          &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;backgroundColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;isDarkMode&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;black&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;white&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Section&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Step One"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            Edit &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;highlight&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;App.js&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; to change this
            screen and then come back to see your edits.
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Section&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Section&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"See Your Changes"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* &amp;lt;ReloadInstructions /&amp;gt; */&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Reload Instruction&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Section&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Section&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Debug"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* &amp;lt;DebugInstructions /&amp;gt; */&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Debug Instruction&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Section&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Section&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Learn More"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            Read the docs to discover what to do next:
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Section&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* &amp;lt;LearnMoreLinks /&amp;gt; */&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Learn More Links&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;ScrollView&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;SafeAreaView&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;styles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;StyleSheet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;sectionContainer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;marginTop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;paddingHorizontal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;sectionTitle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;fontWeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;600&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;sectionDescription&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;marginTop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;fontWeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;400&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;highlight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;fontWeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;700&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  11. Finally run after Troubleshooting
&lt;/h3&gt;

&lt;p&gt;We can simply run below command in the terminal if it was stopped previously to start our webapp in browser.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run web
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should get output similar to below screenshot, and you can go to &lt;a href="http://localhost:8080" rel="noopener noreferrer"&gt;http://localhost:8080&lt;/a&gt; to see your webapp running.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnqdff7rm3hyrylbbdt9p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnqdff7rm3hyrylbbdt9p.png" alt="Final Output" width="800" height="369"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I'm sure it will help someone, at least it could save my 4 days if I know this before. All the changes done to add web support can be found in &lt;a href="https://github.com/ShivamS136/react-native-web-setup/commit/d732e1dab375024dad770454dab68b500a9bd78d" rel="noopener noreferrer"&gt;this before-update commit&lt;/a&gt; and &lt;a href="https://github.com/ShivamS136/react-native-web-setup/commit/c73b8c4139f0b86fc3d1734f1bc8a7014d00e24b" rel="noopener noreferrer"&gt;this after-update commit&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;I created &lt;a href="https://github.com/ShivamS136/react-native-web-setup/releases/tag/1.0.0" rel="noopener noreferrer"&gt;a release&lt;/a&gt; also for the same. &lt;/p&gt;

&lt;p&gt;I used the same configurations on &lt;a href="https://github.com/ShivamS136/harry-potter-dictionary" rel="noopener noreferrer"&gt;this Dummy project&lt;/a&gt; and faced no issues after update.&lt;/p&gt;

&lt;p&gt;If you find any issue in the configurations and gets it resolved, don't hesitate to contribute to &lt;a href="https://github.com/ShivamS136/react-native-web-setup" rel="noopener noreferrer"&gt;the repo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can connect with me on &lt;a href="https://www.linkedin.com/in/shivams136/" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt; or &lt;a href="https://github.com/ShivamS136/" rel="noopener noreferrer"&gt;Github&lt;/a&gt; as well.&lt;/p&gt;

</description>
      <category>react</category>
      <category>reactnative</category>
      <category>tutorial</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Techgig CodeGladiators 2021 is live now, Participate and prove your skills</title>
      <dc:creator>Shivam Sharma</dc:creator>
      <pubDate>Tue, 30 Mar 2021 07:21:49 +0000</pubDate>
      <link>https://dev.to/shivams136/techgig-codegladiators-2021-is-live-now-participate-and-prove-your-skills-836</link>
      <guid>https://dev.to/shivams136/techgig-codegladiators-2021-is-live-now-participate-and-prove-your-skills-836</guid>
      <description>&lt;h3&gt;
  
  
  &lt;a href="https://tinyurl.com/yjxmpuc8" rel="noopener noreferrer"&gt;Participate from this referral link&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;As per Techgig's site:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Code Gladiators is an annual coding competition by TechGig, that draws the best and the brightest coding talent from all parts of India. With multiple contests in emerging technologies and the coveted title of Code Gladiators up for grabs, the competition sees enthusiastic participation and has grown from strength to strength with each passing year.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj0p6782h5xdp01nexcet.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj0p6782h5xdp01nexcet.png" alt="Screenshot of site" width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Leetcode 869. Reordered Power of 2 [Solution]</title>
      <dc:creator>Shivam Sharma</dc:creator>
      <pubDate>Sun, 21 Mar 2021 16:02:34 +0000</pubDate>
      <link>https://dev.to/shivams136/leetcode-869-reordered-power-of-2-solution-3k9j</link>
      <guid>https://dev.to/shivams136/leetcode-869-reordered-power-of-2-solution-3k9j</guid>
      <description>&lt;p&gt;The question is a little bit tricky but once you get the trick, you can easily write the code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; Medium&lt;br&gt;
&lt;strong&gt;Jump To:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Problem Statement&lt;/li&gt;
&lt;li&gt;Explanation&lt;/li&gt;
&lt;li&gt;Solution&lt;/li&gt;
&lt;li&gt;Implementation&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Problem Statement &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Question:&lt;/strong&gt; &lt;a href="https://leetcode.com/problems/reordered-power-of-2/" rel="noopener noreferrer"&gt;https://leetcode.com/problems/reordered-power-of-2/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Starting with a positive integer  &lt;code&gt;N&lt;/code&gt;, we reorder the digits in any order (including the original order) such that the leading digit is not zero.&lt;/p&gt;

&lt;p&gt;Return  &lt;code&gt;true&lt;/code&gt; if and only if we can do this in a way such that the resulting number is a power of 2.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example 1:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Input:&lt;/strong&gt; 1&lt;br&gt;
&lt;strong&gt;Output:&lt;/strong&gt; true&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Example 2:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Input:&lt;/strong&gt; 10&lt;br&gt;
&lt;strong&gt;Output:&lt;/strong&gt; false&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Example 3:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Input:&lt;/strong&gt; 16&lt;br&gt;
&lt;strong&gt;Output:&lt;/strong&gt; true&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Example 4:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Input:&lt;/strong&gt; 24&lt;br&gt;
&lt;strong&gt;Output:&lt;/strong&gt; false&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Example 5:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Input:&lt;/strong&gt; 46&lt;br&gt;
&lt;strong&gt;Output:&lt;/strong&gt; true&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;code&gt;1 &amp;lt;= N &amp;lt;= 10^9&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  Explanation &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;So the problem is simple, we are given a number &lt;code&gt;N&lt;/code&gt; and we need to check whether we can create a number from this number by changing the place of digits. Considering zero can not be at the leading position. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;eg.&lt;/strong&gt; from &lt;code&gt;2014&lt;/code&gt; we can create &lt;code&gt;1024&lt;/code&gt; but not &lt;code&gt;0124&lt;/code&gt; and &lt;code&gt;1024 = 2^10&lt;/code&gt; so answer should be &lt;code&gt;true&lt;/code&gt; for this &lt;code&gt;N=2014&lt;/code&gt;. For &lt;code&gt;N=12&lt;/code&gt; we have two combinations &lt;code&gt;12&lt;/code&gt; and &lt;code&gt;21&lt;/code&gt; and both are not in any power of &lt;code&gt;2&lt;/code&gt; so for &lt;code&gt;N=12&lt;/code&gt; answer is &lt;code&gt;false&lt;/code&gt;. &lt;/p&gt;


&lt;h2&gt;
  
  
  Solution &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;As a naive approach, we can try to check if the number is the power of &lt;code&gt;2&lt;/code&gt; for every permutation of the digits in &lt;code&gt;N&lt;/code&gt; and it will result in time complexity = &lt;code&gt;O((logN)!∗logN)&lt;/code&gt; but look at the constraints condition &lt;code&gt;1 &amp;lt;= N &amp;lt;= 10^9&lt;/code&gt; and for various power of &lt;code&gt;2&lt;/code&gt; we can see that &lt;code&gt;2^29 = 536870912&lt;/code&gt; and &lt;code&gt;2^30 = 1073741824&lt;/code&gt;. So instead of checking whether the permutation of &lt;code&gt;N&lt;/code&gt; is a power of 2, we can check that any of the numbers among &lt;code&gt;2^x ; x=0,1,2...29&lt;/code&gt; has the same number of digits and same frequency of digits with &lt;code&gt;N&lt;/code&gt;. If yes then this &lt;code&gt;2^x&lt;/code&gt; can be created from &lt;code&gt;N&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;eg.&lt;/strong&gt; If &lt;code&gt;N=23&lt;/code&gt; then, &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We'll check if &lt;code&gt;2^0 = 1&lt;/code&gt; can be created using &lt;code&gt;23&lt;/code&gt; by checking the number of digits in &lt;code&gt;2^0 = 1&lt;/code&gt; and &lt;code&gt;23&lt;/code&gt;  as the number of digits are not equal in &lt;code&gt;1&lt;/code&gt; and &lt;code&gt;23&lt;/code&gt; so &lt;code&gt;1&lt;/code&gt; can not be created from &lt;code&gt;23&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt; Now for &lt;code&gt;x=1&lt;/code&gt;, &lt;code&gt;2^x = 2&lt;/code&gt; again due to the different numbers of digits, &lt;code&gt;2&lt;/code&gt; can not be created from &lt;code&gt;23&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt; Now for &lt;code&gt;x=2&lt;/code&gt;, &lt;code&gt;2^x = 4&lt;/code&gt; again due to the different numbers of digits, &lt;code&gt;4&lt;/code&gt; can not be created from &lt;code&gt;23&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Now for &lt;code&gt;x=3&lt;/code&gt;, &lt;code&gt;2^x = 8&lt;/code&gt; again due to the different numbers of digits, &lt;code&gt;8&lt;/code&gt; can not be created from &lt;code&gt;23&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Now for &lt;code&gt;x=4&lt;/code&gt;, &lt;code&gt;2^x = 16&lt;/code&gt; now the number of digits are same, but the frequency of digits in &lt;code&gt;16&lt;/code&gt; and &lt;code&gt;23&lt;/code&gt; are not the same so &lt;code&gt;16&lt;/code&gt; can not be created from &lt;code&gt;23&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Now for &lt;code&gt;x=5&lt;/code&gt;, &lt;code&gt;2^x = 32&lt;/code&gt; now number of digits are same, and frequency of digits in &lt;code&gt;32&lt;/code&gt; and &lt;code&gt;23&lt;/code&gt; are same &lt;code&gt;(2 =&amp;gt; once, 3=&amp;gt; once)&lt;/code&gt; so &lt;code&gt;32&lt;/code&gt; can be created from &lt;code&gt;23&lt;/code&gt;, return &lt;code&gt;true&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  Implementation &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;C++ Code:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Solution&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;reorderedPowerOf2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getNumOfDigits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
        &lt;span class="n"&gt;getDigitsFreq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;d1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
            &lt;span class="n"&gt;d1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getNumOfDigits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="n"&gt;d1&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
                &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
                &lt;span class="n"&gt;getDigitsFreq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;a1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
                    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;a1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]){&lt;/span&gt;
                        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
                    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="nf"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;d1&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="n"&gt;n2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;n2&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;getDigitsFreq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[]){&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
            &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;N&lt;/span&gt; &lt;span class="o"&gt;/=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;getNumOfDigits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
            &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;/=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Runnable C++ code:&lt;/strong&gt;&lt;/p&gt;


&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@shivams136/Leetcode-869-Reordered-Power-of-2?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;



&lt;p&gt;Cover Photo by &lt;a href="https://unsplash.com/@clark_fransa?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Arnold Francisca&lt;/a&gt; on &lt;a href="https://dev.to/s/photos/code?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>algorithms</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Leetcode 841. Keys and Rooms [Solution]</title>
      <dc:creator>Shivam Sharma</dc:creator>
      <pubDate>Fri, 19 Mar 2021 13:30:53 +0000</pubDate>
      <link>https://dev.to/shivams136/leetcode-841-keys-and-rooms-solution-6oe</link>
      <guid>https://dev.to/shivams136/leetcode-841-keys-and-rooms-solution-6oe</guid>
      <description>&lt;p&gt;The question is pretty easy, it's all about just clicking the approach.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; Medium&lt;br&gt;
&lt;strong&gt;Jump To:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Problem Statement&lt;/li&gt;
&lt;li&gt;Explanation&lt;/li&gt;
&lt;li&gt;Solution&lt;/li&gt;
&lt;li&gt;Implementation&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Problem Statement &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Question:&lt;/strong&gt; &lt;a href="https://leetcode.com/problems/keys-and-rooms/" rel="noopener noreferrer"&gt;https://leetcode.com/problems/keys-and-rooms/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are  &lt;code&gt;N&lt;/code&gt;  rooms and you start in room  &lt;code&gt;0&lt;/code&gt;. Each room has a distinct number in  &lt;code&gt;0, 1, 2, ..., N-1&lt;/code&gt;, and each room may have some keys to access the next room.&lt;/p&gt;

&lt;p&gt;Formally, each room  &lt;code&gt;i&lt;/code&gt; has a list of keys  &lt;code&gt;rooms[i]&lt;/code&gt;, and each key  &lt;code&gt;rooms[i][j]&lt;/code&gt;  is an integer in  &lt;code&gt;[0, 1, ..., N-1]&lt;/code&gt;  where  &lt;code&gt;N = rooms.length&lt;/code&gt;. A key  &lt;code&gt;rooms[i][j] = v&lt;/code&gt; opens the room with number  &lt;code&gt;v&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Initially, all the rooms start locked (except for room  &lt;code&gt;0&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;You can walk back and forth between rooms freely.&lt;/p&gt;

&lt;p&gt;Return  &lt;code&gt;true&lt;/code&gt; if and only if you can enter every room.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example 1:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Input:&lt;/strong&gt; [[1],[2],[3],[]]&lt;br&gt;
&lt;strong&gt;Output:&lt;/strong&gt; true&lt;br&gt;
&lt;strong&gt;Explanation:&lt;/strong&gt; &lt;br&gt;
We start in room 0, and pick up key 1.&lt;br&gt;
We then go to room 1, and pick up key 2.&lt;br&gt;
We then go to room 2, and pick up key 3.&lt;br&gt;
We then go to room 3.  Since we were able to go to every room, we return true.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Example 2:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Input:&lt;/strong&gt; [[1,3],[3,0,1],[2],[0]]&lt;br&gt;
&lt;strong&gt;Output:&lt;/strong&gt; false&lt;br&gt;
&lt;strong&gt;Explanation:&lt;/strong&gt; We can't enter the room with number 2.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;code&gt;1 &amp;lt;= rooms.length &amp;lt;= 1000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt; &lt;code&gt;0 &amp;lt;= rooms[i].length &amp;lt;= 1000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt; The number of keys in all rooms combined is at most &lt;code&gt;3000&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  Explanation &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;So the problem is simple, We have a room open and we'll find keys of some other rooms then we can visit these rooms and we'll find other keys there. One room can contain no keys as well. We can not visit a room until we have key to it. So we need to find that whether we can visit all rooms or not.&lt;/p&gt;


&lt;h2&gt;
  
  
  Solution &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Doesn't it like look a graph traversal problem??? Where rooms are like node and keys to other rooms present in a room are like edges to other nodes. And we just need to check whether we can traverse all nodes or not. So we can use &lt;strong&gt;Breadth First Search(BFS)&lt;/strong&gt; or &lt;strong&gt;Dreadth First Search(DFS)&lt;/strong&gt;. I am using a stack-based DFS approach.&lt;/p&gt;

&lt;p&gt;A little enhancement is that I don't want to revisit a node which we have already visited, for that we can use a &lt;strong&gt;bitset&lt;/strong&gt; or a boolean array. One more enhancement we can do that, we can prevent collecting keys for the rooms for whom we already have keys. This can be done using another bitset.&lt;/p&gt;

&lt;p&gt;So solution is easy:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Mark &lt;code&gt;Room-0&lt;/code&gt; visitable using bitset &lt;code&gt;keysCollected&lt;/code&gt; and push into stack &lt;code&gt;s&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Now perform below operations until the stack &lt;code&gt;s&lt;/code&gt; becomes empty:

&lt;ol&gt;
&lt;li&gt; Pop room number from stack, &lt;code&gt;t&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If &lt;code&gt;Room-t&lt;/code&gt; is not visited yet then visit and mark it visited using bitset &lt;code&gt;visited&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Pick those keys from here which open a room which is not visitable yet, which can be checked by &lt;code&gt;keysCollected&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;For picked keys, mark associated rooms visitable using &lt;code&gt;keysCollected&lt;/code&gt; and push into stack &lt;code&gt;s&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;If count of visited rooms as per &lt;code&gt;visited&lt;/code&gt; is equal to the count of total rooms &lt;code&gt;rooms.size()&lt;/code&gt; then return &lt;code&gt;true&lt;/code&gt; else &lt;code&gt;false&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  Implementation &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;C++ Code:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Solution&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;canVisitAllRooms&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;rooms&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;bitset&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;visited&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;bitset&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;keysCollected&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;keysCollected&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;visited&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;visited&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rooms&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;rooms&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;keysCollected&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="n"&gt;keysCollected&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                        &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;visited&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;rooms&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Runnable C++ code:&lt;/strong&gt;&lt;/p&gt;


&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@shivams136/Leetcode-841-Keys-and-Rooms?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;



&lt;p&gt;Cover Photo by &lt;a href="https://unsplash.com/@jaye_haych?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Jaye Haych&lt;/a&gt; on &lt;a href="/s/photos/keys?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>algorithms</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Simple markdown tag insertion snippet using shortcut keys [Pure Javascript]</title>
      <dc:creator>Shivam Sharma</dc:creator>
      <pubDate>Fri, 19 Mar 2021 07:54:46 +0000</pubDate>
      <link>https://dev.to/shivams136/simple-markdown-insertion-in-the-text-using-pure-javascript-pl4</link>
      <guid>https://dev.to/shivams136/simple-markdown-insertion-in-the-text-using-pure-javascript-pl4</guid>
      <description>&lt;p&gt;I needed a tiny, light-weight plug to add markdown syntax in my textboxes, I searched online but all of them were very vast so I decided to create my own with the help of many StackOverflow articles. &lt;/p&gt;

&lt;p&gt;It is a very small Pure JS-based scripts to achieve the same, but before that look at some features of this tiny script as below:&lt;/p&gt;

&lt;h3&gt;
  
  
  Features:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Define your own markdown enclosures like &lt;code&gt;++&lt;/code&gt; for underline and &lt;code&gt;__&lt;/code&gt; for &lt;em&gt;italic&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;If any text is selected then it'll be enclosed with the markdown tag.&lt;/li&gt;
&lt;li&gt;If no text is selected, then you have an option to give a default text to be inserted with markdown tags.&lt;/li&gt;
&lt;li&gt;Markdown can be inserted using shortcut keys like &lt;code&gt;ctrl+b&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If any markdown tag is already added around selected text and the same markdown is applied then the markdown tag gets removed.&lt;/li&gt;
&lt;li&gt;Multiple markdowns can be added sequentially like as &lt;code&gt;**++underlined bold text++**&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Different beginning and closing markdown tags can be inserted like as in hyperlinks, the opening tag can be &lt;code&gt;[&lt;/code&gt; and the closing tag can be &lt;code&gt;](example.com)&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Examples:
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;text&lt;/code&gt; means text is selected.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a text to &lt;code&gt;bold&lt;/code&gt; =&amp;gt; a text to &lt;code&gt;**bold**&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;a text to remove &lt;code&gt;**bold**&lt;/code&gt; =&amp;gt; a text to remove &lt;code&gt;bold&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;a text to remove **&lt;code&gt;bold&lt;/code&gt;** =&amp;gt; a text to remove &lt;code&gt;bold&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Shortcut commands used in snippet:
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Markdown&lt;/th&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Bold&lt;/td&gt;
&lt;td&gt;ctrl+b&lt;/td&gt;
&lt;td&gt;**bold text**&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Italic&lt;/td&gt;
&lt;td&gt;ctrl+i&lt;/td&gt;
&lt;td&gt;__italic text__&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Underline&lt;/td&gt;
&lt;td&gt;ctrl+u&lt;/td&gt;
&lt;td&gt;++underlined text++&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Link&lt;/td&gt;
&lt;td&gt;ctrl+l&lt;/td&gt;
&lt;td&gt;[link title](&lt;a href="http://www.example.com" rel="noopener noreferrer"&gt;http://www.example.com&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Code:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;HTML:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!doctype html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Markdown Tag Insertion&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;language=&lt;/span&gt;&lt;span class="s"&gt;"javascript"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text/javascript"&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"script.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;                                                            
    &lt;span class="nt"&gt;&amp;lt;/br&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"title"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"width:250px;height:35px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/br&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/br&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;textarea&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"desc"&lt;/span&gt; &lt;span class="na"&gt;rows=&lt;/span&gt;&lt;span class="s"&gt;"8"&lt;/span&gt; &lt;span class="na"&gt;cols=&lt;/span&gt;&lt;span class="s"&gt;"80"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://stackoverflow.com/a/54364217/8494462"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Stack Overflow Answer Link&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Javascript:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//Code to bind keyevents &lt;/span&gt;
&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;keydown&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ctrlKey&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;shiftKey&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;66&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;73&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;85&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;76&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;indexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;keyCode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;keyCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;keyCode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;focused&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;activeElement&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;focused&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;desc&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;indexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// To apply only on required elemenst&lt;/span&gt;
                        &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;keyCode&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;66&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;//ctrl+B&lt;/span&gt;
                                &lt;span class="nf"&gt;insertFormating&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;focused&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;**&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bold&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;keyCode&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;73&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;//ctrl+I&lt;/span&gt;
                                &lt;span class="nf"&gt;insertFormating&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;focused&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;__&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;italic&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;keyCode&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;85&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;//ctrl+U&lt;/span&gt;
                                &lt;span class="nf"&gt;insertFormating&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;focused&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;++&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;underline&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;keyCode&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;76&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;//ctrl+l&lt;/span&gt;
                                &lt;span class="nf"&gt;insertFormating&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;focused&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;link title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;](http://www.example.com)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                        &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;

&lt;span class="cm"&gt;/**
* @param     {Object}    txtarea       javascript Element Object to the textarea
* @param     {String}    text          markdown enclosing tag text
* @param     {String}    defaultTxt    Default Text to be inserted when no text is selected
* @param     {String}    text2         markdown enclosing tag text for closing if different from opening
*/&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;insertFormating&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;txtarea&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;defaultTxt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;text2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;selectStart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;txtarea&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;selectionStart&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;selectEnd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;txtarea&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;selectionEnd&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;scrollPos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;txtarea&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scrollTop&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;caretPos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;txtarea&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;selectionStart&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;front&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;txtarea&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;caretPos&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;back&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;txtarea&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selectEnd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;txtarea&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;middle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;txtarea&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;caretPos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;selectEnd&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Sets ending tag as opening tag if empty&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;text2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;textLen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;text2Len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;text2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selectStart&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;selectEnd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;middle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;defaultTxt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;front&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;textLen&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;back&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;text2Len&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nx"&gt;text2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;front&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;front&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;front&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;textLen&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nx"&gt;back&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;back&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text2Len&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;back&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nx"&gt;text2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nx"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;middle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;textLen&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;middle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;text2Len&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nx"&gt;text2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;middle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;middle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;textLen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;middle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;text2Len&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nx"&gt;text2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nx"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nx"&gt;txtarea&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;front&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;middle&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;text2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;back&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selectStart&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;selectEnd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;txtarea&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;selectionStart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;selectStart&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;textLen&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nx"&gt;txtarea&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;selectionEnd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;selectEnd&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;textLen&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;txtarea&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;selectionStart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;selectStart&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;textLen&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nx"&gt;txtarea&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;selectionEnd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;selectEnd&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;textLen&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;txtarea&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;selectionStart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;selectStart&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="nx"&gt;txtarea&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;selectionEnd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;selectEnd&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;textLen&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;text2Len&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;txtarea&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;selectionStart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;selectStart&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;textLen&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;txtarea&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;selectionEnd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;txtarea&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;selectionStart&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;middle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nx"&gt;txtarea&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;focus&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;txtarea&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;scrollTop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;scrollPos&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Any suggestion is appreciated.&lt;/p&gt;

&lt;h3&gt;
  
  
  Codepen:
&lt;/h3&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/shivams136/embed/NWbEoMB?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>codenewbie</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Leetcode 535. Encode and Decode TinyURL [Solution and Discussion]</title>
      <dc:creator>Shivam Sharma</dc:creator>
      <pubDate>Mon, 15 Mar 2021 13:19:24 +0000</pubDate>
      <link>https://dev.to/shivams136/leetcode-535-encode-and-decode-tinyurl-solution-and-discussion-22i0</link>
      <guid>https://dev.to/shivams136/leetcode-535-encode-and-decode-tinyurl-solution-and-discussion-22i0</guid>
      <description>&lt;p&gt;The question is very good and real-world related, but the test environment for this question in Leetcode is not up to the mark, As even below code is also accepted and it requires no effort.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Solution&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;longUrl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;longUrl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;shortUrl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;shortUrl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That is happening because Leetcode is creating a new instance for each test case hence there is no need to keep past input/output in the code. Also, there are no constraints on the length of a short URL.&lt;/p&gt;

&lt;p&gt;But we are here to learn, so ignoring such a bad test environment, we'll be creating a real-world solution. The best thing about this question is the &lt;a href="https://leetcode.com/discuss/interview-question/124658/Design-a-URL-Shortener-%28-TinyURL-%29-System/" rel="noopener noreferrer"&gt;provided hyperlink&lt;/a&gt; to the article.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; Medium&lt;br&gt;
&lt;strong&gt;Jump To:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Problem Statement&lt;/li&gt;
&lt;li&gt;Explanation&lt;/li&gt;
&lt;li&gt;Solution&lt;/li&gt;
&lt;li&gt;Implementation&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Problem Statement &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Question:&lt;/strong&gt; &lt;a href="https://leetcode.com/problems/encode-and-decode-tinyurl/" rel="noopener noreferrer"&gt;https://leetcode.com/problems/encode-and-decode-tinyurl/&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: This is a companion problem to the  &lt;a href="https://leetcode.com/discuss/interview-question/system-design/" rel="noopener noreferrer"&gt;System Design&lt;/a&gt;  problem:  &lt;a href="https://leetcode.com/discuss/interview-question/124658/Design-a-URL-Shortener-(-TinyURL-)-System/" rel="noopener noreferrer"&gt;Design TinyURL&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;TinyURL is a URL shortening service where you enter a URL such as  &lt;code&gt;https://leetcode.com/problems/design-tinyurl&lt;/code&gt;  and it returns a short URL such as  &lt;code&gt;http://tinyurl.com/4e9iAk&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Design the  &lt;code&gt;encode&lt;/code&gt;  and  &lt;code&gt;decode&lt;/code&gt;  methods for the TinyURL service. There is no restriction on how your encode/decode algorithm should work. You just need to ensure that a URL can be encoded to a tiny URL and the tiny URL can be decoded to the original URL.&lt;/p&gt;


&lt;h2&gt;
  
  
  Explanation &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;So the problem is simple, you need to create an algorithm, which will convert a &lt;code&gt;long URL&lt;/code&gt; to a &lt;code&gt;short URL&lt;/code&gt; and the &lt;code&gt;long URL&lt;/code&gt; can be achieved back from the &lt;code&gt;short URL&lt;/code&gt;. One thing to take care of is that the &lt;code&gt;short URL&lt;/code&gt; should always map to a single &lt;code&gt;long URL&lt;/code&gt; but vice versa is not mandatory but good to have. &lt;/p&gt;


&lt;h2&gt;
  
  
  Solution &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;There are many solutions possible to this problem, the one we are going to use is mentioned in the attached article with the question, which is "Simple Base conversion". In this method, we have a base and the base for the system is the number of distinct characters available in the system. Simplest example for it is a &lt;code&gt;Decimal System&lt;/code&gt; which has &lt;code&gt;base=10 (0-9)&lt;/code&gt; or a &lt;code&gt;Hexadecimal Number System&lt;/code&gt; which has &lt;code&gt;base=16 (0-9,A-D)&lt;/code&gt;. So first let's see how we &lt;a href="https://en.wikipedia.org/wiki/Hexadecimal#Division-remainder_in_source_base" rel="noopener noreferrer"&gt;convert a decimal number to a hexadecimal number&lt;/a&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Mod a number by Base and use the character present at this mod value.&lt;/li&gt;
&lt;li&gt;Divide the original number by base.&lt;/li&gt;
&lt;li&gt;Repeat the above steps until the number becomes zero.&lt;/li&gt;
&lt;li&gt;Now write the characters found in a reverse manner.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Eg.&lt;/strong&gt; 1732 =&amp;gt; 6C4&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Base&lt;/th&gt;
&lt;th&gt;Number&lt;/th&gt;
&lt;th&gt;Remainder&lt;/th&gt;
&lt;th&gt;Read Direction&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;1732&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;↑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;108&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;↑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;↑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;→&lt;/td&gt;
&lt;td&gt;↑&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Now again look at the problem we have &lt;code&gt;a-z&lt;/code&gt;, &lt;code&gt;A-Z&lt;/code&gt; and &lt;code&gt;0-9&lt;/code&gt; i.e. &lt;strong&gt;62 characters&lt;/strong&gt; available to use in short URL, so we can see it as a &lt;strong&gt;decimal to 62-based system conversion&lt;/strong&gt; problem. So we'll convert a number to a &lt;code&gt;62-based&lt;/code&gt; string and this string will be our &lt;code&gt;short URL Hash&lt;/code&gt;. This hash can be appended to &lt;code&gt;"http://tinyurl.com/"&lt;/code&gt; to form a complete short URL. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Wait a minute??? From where this decimal number came into the picture???&lt;/em&gt; Actually, instead of converting a very long string to a short URL, we'll be converting a decimal number to a short URL and we'll bind this short URL to the long URL. Or to save space we can bind directly the decimal number to the long URL. This number is an increasing counter, which will be increased every time by &lt;code&gt;1&lt;/code&gt; when &lt;code&gt;encode&lt;/code&gt; is called.&lt;/p&gt;

&lt;p&gt;For a limited number of long URLs, the first method is OK, but when we are going to convert billions then the second method is way better. &lt;/p&gt;

&lt;p&gt;For the first method, In the encoding method, we require only &lt;strong&gt;decimal to 62-based conversion&lt;/strong&gt; and a hash map to store pair of &lt;code&gt;&amp;lt;Short URL Hash, Long URL&amp;gt;&lt;/code&gt;. Then in the decoding method, we'll just look up the short URL in this hash map and return the long URL.&lt;/p&gt;

&lt;p&gt;In the Second method, we'll have a hashmap for the pair of &lt;code&gt;&amp;lt;integer, Long URL&amp;gt;&lt;/code&gt; so we require both  &lt;strong&gt;decimal to 62-based conversion&lt;/strong&gt; (for encoding) and  &lt;strong&gt;62-based to decimal conversion&lt;/strong&gt; (for decoding)&lt;/p&gt;


&lt;h2&gt;
  
  
  Implementation &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;C++ Code:&lt;/strong&gt;&lt;br&gt;
For method 1:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Solution&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;unordered_map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;longUrl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;cmap&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"abcdefghijklmnopqrstuvwxyz\
            ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;shortUrl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
            &lt;span class="n"&gt;shortUrl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;62&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
            &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;62&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shortUrl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;shortUrl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;shortUrl&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;longUrl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;shortUrl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;shortUrl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;shortUrl&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;For method 2:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Solution&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;unordered_map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;longUrl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;cmap&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"abcdefghijklmnopqrstuvwxyz\
            ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;shortUrl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
            &lt;span class="n"&gt;shortUrl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;62&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
            &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;62&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shortUrl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;shortUrl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;longUrl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;shortUrl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;shortUrl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// initialize result&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;shortUrl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;'a'&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;shortUrl&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;shortUrl&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="sc"&gt;'z'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;62&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;shortUrl&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="sc"&gt;'a'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;'A'&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;shortUrl&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;shortUrl&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="sc"&gt;'Z'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;62&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;shortUrl&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="sc"&gt;'A'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;'0'&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;shortUrl&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;shortUrl&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="sc"&gt;'9'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;62&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;shortUrl&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="sc"&gt;'0'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;52&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Runnable C++ code:&lt;/strong&gt;&lt;/p&gt;


&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@shivams136/Leetcode-535-Encode-and-Decode-TinyURL?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;



&lt;p&gt;Cover Photo by &lt;a href="https://unsplash.com/@anniespratt?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Annie Spratt&lt;/a&gt; on &lt;a href="https://dev.to/s/photos/tiny-text?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can have a discussion either here or &lt;a href="https://leetcode.com/problems/encode-and-decode-tinyurl/discuss/1110712/The-question-is-good-but-very-bad-testbed-I-am-disappointed" rel="noopener noreferrer"&gt;here&lt;/a&gt; regarding this question.&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>programming</category>
      <category>cpp</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Leetcode 1721. Swapping Nodes in a Linked List [Solution]</title>
      <dc:creator>Shivam Sharma</dc:creator>
      <pubDate>Sun, 14 Mar 2021 13:40:08 +0000</pubDate>
      <link>https://dev.to/shivams136/leetcode-1721-swapping-nodes-in-a-linked-list-solution-m0</link>
      <guid>https://dev.to/shivams136/leetcode-1721-swapping-nodes-in-a-linked-list-solution-m0</guid>
      <description>&lt;p&gt;If we get the idea correctly then this question is just a combination of two general questions, first one is &lt;strong&gt;"Find &lt;code&gt;k-th&lt;/code&gt; node from the end in a linked list"&lt;/strong&gt; and &lt;strong&gt;"Swap two numbers"&lt;/strong&gt;. As instead of swapping the nodes, swapping the data of the nodes is sufficient. If you are going to swap actual nodes then this is going to be a little bit more tricky. But you can try that as well to test yourself. We are going to solve this question using the above logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; Medium&lt;br&gt;
&lt;strong&gt;Jump To:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Problem Statement&lt;/li&gt;
&lt;li&gt;Explanation&lt;/li&gt;
&lt;li&gt;Solution&lt;/li&gt;
&lt;li&gt;Implementation&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Problem Statement &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Question:&lt;/strong&gt; &lt;a href="https://leetcode.com/problems/swapping-nodes-in-a-linked-list/" rel="noopener noreferrer"&gt;https://leetcode.com/problems/swapping-nodes-in-a-linked-list/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You are given the  &lt;code&gt;head&lt;/code&gt;  of a linked list, and an integer  &lt;code&gt;k&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Return  &lt;em&gt;the head of the linked list after  &lt;strong&gt;swapping&lt;/strong&gt;  the values of the&lt;/em&gt; &lt;code&gt;kth&lt;/code&gt;  &lt;em&gt;node from the beginning and the&lt;/em&gt; &lt;code&gt;kth&lt;/code&gt;  &lt;em&gt;node from the end (the list is  &lt;strong&gt;1-indexed&lt;/strong&gt;).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example 1:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgqiic61f3e0jigcrtmfu.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgqiic61f3e0jigcrtmfu.jpg" alt="Linked List Image" width="722" height="202"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Input:&lt;/strong&gt; head = [1,2,3,4,5], k = 2&lt;br&gt;
&lt;strong&gt;Output:&lt;/strong&gt; [1,4,3,2,5]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Example 2:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Input:&lt;/strong&gt; head = [7,9,6,6,7,8,3,0,9,5], k = 5&lt;br&gt;
&lt;strong&gt;Output:&lt;/strong&gt; [7,9,6,6,8,7,3,0,9,5]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Example 3:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Input:&lt;/strong&gt; head = [1], k = 1&lt;br&gt;
&lt;strong&gt;Output:&lt;/strong&gt; [1]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Example 4:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Input:&lt;/strong&gt; head = [1,2], k = 1&lt;br&gt;
&lt;strong&gt;Output:&lt;/strong&gt; [2,1]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Example 5:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Input:&lt;/strong&gt; head = [1,2,3], k = 2&lt;br&gt;
&lt;strong&gt;Output:&lt;/strong&gt; [1,2,3]&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Constraints:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  The number of nodes in the list is  &lt;code&gt;n&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;1 &amp;lt;= k &amp;lt;= n &amp;lt;= 105&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;0 &amp;lt;= Node.val &amp;lt;= 100&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Explanation &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;So the question wants two simple things from us, first one is to find &lt;code&gt;k-th&lt;/code&gt; node from the beginning and &lt;code&gt;k-th&lt;/code&gt; node from the end in a linked list. The second thing to be done is to swap both the nodes. As it's not asked to swap the actual node with its address so we can simply just swap the values of the nodes instead of swapping the nodes.&lt;/p&gt;


&lt;h2&gt;
  
  
  Solution &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;The problem needs to be solved in the below steps:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Point to &lt;code&gt;k-th&lt;/code&gt; node from the beginning.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Point a pointer &lt;code&gt;x&lt;/code&gt; to the head.&lt;/li&gt;
&lt;li&gt;Move the pointer forward in the linked list until we reached &lt;code&gt;k-th&lt;/code&gt; node.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Point to &lt;code&gt;k-th&lt;/code&gt; node from the end.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Point 2 pointers &lt;code&gt;y&lt;/code&gt; and &lt;code&gt;t&lt;/code&gt; to the head.&lt;/li&gt;
&lt;li&gt;Move pointer &lt;code&gt;t&lt;/code&gt; till &lt;code&gt;k-th&lt;/code&gt; node.&lt;/li&gt;
&lt;li&gt;Now move both the pointers &lt;code&gt;y&lt;/code&gt; &amp;amp; &lt;code&gt;t&lt;/code&gt; until &lt;code&gt;t&lt;/code&gt; has reached the last node.&lt;/li&gt;
&lt;li&gt;So when &lt;code&gt;t&lt;/code&gt; has reached the last node, &lt;code&gt;y&lt;/code&gt; must have been reached &lt;code&gt;k-th&lt;/code&gt; node from the end.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Step-3:&lt;/strong&gt; Swap values of both the nodes.&lt;/p&gt;

&lt;p&gt;As we can guess that &lt;code&gt;Point 2&lt;/code&gt; of &lt;code&gt;Step-2&lt;/code&gt; can be done in the same loop of &lt;code&gt;Point 1&lt;/code&gt; of &lt;code&gt;Step-1&lt;/code&gt;. This will save a bit of computation for us.&lt;/p&gt;


&lt;h2&gt;
  
  
  Implementation &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;C++ Code:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Solution&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nl"&gt;public:&lt;/span&gt;
    &lt;span class="n"&gt;ListNode&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;swapNodes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ListNode&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;ListNode&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// Until we reach k-th node from beginning&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
            &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// Until pointer t reach last need &lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
            &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// Swap values at both the nodes&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Time Complexity:&lt;/strong&gt;  &lt;code&gt;O(N)&lt;/code&gt;, where  &lt;code&gt;N&lt;/code&gt;  is the length of  &lt;code&gt;linked list&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Space Complexity:&lt;/strong&gt;  &lt;code&gt;O(1)&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Runnable C++ code:&lt;/strong&gt;&lt;/p&gt;


&lt;div class="ltag__replit"&gt;
  &lt;iframe height="550px" src="https://repl.it/@shivams136/Leetcode-1721-Swapping-Nodes-in-a-Linked-List?lite=true"&gt;&lt;/iframe&gt;
&lt;/div&gt;



</description>
      <category>algorithms</category>
      <category>programming</category>
      <category>cpp</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
