<?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: Petro Borshchahivskyi</title>
    <description>The latest articles on DEV Community by Petro Borshchahivskyi (@liksu).</description>
    <link>https://dev.to/liksu</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%2F946692%2F836c27a9-7fec-478b-9dcf-15cd0cc74ad7.png</url>
      <title>DEV Community: Petro Borshchahivskyi</title>
      <link>https://dev.to/liksu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/liksu"/>
    <language>en</language>
    <item>
      <title>Too slow without shooting yourself in the foot</title>
      <dc:creator>Petro Borshchahivskyi</dc:creator>
      <pubDate>Wed, 26 Jun 2024 09:22:30 +0000</pubDate>
      <link>https://dev.to/liksu/too-slow-without-shooting-your-leg-4p4i</link>
      <guid>https://dev.to/liksu/too-slow-without-shooting-your-leg-4p4i</guid>
      <description>&lt;p&gt;JavaScript, year after year, becomes a more stable, predictable, and safe tool for building large applications, allowing even junior developers to maintain it without high risks of catastrophic failures. It’s the right choice and strategy for the community as a whole.&lt;/p&gt;

&lt;p&gt;Except in one and only one case, from my perspective: when you definitely know what you're doing and why.&lt;/p&gt;

&lt;p&gt;Yeah, for example, there were a lot of bugs related to &lt;code&gt;==&lt;/code&gt; (non-strict) equality when developers wrote code without hesitation. But you know what? Doing anything without hesitation is a bad idea! It makes me sad to find &lt;code&gt;value === null || value === undefined&lt;/code&gt; in production code, while in JS, there's a special equality between &lt;code&gt;null&lt;/code&gt; and &lt;code&gt;undefined&lt;/code&gt; (&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness"&gt;Comparing equality methods&lt;/a&gt;) and the right choice was to make this code look like &lt;code&gt;value == null&lt;/code&gt;. There's even a special exception in the ESLint &lt;code&gt;eqeqeq&lt;/code&gt; rule for this...&lt;/p&gt;

&lt;p&gt;But sorry, I got a little distracted from the topic of shooting oneself in the foot. While many developers could agree with the double equal operator, almost no one can accept the &lt;code&gt;with&lt;/code&gt; statement (&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/with"&gt;documentation&lt;/a&gt;). There's a strong reason — you can't predict the scope you are working with. And I have to say, it's not just a gun, but a whole big bomb for developers. It's appropriate that it was deprecated (&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode#removal_of_the_with_statement"&gt;Removal of the &lt;code&gt;with&lt;/code&gt; statement&lt;/a&gt;). Except, perhaps, in that one situation where you need to inject something into a scope and want to do it fast.&lt;/p&gt;

&lt;p&gt;Let’s imagine a situation where you need to process a series of data with some formulas. For example, you have a list of market prices by date and you need to get the average price of companies &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;, and &lt;code&gt;c&lt;/code&gt;. Or maybe filtering instead of calculation — you have movies and you want to find an old good movie with an IMDb rating above 7.5 and produced before the millennium. You could always create hand-written functions like &lt;code&gt;(market) =&amp;gt; (market.a + market.b + market.c) / 3&lt;/code&gt;, or &lt;code&gt;(movie) =&amp;gt; movie.year &amp;lt; 2000 &amp;amp;&amp;amp; movie.imdb &amp;gt; 7.5&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But what if you need to create a tool rather than provide a specific result? I've seen a lot of applications where such calculations were hardcoded, and even more applications where there were different solutions to pre-build and add any kind of extensions. All of these solutions require developer’s effort and still do not enable users to write any formula they want. What if you finally want to allow users to write something like &lt;code&gt;(a + b + c) / 3&lt;/code&gt; or &lt;code&gt;year &amp;lt; 2000 and imdb &amp;gt; 7.5&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;Obviously, it's a well-known SQL syntax. And we can find it, for example, as JQL in Jira, a really popular tool for a lot of non-developer users like project managers. So, what if we want to give the same ability to users?&lt;/p&gt;

&lt;p&gt;Some time ago, I developed a library that transformed text inputs into functions based on an extendable grammar set. Importantly, since the final outcome is a function, I kept support for all JavaScript functionalities within a query, allowing users to incorporate calculations such as &lt;code&gt;Math.min(a, b, c)&lt;/code&gt; directly into their queries. And it works great and really fast.&lt;/p&gt;

&lt;p&gt;The key feature that enabled me to effectively calculate user input within the context of a data item was the &lt;code&gt;when&lt;/code&gt; statement. Once a user submits a formula, the library processes it, converts it into code, and then returns a function. Here’s what the process 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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createFilter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;query&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;functionBody&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`with (item) {
        return &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;
    }`&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;item&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;functionBody&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;Let’s put aside all the input-to-code transpiling and safety stuff and concentrate only on the scoping.&lt;/p&gt;

&lt;p&gt;As a result, when we pass a query equal to &lt;code&gt;year &amp;lt; 2000 &amp;amp;&amp;amp; imdb &amp;gt; 7.5&lt;/code&gt;, we’ll get the ready filtering function:&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;filterFn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createFilter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;year &amp;lt; 2000 &amp;amp;&amp;amp; imdb &amp;gt; 7.5&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// You'll get this function referenced in filterFn:&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;anonymous&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;with &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&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="nx"&gt;year&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;imdb&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;7.5&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;Then you can apply the ready function to a whole list and get results.&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;movies&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="na"&gt;year&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1966&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;imdb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;8.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;The Good&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;year&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1966&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;imdb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;5.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;The Bad&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;year&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;imdb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;3.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;The Ugly&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;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;movies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;filterFn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;// You'll get the only one result - 'The Good' movie&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fast and easy.&lt;/p&gt;

&lt;p&gt;Except that we used &lt;code&gt;with&lt;/code&gt;, which is problematic, as I mentioned earlier. So, can we eliminate the &lt;code&gt;with&lt;/code&gt; statement and rewrite the solution in strict mode? Certainly.&lt;/p&gt;

&lt;p&gt;The initial plan was simply to parse all the keys used in the query and slap the &lt;code&gt;item.&lt;/code&gt; prefix on them. No need to mess with the scope at all! However, this method could mess up the integrated JS code, miss some elements, and make searching for keys overly complicated.&lt;/p&gt;

&lt;p&gt;The same goes for the idea of incrementally creating the function, step by step fixing all &lt;code&gt;ReferenceError&lt;/code&gt; that should help identify such keys. And then there were a few other non-effective ideas that I tried to tweak the function body.&lt;/p&gt;

&lt;p&gt;So, let's return to the scope. There is another way to inject keywords into a scope — just pass them as arguments to a function! This makes the filtering function look something 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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;anonymous&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;year&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;imdb&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="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;year&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;imdb&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;7.5&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But… there’s a small issue. A tiny one.&lt;/p&gt;

&lt;p&gt;We don’t know each object’s content before we run the filter. Because, let me remind you, we are making a common tool, the ‘third-party library’ for other developers. So, we can’t predict an object's structure. You can say — the developers will know the structure, they are using TypeScript, thoughtful architecture, OpenAPI specs, and JSDoc as a cherry on top. They can predict, you’ll say. But what if not? What if our library would be used to filter heterogeneous content exactly to get homogeneous results? It is always easy to say that we’ll know exactly the parameters of the filtering function and can pass it manually. But what if we can’t? What if we still want to keep the SQL-like syntax for users on a dataset of unknown objects?&lt;/p&gt;

&lt;p&gt;The most abstract solution will be to collect each time an object's keys and create a new function with the right scope. Something 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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createFilter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;query&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="nx"&gt;item&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;keys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;sort&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;filterFunction&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;Function&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;`return &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;query&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="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;filterFunction&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&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;The greatest fail here is that we need to create a new function for each array item! So expensive!&lt;/p&gt;

&lt;p&gt;I made a tiny benchmark, and found that it runs on average 17 times slower! On large sets of data, you will be able to notice it. Adding a cache based on the keys of an object makes it a bit better, now it is only 11 times slower. This is the price of just getting rid of the deprecated &lt;code&gt;with&lt;/code&gt; statement.&lt;/p&gt;

&lt;p&gt;Maybe we can sometimes allow shooting ourselves in the foot when we really want it.&lt;br&gt;
Some kind of &lt;code&gt;"use sloppy; yes I know what I'm doing"&lt;/code&gt; pragma ;)&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>with</category>
      <category>performance</category>
      <category>bestpractices</category>
    </item>
    <item>
      <title>Boost Your Next.js Project with this Pre-Built Application Template</title>
      <dc:creator>Petro Borshchahivskyi</dc:creator>
      <pubDate>Sun, 30 Apr 2023 21:39:11 +0000</pubDate>
      <link>https://dev.to/liksu/boost-your-nextjs-project-with-this-pre-built-application-template-1bfi</link>
      <guid>https://dev.to/liksu/boost-your-nextjs-project-with-this-pre-built-application-template-1bfi</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pX1ja2Fo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1rolz5g99mr81o1pz0t3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pX1ja2Fo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1rolz5g99mr81o1pz0t3.png" alt="Next.js Application Template" width="800" height="229"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Are you planning to kick-start a new project using Next.js? Save time and energy by leveraging this comprehensive &lt;a href="https://github.com/Liksu/next-template"&gt;Next.js Application Template&lt;/a&gt;, which comes with predefined libraries, configurations, and components to help you get up and running in no time!&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Top-notch libraries and configurations&lt;/strong&gt;: Next.js, Mantine, next-i18next, NextAuth.js, MongoDB, MDX, PM2, React GA4, TypeScript, and ESLint.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Predefined components&lt;/strong&gt;: Layout components, User components, HttpClient, ALink, ColorSchemeToggle, and Social Buttons.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Constants&lt;/strong&gt;: Auth options and Header Menu items.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend helpers&lt;/strong&gt;: MongoDB connection, Auth guard middleware, API Restrictor, HTTP Responses, and getTranslations helper.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pages&lt;/strong&gt;: Predefined &lt;code&gt;_app&lt;/code&gt;, &lt;code&gt;_document&lt;/code&gt;, &lt;code&gt;404&lt;/code&gt;, &lt;code&gt;500&lt;/code&gt; and test sample pages &lt;code&gt;index&lt;/code&gt;, &lt;code&gt;mdx-test&lt;/code&gt;, and &lt;code&gt;profile/index&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The template provides seamless integration with popular libraries such as Mantine, NextAuth.js, and MongoDB to create a modern and powerful stack. &lt;/p&gt;

&lt;p&gt;Mantine is a React component library that offers a range of components like core, dates, forms, modals, and notifications. With NextAuth.js, you'll have authentication and authorization out-of-the-box, while MongoDB enables an efficient database management system. &lt;/p&gt;

&lt;p&gt;Additionally, the template includes MDX support for better content management, PM2 for process management, and React GA4 for Google Analytics integration.&lt;/p&gt;

&lt;p&gt;The predefined components, constants, and backend helpers will ensure you have a solid foundation for your project. The template covers a wide range of use cases, from user management to layout and social media integration. &lt;/p&gt;

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

&lt;p&gt;The Next.js Application Template provides a powerful starting point for your web development projects. By using this template, you'll save time and effort in configuring and setting up the essential components, allowing you to focus on developing the unique features of your application.&lt;/p&gt;

&lt;p&gt;Jump-start your Next.js journey with this robust template and experience a seamless web development process. Explore and use the template by visiting the GitHub repository: &lt;a href="https://github.com/Liksu/next-template"&gt;https://github.com/Liksu/next-template&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>mantine</category>
      <category>typescript</category>
      <category>react</category>
    </item>
  </channel>
</rss>
