Developers in the industry must resolve frontend development problems quickly with minimal impact on existing workflows or backend architecture. In many cases, developers tend to overlook the UI until the end of a project, which can happen because of a lack of resources, ever-evolving product requirements, or the existing attitude that the frontend is the easy bit.
However, companies such as Apple and Google have proven that thinking through the design of the frontend is key to a solid product or platform that will excite and engage users, leading to a higher return on investment and a more successful business.
If you know Vue, you may have also come across other frontend frameworks that, at face value, solve the same problems, such as Ember, Angular, or React. At a surface level, they attempt to make reactive frontend development more reliable and introduce patterns that make it easier. However, there are significant differences in how a Vue project might play out compared to an Angular or React project. Let’s investigate them.
Angular versus Vue
Angular is a Model-View-ViewModel (MVVM) framework built by Google and has built-in support for TypeScript. The Angular ecosystem includes Ahead-of-Time (AoT) rendering, a router, and a CLI tool. However, it fails to deliver a simplified system for global state management; developers would need to learn how to use Flux or adopt NgRx.
Vue takes Angular’s core robustness and provides a better development experience by removing the restriction of an enforced code style for developers. Vue also simplifies common Angular patterns, such as HTML directives, and eliminates a variety of Angular’s project structures, such as injectables, components, pipes, modules, and so on. From Vue 3.0 onward, it provides excellent support for TypeScript and typing without the drawbacks of Angular-enforced coding styles.
Vue is more flexible, developer-friendly, efficient, and straightforward to set up and learn to use than Angular in many cases.
Next, let’s look at how Vue and React differ.
React versus Vue
First released in 2013 and backed by Meta (previously known as Facebook), React rapidly gained popularity in the developer community. React introduces the JSX pattern to write HTML syntax directly with JavaScript. With JSX, React increases the amount that new developers are required to learn about both JavaScript and component-based architecture.
Both React and Vue share the same component-driven development approach, allowing developers to build applications in a modular way. Each component contains its functionalities and lifecycle. Vue takes these core concepts of modular coding and offers flexibility to developers in choosing which approach to use to write their components: JSX or the traditional style, in which HTML, CSS, and JavaScript are separated.
Vue uses the Single-File Component (SFC) approach to leverage this modular structure into a single file while keeping the separation readable and understandable for developers.
Advantages of using Vue for your project
Vue has a gentler learning curve and a vibrant ecosystem. This gentle learning curve helps reduce overhead and cost for any team onboarding developers to a new Vue project.
One key benefit of Vue is its approachability for both new and veteran developers:
- Out of the box, developers can use a well-optimized and performant framework on which to build scalable, dynamic frontend applications.
- The SFC format pattern offers a modular and flexible blueprint that provides an enjoyable experience to developers. SFCs allow Vue to be genuinely versatile. You can implement basic functionalities and incrementally adopt pieces of a static site into Vue rather than overhaul your entire website.
As powerful as Redux and NgRx, Vuex (and lately Pinia) proves to be an outstanding official global state management tool that is flexible enough to meet most development needs.
Thanks to its stable performance; well-defined tools such as Vue Router, Pinia, Vuex, and so on; and a supportive community, developers can save time and money by choosing Vue for their development stack.
The following section explores the essential Vue architecture before deep-diving into the SFC pattern and template syntax.
Working with Vue
To learn about the Vue architecture, we will start by importing the Vue package into our coding playground. One straightforward way is to import the Vue package through the official Content Distribution Network (CDN). We can do so by creating an index.html
file and adding a <script>
tag to load the Vue CDN within the <head>
section of the HTML template, as demonstrated in the following code block:
<!DOCTYPE html>
<html>
<head>
<title>Vue.js project with CDN</title>
<script src="https://unpkg.com/vue@3"></script>
</head>
</html>
The browser will also load the Vue package using the CDN defined in the script
tag when loading the page. Once completed, you can utilize the Vue functions and start writing Vue code.
But first, let’s look at the Vue instance.
Understanding the Vue instance
In general, each Vue application consists of only one root Vue instance, which can be created using the Vue.createApp
method:
const vm = Vue.createApp({
// options
})
The Vue
class constructor accepts an options
object for the configurations and behavior of components. We call this approach Options API and we can use it for all corresponding Vue components. However, all of them are considered nested Vue instances, with their own options and properties.
Note
vm
is a term commonly used to refer to a View Model, which is an abstraction of the view that describes the state of the data in the model. Binding a Vue instance to vm
helps you to keep track of your Vue instance in a block of code.
For the Vue engine to render the application instance, in our index.html
file, we declare an <div>
element within the <body>
tag using a unique class name, ID, or data attribute as the main entry point for the application accordingly:
<body>
<div id="vue-app"></div>
<script>
const vm = Vue.createApp({
//Options
})
</script>
</body>
To render the Vue application in the browser, we need to trigger vm.mount()
to mount the root component to the targeted HTML element using a unique selector. In this example, it is an id
with a value of vue-app
:
<body>
<div id="vue-app"></div>
<script>
const vm = Vue.createApp({
//Options
})
vm.mount('#vue-app')
</script>
</body>
Now, you bind the <div>
element with id="vue-app"
to the new Vue instance.
Next, let’s define text with a value of "Start using Vue.js today!"
and add it as a property of the return
value for the data
method in the application options:
const vm = Vue.createApp({
data() {
return {
text: 'Start using Vue.js today!'
}
}
})
In the preceding code example, data
is a function that returns an Object instance containing the local state (or local variables) of a component. We will discuss this further in an upcoming section of this chapter.
To render the content of text
to the DOM, we use Vue template syntax, represented by double curly braces ({{}}
) wrapped around the reactive content. In this case, we use {{ text }}
, as shown in the following code:
<div id="vue-app">{{ text }}</div>
The Vue engine will replace the data property labeled text
and the curly brace placeholder with the Start using Vue.js
today!
string.
The output of the preceding code will be as follows:
Figure 1.1 – Displaying “Start using Vue.js today!” using a local data property
In the <head>
tag, we can also use the DOM API to construct a Vue application instance and bound it to our target element (with the ID selector as #vue-app
):
<head>
<title>Vue.js CDN</title>
<script src="https://unpkg.com/vue@3"></script>
<script>
document.addEventListener('DOMContentLoaded', function
() {
Vue.createApp({
data(){
return {
text: "Start using Vue.js today!"
}
}
}).mount('#vue-app')
})
</script>
</head>
<body>
<div id="vue-app">{{text}}</div>
</body>
The output is the same for both approaches. However, we strongly recommend not using DOMContentLoaded
.
While working with a CDN is very portable, we recommend using package managers as the installation method for Vue. From Vue 3 and above, Vue projects use Vite (or Vite.js) to initialize and bundle the code. You can access it here: https://vuejs.org/guide/quick-start.html#creating-a-vue-application.
Using a bundling management tool is very helpful for managing other third-party libraries and building an optimized code package for production. In the next section, we will explore a package-controlled example.