<?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: fullstackcoder</title>
    <description>The latest articles on Forem by fullstackcoder (@fullstackcoder).</description>
    <link>https://forem.com/fullstackcoder</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%2F228284%2Ffa728cfa-5443-4df1-9cae-e98492f27c27.png</url>
      <title>Forem: fullstackcoder</title>
      <link>https://forem.com/fullstackcoder</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/fullstackcoder"/>
    <language>en</language>
    <item>
      <title>SpecFlow - Selenium - ChromeDriver code base</title>
      <dc:creator>fullstackcoder</dc:creator>
      <pubDate>Mon, 27 Dec 2021 17:53:00 +0000</pubDate>
      <link>https://forem.com/fullstackcoder/specflow-selenium-chromedriver-code-base-16n7</link>
      <guid>https://forem.com/fullstackcoder/specflow-selenium-chromedriver-code-base-16n7</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclaimer: This is a starting point to build on top of the existing code base, implementing BDD E2E automation testing. As stated in the README, the setup contains minimal configuration (not using Context Injection). English is not my first language, so my apologies for any mistakes.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Brief&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
When it comes to automated testing (BDD, E2E etc) in .NET, the most popular framework at the moment is &lt;a href="https://specflow.org/"&gt;SpecFlow&lt;/a&gt;, combined with Selenium and among the several webdrivers, ChromeDriver is the one used the most.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://github.com/giorgosde/BDDSpecFlowSample"&gt;this&lt;/a&gt; repo I created a code base, adding a few Scenarios, to showcase the above setup, by testing an existing application. I hope this will be useful to anyone starting messing around with BDD on .NET and will save you time from creating the setup from scratch.&lt;/p&gt;

&lt;p&gt;If you would like to support this effort to provide tutorials and demo code, &lt;a href="https://www.facebook.com/FullStackCodr"&gt;please like us on Facebook&lt;/a&gt; or even &lt;a href="https://www.buymeacoffee.com/fullstackcodr"&gt;☕ Buy Me A Coffee&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>csharp</category>
      <category>specflow</category>
      <category>testing</category>
    </item>
    <item>
      <title>.Net AWS MQ</title>
      <dc:creator>fullstackcoder</dc:creator>
      <pubDate>Sun, 28 Nov 2021 13:40:46 +0000</pubDate>
      <link>https://forem.com/fullstackcoder/net-amazon-mq-4dl6</link>
      <guid>https://forem.com/fullstackcoder/net-amazon-mq-4dl6</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclaimer: In this article I give a brief on how to interact with Amazon MQ (using the ActiveMQ engine) from a .Net6 application via &lt;a href="https://masstransit-project.com/"&gt;MassTransit&lt;/a&gt; providing boilerplate code and instructions. This is a high overview and not a step by step guide. Finally, English is not my first language, so my apologies for any mistakes.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;What are we building&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
This is a Proof of Concept aiming to demonstrate the integration of AWS AMQ (Pub/Sub) into .Net via MassTransit. In &lt;a href="https://github.com/giorgosde/Dotnet_AmazonMQ"&gt;this repository&lt;/a&gt; there are two elements under a single Solution:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;WebApi Project containing an ApiController and endpoint which is allowing posting to AMQ via a MessagingService&lt;/li&gt;
&lt;li&gt;A console (dummy) application which consumes the messages from the previous step&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Prerequisites&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
It is expected to have an AWS Account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Create a broker&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://docs.aws.amazon.com/amazon-mq/latest/developer-guide/amazon-mq-creating-configuring-broker.html"&gt;This&lt;/a&gt; is an extensive and descriptive enough tutorial on how to create an AMQ broker. Just to highlight that AmazonMQ supports two engines: ActiveMQ and RabbitMQ. We are going for the ActiveMQ option. The broker creation process takes approximately 15-20 minutes to complete.&lt;br&gt;
&lt;em&gt;Important:&lt;/em&gt; Make sure to use one of the smaller EC2 instances and not the default large one. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Setup the project&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
To make the project up and running there are few actions to be taken:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replace the credentials in the (Producer) WebApi project (

&lt;code&gt;appsettings.json&lt;/code&gt;

):
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  "AMQ": {
    "Username": "{broker_username}",
    "Password": "{broker_password}",
    "HostUrl": "activemq://{broker_endpoint}",
    "queueName": "{broker_queue_name}"
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Replace the credeitnals in the (Consumer) Console Application:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;string username = "{broker_username}";
string password = "{broker_password}";
string hostUrl = "activemq://{broker_endpoint}";
string queueName = "{broker_queue_name}";
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Start both projects in parallel. To achieve this, right click on the Solution and through the properties:
&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkb67sruzc2tz8zuyjmen.JPG" alt="Image description" width="800" height="322"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Demo&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F73euq42ztasogdql4ttu.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F73euq42ztasogdql4ttu.JPG" alt="Image description" width="800" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More info about Amazon MQ can be found &lt;a href="https://aws.amazon.com/amazon-mq/?amazon-mq.sort-by=item.additionalFields.postDateTime&amp;amp;amazon-mq.sort-order=desc"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Remember to delete the broker once finished if there is no other usage apart from demoing&lt;/li&gt;
&lt;li&gt;Broker's configuration cannot be deleted&lt;/li&gt;
&lt;li&gt;Broker's configuration can be used by multiple brokers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you would like to support this effort to provide tutorials and demo code, &lt;a href="https://www.facebook.com/FullStackCodr"&gt;please like us on Facebook&lt;/a&gt; or even &lt;a href="https://www.buymeacoffee.com/fullstackcodr"&gt;☕ Buy Me A Coffee&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>dotnet</category>
      <category>csharp</category>
      <category>aspnetcore</category>
    </item>
    <item>
      <title>.Net Generic Repository Pattern</title>
      <dc:creator>fullstackcoder</dc:creator>
      <pubDate>Sun, 21 Nov 2021 13:04:38 +0000</pubDate>
      <link>https://forem.com/fullstackcoder/net-generic-repository-pattern-4gf</link>
      <guid>https://forem.com/fullstackcoder/net-generic-repository-pattern-4gf</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclaimer: In this article I provide demo code implementing the Generic Repository Pattern via .Net6 and C#. This is a high overview and not a step by step guide on how to start the project from scratch. I don't expect everyone to agree with the statements below since there are many different ways to implement this Pattern. Finally, English is not my first language, so my apologies for any mistakes.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The Generic Repository Pattern is a wide used way to keep a neat codebase on the Data Access Layer, keeping commonly used CRUD functionality grouped together, giving the ability to make it reusable among the different entity types.&lt;/p&gt;

&lt;p&gt;The core concept of the Generic Repository Pattern is that regardless the passed-in data type, the CRUD functionality will adapt to it and will operate the same way. To achieve this, we make use of C# Generics feature.&lt;/p&gt;

&lt;p&gt;A Base Generic Repository (async) interface would like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    public interface IGenericRepository&amp;lt;T&amp;gt;
    {
        Task&amp;lt;IEnumerable&amp;lt;T&amp;gt;&amp;gt; AllAsync();
        Task&amp;lt;T&amp;gt; GetByIdAsync(string id);
        Task&amp;lt;T&amp;gt; CreateAsync(T entity);
        Task&amp;lt;T&amp;gt; UpdateAsync(T entity);
        Task&amp;lt;string&amp;gt; DeleteAsync(string id);
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;"T" represents the generic type, it could be understood as a "placeholder" for the different data types.&lt;/p&gt;

&lt;p&gt;The implementation of the above interface, using Entity Framework, would like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    public class GenericRepository&amp;lt;T&amp;gt;: IGenericRepository&amp;lt;T&amp;gt; where T: BaseEntity
    {

        protected readonly DatabaseContext _context;

        public GenericRepository(DatabaseContext context)
        {
            _context = context;
        }

        public async Task&amp;lt;IEnumerable&amp;lt;T&amp;gt;&amp;gt; AllAsync()
        =&amp;gt; await _context.Set&amp;lt;T&amp;gt;().ToListAsync();

        public async Task&amp;lt;T&amp;gt; CreateAsync(T entity)
        {
            entity.Id = Guid.NewGuid().ToString();
            entity.DateUpdated = DateTime.Now;

            await _context.AddAsync(entity);
            await _context.SaveChangesAsync();

            return entity;
        }

        public async Task&amp;lt;string&amp;gt; DeleteAsync(string id)
        {
            var entity = await _context.Set&amp;lt;T&amp;gt;().FindAsync(id);
            _context.Set&amp;lt;T&amp;gt;().Remove(entity);
            await _context.SaveChangesAsync();

            return id;
        }

        public async Task&amp;lt;T&amp;gt; GetByIdAsync(string id)
        =&amp;gt; await _context.Set&amp;lt;T&amp;gt;().FirstOrDefaultAsync(x =&amp;gt; x.Id == id);

        public async Task&amp;lt;T&amp;gt; UpdateAsync(T entity)
        {
            entity.DateUpdated = DateTime.Now;

            _context.Set&amp;lt;T&amp;gt;().Update(entity);
            await _context.SaveChangesAsync();

            return entity;
        }
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As mentioned above, the aim of the base repository is to be shared between other repositories, in order to make use of the already implemented functionality. An example of usage in an individual feature repository interface:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    public interface IVehicleRepository : IGenericRepository&amp;lt;Vehicle&amp;gt;
    {
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above &lt;code&gt;IVehicleRepository&lt;/code&gt; inherits the functionality of the &lt;code&gt;IGenericRepository&lt;/code&gt;, passing the &lt;code&gt;Vehicle&lt;/code&gt; entity to it. In other words, &lt;code&gt;IVehicleRepository&lt;/code&gt; is informs the &lt;code&gt;IGenericRepository&lt;/code&gt; that it is going to use the CRUD methods against the &lt;code&gt;Vehicle&lt;/code&gt; object. And down to the exact feature repository implementation now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    public class VehicleRepository : GenericRepository&amp;lt;Vehicle&amp;gt;, IVehicleRepository
    {
        protected readonly DatabaseContext _context;

        public VehicleRepository(DatabaseContext context) : base(context)
        {
            _context = context;
        }
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The full implementation of the above code can be found &lt;a href="https://github.com/giorgosde/GenericRepositoryPattern"&gt;here&lt;/a&gt; In this demo project I make use of some of the commonly used techniques, features and tools, including: Generics, DI, Async, Entity Framework (InMemory Database), Automapper, XUnit, FluentAssertation, Moq&lt;/p&gt;

&lt;p&gt;If you would like to support this effort to provide tutorials and demo code, &lt;a href="https://www.facebook.com/FullStackCodr"&gt;please like us on Facebook&lt;/a&gt; or even &lt;a href="https://www.buymeacoffee.com/fullstackcodr"&gt;☕ Buy Me A Coffee&lt;/a&gt;&lt;/p&gt;

</description>
      <category>csharp</category>
      <category>dotnet</category>
      <category>aspnetcore</category>
    </item>
    <item>
      <title>Code review - the mature way</title>
      <dc:creator>fullstackcoder</dc:creator>
      <pubDate>Sat, 07 Aug 2021 22:47:13 +0000</pubDate>
      <link>https://forem.com/fullstackcoder/code-review-the-mature-way-p1g</link>
      <guid>https://forem.com/fullstackcoder/code-review-the-mature-way-p1g</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclaimer: In this article I list the key points I consider every time I do a code review. This is not a step by step guide on how to do code reviews. I don't expect everyone to agree with the statements below. Finally, English is not my first language, so my apologies for any mistakes.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Code reviews is the time of judgment (this meant to be a joke) - it's the place where you give the opportunity to other developers to validate the piece of code you proudly worked on. Regardless you are a junior or senior developer, there will always be something you might have missed in your code, or could be written in a better way.&lt;/p&gt;

&lt;p&gt;There are times where code reviews turn to be a battlefield between the reviewer and the code author though. But this should not be the case. Remember, the result of a code review is to merge a valid and clean piece of code into the code base. Thus, as reviewer, the comments you submit should be relevant, the wording proper and the observations straight to the point. On the other side, as the author of the code, any comments should be welcome and same thing here, any replies to be in proper language.&lt;/p&gt;

&lt;p&gt;But anyway it's not always about code, there are few other aspects to pay attention when reviewing code. I list below some of my technical and non-technical criteria I have in mind every time I do a code review.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5vxpyfg4y3rpuskar4q2.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5vxpyfg4y3rpuskar4q2.jpeg" alt="Alt Text" width="640" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Technical considerations
&lt;/h4&gt;

&lt;p&gt;Firstly I usually go quickly through the code in order to check for any obvious:&lt;br&gt;
typo/ misspelling /readability, code coverage, linting, code smell, duplications in the newly introduced code, naming, magic strings and numbers. For most of these we can also rely on automated checks - Sonarqube for example is a widely used tool that helps to identify the mentioned issues upfront, reducing the manual reviewing time.&lt;/p&gt;

&lt;p&gt;I then have a second look to check as for coding principles (example SOLID standards), simplicity and reusability. For big (usually legacy) projects, I try to check if any of the introduced code exists somewhere else in the code base so we can use the existing one to avoid reinventing the wheel.&lt;/p&gt;

&lt;p&gt;Consider a better syntax. There will always be a better way to write a certain piece of code. But it is important to use the most up to date syntax and features of the language or framework we are using so we can take the most out of it, taking advantage of their functionality. Here I try to keep the balance between &lt;strong&gt;"you could change it"&lt;/strong&gt; vs &lt;strong&gt;"you should change it"&lt;/strong&gt; and this is because I try to respect the developer's programming style as well. In these situations I usually put as a suggestion the requested change, highlighting that this is &lt;strong&gt;how I would write that&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F37d87bvks5cr053qnle9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F37d87bvks5cr053qnle9.png" alt="Alt Text" width="800" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Non-technical considerations
&lt;/h4&gt;

&lt;p&gt;What the ticket is all about. In an agile environment, every submitted piece of code should follow a previously discussed ticket (whether this is a story, a task or a bug). As a first step so, I check if the provided code, satisfies the acceptance criteria of the ticket. As part of this I try to identify any edge cases too - any use cases that might have missed from the ticket's criteria and they should be handled as part of this work.&lt;/p&gt;

&lt;p&gt;What exactly the merge request (pull request if you like) contains. Some times we tend to sneak small amends as part of another merge request, in order not to raise a separate ticket and merge request. It is practical every merge request to contain (relatively) small changes and this is because if for some reason we have to roll back the master branch, then all this work will go wasted. Small merge requests are digestive - easy to review and be tested - so we can keep rolling smoothly. &lt;/p&gt;

&lt;p&gt;Commit message is part of my reviewing process too. Looking the commit logs in a later point of time we should have a list of meaningful commits and even better, to contain the ticket number where this change had to be introduced for. To get this further, having straight to the point commits can be useful for when investigating (possibly as part of debugging) an area into the code - a &lt;code&gt;git blame&lt;/code&gt; on a specific line of code will reveal the commit message so it makes sense to meet a meaningful commit in order to understand the existence of this line.&lt;/p&gt;

&lt;p&gt;Finally, I want my reviews not to affect productivity so before I leave a comment I have always in mind a couple of things which I group together here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Time spent on the ticket. If a ticket is under development for too long, then adding less important comments it will delay the delivery even more. In these situations I try to leave the necessary comments - any lower priority observations can be addressed in a later ticket.&lt;/li&gt;
&lt;li&gt;Urgency. If a ticket needs to move fast (for example bug on production) then I skip the steps for better syntax, naming etc. For an urgent bug, I am more open to allow a quick solution from a more proper one, in order to resolve the direct problem and satisfy the end user, but always follow up to improve this piece right after. Remember, our projects have to be as perfect possible in terms of code but they should also be functional for the end user.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnbcg6zfllq3gzyh7pweu.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnbcg6zfllq3gzyh7pweu.jpg" alt="Alt Text" width="552" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Code reviews is a chance to see the problem from different angles and consider different (or maybe better) ways to resolve it. Both sides should be open to submit and address valid comments on the code. There should be no ego or arrogance in this - no hard feelings at all! Better few and meaningful words (pointing some documentation and resources if needed) from a tone of comments that may not make sense in some cases. &lt;/p&gt;

&lt;p&gt;Thanks for reading this. If you want to show me some love, you can always &lt;a href="https://www.buymeacoffee.com/fullstackcodr"&gt;☕ Buy Me A Coffee&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>career</category>
      <category>productivity</category>
      <category>codequality</category>
    </item>
    <item>
      <title>Why VueJs is the next big thing - a personal perspective</title>
      <dc:creator>fullstackcoder</dc:creator>
      <pubDate>Sat, 02 Nov 2019 16:27:04 +0000</pubDate>
      <link>https://forem.com/fullstackcoder/why-vuejs-is-the-next-big-thing-a-personal-perspective-397k</link>
      <guid>https://forem.com/fullstackcoder/why-vuejs-is-the-next-big-thing-a-personal-perspective-397k</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclaimer: In this post I list those things that triggered my interest on VueJs and I do not expect everyone to agree with the statements below. This is not a competition for the best front-end framework/library. The following post is a result of my exposure working on Angular, VueJs and React as a professional. Feel free to place your own thoughts on the comments and possibly end up in a robust conclusion. Finally, when mentioning Angular, I am talking about Angular 2+ and not AngularJs.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It's a fact that the decision for which library to use depends on which of those tools could cover your needs each time. As a professional I worked on the most popular ones (Angular, React, VueJs), I found all of them equally great, but I dare to say that VueJs is my favorite one. Like it is mentioned in several posts, VueJs is a combination of React and Angular and I totally agree with that - VueJs actually embrace the greatest features of Angular and React.&lt;/p&gt;

&lt;p&gt;Googling around, I found out that most of the blogs are talking about the popularity of the front-end frameworks and libraries considering graphs and job postings, numbers of downloads per library etc. I will try to make my approach more practical, naming those features that VueJs "borrowed" from Angular and React and I like the most. Long story short, here we go:&lt;/p&gt;

&lt;h4&gt;
  
  
  Two-way data binding
&lt;/h4&gt;

&lt;p&gt;..or else "model binding". By saying two-way data binding in a general term means that any changes to the model object, will affect the UI and vice versa. I find this feature very handy in terms of code maintenance and possibly readability. Two-way data binding is used in VueJs and Angular but not in React. When working with React, you have to manually bind the updates by calling a function from the event handler - most of the times this is nothing more than a lambda function which updates the state by setting the current value - but still this is a concern which could be avoided by having the two way data binding feature.&lt;/p&gt;

&lt;h4&gt;
  
  
  Easier integration in an existing project
&lt;/h4&gt;

&lt;p&gt;Although all the three of them can fully cover the needs of a Single Page Application solution, there are also those cases where you just need to write a piece of more elegant javascript without having to carry on the whole framework/library. A real case scenario I usually face is when I want to add some ajax calls in a legacy Multiple Page Application (written let's say in .NET MVC with Razor) and I want to avoid using the "obsolete" to me JQuery. I am not saying that JQuery is not doing the job, but even pure javascript can do the job either. So since we are moving forward, I guess that a more modern solution could be more effective. This is where VueJs and React are dominating - it is quite easy to include a bit of VueJs or React code in a "non VueJs" or "non React" application. Although Angular introduced the &lt;a href="https://angular.io/guide/elements"&gt;Angular Elements&lt;/a&gt; it is still not a straight forward way to apply them outside an Angular application. Basically this is because Angular was introduced as a &lt;strong&gt;framework&lt;/strong&gt;, when React and VueJs as &lt;strong&gt;libraries&lt;/strong&gt;, so this is a nice starting point for the next listed feature.&lt;/p&gt;

&lt;h4&gt;
  
  
  Grow as you go approach - initial package size
&lt;/h4&gt;

&lt;p&gt;Like it was mentioned before, Angular comes as a full solution for Single Page Applications so the initial package of (approx) 500KB contains all the relevant tools like the Router, HttpClient, built-in form validation, built-in pipes etc. As such, whether you need them or not, Angular will install them by default. VueJs and React (80KB and 100KB each) offer some more flexibility/scalability though. The initial installation is in a more frugal format and any extra packages can be installed thereafter. So at first place you get only what you need and as long as your needs grow, you can extend the setup with more tools. &lt;/p&gt;

&lt;h4&gt;
  
  
  Functional and Class components
&lt;/h4&gt;

&lt;p&gt;Red wine, white wine.... I presume that this decision is mostly depending on each developer's style or even on the team's agreed code guide but still. Having the option to choose between Functional and Class components is offered in VueJs and React but not in Angular. I am not saying it's good or bad using one way over the other, but still it is a level of freedom that Angular is not supporting anyway. With Angular the only option is the Class components.&lt;/p&gt;

&lt;h4&gt;
  
  
  Built-in API
&lt;/h4&gt;

&lt;p&gt;Following the previous thought, this one is a matter of personal preference as well. Comparing React and Angular, I find that Angular offers a massive API and this can be either good or bad. The Angular API covers tons of use cases in a new syntax, when React API is simpler and relies in a lower level (pure javascript). Obviously this is something that affects the learning curve as well. Thankfully VueJs contains a simple enough (to adapt quick) API but not that extensive like Angular. A conditional iteration in a VueJs component's template for example can be achieved by &lt;code&gt;v-for&lt;/code&gt; and &lt;code&gt;v-if&lt;/code&gt; (&lt;code&gt;*ngIf&lt;/code&gt;, &lt;code&gt;*ngFor&lt;/code&gt; in Angular) etc when in React we have to play with more pure javascript commands like &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map"&gt;map&lt;/a&gt;, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax"&gt;spread operator&lt;/a&gt; etc. But again, this is  a matter of personal preference.&lt;/p&gt;

&lt;h4&gt;
  
  
  Separation of Concerns
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Separation_of_concerns"&gt;Separation of concerns&lt;/a&gt; is one of the fundamental principles when talking about professional coding. Organizing the code in sections by having each section responsible for a specific operation prevents a lot of problems in terms of code maintenance and readability. In VueJs and Angular the components hold the html, javascript and css in separate code blocks and that increases the readability possibly but for sure, it serves the Separation of Concerns Principle. On the other hand, React introduces the &lt;a href="https://reactjs.org/docs/introducing-jsx.html"&gt;JSX syntax&lt;/a&gt; which is a mixture of javascript and html because of the belief that those two are a bit of tied to each other. &lt;/p&gt;

&lt;p&gt;To summarize, there is no good and bad library/framework. The first step in order to choose what suits our case, is to consider the needs of this case in depth. All the three mentioned tools (Angular, VueJs and React) were built by skillful developers and the aim was to be used efficiently by developers. As a &lt;strong&gt;personal&lt;/strong&gt; preference though, VueJs is my favorite tool for the reasons mentioned above. &lt;em&gt;Your opinions are also welcome&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/fullstackcodr"&gt;☕ Buy Me A Coffee&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vue</category>
      <category>angular</category>
      <category>react</category>
    </item>
  </channel>
</rss>
