<div class="container">
    <button id="button-animate">
        Button
    </button>
</div>let btn = document.getElementById('button-animate');
btn.addEventListener('click', () => {
    // some code
});CSS
HTML
JavaScript
View
button {
    border: 3px solid #218294;
    font-size: 30px;
    color: #218294;
    text-decoration: none;
    text-transform: uppercase;
    ...
}
button::after {
    content: '';
    position: absolute;
    ...
}
.Кнопка
@Component({
  selector: 'app-buttin',
  templateUrl: './btn.html',
  styleUrls: ['./btn.css']
})
class AppButton {
  constructor() {}
  ...
}TypeScript
button {
    ...
}
CSS
<button>
  Button
</button>HTML
Angular (Google)
2009, 2016
button {
    ...
}React.js (Facebook)
2013
Vue.js (Эван Ю)
2014
class Btn extends Component {
  render() {
    return (
      <div>
        <button>
          Button
        </button>
      </div>
    );
  }
}JSX
<template>
  <div>
    <button>
      Button
    </button>
  </div>
</template>
<script>
  export default {
    data() {...},
    methods: {...}
  }
</script>
<style>
  button {
    ...
  }
</style>CSS
VUE
<template>
    <div>
        <h1>Компонент на Vue.js</h1>
        <span>{{spanText}}</span>
        <button v-on:click="btnClick">Нажми меня!</button>
    </div>
</template>
<script>
export default {
    data() {
        return {
            spanText: 'Text in Vue'
        }
    },
    methods: {
        btnClick() {
            alert('Привет');
        }
    }
}
</script>
<style scoped>
h1 {
    color: blue;
}
</style><p v-text="messText">Текстовое содержимое</p>
<p v-html="messHTML">HTML содержимое</p>items: [
    {name: 'Tony',  age: 25},
    {name: 'Tyler', age: 27},
    {name: 'Tom',   age: 20}
]<button v-on:click="onClick" /><a v-bind:href="url" /><ul>
    <li v-for="item in items">
        {{ item.name }}
    </li>
</ul><div v-if="name == 'admin'">Показываем блок</div>
<div v-else>Иначе показываем этот</div>| v-text, v-html | Отображение текста или html | 
| v-show, v-if, v-else, v-else-if | Условная отрисовка | 
| v-for | Отрисовка списков | 
| v-on: | Обработчики событий DOM | 
| v-bind: | Связывание атрибутов элементов | 
| v-model | Двунаправленное связывание данных с элементами | 
| v-pre | Отмена компиляции у элемента и его потомков | 
| v-cloak | Скрытие нескомпилированных шаблонов | 
| v-once | Однократная отрисовка элемента | 
npm install -g @vue/clivue create hello-world
vue ui<template>
    <div id="app">
	<router-link to="/home">Home</router-link>
	<router-link to="/about">About</router-link>
	<router-view></router-view>
    </div>
</template>
<script>
const routes = [
    { path: '/home', component: Home },
    { path: '/about', component: About }
]
const router = new VueRouter({
    routes
})
const app = new Vue({
    router
}).$mount('#app')
</script>.......Плюсы
Минусы