В чем разница между фреймворком и библиотекой?

«В чем разница между фреймворком и библиотекой?» — вопрос из категории Архитектура, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Разница заключается в том, кто контролирует поток выполнения приложения — это принцип Инверсии управления (IoC).

Библиотека — это набор инструментов (функций, классов), которые вы вызываете в своем коде, когда вам это нужно. Вы контролируете поток.

Пример: Вы используете библиотеку axios для HTTP-запросов, решая сами, когда и какой запрос выполнить.

Фреймворк — это каркас, который определяет структуру приложения и сам вызывает ваш код. Фреймворк контролирует поток.

Пример: В фреймворке React вы описываете компоненты, а фреймворк сам решает, когда их отрендерить и обновить на основе своего внутреннего цикла.

Аналогия:

  • Библиотека — это поход в магазин за инструментами. Вы покупаете молоток и гвозди и сами решаете, как и когда строить полку.
  • Фреймворк — это каркас дома. Вы заполняете стены и проводите коммуникации внутри уже заданной структуры.

Технический пример:

// Использование библиотеки Lodash (вы управляете вызовом)
import _ from 'lodash';
const users = [...];
const activeUsers = _.filter(users, { isActive: true }); // Вы решили вызвать filter сейчас

// Работа в фреймворке Angular (фреймворк управляет вызовом)
@Component({...})
export class UserComponent {
  // Angular сам создаст экземпляр этого класса и вызовет ngOnInit,
  // когда сочтет нужным в своем жизненном цикле компонента.
  ngOnInit() {
    this.loadUsers();
  }
}