@nitra/cursor 1.0.9 → 1.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/mdc/vue.mdc +191 -0
- package/package.json +1 -1
package/mdc/vue.mdc
ADDED
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Vue
|
|
3
|
+
alwaysApply: true
|
|
4
|
+
version: '1.1'
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Vue 3 (Composition API)
|
|
8
|
+
|
|
9
|
+
# Vue 3 Composition API — правила для .cursorrules
|
|
10
|
+
|
|
11
|
+
## Найкращі практики Vue 3 Composition API
|
|
12
|
+
|
|
13
|
+
```javascript
|
|
14
|
+
const vue3CompositionApiBestPractices = [
|
|
15
|
+
'Використовуй функцію setup() для логіки компонента',
|
|
16
|
+
'Реалізуй computed properties через computed()',
|
|
17
|
+
'Використовуй watch і watchEffect для side effects',
|
|
18
|
+
'Підключай lifecycle hooks: onMounted, onUpdated тощо',
|
|
19
|
+
'Використовуй provide/inject для dependency injection'
|
|
20
|
+
]
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Структура папок
|
|
24
|
+
|
|
25
|
+
```javascript
|
|
26
|
+
const folderStructure = `
|
|
27
|
+
src/
|
|
28
|
+
components/
|
|
29
|
+
composables/
|
|
30
|
+
views/
|
|
31
|
+
router/
|
|
32
|
+
store/
|
|
33
|
+
assets/
|
|
34
|
+
App.vue
|
|
35
|
+
main.js
|
|
36
|
+
`
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Найменування файлів
|
|
40
|
+
|
|
41
|
+
- **SFC:** імена файлів компонентів у **PascalCase** (`MyWidget.vue`).
|
|
42
|
+
- **Інші JS-модулі:** узгоджено **kebab-case** (`date-utils.js`).
|
|
43
|
+
|
|
44
|
+
### Модулі та архітектура
|
|
45
|
+
|
|
46
|
+
- **ES modules** (`import`/`export`), один модуль — одна відповідальність, уникай **circular dependencies**.
|
|
47
|
+
- **Composition** замість успадкування; логіку для повторного використання винось у **composables** (замість зайвих HOC, де це доречно).
|
|
48
|
+
- **SFC** для template + script + style; за потреби розділяй presentational і container-компоненти (UI vs дані/оркестрація).
|
|
49
|
+
|
|
50
|
+
### Code splitting
|
|
51
|
+
|
|
52
|
+
- **Route-based:** lazy-імпорти в маршрутах (`() => import('...')`) і async components.
|
|
53
|
+
|
|
54
|
+
## Додаткові вказівки
|
|
55
|
+
|
|
56
|
+
```javascript
|
|
57
|
+
const additionalInstructions = `
|
|
58
|
+
1. Використовуй JavaScript
|
|
59
|
+
2. Коректно оголошуй props і emits
|
|
60
|
+
3. За потреби використовуй компонент Teleport у Vue 3
|
|
61
|
+
4. Застосовуй Suspense для async components
|
|
62
|
+
5. Реалізуй належний error handling
|
|
63
|
+
6. Дотримуйся Vue 3 style guide і naming conventions
|
|
64
|
+
7. Використовуй Vite для швидкої розробки та збірки
|
|
65
|
+
`
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Детальні вказівки
|
|
69
|
+
|
|
70
|
+
1. **Vue router**: Завжди використовуй Vue router для маршрутизації в проекті версії 5 та його file-based routing.
|
|
71
|
+
2. **Компонент Teleport**: Використовуй Teleport у Vue 3, коли потрібно рендерити поза поточною ієрархією DOM.
|
|
72
|
+
3. **Suspense для async components**: Застосовуй Suspense для асинхронних компонентів і кращого UX.
|
|
73
|
+
4. **Error handling**: Реалізуй глобальний error handling механізмами Vue 3, щоб коректно перехоплювати та обробляти помилки.
|
|
74
|
+
5. **Style guide і naming**: Дотримуйся офіційного Vue 3 style guide і naming conventions для узгодженості кодової бази.
|
|
75
|
+
6. **Vue macros**: Використовуй Vue macros для більш ефективного розробки компонентів.
|
|
76
|
+
7. **Vue Reactivity Transform**: Використовуй Vue Reactivity Transform для змінних в компонентах.
|
|
77
|
+
|
|
78
|
+
### Патерни та антипатерни
|
|
79
|
+
|
|
80
|
+
- **provide/inject** — для глибоко вкладених залежностей; **renderless**-компоненти / **slots** — коли логіку відділяєш від розмітки.
|
|
81
|
+
- **HTTP:** окремі модулі **services** або **composables** для API; **async/await**.
|
|
82
|
+
- **Події:** батько–дитина через **emits**; для не пов’язаних гілок — **store** / **provide-inject**, уникай глобального **event bus** у новому коді.
|
|
83
|
+
- Не мутуй **props** напряму — оновлення через подію вгору або v-model.
|
|
84
|
+
- Обмежуй зайве в глобальному стані; локальний стан у компоненті — за замовчуванням.
|
|
85
|
+
- Уникай прямої роботи з **DOM**, якщо достатньо реактивного шаблону та ref.
|
|
86
|
+
- **Magic numbers/strings** винось у константи; **computed** тримай простими, важкі обчислення — у функції або утиліти.
|
|
87
|
+
|
|
88
|
+
### State management
|
|
89
|
+
|
|
90
|
+
- **Single source of truth** для спільних даних: у нових проєктах на Vue 3 **Pinia** (модульні stores, actions)
|
|
91
|
+
- Похідний стан — через обчислення в store або **computed** у компонентах, без «тихих» побічних ефектів у getters.
|
|
92
|
+
|
|
93
|
+
### Обробка помилок (додатково)
|
|
94
|
+
|
|
95
|
+
- **try/catch** навколо async-операцій; зрозумілі повідомлення для користувача; логування на сервіс моніторингу за потреби.
|
|
96
|
+
- **Error boundary**-підхід у Vue — через окремі компоненти-обгортки та `onErrorCaptured` / глобальні хендлери залежно від архітектури.
|
|
97
|
+
|
|
98
|
+
### Продуктивність
|
|
99
|
+
|
|
100
|
+
- **v-for** — стабільні унікальні **`:key`**; не плутай **v-if** (умовний mount) і **v-show** (перемикання visibility).
|
|
101
|
+
- Важкі **computed** / **watch** — не робити зайвої роботи; **debounce/throttle** для частих подій.
|
|
102
|
+
- **v-once** для статичного вмісту; уникай глибоко вкладених дерев без потреби.
|
|
103
|
+
- Після ручних **addEventListener** / підписок — прибирай у **onUnmounted**.
|
|
104
|
+
|
|
105
|
+
### Безпека
|
|
106
|
+
|
|
107
|
+
- Не довіряй **v-html** без санітизації; для форм/API — **CSRF**-захист за потреби; валідація **на сервері** обов’язкова.
|
|
108
|
+
|
|
109
|
+
### Тестування
|
|
110
|
+
|
|
111
|
+
- **Unit / component:** **Vue Test Utils**; з **Vite** зручно **Vitest**.
|
|
112
|
+
- **E2E:** **Playwright** змістовні сценарії користувацьких потоків.
|
|
113
|
+
|
|
114
|
+
### Інструменти (узгоджено з Vite і цим правилом)
|
|
115
|
+
|
|
116
|
+
- Якість коду: **ESLint** + **eslint-plugin-vue**; форматування — **oxfmt**, див. `js-format.mdc`.
|
|
117
|
+
- Збірка та dev-сервер — **Vite**
|
|
118
|
+
- **Vue Devtools** для дебагу; продакшен-збірка — **`vite build`**, оптимізація асетів і кешування на рівні деплою / CDN.
|
|
119
|
+
|
|
120
|
+
### CI/CD
|
|
121
|
+
|
|
122
|
+
- У pipeline: **install**, **lint**, **test**, **vite build**; артефакти з продакшен-режиму.
|
|
123
|
+
|
|
124
|
+
### Приклад
|
|
125
|
+
|
|
126
|
+
```javascript
|
|
127
|
+
// Приклад Vue 3 компонента з Composition API
|
|
128
|
+
import { computed, onMounted } from 'vue'
|
|
129
|
+
|
|
130
|
+
export default {
|
|
131
|
+
setup() {
|
|
132
|
+
const count = $ref(0)
|
|
133
|
+
const doubleCount = computed(() => count * 2)
|
|
134
|
+
|
|
135
|
+
onMounted(() => {
|
|
136
|
+
console.log('Компонент змонтовано')
|
|
137
|
+
})
|
|
138
|
+
|
|
139
|
+
return {
|
|
140
|
+
count,
|
|
141
|
+
doubleCount
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
в файлі .vscode/extensions.json є налаштування для Vue:
|
|
148
|
+
|
|
149
|
+
```json title=".vscode/extensions.json"
|
|
150
|
+
{
|
|
151
|
+
"recommendations": ["Vue.volar"]
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
мінімальний повний `package.json` для Vite + Vue + `vue-macros` (версії підлаштуй під проєкт):
|
|
156
|
+
|
|
157
|
+
```json title="package.json"
|
|
158
|
+
{
|
|
159
|
+
"name": "my-vue-app",
|
|
160
|
+
"private": true,
|
|
161
|
+
"type": "module",
|
|
162
|
+
"dependencies": {
|
|
163
|
+
"vue": "^3.5.0"
|
|
164
|
+
},
|
|
165
|
+
"devDependencies": {
|
|
166
|
+
"vite": "^8.0.0",
|
|
167
|
+
"@vitejs/plugin-vue": "^6.0.0",
|
|
168
|
+
"vue-macros": "^3.1.2"
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
```javascript title="vite.config.js"
|
|
174
|
+
import Vue from '@vitejs/plugin-vue'
|
|
175
|
+
import VueMacros from 'vue-macros/vite'
|
|
176
|
+
import { defineConfig } from 'vite'
|
|
177
|
+
|
|
178
|
+
export default defineConfig({
|
|
179
|
+
plugins: [
|
|
180
|
+
VueMacros({
|
|
181
|
+
plugins: {
|
|
182
|
+
vue: Vue()
|
|
183
|
+
}
|
|
184
|
+
})
|
|
185
|
+
]
|
|
186
|
+
})
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### Висновок
|
|
190
|
+
|
|
191
|
+
Дотримуючись цих практик і правил, можна будувати масштабовані, підтримувані та ефективні застосунки на Vue 3 з Composition API. Завжди звіряйся з офіційною документацією Vue 3 щодо оновлень і нових можливостей.
|