Разница между composable-функциями Vue 3 и модулями JS

Обе концепции позволяют разделять код, но они решают разные задачи. Давай разберёмся, что к чему.


Пункт 1. Composable-функции – это про реактивность Vue

📌 Что делают?

  • Работают с ref, reactive, computed, watch и другими реактивными штуками Vue.
  • Позволяют повторно использовать логику, связанную с состоянием компонентов.
  • Используют Composition API (setup()).

📌 Пример Composable для отслеживания размеров окна  useWindowSize.js import { ref, onMounted, onUnmounted } from 'vue';

export function useWindowSize() {   const width = ref(window.innerWidth);   const height = ref(window.innerHeight);

function updateSize() {     width.value = window.innerWidth;     height.value = window.innerHeight;   }

onMounted(() => window.addEventListener('resize', updateSize));   onUnmounted(() => window.removeEventListener('resize', updateSize));

return { width, height }; } ➡️ Главное отличие – тут используется ref, onMounted, onUnmounted, что делает код реактивным.


Пункт 2. Обычные модули JS – это про обычную логику

📌 Что делают?

  • Содержат обычные функции и переменные.
  • Не зависят от Vue и не работают с реактивностью.
  • Используются в любом JS-проекте.

📌 Пример: модуль для работы с датами  dateUtils.js export function formatDate(date) {   return new Date(date).toLocaleDateString(); }

export function getCurrentYear() {   return new Date().getFullYear(); } ➡️ Главное отличие – это просто набор чистых функций, не использующих Vue. Такой себе функциональный подход.


Пункт 3. Когда что использовать?

Нужно работать с реактивными данными  ✅ Composable-функции  ❌ JS-модули

Нужно управлять жизненным циклом (onMounted, onUnmounted)  ✅ Composable-функции  ❌ JS-модули

Нужно просто переиспользовать утилитарные функции  ❌ Composable-функции  ✅ JS-модули

Нужно слушать события (resize, input, click и т.д.) внутри Vue  ✅ Composable-функции  ❌ JS-модули

🎯 Вывод

  • Composable-функции = реактивность, ref, computed, watch, Vue API.
  • JS-модули = обычные функции, без реактивности, можно использовать в любом проекте.

Посему Если твой код завязан на Vue и реактивность – используй composable. Если нужна просто библиотека функций – делай обычный JS-модуль. 🚀

@leadWithout