Если работаете с
CSS Variable Autocomplete
#css #tip
CSS properties
в VS Code
, то вот полезное расширениеCSS Variable Autocomplete
#css #tip
Visualstudio
CSS Variable Autocomplete - Visual Studio Marketplace
Extension for Visual Studio Code - Autocomplete CSS Variable support CSS, SCSS, LESS, PostCSS, VueJS, ReactJS and more
Я ранее советовал переходить от
Но нужно понимать, что переменные из
Это значит блок кода
не попадет в бандл вообще в первом случае, а аналог с конфиг файлом - попадет, (но не будет выполняться, естественно).
Так что иногда имеет смысл использовать эту конструкцию (для
#vite #tip
.env
к конфигурационным файлам в json
форматеНо нужно понимать, что переменные из
.env
заменяются в коде на этапе компиляции, а из конфига подставляются в райнтаймеЭто значит блок кода
if (import.meta.env.MODE === "development") {
// do some debug work
}
не попадет в бандл вообще в первом случае, а аналог с конфиг файлом - попадет, (но не будет выполняться, естественно).
Так что иногда имеет смысл использовать эту конструкцию (для
import.meta.env.MODE
переменной .env
файл не нужен, она определена всегда).#vite #tip
Telegram
Vue-FAQ
Как организовать конфигурационные параметры в приложении?
Наиболее удобна, имхо, следующая конфигурация конфигов.
Есть, грубо говоря, .env, .env.staging, .env.local
Локально используется .env.local, он в гитигноре, и у каждого разработчика свой. Если работаешь…
Наиболее удобна, имхо, следующая конфигурация конфигов.
Есть, грубо говоря, .env, .env.staging, .env.local
Локально используется .env.local, он в гитигноре, и у каждого разработчика свой. Если работаешь…
Если у вас есть массив, в каждом элементе которого есть
#tip #performance #reactivity
computed
, то лучше создать один на весь массив, чем много для каждого элемента// Bad
const rows = productRows.map(row => ({
...row,
total: computed(() => row.price * row.qty),
}));
// Good
const computedRows = computed(() =>
productRows.map(row => ({
...row,
total: row.price * row.qty,
}))
);
#tip #performance #reactivity
Глубокое клонирование реактивных объектов в Vue 3
3 рабочих способа
1. Комбинация
2. Ручное глубокое копирование
3. Библиотечные решения
#tip #reactivity
Vue 3
использует Proxy
для реактивности, что создает проблемы при попытке клонировать объекты. Стандартные методы работают не так, как ожидается:const state = reactive({ user: { name: "Al" } });
// Проблемы:
const badCopy1 = { ...state }; // сохраняет Proxy-ссылки
const badCopy2 = JSON.parse(JSON.stringify(state)); // теряет методы и Proxy
3 рабочих способа
1. Комбинация
toRaw
+ structuredClone
import { toRaw } from 'vue';
const original = reactive({ data: 123 });
const copy = structuredClone(toRaw(original));
2. Ручное глубокое копирование
function deepClone(obj) {
if (obj === null || typeof obj !== 'object') return obj;
const clone = Array.isArray(obj) ? [] : {};
for (const key in obj) {
clone[key] = deepClone(obj[key]);
}
return clone;
}
const copy = reactive(deepClone(toRaw(original)));
3. Библиотечные решения
import { cloneDeep } from 'lodash-es';
const copy = reactive(cloneDeep(toRaw(obj)));
#tip #reactivity
This media is not supported in your browser
VIEW IN TELEGRAM
:hover > :not(:hover)
#css #tip
hover
обычно используется, чтобы выделить какой-то элемент. Но иногда красивей что-то сделать с остальнымиul {
@media (hover) and (prefers-reduced-motion: no-preference) {
& > li {
transform-origin: left center;
transition: transform 1s var(--ease-spring-3), opacity 0.3s var(--ease-3);
}
&:hover > li:not(:hover) {
opacity: 0.25;
transform: scale(0.8);
}
}
}
#css #tip
В
И не забываем, что
#js #tip
JS
чтобы выйти из вложенных циклов можно использовать меткиouterLoop: for (let i = 0; i < 5; i++) {
let j = 0;
while (true) {
if (j === 2) {
break outerLoop; // Выходит из внешнего цикла
}
j++;
}
}
И не забываем, что
Array.prototype.sort()
приводит к строкам. Нужен компаратор.[10, 2, 1].sort(); // [1, 10, 2] (как строки!)
[10, 2, 1].sort((a, b) => a - b); // [1, 2, 10] (правильно)
#js #tip
Метод
Браузер дает запросу
Практические применения
- Финализация аналитических данных - отправка собранной за сессию аналитики перед закрытием страницы
- Автосохранение - сохранение последнего состояния приложения, которое пользователь мог не сохранить явно
- Отчеты об ошибках - гарантированная отправка логов о критических ошибках
- Трекинг поведения - фиксация последних действий пользователя перед уходом
Ограничения
- Максимальный размер полезной нагрузки ограничен (обычно 64Кб)
- Поддерживает только POST-запросы
- Не поддерживает кастомные заголовки
- Ответ сервера не может быть обработан
#tip
navigator.sendBeacon()
предоставляет возможность гарантированно отправить небольшой объем данных на сервер, даже если пользователь закрывает страницу или браузер. В отличие от традиционных AJAX
-запросов, которые могут быть прерваны при выгрузке страницы, sendBeacon
обеспечивает доставку данных в таких сценариях.Браузер дает запросу
sendBeacon
приоритетное выполнение перед завершением работы страницы, что делает этот метод идеальным для критически важных данных.Практические применения
- Финализация аналитических данных - отправка собранной за сессию аналитики перед закрытием страницы
- Автосохранение - сохранение последнего состояния приложения, которое пользователь мог не сохранить явно
- Отчеты об ошибках - гарантированная отправка логов о критических ошибках
- Трекинг поведения - фиксация последних действий пользователя перед уходом
const data = JSON.stringify({event: 'page_close', time: Date.now()});
navigator.sendBeacon('/analytics', data);
Ограничения
- Максимальный размер полезной нагрузки ограничен (обычно 64Кб)
- Поддерживает только POST-запросы
- Не поддерживает кастомные заголовки
- Ответ сервера не может быть обработан
#tip
Несколько месяцев назад
Можно пойти дальше - попросите
Экономия времени и кредитов.
(не для
P.S. В новом Курсоре появилась фича
#ai #cursor #tip
Cursor
(и другие, наверно, тоже) научились работать с линтером, за один прогон исправляя ошибкиМожно пойти дальше - попросите
Cursor
написать и использовать тестовый скрипт для проверки некого функционала (без каких либо тестовых библиотек), который вы ему заказали. Тогда агент будет в цикле сам запускать этот скрипт, который будет проверять правильность уже проектного кода, ставить логи, изучать ошибки и исправлять их, пока всё не пофиксит. Часто он делает это сам.Экономия времени и кредитов.
(не для
vue
, для js
, py
, php
etc).P.S. В новом Курсоре появилась фича
Run agent in Clouds
, включенная по умолчанию, из-за которой редактор начинает жутко тормозить. Можно отключить.#ai #cursor #tip
При использовании
Единственное найденное решение
#router #tip
router-view
с transition
с mode="out-in"
в dev режиме
при переходах по роутам часто ловится белый экранЕдинственное найденное решение
-
отключать этот mode
в dev
режиме<router-view v-slot="{ Component }">
<Transition mode="out-in">
<component :is="Component" />
</Transition>
</router-view>
#router #tip
Совет: если ваш
—
На днях
#ai #tip #cursor
Cursor
начал сильно тормозить, почистите историю чатов—
На днях
Anthropic
опубликовала длинный документ, в котором описывает, как его сотрудники используют Claude Code
. Можно рассматривать, как полезные советы при работе с AI
.#ai #tip #cursor