React.js and Vue.js – JavaScript libraries comparison

There is this popular Polish meme with monkey acting like stereotypical man in his 50s. His name is Janusz, his car is 1.9 TDI version of well-known B5, he is proud of his mustache. He always says “it used to be [better]”. That adage is also true in JavaScript development. Back in 2006 jQuery was

There is this popular Polish meme with monkey acting like stereotypical man in his 50s. His name is Janusz, his car is 1.9 TDI version of well-known B5, he is proud of his mustache. He always says “it used to be [better]”. That adage is also true in JavaScript development. Back in 2006 jQuery was announced. It is widely used since then. Nowadays we have so many good JS libraries or even frameworks, that choosing right one for our projects is really overwhelming. I hope that this post will help you to find out if it really used to be better back then. The best way to determine that is learning those new frameworks!
Today I would like to compare two great JavaScript libraries for frontend development – React.js and Vue.js. Yes, I know that Vue.js is a “framework”, but for simplicity I am going to call it a “library”.

History and popularity

Let’s start with something non-technical and take a look at history of both libraries. React.js was initially released in March 2013. It is developed and maintained by Facebook. Vue.js was first released in February 2014 by ex-Google employee Evan You.
Since then, React earned about 85k stars on GitHub and Vue nearly 80k. Monthly about 6 million developers download React.js package from npm. In comparison we have over 1 million downloads of Vue.js package. Both packages are available under MIT License. React has over 1k contributors on GitHub, while Vue has only 130.

Similarities

Both libraries handle small functions that receive an input and return rendered elements as output. We call those functions components. Consequently we say that React.js and Vue.js are component-based.
To tell the truth, I really enjoy using ES6 with all its magic like spread operator, promises, classes and template literals. The best part comes now: both libraries use ES6, moreover, React focuses on using it.
One more thing to mention is that Virtual DOM is used in one and the other, mainly for performance reasons.
Last but not least, they both maintain focus in the core library, with concerns such as routing and global state management handled by companion libraries.

Templates – JSX vs “single file components”.

For years developers were trying to seperate UI templates and JavaScript logic. Usage of React’s JSX or Vue’s single file components breaks up with that long-standing pratices. Sounds terrible? Well, the new school says, that you should build reusable, composable and easy to test components rather than trying to seperate logic and templates, which in fact is just separation of technologies, not concerns.
JSX is a syntax extension to JavaScript, recommended by creators of React.js as a visual aid when working with UI inside the JS code. It looks like this:
As you can see, JavaScript appears to be mixed with HTML, but it is not quite true. JSX is an XML-like syntax extension to JS and is intended to be used by various preprocessors (transpilers) to transform these XML-like tokens into standard ECMAScript. At first it seems wrong, but it is really powerful and developer-friendly.
Vue.js on the other hand uses single file components, meaning that templates, scripts and styles are in one file but in three different, ordered sections. Our beloved “Hello world!” component in Vue.js looks like this:

As you can see React.js puts HTML-like tags in much more powerful JavaScript. On the other hand, Vue.js puts HTML next to JavaScript and CSS, in single file.

Performance

Both libraries have similar results in benchmarks, especially in terms of creating elements using virtual DOM. Vue.js is smaller and allocates less memory, React.js on the other hand is faster in terms of updating and re-rendering elements. That can lead us to conclusion, that the performance benchmarks should only be considered as side note, not as a verdict.

Fight!

I have prepared two similar applications, one in React.js and the other in Vue.js. I would like to show you how things are done in one and the other.
For creating React.js application, I used create-react-app, and for Vue.js application – vue-cli with template webpack-simple. Both applications use bulma as CSS framework.
Apps are composed of few components:
– App – container of other components and header
– Counter – two buttons for incrementing and decrementing and a counter
– Markdown Editor – dead simple markdown editor and compiler using marked
– Sample Form – another simple component, which displays message based on two text inputs.
Shall we see the code?
Let’s start with simple Counter component.

Same component in React is slightly different:

As you can easily see there are few differences between those files:

  • className vs class – using JSX with React.js forces us to use className attribute for CSS class, because class is reserved word in JavaScript
  • state in React.js is immutable, you cannot change it directly. You have to use special method setState to change state. Vue.js on the other hand uses mutable objects for storing data.
  • Obvious one – syntax. Vue.js uses three sections – one for HTML template, one for JS scripts and the last one for CSS styles. React.js mixes HTML and JS producing class with necessary methods.

Next thing I would like to point is two-way data binding in Vue.js.
Field containing Employer data in Vue.js is build like that:

As you can see above, data‘s employer is bind to input. Changing input value changes also JavaScript model.
In React.js there is only one-way data binding. It updates the model first and then it renders the UI element.

As you can see we need a method for handling changes made on our input element.
You can find both apps on my Github: here is Vue.js app and here is React.js app

Flux

Flux is the application architecture used for building client-side web applications. It complements view components by utilizing a unidirectional data flow. It’s more of a pattern rather than a formal framework. Both React.js and Vue.js are widely used with libraries that implement Flux pattern. For React it’s Redux, for Vue it’s Vuex.

Conclusion

Vue.js and React.js are great, powerful tools for creating frontend for your web applications. They have much in common, but there are some distinguishing differences.
Vue has the following advantages over React:

  • it is smaller and faster,
  • single file components allow us to use HTML, JS and CSS in terms of one reusable component,
  • it is simpler in terms of syntax,
  • easier learning-curve.

React has the following advantages over Vue:

  • gives more flexibility in large apps developing,
  • easier to test,
  • huge community and list of ready-made components,
  • developers are really well-paid.

And what JavaScript frontend library will you choose for your next project?