<?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>Forem: Marina Eremina</title>
    <description>The latest articles on Forem by Marina Eremina (@marina_eremina).</description>
    <link>https://forem.com/marina_eremina</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3330234%2F2e968222-9f1e-48e9-8922-e72ea3831543.png</url>
      <title>Forem: Marina Eremina</title>
      <link>https://forem.com/marina_eremina</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/marina_eremina"/>
    <language>en</language>
    <item>
      <title>Tag Trends in Tech Articles: From Beginner Guides to System Design</title>
      <dc:creator>Marina Eremina</dc:creator>
      <pubDate>Wed, 18 Mar 2026 13:22:34 +0000</pubDate>
      <link>https://forem.com/marina_eremina/tag-trends-in-tech-articles-from-beginner-guides-to-system-design-37jk</link>
      <guid>https://forem.com/marina_eremina/tag-trends-in-tech-articles-from-beginner-guides-to-system-design-37jk</guid>
      <description>&lt;p&gt;&lt;em&gt;Insights from 1 million DEV articles (2022–2026).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Tags don’t just label articles — they reveal where &lt;strong&gt;developer attention is shifting&lt;/strong&gt;. They show which topics are gaining momentum, which are fading, and how technologies evolve over time.&lt;/p&gt;

&lt;p&gt;In my previous &lt;a href="https://dev.to/marina_eremina/i-analyzed-1-million-devto-articles-2022-2026-heres-what-the-data-reveals-44gm"&gt;analysis of 1 million DEV articles&lt;/a&gt;, tags already highlighted major trends — from the rise of AI to the return of tutorials.&lt;/p&gt;

&lt;p&gt;In this article, I continue exploring the story that tags tell about &lt;strong&gt;developer interests and core web technologies&lt;/strong&gt;. Do these trends reflect what’s happening in the broader ecosystem? 🙂&lt;/p&gt;




&lt;h2&gt;
  
  
  Developers Are Going Deeper
&lt;/h2&gt;

&lt;p&gt;The first clear pattern: &lt;strong&gt;“serious” topics are steadily growing&lt;/strong&gt;. Performance, automation, security, architecture and system design all show consistent upward trends.&lt;/p&gt;

&lt;p&gt;Here’s how it looks as a share of published articles:&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%2Fw880vgayb09pe4oksci5.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%2Fw880vgayb09pe4oksci5.png" alt=" " width="800" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And expressed as total article count, the trend is confirmed:&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%2Fygs91u24gz0284rhlklc.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%2Fygs91u24gz0284rhlklc.png" alt=" " width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The conversation is moving from “how to code” to “how to build scalable, production-ready systems.”&lt;/p&gt;

&lt;p&gt;It’s not just new technologies — it’s a shift in mindset. Developers are caring less about syntax and more about &lt;strong&gt;structure, scale and reliability&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Beginner Topics Are Shrinking
&lt;/h2&gt;

&lt;p&gt;While advanced topics are growing, beginner-focused content is declining. &lt;code&gt;beginners&lt;/code&gt; tag is steadily decreasing, dropping from roughly &lt;strong&gt;14% to 5%&lt;/strong&gt; of total article share.&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%2Fvl8qc4e0cyrhgqdobglx.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%2Fvl8qc4e0cyrhgqdobglx.png" alt=" " width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This doesn’t necessarily mean there are fewer beginners. Instead, it suggests that the &lt;strong&gt;overall conversation is shifting&lt;/strong&gt;: the focus is no longer just on getting started, but on &lt;strong&gt;building scalable, production-ready systems&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Backend Is Catching Up
&lt;/h2&gt;

&lt;p&gt;Another interesting trend appears when we look at the &lt;strong&gt;main web development domains&lt;/strong&gt; — frontend, backend and fullstack.&lt;/p&gt;

&lt;p&gt;For most of the analyzed period, &lt;strong&gt;frontend content dominated&lt;/strong&gt; on DEV, followed by backend, with fullstack consistently third.&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%2Fh900bpw7y6krwyxitqi1.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%2Fh900bpw7y6krwyxitqi1.png" alt=" " width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, &lt;strong&gt;backend articles showed steady growth&lt;/strong&gt;, and by the end of 2025 backend nearly caught up with frontend in total article count.&lt;/p&gt;

&lt;p&gt;What can be behind this shift? Backend work is deeply &lt;strong&gt;tied to system design, automation and security&lt;/strong&gt; — all reflecting the “serious topics” we saw rising earlier.&lt;/p&gt;

&lt;p&gt;Meanwhile, the frontend ecosystem has matured. With established tools and patterns, there’s less need for exploratory or introductory content than before. Whatever the reason, the data suggests that &lt;strong&gt;backend is having its moment&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Interestingly, &lt;strong&gt;fullstack&lt;/strong&gt; remains consistently lower - despite being common in job titles. Most likely, developers may still &lt;em&gt;work&lt;/em&gt; fullstack, but tend to &lt;em&gt;write about specific layers&lt;/em&gt; (frontend or backend).&lt;/p&gt;

&lt;p&gt;This trend reinforces a broader pattern seen across the dataset: the conversation is shifting from &lt;strong&gt;building interfaces&lt;/strong&gt; to &lt;strong&gt;designing and scaling systems&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Languages That Power Web Development: Stable or Shifting?
&lt;/h2&gt;

&lt;p&gt;If you had to guess which language dominates developer discussions, you’d probably say &lt;strong&gt;JavaScript&lt;/strong&gt;. And you’d be right — JavaScript remains the most-discussed language on DEV, with stable dominance over time.&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%2Fdm9xyknop3sie4itq60m.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%2Fdm9xyknop3sie4itq60m.png" alt=" " width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But here’s something interesting: TypeScript sits at roughly the same level as CSS and HTML — nowhere near JavaScript.&lt;/p&gt;

&lt;p&gt;Why is &lt;strong&gt;TypeScript under-tagged&lt;/strong&gt;? Its adoption in real projects is massive, but on DEV the &lt;code&gt;javascript&lt;/code&gt; tag still carries the conversation. Writers may either skip the &lt;code&gt;typescript&lt;/code&gt; tag or treat it as “JavaScript plus” rather than a separate topic.&lt;/p&gt;

&lt;p&gt;CSS and HTML have a smaller share, but stable — &lt;strong&gt;fundamentals never fade&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Backend technologies&lt;/strong&gt; tell a similar story of winners and steady performers.&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%2Fcxrboj2i0b15dok4mtea.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%2Fcxrboj2i0b15dok4mtea.png" alt=" " width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Python&lt;/strong&gt; stands out, with growth accelerating in 2024-2025, likely driven by AI. Building LLM apps increasingly means writing Python.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Java&lt;/strong&gt; holds steady, not growing fast, not declining. The mid 2025 spike probably reflects Java 21 adoption and its 30th anniversary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Go&lt;/strong&gt; shows slow but consistent growth - steady, reliable, worth watching.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PHP&lt;/strong&gt;, &lt;strong&gt;SQL&lt;/strong&gt;, &lt;strong&gt;Ruby&lt;/strong&gt; remain stable - loved but not dominant. SQL, in particular, is a quiet constant: every developer &lt;em&gt;uses&lt;/em&gt; it, but almost no one &lt;em&gt;writes&lt;/em&gt; about it 🙂&lt;/p&gt;

&lt;p&gt;One particularly interesting moment: &lt;strong&gt;Go overtakes PHP&lt;/strong&gt; around the end of 2025 - a symbolic shift, as a modern systems language surpasses one of the original web pillars.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It’s amazing what stories tags can tell on DEV — revealing trends, focus shifts and how developers are moving &lt;strong&gt;from beginner guides to building scalable, production-ready systems&lt;/strong&gt; 🙂&lt;/p&gt;

&lt;p&gt;Part one: &lt;a href="https://dev.to/marina_eremina/i-analyzed-1-million-devto-articles-2022-2026-heres-what-the-data-reveals-44gm"&gt;I Analyzed 1 Million dev.to Articles (2022–2026): Here’s What the Data Reveals&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dataengineering</category>
      <category>analytics</category>
      <category>webdev</category>
      <category>data</category>
    </item>
    <item>
      <title>I Analyzed 1 Million dev.to Articles (2022–2026): Here’s What the Data Reveals</title>
      <dc:creator>Marina Eremina</dc:creator>
      <pubDate>Mon, 09 Mar 2026 14:03:15 +0000</pubDate>
      <link>https://forem.com/marina_eremina/i-analyzed-1-million-devto-articles-2022-2026-heres-what-the-data-reveals-44gm</link>
      <guid>https://forem.com/marina_eremina/i-analyzed-1-million-devto-articles-2022-2026-heres-what-the-data-reveals-44gm</guid>
      <description>&lt;p&gt;&lt;em&gt;From the rise of AI topics to publishing patterns and writing habits.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;From December 2022 to January 2026, developers published over &lt;strong&gt;one million articles&lt;/strong&gt; on &lt;code&gt;dev.to&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Developer communities often reflect where the industry is heading.&lt;/p&gt;

&lt;p&gt;Some trends you can almost feel intuitively. Tutorials seem less common. AI is everywhere. Some topics fade while others suddenly explode.&lt;/p&gt;

&lt;p&gt;But intuition only goes so far — it’s much better to look at the &lt;strong&gt;data at scale&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So I analyzed &lt;strong&gt;1 million &lt;code&gt;dev.to&lt;/code&gt; articles published between 2022 and 2026&lt;/strong&gt; to understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what developers write about&lt;/li&gt;
&lt;li&gt;when they publish&lt;/li&gt;
&lt;li&gt;how topics evolve over time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some findings confirmed what I expected. Others genuinely surprised me 😊&lt;/p&gt;

&lt;p&gt;Here are some of the most interesting insights from &lt;strong&gt;1,000,000+ articles&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The AI Takeover: 3% → 23% in Three Years
&lt;/h2&gt;

&lt;p&gt;Let's start with the elephant in the room 😊&lt;/p&gt;

&lt;p&gt;I'm sure everyone would bet that AI-related articles have grown. We see it, we feel it intuitively. But what do the &lt;em&gt;actual numbers say&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;Back in &lt;strong&gt;December 2022&lt;/strong&gt;, ChatGPT had just launched. &lt;strong&gt;The &lt;code&gt;ai&lt;/code&gt; tag appeared in roughly 3% of &lt;code&gt;dev.to&lt;/code&gt; articles.&lt;/strong&gt; At the time, it was still a relatively niche topic, mostly discussed by ML engineers and researchers.&lt;/p&gt;

&lt;p&gt;Fast forward to &lt;strong&gt;late 2025 - early 2026&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;18% to 23% of all articles now mention AI in some form.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In other words:&lt;/strong&gt; roughly &lt;strong&gt;one in five &lt;code&gt;dev.to&lt;/code&gt; articles&lt;/strong&gt; now touches AI.&lt;/p&gt;

&lt;p&gt;Here's what that explosion looks like as a &lt;strong&gt;share of total articles&lt;/strong&gt; that has the &lt;code&gt;ai&lt;/code&gt; tag:&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%2F82pn077h2ikzzvsx7jg8.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%2F82pn077h2ikzzvsx7jg8.png" alt=" " width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These aren’t just theoretical discussions anymore. Many posts focus on practical implementation — &lt;strong&gt;building with LLMs, RAG pipelines, AI agents and developer tooling&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This isn't just a tag trend — it's a &lt;strong&gt;fundamental shift&lt;/strong&gt; in what developers are building and learning.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Tag Timeline: &lt;code&gt;ai&lt;/code&gt; Surpasses &lt;code&gt;webdev&lt;/code&gt; and &lt;code&gt;programming&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Here are the &lt;strong&gt;25 most-used tags&lt;/strong&gt; across all three years, ranked by the percentage of articles that include them:&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%2F5jzhpqyz8f1uq2b7i2lb.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%2F5jzhpqyz8f1uq2b7i2lb.png" alt=" " width="466" height="697"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At first glance, this looks exactly as you might expect. &lt;code&gt;webdev&lt;/code&gt; and &lt;code&gt;programming&lt;/code&gt; dominate the platform, with &lt;code&gt;ai&lt;/code&gt; sitting in third place. But averages hide the real story.&lt;/p&gt;

&lt;p&gt;Because the tag rankings weren’t static.&lt;/p&gt;

&lt;p&gt;By &lt;strong&gt;mid 2025&lt;/strong&gt;, the &lt;strong&gt;&lt;code&gt;ai&lt;/code&gt; tag had surpassed&lt;/strong&gt; both &lt;code&gt;webdev&lt;/code&gt; and &lt;code&gt;programming&lt;/code&gt;, climbing from &lt;strong&gt;#3 to #1&lt;/strong&gt;. Here’s what that shift looks like over time:&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%2Fttqtjlw8deaavz1yosau.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%2Fttqtjlw8deaavz1yosau.png" alt=" " width="800" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Another intriguing observation&lt;/strong&gt;: after nearly two years of steady decline, the &lt;code&gt;tutorial&lt;/code&gt; tag turned upward around mid 2025.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The data show that tutorials are making a comeback.&lt;/strong&gt; This is one of the patterns that surprised me most and the one I'm most curious about.&lt;/p&gt;




&lt;h2&gt;
  
  
  Publishing Volume &amp;amp; Engagement Paradox
&lt;/h2&gt;

&lt;p&gt;One of the first patterns visible in the dataset is the consistent growth in publishing activity on the platform.&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%2Ffrhkm78fbekeqbq6y2ao.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%2Ffrhkm78fbekeqbq6y2ao.png" alt=" " width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The trend is clear: article volume has been steadily increasing, reinforcing &lt;code&gt;dev.to&lt;/code&gt;’s role as a major hub for developers sharing knowledge.&lt;/p&gt;

&lt;p&gt;But the data also revealed an interesting puzzle.&lt;/p&gt;

&lt;p&gt;When I compared the number of articles published per month with total reactions and comments, something unexpected appeared. While the &lt;strong&gt;number of articles keeps rising&lt;/strong&gt;, overall &lt;strong&gt;engagement trends slightly downward&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%2F6ac6wtfmmk8qnbxqv663.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%2F6ac6wtfmmk8qnbxqv663.png" alt=" " width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In simple terms: more people are writing. But each individual article is receiving less attention.&lt;/p&gt;

&lt;p&gt;So what’s happening? One likely explanation is &lt;strong&gt;attention saturation&lt;/strong&gt;. The number of articles published each month has grown significantly since 2023, but developer attention is not unlimited.&lt;/p&gt;

&lt;p&gt;In fact, just in January 2026 &lt;code&gt;dev.to&lt;/code&gt; had so many articles published that it would take &lt;strong&gt;38 days of nonstop reading to catch up&lt;/strong&gt;. Who would accept such a challenge? 😅&lt;/p&gt;




&lt;h2&gt;
  
  
  Most Articles Take 1–6 Minutes to Read
&lt;/h2&gt;

&lt;p&gt;Another interesting pattern appears when looking at &lt;strong&gt;estimated reading time&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%2Fi6jwm64vpq2s4uxd55ws.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%2Fi6jwm64vpq2s4uxd55ws.png" alt=" " width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nearly 90% of all articles take 6 minutes or less to read.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Most writers aren't aiming for essays. They're sharing a quick tip, a snippet of code, a thought that fit in one sitting.&lt;/p&gt;

&lt;p&gt;The platform runs on &lt;strong&gt;short-form energy&lt;/strong&gt;. Which makes sense - it's how most of us consume content these days anyway.&lt;/p&gt;




&lt;h2&gt;
  
  
  When Developers Publish: Is Tuesday–Wednesday Really the Peak?
&lt;/h2&gt;

&lt;p&gt;You’ve probably heard it many times — Tuesday and Wednesday are the busiest days for publishing on developer platforms. I wondered would the data confirm this pattern?&lt;/p&gt;

&lt;p&gt;It turned out, the &lt;strong&gt;differences between Monday through Friday are actually minimal&lt;/strong&gt; — only about 2% separates the highest and lowest weekday.&lt;/p&gt;

&lt;p&gt;Weekends, however, show a clear dip, with &lt;strong&gt;Saturday and Sunday about 5% lower than weekdays&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%2Fe5jca2ec8kuc1zmc4scg.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%2Fe5jca2ec8kuc1zmc4scg.png" alt=" " width="800" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I used to wonder if Tuesday was secretly the best day to publish. Now I'm thinking: just publish when you're ready. The day matters less than the content 🙂&lt;/p&gt;




&lt;h2&gt;
  
  
  Behind the Numbers: How the Data Was Collected and Processed
&lt;/h2&gt;

&lt;p&gt;All of these insights come from a &lt;strong&gt;data pipeline built on Azure&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Extract&lt;/strong&gt;: Python scraper running in Azure Functions pulled data from the &lt;strong&gt;&lt;code&gt;dev.to&lt;/code&gt; REST API&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Load&lt;/strong&gt;: Raw JSON landed in &lt;strong&gt;Azure Blob Storage&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transform&lt;/strong&gt;: &lt;strong&gt;Databricks&lt;/strong&gt; with &lt;strong&gt;PySpark&lt;/strong&gt; cleaned, deduplicated and shaped the data (Bronze → Silver → Gold layers)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analyze&lt;/strong&gt;: Gold tables fed into &lt;strong&gt;Power BI&lt;/strong&gt; for visualization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All orchestrated with &lt;strong&gt;Azure Data Factory&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Source&lt;/strong&gt;: Forem REST API&lt;br&gt;
&lt;strong&gt;Total articles&lt;/strong&gt;: 1,000,000&lt;br&gt;
&lt;strong&gt;Time span&lt;/strong&gt;: 3 years&lt;br&gt;
&lt;strong&gt;Cloud cost&lt;/strong&gt;: Surprisingly reasonable (Databricks was the biggest line item)&lt;/p&gt;




&lt;p&gt;Big thanks to the &lt;strong&gt;dev.to team&lt;/strong&gt; for creating such a welcoming space where developers can &lt;strong&gt;share, learn and grow&lt;/strong&gt; — and to &lt;strong&gt;everyone who writes here&lt;/strong&gt;: you make this community vibrant and inspiring. It’s amazing to see how the platform brings people together and sparks creativity across the community ❤️ &lt;/p&gt;

</description>
      <category>dataengineering</category>
      <category>analytics</category>
      <category>ai</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Exploring Coffee Quality Data with GitHub Copilot CLI</title>
      <dc:creator>Marina Eremina</dc:creator>
      <pubDate>Sun, 15 Feb 2026 22:31:07 +0000</pubDate>
      <link>https://forem.com/marina_eremina/exploring-coffee-quality-data-with-github-copilot-cli-192l</link>
      <guid>https://forem.com/marina_eremina/exploring-coffee-quality-data-with-github-copilot-cli-192l</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-01-21"&gt;GitHub Copilot CLI Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I built a small Python project that analyzes coffee data from the &lt;strong&gt;Coffee Quality Institute&lt;/strong&gt; (CQI) dataset. The CQI dataset contains detailed scoring for coffee samples from different countries of origin, based on attributes like aroma, flavor, acidity, sweetness, and more.&lt;/p&gt;

&lt;p&gt;I wanted to answer simple but fun questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which countries produce the highest-rated coffee?&lt;/li&gt;
&lt;li&gt;Does country of origin affect sweetness or acidity?&lt;/li&gt;
&lt;li&gt;What actually separates a top-scoring coffee from an average one?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s basically a data-driven way to understand what makes great coffee great. And maybe where to find it 🙂&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Here’s what the data revealed:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dataset Overview&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%2F3z75euoehv3ywr1c7tto.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%2F3z75euoehv3ywr1c7tto.png" alt=" " width="463" height="198"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Top 5 Countries by Total Coffee Score&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;highest-ranked countries&lt;/strong&gt; based on the &lt;strong&gt;combined scores of all coffee attributes&lt;/strong&gt;, showing which origins consistently produce exceptional coffee.&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%2Fr7brulus86spwv0b5g3o.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%2Fr7brulus86spwv0b5g3o.png" alt=" " width="800" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Coffee Profile Comparison by Total Score&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Radar chart showing the highest, mid-range, and lowest scoring coffees.&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%2Fp8rzazxoyxh0jmkjw91n.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%2Fp8rzazxoyxh0jmkjw91n.png" alt=" " width="800" height="649"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sweetness by Country&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A quick comparison highlighting which countries produce the sweetest and least sweet coffees.&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%2Fbtmwyjcusxihzd5xzpgz.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%2Fbtmwyjcusxihzd5xzpgz.png" alt=" " width="714" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check out the full analysis &lt;a href="https://github.com/eremina-official/cqi-data-analysis" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My Experience with GitHub Copilot CLI
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot CLI genuinely changed how I approached this project. Basically, Copilot was helping with every step: &lt;strong&gt;project setup, building, debugging and refactoring&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project Setup in Seconds&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With a single prompt, Copilot scaffolded the entire project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create a Python project for data analysis with pandas. 
1. Create project directory called 'data-analysis'. 
2. Set up a Python virtual environment inside it. 
3. Install pandas, flake8 and black in the virtual environment. 
4. Configure flake8 and black for code quality.
5. Create README.md. 
6. Add a .gitignore file.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Fast Data Exploration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With a simple prompt, I could quickly test hypotheses or look for correlations, for example:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;"Analyse correlation between origin country and coffee sweetness. Use python, pandas, matplotlib to visualise the data."&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Copilot generated:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A clean script&lt;/li&gt;
&lt;li&gt;Statistical calculations&lt;/li&gt;
&lt;li&gt;A ready-to-run visualization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Time saved: ~30-45 minutes of writing boilerplate, debugging and tweaking plots. I just reviewed the output and refined the logic. Huge time saver.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Made It Different&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Unlike other AI coding tools I've tried, Copilot CLI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Remembers context&lt;/strong&gt; across commands in the same session (like excluding countries with too few samples)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Understands project structure&lt;/strong&gt; in the same session (it knew where to put scripts, how to organize outputs, etc.)&lt;/li&gt;
&lt;li&gt;Suggests &lt;strong&gt;meaningful commit messages&lt;/strong&gt; after changes and runs them when needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For data analysis projects where you're constantly exploring patterns and experimenting with different visualizations, this workflow is excellent 😊&lt;/p&gt;

&lt;p&gt;After seeing these coffee scores, I’m really curious — which country’s coffee is your favorite? ☕&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>cli</category>
      <category>githubcopilot</category>
    </item>
    <item>
      <title>How to Import SVG Files in a Next.js Project (2025)</title>
      <dc:creator>Marina Eremina</dc:creator>
      <pubDate>Tue, 16 Dec 2025 15:33:22 +0000</pubDate>
      <link>https://forem.com/marina_eremina/how-to-import-svg-files-in-a-nextjs-project-2025-3m80</link>
      <guid>https://forem.com/marina_eremina/how-to-import-svg-files-in-a-nextjs-project-2025-3m80</guid>
      <description>&lt;p&gt;Working with SVGs in Next.js has multiple approaches depending on your use case. Let’s go through the most common and recommended methods.&lt;/p&gt;

&lt;h3&gt;
  
  
  1️⃣ Inline SVG
&lt;/h3&gt;

&lt;p&gt;Use case: good for small SVGs that are not reused anywhere in your app.&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="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;InlineSvgExample&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;flex items-center gap-1 px-2 py-1 bg-gray-100 rounded&lt;/span&gt;&lt;span class="dl"&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="cm"&gt;/* Inline SVG icon */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;svg&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;w-3 h-3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;currentColor&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;viewBox&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0 0 16 16&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;M8 0a8 8 0 1 0 8 8A8 8 0 0 0 8 0zm0 15A7 7 0 1 1 15 8 7 7 0 0 1 8 15z&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/svg&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="nx"&gt;Add&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&gt;&amp;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;Pros:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No extra configuration needed.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Poor maintainability if reused in multiple places.&lt;/li&gt;
&lt;li&gt;Harder to manage styles dynamically.

&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2️⃣ Place SVG in the &lt;code&gt;/public&lt;/code&gt; Folder and Display with &lt;code&gt;Image&lt;/code&gt; Component
&lt;/h3&gt;

&lt;p&gt;Best choice when: you &lt;em&gt;don’t&lt;/em&gt; need to set svg style except for width and height.&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;Image&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;next/image&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Image&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/github.svg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&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="nx"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&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="nx"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Github&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Simple and straightforward.&lt;/li&gt;
&lt;li&gt;Leverages Next.js built-in &lt;code&gt;Image&lt;/code&gt; optimization.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Limited styling options.&lt;/li&gt;
&lt;li&gt;Cannot dynamically change colors or other attributes via React props.

&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3️⃣ Import SVG as a React Component
&lt;/h3&gt;

&lt;p&gt;Best choice when: you want to &lt;strong&gt;style the SVG with CSS or Tailwind&lt;/strong&gt;, or to &lt;strong&gt;change colors&lt;/strong&gt; dynamically.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; Place your SVG file in &lt;code&gt;/src/assets&lt;/code&gt; or &lt;code&gt;/assets&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; Install &lt;code&gt;@svgr/webpack&lt;/code&gt; if you haven’t already:&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;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;D&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;svgr&lt;/span&gt;&lt;span class="sr"&gt;/webpac&lt;/span&gt;&lt;span class="err"&gt;k
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt; Adjust &lt;code&gt;next.config.ts&lt;/code&gt; to configure loader:&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;import&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NextConfig&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="s2"&gt;next&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;nextConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;reactCompiler&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="na"&gt;turbopack&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;*.svg&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;loaders&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;@svgr/webpack&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="na"&gt;as&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="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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For more loader configurations, check: &lt;a href="https://nextjs.org/docs/app/api-reference/config/next-config-js/turbopack#configuring-webpack-loaders" rel="noopener noreferrer"&gt;Configuring webpack loaders&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Then import svg as a React Component:&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;GithubIcon&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@/assets/icons/GithubIcon.svg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;GithubIcon&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;w-6 h-6 text-gray-500&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Full styling control with Tailwind or CSS.&lt;/li&gt;
&lt;li&gt;Dynamic props for size, colors, className, etc.&lt;/li&gt;
&lt;li&gt;Perfect for reusable icons/components.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Slightly more setup.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ Conclusion:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use inline SVG for one-off small icons.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;/public&lt;/code&gt; + &lt;code&gt;Image&lt;/code&gt; for static SVGs with no dynamic styling.&lt;/li&gt;
&lt;li&gt;Use SVG as React component for reusable, styled, and dynamic icons.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>nextjs</category>
      <category>svg</category>
      <category>assets</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Install Cursor on Ubuntu (2025)</title>
      <dc:creator>Marina Eremina</dc:creator>
      <pubDate>Tue, 23 Sep 2025 14:51:31 +0000</pubDate>
      <link>https://forem.com/marina_eremina/how-to-install-cursor-on-ubuntu-2025-4a0a</link>
      <guid>https://forem.com/marina_eremina/how-to-install-cursor-on-ubuntu-2025-4a0a</guid>
      <description>&lt;p&gt;&lt;strong&gt;Cursor&lt;/strong&gt; is an AI-powered editor that makes coding easier and faster. Installing it on Ubuntu is as simple as downloading a &lt;code&gt;.deb&lt;/code&gt; file and running one command.&lt;/p&gt;

&lt;p&gt;1. Go to official &lt;a href="https://cursor.com/download" rel="noopener noreferrer"&gt;cursor download page&lt;/a&gt;. Download the latest &lt;code&gt;.deb&lt;/code&gt; file (recommended for Ubuntu/Debian).&lt;/p&gt;

&lt;p&gt;2. Open a terminal and navigate into the directory where you saved the &lt;code&gt;.deb&lt;/code&gt; (e.g. &lt;code&gt;Downloads&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd Downloads
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3. Install Cursor.&lt;br&gt;
Change &lt;code&gt;cursor.deb&lt;/code&gt; to the actual filename, for example &lt;code&gt;cursor_1.6.35_amd64.deb&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install ./cursor.deb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After installation you should see Cursor in your app launcher 🎉.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;APT Repository Added Automatically (and How to Verify &amp;amp; Update)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you install Cursor on Ubuntu from the official &lt;code&gt;.deb&lt;/code&gt; file, installer actually adds the official Cursor &lt;strong&gt;APT repository&lt;/strong&gt; in the background. This allows apt to see Cursor updates just like any other package on ubuntu.&lt;/p&gt;

&lt;p&gt;1. How to check if the repo was added&lt;/p&gt;

&lt;p&gt;After installing Cursor, you can quickly check if the APT repository is registered:&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 update | &lt;span class="nb"&gt;grep &lt;/span&gt;cursor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the repository was added, you’ll see a line like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Hit:10 https://downloads.cursor.com/aptrepo stable InRelease
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This confirms that apt recognizes Cursor repo and can fetch updates from it.&lt;/p&gt;

&lt;p&gt;2. Updating Cursor&lt;/p&gt;

&lt;p&gt;Once the repository is active, updating Cursor is easy:&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 update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--only-upgrade&lt;/span&gt; cursor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first command refreshes your package list.&lt;br&gt;
The second upgrades Cursor if a newer version is available.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>ubuntu</category>
      <category>coding</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Import SVG Files to React + Vite Project (2025)</title>
      <dc:creator>Marina Eremina</dc:creator>
      <pubDate>Wed, 20 Aug 2025 12:27:37 +0000</pubDate>
      <link>https://forem.com/marina_eremina/how-to-import-svg-files-to-react-vite-project-2025-59mo</link>
      <guid>https://forem.com/marina_eremina/how-to-import-svg-files-to-react-vite-project-2025-59mo</guid>
      <description>&lt;p&gt;When working with React projects in Vite, you may want to import SVGs as React components instead of plain image URLs. The easiest way to achieve this is by using the &lt;code&gt;vite-plugin-svgr&lt;/code&gt; &lt;a href="https://www.npmjs.com/package/vite-plugin-svgr" rel="noopener noreferrer"&gt;plugin&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Install the plugin
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// npm&lt;/span&gt;
&lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;save&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;dev&lt;/span&gt; &lt;span class="nx"&gt;vite&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;plugin&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;svgr&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Add the plugin to your Vite config (&lt;code&gt;vite.config.ts&lt;/code&gt;)
&lt;/h3&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineConfig&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;vite&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;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;@vitejs/plugin-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="nx"&gt;svgrPlugin&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;vite-plugin-svgr&lt;/span&gt;&lt;span class="dl"&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="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&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="nf"&gt;react&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="nf"&gt;svgrPlugin&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;
  
  
  3. Import SVG files as React components
&lt;/h3&gt;

&lt;p&gt;Add &lt;code&gt;?react&lt;/code&gt; to the end of your SVG import path:&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;LogoSvg&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;./assets/logo.svg?react&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;Button&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FC&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="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;LogoSvg&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="nx"&gt;Click&lt;/span&gt; &lt;span class="nx"&gt;Me&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/button&lt;/span&gt;&lt;span class="err"&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="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now LogoSvg behaves like a regular React component.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Adjust for TypeScript
&lt;/h3&gt;

&lt;p&gt;If you are using TypeScript, the line with svg import might show an error like:&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;Cannot&lt;/span&gt; &lt;span class="nx"&gt;find&lt;/span&gt; &lt;span class="nx"&gt;module&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./assets/logo.svg?react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="nx"&gt;or&lt;/span&gt; &lt;span class="nx"&gt;its&lt;/span&gt; &lt;span class="nx"&gt;corresponding&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;declarations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2307&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To fix this error, in the &lt;code&gt;vite-env.d.ts&lt;/code&gt; file add the following line &lt;code&gt;/// &amp;lt;reference types="vite-plugin-svgr/client" /&amp;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="c1"&gt;/// &amp;lt;reference types="vite/client" /&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;/// &amp;lt;reference types="vite-plugin-svgr/client" /&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures TypeScript recognizes &lt;code&gt;.svg?react&lt;/code&gt; imports correctly.&lt;/p&gt;

&lt;h3&gt;
  
  
  SVG as Component vs. SVG as Image URL
&lt;/h3&gt;

&lt;p&gt;Key Advantages of Importing SVGs as React Components vs. file URL import:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;SVGs are part of the DOM, so you can style them with CSS or Tailwind.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can pass props dinamicaly, like className, width, or fill to customize them.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No extra HTTP requests, since the SVG is inlined.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>react</category>
      <category>vite</category>
      <category>svg</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Add a Map with a Location to a Webpage Using OpenLayers and React</title>
      <dc:creator>Marina Eremina</dc:creator>
      <pubDate>Mon, 14 Jul 2025 05:35:28 +0000</pubDate>
      <link>https://forem.com/marina_eremina/how-to-add-a-map-with-a-location-to-a-webpage-using-openlayers-and-react-gnc</link>
      <guid>https://forem.com/marina_eremina/how-to-add-a-map-with-a-location-to-a-webpage-using-openlayers-and-react-gnc</guid>
      <description>&lt;p&gt;In this article we explore how to add a simple map with a location marker to a webpage using &lt;strong&gt;free and open-source tools&lt;/strong&gt;. No API key will be required for this map.&lt;/p&gt;

&lt;p&gt;We'll be using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;OpenLayers&lt;/strong&gt; - a JavaScript library that helps you display maps and add features like markers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;OpenStreetMap (OSM)&lt;/strong&gt; - an open source project providing free maps.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Together, OpenLayers and OpenStreetMap offer a fully open-source &lt;strong&gt;alternative&lt;/strong&gt; to commercial mapping platforms like Google Maps.&lt;/p&gt;

&lt;p&gt;✅ This example is built with React, but the approach can be easily adapted to work with other frontend frameworks such as Vue, Angular, or plain JavaScript.&lt;/p&gt;

&lt;p&gt;Here is a link to a &lt;a href="https://eremina-official.github.io/ol-react-map/" rel="noopener noreferrer"&gt;demo&lt;/a&gt; that shows how the working map appears on a webpage.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Create a New React Project (or Use an Existing One)
&lt;/h3&gt;

&lt;p&gt;If you’d like to try adding the map to a webpage, the easiest way to get started is by using a Vite template:&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;npm&lt;/span&gt; &lt;span class="nx"&gt;create&lt;/span&gt; &lt;span class="nx"&gt;vite&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;latest&lt;/span&gt; &lt;span class="nx"&gt;ol&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;react&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;template&lt;/span&gt; &lt;span class="nx"&gt;react&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alternatively, you can simply install the &lt;code&gt;ol&lt;/code&gt; (OpenLayers) library in your existing React project and build from there.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Install OpenLayers
&lt;/h3&gt;

&lt;p&gt;OpenLayers can be installed using npm:&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;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="nx"&gt;ol&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you prefer not to include the &lt;code&gt;ol&lt;/code&gt; package in your bundle, you can load it via CDN in the &lt;code&gt;index.html&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://cdn.jsdelivr.net/npm/ol@v10.6.0/dist/ol.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, bundling it with your project is generally preferred for better control and performance.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Create the Map Component
&lt;/h3&gt;

&lt;p&gt;Now we can initialize our map. In the &lt;code&gt;src/Map.tsx&lt;/code&gt; we import a Map component from &lt;code&gt;ol&lt;/code&gt; library and use it to create the map instance. The Map requires a few important parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;target&lt;/code&gt; - tells OpenLayers where to place the map. It should be the &lt;code&gt;id&lt;/code&gt; or &lt;code&gt;ref&lt;/code&gt; to an HTML element that will act as the map container.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;view&lt;/code&gt; - sets the initial position of the map: where it’s centered and zoomed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;layers&lt;/code&gt; - the content that will be shown on the map. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We’ll use two layers: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;OSMLayer&lt;/code&gt; - a basic map layer using OpenStreetMap tiles (which gives us a detailed world map).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;vectorLayer&lt;/code&gt; - a layer that will display a marker for a specific location.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this example let's center our map on London. To do that, we’ll need London’s coordinates as longitude and latitude which we can easily find online.&lt;/p&gt;

&lt;p&gt;Let’s take a closer look at our &lt;code&gt;vectorLayer&lt;/code&gt; to understand how it is created. We add this layer using the &lt;code&gt;VectorLayer&lt;/code&gt; from &lt;code&gt;ol&lt;/code&gt; library. This layer needs a &lt;strong&gt;source&lt;/strong&gt;, which we provide using &lt;code&gt;VectorSource&lt;/code&gt;. The source contains our &lt;strong&gt;London location&lt;/strong&gt;, represented as a Point feature.&lt;/p&gt;

&lt;p&gt;We also define a &lt;strong&gt;style&lt;/strong&gt; for this layer using the &lt;code&gt;Style&lt;/code&gt;. Here, we can pass an SVG icon, which we use as a marker for our London location on the map.&lt;/p&gt;

&lt;p&gt;Lastly, our London coordinates are passed as the &lt;code&gt;center&lt;/code&gt; in the &lt;code&gt;view&lt;/code&gt; parameter of the Map, so the map is centered on London when it loads.&lt;/p&gt;

&lt;p&gt;Here is how the whole set up looks like:&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;// src/Map.tsx&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useEffect&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="nb"&gt;Map&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="nx"&gt;Feature&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;ol&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;Zoom&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;ol/control&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;TileLayer&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;ol/layer/Tile.js&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;OSM&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;ol/source/OSM.js&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;VectorLayer&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;ol/layer/Vector.js&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;VectorSource&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;ol/source/Vector.js&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;Point&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;ol/geom&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;fromLonLat&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;ol/proj.js&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;Style&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Icon&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;ol/style.js&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;reactSvg&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;./assets/pin.svg?url&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 the SVG as a URL&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Coordinate&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;ol/coordinate&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;MAP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;map&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Longitude, Latitude for London&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;coordinatesLondon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;number&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="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.118092&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;51.509865&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="c1"&gt;// Convert lon/lat coordinate to OpenLayers default coordinate system&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;coordinates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Coordinate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fromLonLat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;coordinatesLondon&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;feature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Feature&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Point&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&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;Feature&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;geometry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Point&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;coordinates&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Layer for the location pin icon&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;vectorLayer&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;VectorLayer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;VectorSource&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;features&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;feature&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Style&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Icon&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;reactSvg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;anchor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&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="p"&gt;}),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// The basic map layer with OpenStreetMap&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;OSMLayer&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;TileLayer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OSM&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;MapElement&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FC&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="nf"&gt;useEffect&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="c1"&gt;// Initialize the map when the component mounts&lt;/span&gt;
    &lt;span class="c1"&gt;// to make sure the element with id 'map' is in the DOM&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;map&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;Map&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;MAP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// id of the map container&lt;/span&gt;
      &lt;span class="na"&gt;view&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;center&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;coordinates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;zoom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;}),&lt;/span&gt;
      &lt;span class="c1"&gt;// layers order matters for the vectorLayer to be on top&lt;/span&gt;
      &lt;span class="na"&gt;layers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;OSMLayer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;vectorLayer&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;controls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Zoom&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Cleanup the map when the component unmounts&lt;/span&gt;
      &lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setTarget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;undefined&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="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mapContainer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;MAP&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&amp;gt; {/&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;Map&lt;/span&gt; &lt;span class="nx"&gt;container&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;}
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;attribution&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="err"&gt;©&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://www.openstreetmap.org/copyright&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nx"&gt;OpenStreetMap&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/a&amp;gt; contributor&lt;/span&gt;&lt;span class="err"&gt;s
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;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;Those are the key parts of the setup, now let’s take a quick look at map controls and attribution.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Custom Controls Styling
&lt;/h3&gt;

&lt;p&gt;In OpenLayers, &lt;strong&gt;controls&lt;/strong&gt; are UI elements that allow users to interact with the map, for example, &lt;strong&gt;zoom buttons&lt;/strong&gt; or a fullscreen toggle. Controls are built-in and can be added or removed depending on what your map needs.&lt;/p&gt;

&lt;p&gt;Controls are added to the map using the &lt;code&gt;controls&lt;/code&gt; parameter when creating a new &lt;code&gt;Map&lt;/code&gt; instance. In this example, we include only the default &lt;code&gt;Zoom&lt;/code&gt; control and apply a custom style to it.&lt;/p&gt;

&lt;p&gt;The zoom control uses the CSS class name &lt;code&gt;ol-zoom&lt;/code&gt;, which we can target to customize its appearance.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.ol-zoom {
  position: absolute;
  bottom: 35px;
  right: 10px;
  display: flex;
  flex-direction: column;
  gap: 5px;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The zoom buttons are typically placed in the bottom-right corner of the map.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Attribution for the OSM Layer
&lt;/h3&gt;

&lt;p&gt;The OSM layer is open source, but it &lt;strong&gt;requires attribution&lt;/strong&gt; to OpenStreetMap contributors. The attribution text &lt;code&gt;© OpenStreetMap contributors&lt;/code&gt; is usually included as a absolutely positioned element in the bottom-right corner of the map.&lt;/p&gt;

&lt;p&gt;✅ Also, it is important to set a &lt;strong&gt;width&lt;/strong&gt; on the map container, otherwise the map won’t be visible on the page.&lt;/p&gt;

&lt;p&gt;Now simply include your Map component in the page layout.&lt;br&gt;
And that’s it! 🎉&lt;/p&gt;

&lt;p&gt;You can find the full setup in the GitHub repo:&lt;br&gt;
👉 &lt;a href="https://github.com/eremina-official/ol-react-map" rel="noopener noreferrer"&gt;Check out the complete code on GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>map</category>
      <category>openlayers</category>
    </item>
    <item>
      <title>How to Set Up ESLint and Prettier for React app in VSCode (2025)</title>
      <dc:creator>Marina Eremina</dc:creator>
      <pubDate>Tue, 08 Jul 2025 06:03:51 +0000</pubDate>
      <link>https://forem.com/marina_eremina/how-to-set-up-eslint-and-prettier-for-react-app-in-vscode-2025-2341</link>
      <guid>https://forem.com/marina_eremina/how-to-set-up-eslint-and-prettier-for-react-app-in-vscode-2025-2341</guid>
      <description>&lt;p&gt;This tutorial shows how to configure &lt;strong&gt;ESLint&lt;/strong&gt; and &lt;strong&gt;Prettier&lt;/strong&gt; in a &lt;strong&gt;React + TypeScript project&lt;/strong&gt; using &lt;strong&gt;Vite&lt;/strong&gt; and &lt;strong&gt;VSCode&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;ESLint&lt;/em&gt; helps to catch bugs and enforce consistent code quality.&lt;br&gt;
&lt;em&gt;Prettier&lt;/em&gt; ensures consistent code formatting by automatically applying style rules.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Install ESLint and Prettier extensions in VSCode
&lt;/h3&gt;

&lt;p&gt;✅ Ensure both extensions are enabled after installation.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Create a New React + TypeScript Project with Vite
&lt;/h3&gt;

&lt;p&gt;Use Vite’s &lt;code&gt;react-ts&lt;/code&gt; template to start a new project:&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;npm&lt;/span&gt; &lt;span class="nx"&gt;create&lt;/span&gt; &lt;span class="nx"&gt;vite&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;latest&lt;/span&gt; &lt;span class="nx"&gt;react&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;lint&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;setup&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;template&lt;/span&gt; &lt;span class="nx"&gt;react&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;
&lt;span class="nx"&gt;cd&lt;/span&gt; &lt;span class="nx"&gt;react&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;lint&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;setup&lt;/span&gt;
&lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;react-ts&lt;/code&gt; Vite template includes ESLint pre-installed and pre-configured by default. You’ll see an &lt;code&gt;eslint.config.js&lt;/code&gt; file in the project root directory with a minimal setup.&lt;/p&gt;

&lt;p&gt;You can open &lt;code&gt;src/App.tsx&lt;/code&gt; file and make a small change to test ESLint, for example, declare a new variable &lt;code&gt;let testVariable = 'test'&lt;/code&gt;. Now if you run &lt;code&gt;npm run lint&lt;/code&gt; in the console, there should be an error like this:&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="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;  &lt;span class="nx"&gt;error&lt;/span&gt;  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;testVariable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="nx"&gt;is&lt;/span&gt; &lt;span class="nx"&gt;never&lt;/span&gt; &lt;span class="nx"&gt;reassigned&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;Use&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;const&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="nx"&gt;instead&lt;/span&gt;  &lt;span class="nx"&gt;prefer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;
&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;  &lt;span class="nx"&gt;error&lt;/span&gt;  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;testVariable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="nx"&gt;is&lt;/span&gt; &lt;span class="nx"&gt;assigned&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="nx"&gt;but&lt;/span&gt; &lt;span class="nx"&gt;never&lt;/span&gt; &lt;span class="nx"&gt;used&lt;/span&gt;        &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;typescript&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;eslint&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;no&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;unused&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;vars&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;VSCode should also highlight the error automatically if the ESLint extension is working correctly.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Install Prettier and configure it to work with ESLint
&lt;/h3&gt;

&lt;p&gt;Next, we’ll integrate Prettier into the ESLint workflow to handle code formatting. This will ensure that there are no conflicts between ESLint and Prettier rules.&lt;/p&gt;

&lt;p&gt;Run the following commands in the project directory:&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;// Install Prettier&lt;/span&gt;
&lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;save&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;dev&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;save&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;exact&lt;/span&gt; &lt;span class="nx"&gt;prettier&lt;/span&gt;

&lt;span class="c1"&gt;// Install plugins to run Prettier inside ESLint&lt;/span&gt;
&lt;span class="nx"&gt;npm&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;save&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;dev&lt;/span&gt; &lt;span class="nx"&gt;eslint&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;plugin&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;prettier&lt;/span&gt; &lt;span class="nx"&gt;eslint&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;prettier&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Update &lt;code&gt;eslint.config.js&lt;/code&gt; file:&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;js&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;@eslint/js&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;globals&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;globals&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;reactHooks&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;eslint-plugin-react-hooks&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;reactRefresh&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;eslint-plugin-react-refresh&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;tseslint&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;typescript-eslint&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// add Prettier support&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;prettierConfig&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;eslint-plugin-prettier/recommended&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;globalIgnores&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;eslint/config&lt;/span&gt;&lt;span class="dl"&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;tseslint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="nf"&gt;globalIgnores&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="na"&gt;files&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;**/*.{ts,tsx}&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;extends&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;recommended&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;tseslint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;recommended&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;reactHooks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;recommended-latest&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="nx"&gt;reactRefresh&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vite&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;prettierConfig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// extend ESLint with Prettier config&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;languageOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;ecmaVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2020&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;browser&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="c1"&gt;// add Prettier rules&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;prettier/prettier&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;error&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;singleQuote&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="na"&gt;printWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;tabWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;semi&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="na"&gt;trailingComma&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;es5&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;bracketSpacing&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="na"&gt;endOfLine&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;lf&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now if you run &lt;code&gt;npm run lint&lt;/code&gt; in the console, the output should include Prettier and ESLint errors.&lt;/p&gt;

&lt;p&gt;✅ Tip: In case the editor still does not highlight the errors, first try to close and open again the VSCode.&lt;/p&gt;

&lt;p&gt;✅ Here is the &lt;a href="https://github.com/eremina-official/react-lint-setup" rel="noopener noreferrer"&gt;link&lt;/a&gt; to the project with the working setup.&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>vite</category>
      <category>prettier</category>
      <category>react</category>
    </item>
  </channel>
</rss>
