01 Что такое дебаунс и дроссель и для чего они нужны?

Отказаться

Как следует из названия, debounce предотвращает дрожание и не принимает одно событие несколько раз. Печатание на клавиатуре — это операция по устранению дребезга, с которой вы будете сталкиваться каждый день.

Легко понять концепцию, когда у вас есть контекст. Позвольте мне рассказать вам о некоторых случаях дебаунса:

  1. Кнопки входа и отправки текстовых сообщений быстро нажимаются пользователями, поэтому отправляется несколько запросов, и требуется устранение отказов.
  2. При изменении размера окна браузера количество событий изменения размера слишком велико, что приводит к слишком большому количеству вычислений. Вам нужно отказаться от дребезга, чтобы избежать множественных вычислений.
  3. Текстовый редактор сохраняет в режиме реального времени и сохраняет через одну секунду без каких-либо изменений.

Код устранения дребезга показан ниже, видно, что основное внимание при отмене дребезга уделяется очистке clearTimeout(timer)

function debounce (f, wait) {
  let timer
  return (...args) => {
    clearTimeout(timer)
    timer = setTimeout(() => {
      f(...args)
    }, wait)
  }
}

Дроссель

Дроссель управляет частотой событий, например, раз в секунду или раз в минуту. Это похоже на Rate Limit, управляемое сервером и шлюзом.

  1. События прокрутки, которые вычисляют информацию о местоположении каждую секунду и т. д.
  2. События воспроизведения в браузере и информация о ходе выполнения рассчитываются каждую секунду и т. д.
  3. Поле ввода выполняет поиск в режиме реального времени и отправляет запрос на отображение выпадающего списка, а также отправляет запрос каждую секунду (его также можно использовать для устранения дребезга)

Код дроссельной заслонки показан ниже, видно, что ключ дроссельной заслонки запирается timer=timeout

function throttle (f, wait) {
  let timer
  return (...args) => {
    if (timer) { return }
    timer = setTimeout(() => {
      f(...args)
      timer = null
    }, wait)
  }
}

Заключение

  1. Debounce: чтобы предотвратить дрожание, триггер события будет сброшен в течение единицы времени, чтобы избежать случайного запуска события несколько раз. Реализация сосредоточена на очистке clearTimeout. Debounce может быть примером ожидания лифта, ему нужно подождать некоторое время, пока входит один человек.
  2. Дросселирование: для управления потоком событие может запускаться только один раз в единицу времени, что аналогично ограничению скорости на стороне сервера. Реализация фокусируется на блокировке и разблокировке timer=timeout; timer=null. Дроссель может быть примером проезда через светофор, а можно проехать замес на каждый зеленый свет.

02 Как получить уникальный идентификатор браузера в интерфейсе

Из-за разных параметров рендеринга и алгоритмов сглаживания при отрисовке холста на разных системных видеокартах CRC проверка отрисовываемых данных изображения также отличается.

function getCanvasFp () {
  const canvas = document.getElementById('canvas')
  const ctx = canvas.getContext('2d')
  ctx.font = '14px Arial'
  ctx.fillStyle = '#ccc'
  ctx.fillText('hello, shanyue', 2, 2)
  return canvas.toDataURL('image/jpeg')
}

Таким образом, из холста можно получить уникальный идентификатор, который учитывает информацию об отпечатке браузера.

  1. Получить base64 строку URL-адреса данных изображения через холст
  2. Выполните вычисление дайджеста MD5 для строки bas464, чтобы получить информацию об отпечатке пальца.

Тем не менее, есть зрелые решения для этой потребности. Если вы используете его в производственной среде, вы можете использовать приведенную ниже библиотеку.

Он получает информацию об отпечатках пальцев браузера на основе следующей информации, и эта информация становится компонентом

  1. canvas
  2. webgl
  3. UserAgent
  4. AudioContext
requestIdleCallback(function () {
  Fingerprint2.get((components) => {
    const values = components.map((component) => component.value)
    const fp = Fingerprint2.x64hash128(values.join(''), 31)
  })
})

fingerprintjs2 имеют разные классификации компонентов

  1. browser-independent component: некоторые компоненты могут получать одинаковое значение в разных браузерах на одном и том же устройстве, а некоторые независимые браузеры могут получать разные значения.
  2. stable component: значение некоторых компонентов не изменится после обновления, которое называется стабильным компонентом.

Мы можем выбрать соответствующие компоненты в соответствии с бизнесом

const options = {
  excludes: {userAgent: true, language: true}
}

Заключение

Информация об отпечатках пальцев браузера может быть получена в соответствии с холстом

  1. Получить base64 строку URL-адреса данных изображения через холст
  2. Выполните вычисление дайджеста MD5 для строки bas464, чтобы получить информацию об отпечатке пальца.

Если он используется в производственной среде, fingerprintjs2 можно использовать для соответствующего компонента в соответствии с бизнес-требованиями, например, может ли одно устройство быть кросс-браузерным.

03 Как получить IP клиента в серверном приложении

Если есть заголовок x-forwarded-for request, возьмите первый IP-адрес, в противном случае возьмите remoteAddr сокета, установившего соединение.
И x-forwarded-for в основном стал стандартным HTTP-заголовком на основе прокси. Формат следующий. Видно, что первый IP-адрес представляет его реальный IP-адрес. Вы можете обратиться к MDN X-Forwarded-For

X-Forwarded-For: 203.0.113.195, 70.41.3.18, 150.172.238.178
X-Forwarded-For: <client>, <proxy1>, <proxy2>

Вот как коа получает IP

get ips() {
    const proxy = this.app.proxy;
    const val = this.get(this.app.proxyIpHeader);
    let ips = proxy && val
      ? val.split(/\s*,\s*/)
      : [];
    if (this.app.maxIpsCount > 0) {
      ips = ips.slice(-this.app.maxIpsCount);
    }
    return ips;
  },

  get ip() {
    if (!this[IP]) {
      this[IP] = this.ips[0] || this.socket.remoteAddress || '';
    }
    return this[IP];
  },

04 Как заменить одну подстроку другой подстрокой в ​​js

Подробное описание: Suppose there is a string `hello.hello.hello.` that needs to be replaced with `AAA`, that is, replace `hello.` with `A`

Если необходимо заменить всю строку, вы можете использовать String.prototype.replace(re, replacer), где вам нужно открыть глобальный флаг для регулярного выражения.

const s = 'foo foo foo'
s.replce(/foo/g, 'bar')

Более того, можно ли использовать регулярные выражения для замены подстрок?

Ответ: Нет, так как при использовании подстрок для построения регулярных выражений могут быть специальные символы, что может вызвать проблемы, как показано ниже.

// expect: 'AhelloX hello3 '
> 'hello. helloX hello3 '.replace(new RegExp('hello. ', 'g'), 'A')
< "AAA"

Вы можете заменить подстроки в javascript, как показано ниже: str.split(‘foo’).join(‘bar’)

> 'hello. hello. hello. '.split('hello. ').join('A')
< "AAA"

Какой умный (тупой) замечательный (топорный) способ!!! TC39 наверное тоже понял проблему, поэтому придумал новый API, в ESNext

String.prototype.replaceAll()

'aabbcc'.replaceAll('b', '.'); 
// 'aa..cc'

Заключение

Два решения

  • str.split('foo').join('bar')
  • str.replaceAll('foo', 'bar')

05 Как получить память процесса и следить за ней

Подробное описание: When writing scripts, sometimes OOM occurs when the memory is too large, so how do we know the memory of a process? Also how to monitor it

Память, занятая процессом, может быть получена через ps

$ ps -O rss -p 3506
  PID   RSS S TTY          TIME COMMAND
 3506  6984 S pts/1    00:00:00 vim

Если вы хотите следить за памятью, вы должны использовать команду pidstat, которая всесильна в процессе

## -r show memory info
## -p for pid
## 1: print once aminute
$ pidstat -r -p 3506 1
Linux 3.10.0-957.21.3.el7.x86_64 (shanyue)      11/04/19        _x86_64_        (2 CPU)

20:47:35      UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
20:47:36        0      3506      0.00      0.00  139940   6984   0.18  vim
20:47:37        0      3506      0.00      0.00  139940   6984   0.18  vim
20:47:38        0      3506      0.00      0.00  139940   6984   0.18  vim
20:47:39        0      3506      0.00      0.00  139940   6984   0.18  vim
20:47:40        0      3506      0.00      0.00  139940   6984   0.18  vim
20:47:41        0      3506      0.00      0.00  139940   6984   0.18  vim

pidstat — это инструмент для повышения производительности Linux под sysstat, но как в Mac отслеживать изменения памяти? Конечно, можно использовать всемогущий top/htop

$ htop -p 31796

Заключение

Три решения

  1. pidstat -r
  2. htop/top -p
  3. ps -O rss -p

Окончательно

Спасибо, что прочитали. С нетерпениемс нетерпением жду ваших подписчиков и новых статей высокого качества.







Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord . Заинтересованы в хакинге роста? Ознакомьтесь с разделом Схема.