Задать вопрос
  • Как изменить цвет шрифта для новых файлов Git?

    @jazzus Автор вопроса
    Все работает с addedResourceForeground, не те файлы смотрел)
    Ответ написан
    Комментировать
  • Как создать define для одного vue документа?

    SeaInside
    @SeaInside
    15 лет пилю все эти штуки
    Судя по всему, вам нужно просто заменять одну строку на другую?
    В webpack такие преобразования делаются с помощью лоадеров, например, вам может подойти string-replace-loader (сам не пользуюсь, но по тексту задачи - почему бы и не да).

    Но вообще это странно, на несуществующий в данном контексте SOMETHING будет ругаться и IDE, и линтеры, да и вообще это какая-то магия, а чем меньше магии, тем лучше.
    Если приведёте конкретный пример, а не абстрактный SOMETHING, то будет понятнее, чего вы хотите и, вероятно, можно будет посоветовать более очевидное решение.
    Ответ написан
    Комментировать
  • Как в service worker добавить заголовок X-Powered-By?

    @newaitix Автор вопроса
    var version='5.4.3.5';
    self.addEventListener('install',function(ev){
    	ev.waitUntil(caches.open(version).then(function(cache){
    		if(location.protocol=='http:'||location.protocol=='https:'){
    			return fetch('/resource.json').then(function(res){
    				return res.json();
    			}).then(function(files){
    				return cache.addAll(files);
    			});
    		}
    	}));
    	self.skipWaiting();
    });
    self.addEventListener('activate',function(ev){
    	ev.waitUntil(caches.keys().then(function(keyList){
    		return Promise.all(keyList.map(function(key){
    			if(version!=key){
    				return caches.delete(key);
    			}
    		}));
    	}));
    });
    self.addEventListener('fetch',function(ev){
    	ev.respondWith(caches.match(ev.request).then(function(res){
    		return res||fetch(ev.request).then(function(res){
    			var resToCache=res.clone(),
    				newHeaders=new Headers(resToCache.headers);
    			newHeaders.append('X-Powered-By','nginx');
    			var anotherResponse=new Response(resToCache.body,{
    					status: resToCache.status,
    					statusText: resToCache.statusText,
    					headers: newHeaders
    				});
    			caches.open(version).then(function(cache){
    				if(ev.request.method!='POST'&&(new URL(ev.request.url).protocol=='http:'||new URL(ev.request.url).protocol=='https:')){
    					cache.put(ev.request,anotherResponse);
    				}
    			});
    			return res;
    		}).catch(function(){
    			return caches.match('/offline.html');
    		});
    	}));
    });
    Ответ написан
    Комментировать
  • Как работает веб-сервер и node js в связке? Зачем нужен Nginx?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Веб-разработка
    Самое простое - nginx отдаёт статику. На больших объёмах делать это через Ноду неэффективно.
    Посложнее - nginx позволяет управлять ходом запроса. Например, редиректить на https.
    Ещё сложнее - можно настроить nginx, чтобы он умно балансировал запросы между несколькими бэкендами и автоматом блокировал слишком частые попытки подключения.

    Nginx очень хорошо в промышленных масштабах делает определённую часть работы, связанной с http-запросом, поэтому ему эту часть работы и делегируют.
    Ответ написан
    Комментировать
  • Как с помощью JS автоматически повернуть экран пользователя на мобильном устройстве?

    Stalker_RED
    @Stalker_RED
    Lynn «Кофеман», неправда, не только сообщение. Можно сделать
    document.body.style.transform = 'rotate(90deg)'; // попробуйте в консоли

    И ширину с высотой подкорректировать.
    Ответ написан
    5 комментариев
  • Как прописывать типы для связывания их с библиотечным кодом?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Нужен код. Вопрос абстрактный слишком. (или ты не заключил код в тег <code></code> :) )
    Получить тип из имеющейся функции: type Fuc = typeof func;.
    Получить тип параметров передаваемых в функцию и тип возвращаемого значения: Parameters<Func> и ReturnType<Func> соответсвенно.
    Для сложных типов с дженериками - смотреть надо отдельно.
    Ответ написан
    1 комментарий
  • Как попасть в "Список организаций" при поисковом запросе Яндекса?

    deepblack
    @deepblack
    Настроить Обогащённые ответы:
    Обогащённые ответы — это разновидность сниппетов, или блоков поисковой выдачи. Такие сниппеты, помимо заголовка веб-страницы и её описания, содержат дополнительные данные: картинки, ссылки на разделы сайта, адреса и телефоны и так далее. Обогащённые ответы позволяют пользователям быстрее получить ответ на свой вопрос, а владельцам сайтов — привлечь больше посетителей на свой ресурс.
    Ответ написан
    Комментировать
  • Как в Nginx применить одни настройки сразу ко всем хостам?

    один раз придется все конфиги дополнить инструкцией include common.conf;

    Создать этот файл common.conf и в него помещать общие инструкции.

    Как вариант, скрипт написать, который вставит дополнение в каждый конфиг.
    Ответ написан
    1 комментарий
  • Есть ли возможность бесконечно увеличивать css свойство с помощью анимации?

    Stalker_RED
    @Stalker_RED
    Для CSS анимации обязательно нужно задать начальную и конечную точки, так что бесконечно не получится.
    Но на самом деле вам и не нужна бесконечность, т.к. браузер сломается примерно на 34 млн пикселей. Так что можете задать достаточно большое число, к примеру 30 млн, и подобрать нужную скорость. И ждите крэшрепорты от юзеров, у которых кончилась память)
    Ответ написан
    Комментировать
  • Как уникализировать массив объектов?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Собираем ключ-значение, выдёргиваем значения:

    [...new Map(arr.map(n => [ n.value, n ])).values()]
    
    // или
    
    Object.values(arr.reduce((acc, n) => (acc[n.value] ??= n, acc), {}))

    Фильтрация, запоминаем кого встретили, первый раз пропускаем, остальные нет:

    arr.filter(function(n) {
      return !(this[n.value] = this.hasOwnProperty(n.value));
    }.bind({}))
    
    // или
    
    arr.filter(function({ value }) {
      return !this.set(value, this.has(value)).get(value);
    }, new Map)
    
    // или
    
    arr.filter(((picked, { value: n }) => !picked.has(n) && picked.add(n)).bind(null, new Set))

    Фильтрация, ищем элемент похожий на текущий, его же и нашли - окей:

    arr.filter((n, i, a) => n === a.find(m => m.value === n.value))
    
    // или
    
    arr.filter((n, i, a) => i === a.findIndex(m => Object.is(m.value, n.value)))

    Ну и чего-нибудь странного ещё добавим:

    Array.from(
      new Set(arr.map(n => n.value)),
      n => arr.find(m => m.value === n)
    )
    
    // или
    
    arr
      .slice()
      .sort((a, b) => a.value.localeCompare(b.value))
      .filter((n, i, a) => n.value !== a[i - 1]?.value)
    Ответ написан
    1 комментарий
  • Как заблокировать доступ к сайтам в NGINX?

    @dodo512
    location / {
        proxy_pass http://backend;
    }
    
    location ~ ^/(smokeping|pgadmin4) {
        allow 192.168.11.0/25;
        deny all;
        
        proxy_pass http://backend;
    }
    Ответ написан
    1 комментарий
  • Как реализовать SSR без использования глобального хранилища (на примере Vue 3)?

    @MEDIOFF
    Python Developer
    А причем у вас Vuex и SSR? Vuex просто хранит состояние - нет Vuex нет состояния, вы ничего не прокидываете на клиент с сервера, клиент каждый раз ходит к вам за новой страничкой, и вы ему отдаете ее уже наполненную со всеми данными - это и есть SSR, к примеру у вас обычно Vue получает список товаров с сервера, как получит показывает карточки, с SSR вы отдаете страничку сразу с карточками готовыми.
    По факту SSR нужен для SEO в большей части, так как я не знаю людей которые отрубают js в браузере

    Если нужен SSR, то рекомендую не изобретать велосипед, а посмотреть в сторону Nuxt
    Ответ написан
  • Как поменять цвет букв при пересечение картинки?

    Ankhena
    @Ankhena Куратор тега CSS
    Нежно люблю верстку
    Например, так https://jsfiddle.net/hpsct6Lg/
    Или делать градиент для текста и на JS выяснять, где у него точка перехода.
    Ответ написан
    2 комментария
  • Как задать выполнение скрипта bash по собственному расписанию?

    fox_12
    @fox_12
    Расставляю биты, управляю заряженными частицами
    В файле holidays.txt выписать праздничные даты согласно производственного календаря в формате %d.%m.%y

    При запуске проверять текущую дату
    #!/bin/bash
    
    if  cat holidays.txt | grep `date +"%d.%m.%y"` > /dev/null ; then
       # выполнять если праздник
    else
       # выполнять если не праздник
    fi
    Ответ написан
    Комментировать
  • Сборка проекта под разные сайты?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Если разные версии одних и тех же компонентов(различающихся только внутри но имеющих идентичный интерфейс), то можно просто использовать алиасы, типа:
    alias: { 
      '@component-1': {
        'site1': path.resolve(__dirname, './site1/component-1.vue'),
        'site2': path.resolve(__dirname, './site2/component-1.vue'),
      }[process.env.TARGET]
    }
    import Component1 from '@component-1';
    Это если не билдить лишнего. А так, если размер не критичен, можно просто использовать конфиг-файл и <component :is="var"/>.
    Ответ написан
    2 комментария
  • Что необходимо знать и уметь для реализации механизма схожего с Git для управления версиями документов?

    Вот частичный перевод и там же ссылка на оригинальную документацию где описано внутренне устройство https://m.habr.com/ru/company/badoo/blog/163853/

    P. S. Это ж как надо пытаться "не найти" , чтобы действительно не найти эту документацию?
    Ответ написан
    Комментировать
  • Какой сброс будет лучше для css?

    valgerofficial
    @valgerofficial
    Вот так

    *,
    ::before,
    ::after {
        padding: 0;
        margin: 0;
    
        -webkit-box-sizing: border-box;
           -moz-box-sizing: border-box;
             -o-box-sizing: border-box;
                box-sizing: border-box;
    }
    
    html {
        -webkit-text-size-adjust: 100%;
        -ms-text-size-adjust: 100%;
        -webkit-font-smoothing: subpixel-antialiased;
        text-rendering: geometricPrecision;
    }
    
    body {
        margin: 0;
        padding: 0;
        font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Helvetica Neue, sans-serif;
    
        -webkit-font-smoothing: subpixel-antialiased;
        -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
        -webkit-touch-callout: none;
    }
    
    html,
    body {
        height: 100%;
        min-height: 100%;
        font-feature-settings: kern 1, liga 1, calt 1, pnum 1, tnum 0, onum 1, lnum 0, dlig 0;
    }
    
    html,
    body,
    article,
    aside,
    details,
    figcaption,
    figure,
    footer,
    header,
    hgroup,
    main,
    menu,
    nav,
    section,
    summary {
        display: block;
    }
    
    h1,
    h2,
    h3,
    h4,
    h5,
    h6 {font-weight: 400;}
    
    h1  {font-size: 2.2em;}
    h2  {font-size: 1.9em;}
    h3  {font-size: 1.65em;}
    h4  {font-size: 1.4em;}
    h5  {font-size: 1.2em;}
    h6  {font-size: 1em;}
    
    audio:not([controls]) {
        display: none;
        height: 0;
    }
    
    [hidden],
    template {
        display: none;
    }
    
    a {
        background: transparent;
        text-decoration: none;
        cursor: pointer;
    }
    
    a:active,
    a:hover {
        outline: 0;
    }
    
    img {
        border: 0;
    }
    
    ul,
    li {
        outline: 0;
        border: 0;
        list-style: none;
    }
    
    abbr {
        cursor: help;
        font-feature-settings: kern 1, liga 1, calt 1, pnum 1, tnum 0, onum 1, lnum 0, smcp 1, c2sc 1;
    }
    
    abbr[title] {
        text-decoration: none;
        border-bottom: 1px dotted;
    }
    
    b,
    strong {
        font-weight: 700;
    }
    
    dfn {
        font-style: italic;
    }
    
    mark {
        background: #ff0;
        color: #000;
    }
    
    time {
        font-feature-settings: kern 1, liga 1, calt 1, pnum 1, tnum 0, onum 1, lnum 0;
    }
    
    small {
        font-weight: 400;
        font-size: 80%;
    }
    
    sub,
    sup {
        font-size: 75%;
        line-height: 0;
        position: relative;
        vertical-align: baseline;
    }
    
    sup {
        top: -0.5em;
        font-feature-settings: kern 1, liga 1, calt 1, pnum 1, tnum 0, onum 1, lnum 0, dlig 0, sups 1;
    }
    
    sub {
        bottom: -0.25em;
        font-feature-settings: kern 1, liga 1, calt 1, pnum 1, tnum 0, onum 1, lnum 0, dlig 0, subs 1;
    }
    
    svg:not(:root) {
        overflow: hidden;
    }
    
    hr {
        height: 0;
        -webkit-box-sizing: content-box;
        -moz-box-sizing: content-box;
        box-sizing: content-box;
    }
    
    pre {
        overflow: auto;
    }
    
    code,
    kbd,
    pre,
    samp {
        font-family: "Source Code Pro", Consolas", "Courier New", SFMono-Regular, Menlo, Monaco, monospace;
        font-size: 0.8em;
        font-feature-settings: kern 0, liga 0, calt 1, dlig 0, pnum 0, tnum 1, onum 0, lnum 1, zero 1;
    }
    
    button,
    form,
    input,
    optgroup,
    select,
    textarea {
        outline: 0;
        color: inherit;
        font: inherit;
    }
    
    button,
    select {
        border: 0;
        text-transform: none;
    }
    
    button,
    html input[type="button"],
    input[type="reset"],
    input[type="submit"] {
        -webkit-appearance: button;
        cursor: pointer;
    }
    
    button:not(:disabled),
    [type="button"]:not(:disabled),
    [type="reset"]:not(:disabled),
    [type="submit"]:not(:disabled) {
      cursor: pointer;
    }
    
    button[disabled],
    html input[disabled] {
        cursor: default;
    }
    
    button::-moz-focus-inner,
    input::-moz-focus-inner {
        border: 0;
    }
    
    input {
        line-height: normal;
    }
    
    input[type="radio"],
    input[type="checkbox"] {
        box-sizing: border-box;
        padding: 0;
    }
    
    input[type="number"]::-webkit-inner-spin-button,
    input[type="number"]::-webkit-outer-spin-button {
        height: auto;
    }
    
    input[type="search"] {
        -webkit-appearance: textfield;
        -moz-box-sizing: content-box;
        -webkit-box-sizing: content-box;
        box-sizing: content-box;
    }
    
    input[type="search"]::-webkit-search-cancel-button,
    input[type="search"]::-webkit-search-decoration {
        -webkit-appearance: none;
    }
    
    input[type="color"],
    input[type="date"],
    input[type="datetime"],
    input[type="datetime-local"],
    input[type="number"],
    input[type="range"],
    input[type="tel"],
    input[type="week"] {
        font-feature-settings: kern 0, liga 1, calt 1, pnum 1, tnum 0, onum 0, lnum 1, zero 0;
    }
    
    fieldset {
        border: 1px solid silver;
        margin: 0 2px;
        padding: 0.35em 0.625em 0.75em;
    }
    
    legend {
        border: 0;
    }
    
    textarea {
    	resize: vertical;
        overflow: auto;
    }
    
    optgroup {
        font-weight: 700;
    }
    
    table {
        border-collapse: collapse;
        border-spacing: 0;
    }
    
    tbody,
    caption {
        font-feature-settings: kern 1, liga 1, calt 1, pnum 0, tnum 1, onum 0, lnum 1, zero 1;
    }

    Ответ написан
    Комментировать