This content originally appeared on DEV Community and was authored by ryzhpolsos
В этом посте хотелось бы выразить своё мнение по поводу фреймворков, которые стали стандартом современного программирования.
В чём отличие фреймворка от библиотеки?
Если не вдаваться в детали и говорить простым человеческим языком, можно выразиться так: программист встраивает библиотеку в свой код, меняя лишь вызовы отдельных функций на библиотечные, тогда как фреймворк предполагает изменения самой концепции разработки.
Один из ярких и показательных примеров – библиотека jQuery и фреймворк React. Оба этих инструмента предназначены для написания фронтенда на JS/TS, поэтому их вполне можно сравнивать.
Для примера возьмём маленькую и лёгкую задачу – создать простейший кликер с одной кнопкой и счётчиком нажатий.
На нативном JS+HTML эта задача решается так (HTML и JS-код намеренно объединены в один листинг для удобства):
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<span id="clickCount">0</span>
<button id="click">Click me</button>
<script>
const counter = document.querySelector('#clickCount');
const button = document.querySelector('#click');
let clicks = 0;
button.addEventListener('click', ()=>{
clicks++;
counter.textContent = clicks;
});
</script>
</body>
</html>
Предположим, что наш программист-кликатель захотел упростить себе жизнь и применить jQuery. Теперь его код выглядит так:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
</head>
<body>
<span id="clickCount">0</span>
<button id="click">Click me</button>
<script>
const counter = $('#clickCount');
let clicks = 0;
$('#click').on('click', ()=>{
clicks++;
counter.text(clicks);
});
</script>
</body>
</html>
Добавилась строка с подключением библиотеки, изменились названия функций и методов для работы с DOM-деревом, но концепция сохранилась – сначала производится поиск элемента на странице, а потом с ним производятся какие-то действия – подписка на событие, изменение текста и т.д.
Если же нашему кликеролюбу захочется использовать React – его код будет выглядеть примерно так:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="https://unpkg.com/react@17/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js" crossorigin></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
<body>
<div id="root"></div>
<script type="text/babel">
function App() {
const [clickCount, setClickCount] = React.useState(0);
const handleClick = () => {
setClickCount(clickCount + 1);
};
return (
<div>
<span>{clickCount}</span>
<button onClick={handleClick}>Click me</button>
</div>
);
}
ReactDOM.render(<App />, document.getElementById('root'));
</script>
</body>
</html>
Как видно, концепция разработки полностью изменилась, код стал выглядеть совсем иначе – теперь применяются компоненты, состояния и т.п.
Из этого примера можно сделать вывод – библиотеку легко встроить в существующий код, тогда как для программирования на фреймворке придётся переучиваться и менять методы разработки.
Но плохо ли это?
Для тренировки мозга новыми знаниями – нет. Для разработки – да, особенно, когда существует несколько разных фреймворков с разными подходами, миграция между которыми существующей кодовой базы превращается в боль и огромное количество рутинной работы. К тому же, из-за огромного распространения фреймворков начинающие программисты зачастую не умеют решать задачи без них и лепят их даже там, где можно обойтись легковесной библиотекой – особенно это заметно во фронтенде.
Что с этим делать?
Применять фреймворки только в тех случаях, когда их преимущества перевешивают недостатки – при разработке особо крупных проектов, а в остальных случаях обходиться набором библиотек.
This content originally appeared on DEV Community and was authored by ryzhpolsos