Я составил интеллект-карту фронтенд-интервью и поместил ее в конец статьи, так как картинка слишком большая, рекомендуется ее скачать и просмотреть.
В этой статье представлена общая идея собеседования и некоторые базовые знания, которые надеются принести вам некоторую помощь и помочь вам найти хорошую работу, которую вы хотите.
Представьтесь (только для справки)
Обратите внимание (преодолейте нервозность, говорите медленно, смотрите прямо на интервьюера)
Добрый день, интервьюер, меня зовут **, сегодня я претендую на должность фронтенд-инженера в вашей компании. Я занимаюсь front-end разработкой более двух лет, у меня более X лет опыта разработки Vue и один год опыта разработки React, в моей прошлой компании я в основном занимался разработкой страниц H5, бэкграунда. системы управления и гибридные приложения. Обычно мне нравится посещать некоторые технические сообщества, чтобы обогатить свои технологии, такие как Sifu, Nuggets и т. д., и я также самостоятельно разработал личный веб-сайт блога, чтобы записывать результаты своей работы и опыт обучения. У меня относительно мягкий характер, и я более общителен в общении с коллегами и друзьями, мне нравится полностью посвящать себя разработке кода на работе, и я всегда серьезно и ответственно отношусь к работе. Интервьюер, это мое введение, спасибо.
Введение в конкретный проект
Этот раздел будет задавать с высокой вероятностью, обратите внимание на формулировку языка, вы не сделали адекватных приготовлений, не паниковали бы, это чувство безопасности для себя.Пример:
XXAPP
Описание проекта: XXAPP — это многофункциональное программное обеспечение для частного банковского обслуживания, которое в основном имеет такие функции, как операции со счетами, переводы и денежные переводы, покупка и продажа сертификатов депозитных продуктов, пополнение и снятие средств и т. д. Оно использует собственный встроенный метод веб-просмотра.messageHandlers[fn].postMessage(data)
метод.Android
использоватьwindow.AndroidWebView[fn] (data)
Основные моменты и трудности проекта: после истечения времени входа в систему вы продолжите возвращаться на исходную рабочую страницу после повторного входа в систему.
ххх банковский проект
ххх торговый центр
xxx система управления фоном
xxx
HTML, CSS связанные
Новые возможности и семантика html5
- Семантические теги: заголовок, навигация, основная статья, раздел в сторону, нижний колонтитул.
语义化意味着顾名思义,HTML5的语义化指的是合理正确的使用语义化的标签来创建页面结构,如
header,footer,nav,从标签上即可以直观的知道这个标签的作用,而不是滥用div。
语义化的优点有:
代码结构清晰,易于阅读,利于开发和维护
方便其他设备解析(如屏幕阅读器)根据语义渲染网页。
有利于搜索引擎优化(SEO),搜索引擎爬虫会根据不同的标签来赋予不同的权重
Механизм рендеринга браузера, перерисовка, перекомпоновка
Процесс создания веб-страницы:
-
HTML
анализируется парсером HTML вDOM
Дерево -
css
анализируется парсером css вCSSOM
Дерево - комбинировать
DOM
дерево иCSSOM
дерево, сгенерировать дерево рендеринга (Render Tree
) - создать макет (
flow
), то есть плоское соединение всех узлов всех деревьев рендеринга - нарисуй схему(
paint
)на экране
Реаранжировка (также называемая перекомпоновкой):когдаDOM
изменения влияют на геометрическую информацию элемента (DOM
положение и размер объекта), браузеру необходимо пересчитать геометрические свойства элемента, чтобы поместить его в правильное положение в интерфейсе, этот процесс называется перекомпоновкой.
вызывать:
- Добавить или удалить видимые элементы DOM
- Изменения размера элемента - поля, отступы, границы, ширина и высота
Перерисовать:Когда внешний вид элемента изменяется без изменения макета, процесс перерисовки внешнего вида элемента называется перерисовкой. вызывать:
- изменить элемент
color、background、box-shadow
Равные атрибуты
Предложения по оптимизации перестановки:
- Отдельные операции чтения и записи
- Модификация стилей
- Кэш нужно модифицировать
DOM
элемент - только изменить
position:absolute
илиfixed
элемент, мало влияет на другие элементы - начинается анимация
GPU
ускорить,translate
использовать3D
Разнообразие
transform
без перерисовки, без перекомпоновки
Потому чтоtransform
Он относится к синтетическому признаку, и синтетический признак осуществляется.transition/animate
При анимации создается составной слой. Это позволяет визуализировать анимированные элементы в отдельном слое. Когда содержимое элемента не изменилось, перерисовывать не нужно. Браузер создает кадры анимации путем рекомпозиции.
css блочная модель
всеHTML
Элементы можно увидеть в виде блоков в CSS,"box model"
Этот термин используется при проектировании и выкладке.CSS
Блочная модель — это, по сути, коробка, которая инкапсулирует окружающую среду.HTML
элемент, который включает в себя: поля, границы, отступы и фактическое содержимое.
Блочная модель позволяет размещать элементы в пространстве между другими элементами и границами окружающих элементов.
приоритет стиля css
!important>style>id>class
Что такое БФК? Каковы правила компоновки для BFC? Как создать БФУ? Приложение БФС?
BFC
даBlock Formatting Context
Аббревиатура контекста форматирования блока.BFC
Это концепция макета CSS, среда, в которой элементы внутри не влияют на элементы снаружи.
Правила компоновки: блок — это объект и основная единица макета CSS, а страница состоит из нескольких блоков. Тип элемента и свойство display определяют тип Box. Различные типы ящиков будут участвовать в разныхFormatting Context
.
Создать: плавающий элементdisplay:inline-block position:absolute
Применение: 1. Точки принадлежат разнымBFC
может предотвратитьmargin
Перекрытие 2. Очистить внутренний плавающий элемент 3. Адаптивный макет с несколькими столбцами
DOM, BOM объекты
BOM(Browser Object Model)
Относится к объектной модели браузера, к которой можно получить доступ и управлять ею в окне браузера. Используя BOM, разработчики могут перемещать окна, изменять текст в строке состояния и выполнять другие действия, не связанные напрямую с содержимым страницы.
СделатьJavaScript
Возможность «разговаривать» с браузером.DOM (Document Object Model)
относится к объектной модели документа, через которую можно получить доступHTML
Все элементы документа.DOM
даW3C
(Консорциум всемирной паутины).DOM
доступ определенHTML
а также XML
Стандарты документации:
«Объектная модель документа W3C (DOM) — это независимый от платформы и языка интерфейс, который позволяет программам и сценариям динамически получать доступ и обновлять содержимое, структуру и стиль документа».W3C DOM
Стандарт разделен на 3 разные части:
- основной
DOM
- Стандартная модель для любого структурированного документа -
XML DOM
- Стандартная модель для XML-документов -
HTML DOM
- Стандартная модель для HTML-документов
что XML DOM
?XML DOM
Определяет объекты и атрибуты всех XML-элементов, а также методы доступа к ним.
Что такое HTML DOM?
HTML DOM определяет объекты и свойства всех элементов HTML, а также методы доступа к ним.
связанные с JS
типы данных js, typeof, instanceof, преобразование типов
string、number、boolean、null、undefined、object(function、array)、symbol(ES10 BigInt)
-
typeof
В основном используется для определения типа данных. Возвращаемое значениеstring、boolean、number、function、object、undefined。
-
instanceof
Экземпляр, который определяет, кто является объектом. -
null
представляет собой пустой объектundefined
Представляет переменную, которая была объявлена в области видимости, но ей не присвоено значение.
Закрытие (высокая частота)
Замыкание — это функция, которая имеет доступ к переменной в области действия другой функции — Advanced JavaScript Programming
Закрытие происходит, когда функция может запомнить и получить доступ к лексической области видимости, в которой она находится.
Даже если функция выполняется за пределами текущей лексической области видимости — «JavaScript, которого вы не знаете».
- Использование закрытия:
- Возможность доступа к лексической области, в которой была определена функция (предотвращает ее повторное использование)
- частная переменная
- Объем ложного блока
- Создать модуль
- Недостатки замыканий: переменные функции всегда будут храниться в памяти, а слишком большое количество замыканий может привести к утечкам памяти
Прототип, цепочка прототипов (высокая частота)
прототип:присущий объекту__proto__
свойство, которое указывает на объектprototype
Свойства прототипа.
Цепь прототипа:Когда мы получаем доступ к свойству объекта, если свойство не существует в объекте, то оно обращается к своему объекту-прототипу, чтобы найти это свойство, а у объекта-прототипа будет свой собственный прототип, поэтому мы продолжаем его искать. это концепция цепочки прототипов. Конец цепочки прототипов обычноObject.prototype
Вот почему наш вновь созданный объект можно использоватьtoString()
и другие причины.
Функции: JavaScript
Объекты передаются по ссылке, и каждая новая объектная сущность, которую мы создаем, не имеет собственной копии прототипа. Когда мы изменяем прототип, связанные с ним объекты также наследуют изменения.
это указывает на новое ключевое слово
this
Объект — это атрибут в контексте выполнения, указывающий на объект, для которого в последний раз вызывался метод.this
равныйwindow
, и когда функция вызывается как объект, это равно этому объекту.
В реальном развитии,this
О наведении можно судить по четырем режимам вызова.
- Вызов функции, когда функция не является свойством объекта, она вызывается непосредственно как функция,
this
Указывает на глобальный объект. - вызов метода, если функция вызывается как метод объекта,
this
указывает на этот объект. - вызов конструктора,
this
указать на этоnew
Недавно созданный объект. - Четвертый
apply 、 call 和 bind
В режиме вызова все три метода могут отображать указатель this указанной вызывающей функции.apply
Полученный параметр представляет собой массив,call
принимает список аргументов, ``bind方法通过传入一个对象,返回一个
this绑定了传入对象的新函数。这个函数的
this指向除了使用
новый ` будет изменен, в противном случае он не будет изменен.
new
- Сначала создал новый пустой объект
- Установите прототип, установите прототип объекта в прототип функции
prototype
объект. - Пусть функция
this
Укажите на этот объект, выполните код конструктора (добавьте свойства к этому новому объекту) - Определить тип возвращаемого значения функции, если это тип значения, вернуть созданный объект. Если это ссылочный тип, возвращается объект этого ссылочного типа.
Объем, цепочка объемов, переменный подъем
作用域
Отвечает за сбор и обслуживание набора запросов, состоящего из всех объявленных идентификаторов (переменных), и за соблюдение очень строгого набора правил, определяющих доступ к этим идентификаторам при выполнении кода в данный момент. (глобальная область, область действия, область действия блока).
Цепочка областей видимости состоит в том, чтобы искать переменную слой за слоем из текущей области видимости, пока глобальная область видимости не будет найдена и все еще не найдена, она сдастся. Эта послойная связь作用域链
.
Наследование (включая ES6), многократные методы наследования
(1) Первый原型链的方式来实现继承
, но недостатком этого метода реализации является то, что когда он содержит данные ссылочного типа, они будут общими для всех объектов экземпляра, что легко может вызвать путаницу при модификации. Также нельзя передавать параметры супертипу при создании подтипа.
(2) Второй способ заключается в использовании借用构造函数
Этот метод реализуется путем вызова конструктора супертипа в функции подтипа.Этот метод устраняет недостаток, заключающийся в невозможности передачи параметров в супертип, но одна проблема заключается в том, что он не может реализовать метод функции.Есть нет способа получить доступ к подтипу метода, определенному прототипом супертипа.
(3) Третий способ组合继承
, наследование композиции — это способ объединить цепочку прототипов и заимствованные конструкторы. Наследование свойств типа достигается за счет заимствования функции-конструктора, а наследование методов достигается путем установки прототипа подтипа в экземпляр супертипа. Этот метод решает проблему, когда два вышеуказанных режима используются по отдельности, но поскольку мы используем экземпляр супертипа в качестве прототипа подтипа, конструктор супертипа вызывается дважды, в результате чего получается прототип подтипа. много ненужных атрибутов.
(4) Четвертый способ原型式继承
, Основная идея прототипного наследования заключается в создании нового объекта на основе существующего объекта.Принцип реализации заключается в передаче объекта в функцию, а затем возврате объекта, прототипом которого является этот объект. Идея этого наследования заключается не в создании нового типа, а в реализации простого наследования объекта.Метод Object.create(), определенный в ES5, является реализацией прототипного наследования. Недостаток тот же, что и у прототипа цепным способом.
(5) Пятый способ寄生式继承
, идея паразитического наследования заключается в создании функции, которая инкапсулирует процесс наследования, передавая объект, затем копируя копию объекта, затем расширяя объект и, наконец, возвращая объект. Этот процесс расширения можно понимать как своего рода наследование. Преимущество этого типа наследования заключается в реализации наследования для простого объекта, если объект не является нашим пользовательским типом. Недостатком является невозможность повторного использования функций.
(6) Шестой способ寄生式组合继承
, недостатком композиционного наследования является то, что экземпляр супертипа используется в качестве прототипа подтипа, что приводит к добавлению ненужных свойств прототипа. Паразитическое композиционное наследование использует копию прототипа супертипа в качестве прототипа подтипа, что позволяет избежать создания ненужных свойств.
EventLoop
JS
Он однопоточный. Чтобы предотвратить слишком долгую блокировку следующего кода при выполнении функции, синхронный код сначала помещается в стек выполнения, выполняется последовательно, а асинхронный код помещается в асинхронный код. Асинхронная очередь делится на очередь макрозадач и очередь микрозадач, поскольку время выполнения очереди макрозадач больше, поэтому очередь микрозадач имеет приоритет над очередью макрозадач. Представитель очереди микрозадач,Promise.then
,MutationObserver
, задача макросаsetImmediate setTimeout setInterval
родной аякс
ajaxЭто асинхронный метод связи, который получает данные с сервера и достигает эффекта частичного обновления страницы. Обработать:
- Создайте
XMLHttpRequest
объект; - передача
open
Метод передает три параметра Метод запроса(GET/POST)、url、同步异步(true/false)
; - монитор
onreadystatechange
событие, когдаreadystate
Возвращает, когда равно 4responseText
; - Вызовите метод отправки для передачи параметров.
Всплывание событий, захват (делегат)
- всплывающее окно событияОтносится к запуску определенного типа события для объекта. Если объект привязан к событию, событие будет запущено. Если нет, оно будет распространено на родительский объект объекта, и, наконец, родительский объект вызовет событие. мероприятие.
- делегация мероприятияПо сути, он использует механизм всплытия событий браузера. Поскольку событие будет загружено на родительский узел во время процесса всплытия, и родительский узел может получить целевой узел через объект события, функция прослушивателя дочернего узла может быть определена на родительском узле, а функция прослушивателя родительский узел может единообразно обрабатывать несколько дочерних событий, этот способ называетсяагент событий.
event.stopPropagation()
или метод под т.е.event.cancelBubble = true;
// останавливаем всплытие события
ES6
- Новый тип символа представляет собой уникальное значение, которое используется для определения уникального имени атрибута объекта;
- Все const / quices используются для объявления переменных, которые не повторяются, с объемами уровня блока. Есть временная мертвая зона, то есть нет изменений в переменных. (Const обычно используется для объявления постоянной);
- Деструктуризация и присвоение переменных (в том числе массивов, объектов, строк, чисел и логических значений, параметров функций), остаточных операторов (...остальные);
- строка шаблона (
${data}
); - оператор спреда(массив, объект);;
- функция стрелки;
- Установить и сопоставить структуры данных;
- Proxy/Reflect;
- Promise;
- асинхронная функция;
- Class;
- Синтаксис модуля (импорт/экспорт).
Vue
Кратко опишите MVVM.
MVVMдаModel-View-ViewModel
Сокращенное название,MVC
серединаController
эволюционировать вViewModel。Model
Слои представляют модель данных,View
представляет компонент пользовательского интерфейса,ViewModel
даView
а такжеModel
Layer Bridge, данные будут привязаны кviewModel
слоя и автоматически отображать данные на странице, а также уведомлять об изменении представленияviewModel
Данные обновления слоя.
Расскажите о своем понимании жизненного цикла vue?
каждыйVue
Примеры пройдут через серию процессов инициализации во время создания,vue
Крюк жизненного цикла, то есть функция, которая срабатывает при достижении определенного этапа или условия, целью которой является завершение некоторых действий или событий.
-
create阶段
: экземпляр vue созданbeforeCreate
: Перед созданием данные в данных и методах не были инициализированы в это времяcreated
: Создано, в данных есть значение, не смонтировано -
mount阶段
: экземпляр vue монтируется на реальный узел DOM.beforeMount
: Вы можете инициировать запрос сервера для перехода к даннымmounted
: Дом можно оперировать в это время -
update阶段
: Когда данные данных в экземпляре vue изменяются, инициируйте повторную визуализацию компонента.beforeUpdate
updated
-
destroy阶段
: экземпляр vue уничтоженbeforeDestroy
: Перед уничтожением экземпляра некоторые методы в это время могут быть уничтожены вручную.destroyed
computed与watch
смотреть монитор недвижимостиЭто объект, ключ — это свойство, за которым необходимо наблюдать, а значение — это соответствующая функция обратного вызова, которая в основном используется для отслеживания изменений некоторых конкретных данных, чтобы выполнять определенные операции бизнес-логики, отслеживать изменения свойств и необходимость выполнять асинхронное выполнение при изменении данных или для дорогостоящих операций
вычисляемые свойстваРезультат имущества кэшируется, когдаcomputed
Когда свойства, от которых зависит функция, не изменились, результат будет считан из кеша при вызове текущей функции. Он будет пересчитан, если не изменятся зависимые реактивные свойства, в основном используемые в качестве свойствcomputed
функции должны использоватьreturn
вернуть окончательный результатcomputed
Более эффективно, используйте первым
сцены, которые будут использоваться
computed
: используется, когда на атрибут влияют несколько атрибутов, например: функция расчета продуктов корзины покупок.watch
: используется, когда одна часть данных влияет на несколько частей данных, например: данные поиска
Роль ключа в v-for
-
key
Функция в основном состоит в том, чтобы более эффективно сравнить, является ли каждый узел в виртуальной DOM одним и тем же узлом; -
Vue在patch
Ключ является необходимым условием в процессе определения того, являются ли два узла одним и тем же узлом.При рендеринге набора списков ключ часто является уникальным идентификатором, поэтому, если ключ не определен,Vue
Можно только считать, что два сравниваемых узла одинаковы, даже если это не так, что приводит к частым обновлениям элементов, делая весьpatch
Процесс относительно неэффективен и влияет на производительность; - Как видно из исходного кода, когда Vue оценивает, являются ли два узла одинаковыми, он в основном оценивает их ключ и тип элемента, поэтому, если ключ не установлен, его значение равно
undefined
, вы всегда можете подумать, что это две одинаковые ноды и могут делать только операции обновления, что приводит к большому количеству операций обновления dom, что явно не желательно.
Как общаться с компонентами vue
Взаимодействие компонентов родитель-потомок
родитель -> ребенокprops
, ребенок -> родитель$on、$emit` 获取父子组件实例
children
Ref 获取实例的方式调用组件的属性或者方法
Provide, inject` официально не рекомендуются, но обычно используются при написании библиотек компонентов
Взаимодействие компонентов родственного компонента
Event Bus
Реализовать межкомпонентную коммуникациюVue.prototype.$bus = new Vue() Vuex
Взаимодействие компонентов между уровнями
$attrs、$listeners
Provide、inject
Общие команды
- v-if: определить, следует ли скрывать;
- v-for: цикл данных;
- v-bind:class: привязать свойство;
- v-model: реализовать двустороннюю привязку
Принцип реализации двусторонней привязки
когдаVueКогда экземпляр создан, Vue просматривает свойства параметра данных, используяObject.definePropertyПревратите их в геттеры/сеттеры и отслеживайте зависимости внутри, уведомляя об изменениях при доступе к свойствам и их изменении. У каждого экземпляра компонента есть соответствующий экземпляр программы-наблюдателя, который записывает свойство как зависимость во время процесса рендеринга компонента, а затем уведомляет наблюдателя о необходимости пересчета при вызове установщика зависимости, тем самым вызывая обновление связанных с ним компонентов.
Есть ли реализация v-модели и как она работает?
-
vue
Двусторонняя привязка является директивойv-model
, вы можете привязать динамическое значение к представлению, и изменения в представлении могут изменить значение.v-model
синтаксический сахар, по умолчанию эквивалентный:value和@input
. - использовать
v-model
Это может уменьшить количество громоздкого кода обработки событий, повысить эффективность разработки, а также улучшить читаемость кода. - Обычно используется на элементах формы
v-model
- Собственный элемент формы можно использовать напрямую
v-model
, если вы хотите использовать его в пользовательском компоненте, вам нужно привязать значение в компоненте и обработать событие ввода - Я сделал тест, и вывод содержит
v-model
Обнаружено, что функция рендеринга компонента шаблона будет преобразована в привязку атрибута значения и прослушивателя событий, а соответствующая операция обновления переменной будет выполнена в функции обратного вызова события, что показывает, что магия на самом деле делается компилятором vue.
Реализация nextTick
-
nextTick
даVue
глобальныйAPI
, в следующий разDOM
Выполнение отложенного обратного вызова после завершения цикла обновления, используемого после изменения данных.$nextTick
, вы можете получить обновленнуюDOM
; - Vue выполняется асинхронно при обновлении DOM. Пока изменение данных обнаружено,
Vue
Будет открыта 1 очередь, и все изменения данных, происходящие в одном и том же цикле событий, будут буферизированы. если то же самоеwatcher
Запущенный несколько раз, он будет помещен в очередь только один раз. Эта дедупликация во время буферизации важна для избежания ненужных вычислений иDOM
Операция очень важна.nextTick
Метод добавит функцию обратного вызова в очередь, чтобы гарантировать, что функция вызывается после завершения предыдущей операции DOM; - Например, когда я что-то делаю, я использую nextTick, передаю функцию обратного вызова и выполняю в ней операции dom;
- У меня тоже есть простое понимание
nextTick
реализована, она будет вcallbacks
Добавьте функцию, которую мы передали, а затем используйтеtimerFunc
Асинхронный звонок им, будет предпочтительным асинхронным режимомPromise
. Это заставляет меня понять, почему вы можетеnextTick
видеть вdom
Результат операции.
Понимание vnode, процесса компиляции и патча
vnode 虚拟DOM节点 创建:
export function Vnode (){
return {
tag:'div',
children: 'span',
attr:'',
text:'你好!'
}
}
Весь процесс после нового Vue
-
initProxy
: Прокси области, который перехватывает данные, к которым обращаются другие компоненты внутри компонента. -
initLifecycle
:建立父子组件关系,在当前组件实例上添加一些属性和生命周期标识。 Такие как[Math Processing Error]parent,parent,refs,$children,_isMounted
Ждать. -
initEvents
: добавить слушателя к событию, переданному родительским компонентом, который создает событие и прослушивает, а дочерний компонент создает событие, а дочерний компонент прослушивает -
initRender
: объявить [Math Processing Error] слоты и слоты и createElement() и т. д. -
initInjections
: вставка данных, инициализация вставки, обычно используется для более глубокой связи между компонентами. -
initState
: важно) data-responsive: инициализированное состояние. Резюме инициализации многих параметров: данные, методы, реквизиты, вычисляемые и наблюдаемые. -
initProvide
: Обеспечивает вставку данных.
Мышление: зачем сначала вводить, а потом предоставлять? ?
Ответ: 1. Во-первых, данные от предков должны быть объединены с данными текущего экземпляра, и равны по весу, поэтому initInjections внедряемых данных должны быть вInitState
над. 2. Внедряемые сверху вещи передаются в текущем компоненте и предоставляются потомкам, поэтому внедряемые данные тоже должны быть на нем.
vm.[Math Processing Error]mount(vm.mount(vm.options.el)
: смонтировать экземпляр.
Реализация поддержки активности
Роль: реализация кэширования компонентов
Функция крючка:
`activated `组件渲染后调用
`deactivated `组件销毁后调用
принцип:Vue.js
Внутренняя воляDOM
Узлы абстрагируются один за другимVNode
узел,keep-alive
Кэширование компонентов также основано наVNode
Node вместо прямого хранилищаDOM
структура. это удовлетворит условию(pruneCache与pruneCache)
компоненты вcache
Объект кэшируется и повторно визуализируется, когда его необходимо повторно визуализировать.vnode
узел изcache
Объект вынимается и визуализируется.
Свойства конфигурации:
include
Строка или регулярное выражение. Кэшируются только компоненты с совпадающими именами.
exclude
Строка или регулярное выражение. Любой компонент, имя которого совпадает, не будет кэшироваться
max
Число, максимальное количество экземпляров компонента может быть закэшировано.
Принцип реализации vuex и vue-router
vuex
— это библиотека управления состоянием, специально разработанная для приложений vue.js.
Основная идея:
-
state
(одно дерево состояний)getter/Mutation
Показать изменения фиксацииstate
-
Action类似Mutation
,представитьMutation
, который может содержать произвольные асинхронные операции. -
module
(Когда приложение становится большим и сложным, разделитеstore
для конкретныхmodule
модуль)
Как вы понимаете алгоритм сравнения в Vue?
В js сделать trueDOM
Накладные расходы очень велики.Например, если мы изменим определенные данные, если они будут напрямую преобразованы в реальныеDOM
, вызовет весьdom
Перерисовка и перестановка деревьев. Итак, возможно ли обновить только небольшой фрагмент домена, который мы модифицируем, не обновляя весь?dom
Шерстяная ткань? В этот момент нам нужно сначалаdom
Создать виртуальныйdom
, когда виртуальныйdom
После изменения данных узла будет сгенерирован новыйVnode
, то новыйVnode
И старыйVnode
Для сравнения, если есть какая-то разница, измените его прямо на реальном доме, а затем сделайте старыйVnode
стоимость новогоVnode
.
diffПроцесс заключается в вызовеpatch
функцию, сравните старый и новый узлы и дайте реальный при сравненииDOM
Пластырь. в принятииdiff
Когда алгоритм сравнивает старые и новые узлы, сравнение будет выполняться только на одном уровне.
существуетpatch
метод, сначала выполните сравнение на уровне дереваnew Vnode
удалить, если его нетold Vnode
old Vnode
Добавьте новые, если они не существуютVnode
Выполнить обновление различий, если оба существуют
Когда будет определено, что алгоритм сравнения должен быть выполнен, сравните дваVnode
, включая три типа операций: обновление атрибута, обновление текста, обновление дочернего узла
Если старый и новый узлы имеют дочерние узлы, дочерние узлы будутdiff
работай, звониupdatechidren
Если у старого узла нет дочерних узлов, а у нового узла есть дочерние узлы, сначала очистите текстовое содержимое старого узла, а затем добавьте к нему дочерние узлы.
Если у нового узла нет дочерних элементов, а у старого узла есть дочерние элементы, удалите все дочерние элементы узла.
Когда старые, новые и старые узлы не имеют дочерних узлов, замените текст
updateChildrenБудуVnode
Извлекаются дочерний узел Vch для oldVnode и дочерний узел oldCh для oldVnode.oldCh和vCh
Переменные с двумя головками и хвостамиStartIdx和EndIdx
, их 2 переменные сравниваются друг с другом, всего 4 метода сравнения. Если ни одно из 4 сравнений не совпадает, если установленоkey
, буду использоватьkey
Сравните, в процессе сравнения переменная окажется посередине, один разStartIdx>EndIdx
показыватьoldCh和vCh
По крайней мере один из них был пройден, и сравнение заканчивается.
Какие оптимизации производительности Vue вы сделали?
编码阶段
尽量减少data中的数据,data中的数据都会增加getter和setter,会收集对应的watcher
v-if和v-for不能连用
如果需要使用v-for给每项元素绑定事件时使用事件代理
SPA 页面采用keep-alive缓存组件
在更多的情况下,使用v-if替代v-show
key保证唯一
使用路由懒加载、异步组件
防抖、节流
第三方模块按需导入
长列表滚动到可视区域动态加载
图片懒加载
SEO优化
预渲染
服务端渲染SSR
打包优化
压缩代码
Tree Shaking/Scope Hoisting
使用cdn加载第三方模块
多线程打包happypack
splitChunks抽离公共文件
sourceMap优化
用户体验
骨架屏
PWA
还可以使用缓存(客户端缓存、服务端缓存)优化、服务端开启gzip压缩等。
Знаете ли вы, какие новые функции есть в Vue3? Какое влияние они окажут?
- повышение производительности
Меньше и быстрее Поддержка пользовательских рендереров Поддержка оптимизации встряхивания дерева: метод оптимизации для удаления бесполезного кода во время упаковки. Поддержка фрагментов и кросс-компонентного рендеринга
- Изменения API
Синтаксис шаблона остается неизменным на 99 %
Встроенная поддержка компонентов на основе классов без какой-либо компиляции и различных сценических функций
Проектируйте с учетом функций вывода типов TypeScript.重写虚拟DOM
Можно ожидать больше подсказок во время компиляции, чтобы уменьшить накладные расходы во время выполнения.优化插槽生成
Родительский и дочерний компоненты могут отображаться отдельно静态树提升
Сокращение затрат на рендеринг基于Proxy的观察者机制
Экономия памяти
- Не совместим с IE11
检测机制
Более полное, точное, эффективное и более поддающееся отладке отслеживание ответов
Каковы преимущества и недостатки реализации двусторонней привязки Proxy по сравнению с Object.defineProperty?
- Object.definedPropertyФункция заключается в захвате свойств объекта, захвате методов получения и установки свойств и выполнении определенных операций при изменении свойств объекта. Прокси захватывает весь объект.
- ProxyБудет возвращен прокси-объект, нам нужно только управлять новым объектом, а Object.defineProperty может только просматривать свойства объекта и изменять их напрямую.
- Object.definedPropertyНе поддерживает массивы, точнее не поддерживает различные API массивов, потому что если рассматривать только ситуацию arr[i]=value, то его можно угнать, но такой угон не имеет смысла. Прокси может поддерживать различные API массивов.
- Хотя Object.defineProperty имеет много недостатков, его совместимость лучше, чем у Proxy.
React
1. Функция ключа в реакции, в чем разница между наличием ключа и отсутствием ключа, что значит сравнивать узлы на одном уровне?
Keys是React用于追踪哪些列表中元素被修改、被添加或者被移除的辅助标识。
2. Ваше понимание алгоритмов виртуального дома и сравнения и реализация функции рендеринга.
虚拟DOM
По сутиJavaScript
объект, да真实DOM
абстрактное представление.
Когда состояние изменится, запишите разницу между новым деревом и старым деревом.
Наконец обновите diff до реальногоdom
серединафункция визуализации:
- согласно с
tagName
Создать родительский тег, прочитатьprops
, установить свойства,如果有content
,настраиватьinnerHtml或innerText
, - Если есть дочерние элементы, итерация по дочерним элементам рекурсивно вызывает
render
метод, который последовательно добавляет сгенерированные дочерние элементы к родительскому элементу и возвращает корневой элемент.
3. Как общаться между компонентами React?
- Родительско-дочерний компонент, родитель-> дочерний элемент используют напрямую
Props
, дочернее -> родительское использованиеcallback
Перезвоните - Компоненты, не являющиеся родительскими и дочерними, с использованием модели публикации-подписки
Event
модуль - Для сложных проектов
Redux、Mobx
и другая глобальная библиотека управления состоянием -
Context Api context
Делает компоненты менее пригодными для повторного использования
Context
Предоставляет способ устранить необходимость вручную добавлять компоненты для каждого слоя.props
, вы можете передавать данные между деревьями компонентов.Если вы просто хотите избежать передачи некоторых свойств слой за слоем, состав компонента (component composition
) иногда является лучшим решением, чем context .
5. Недостатки компонентной композиции: это усложнит высокоуровневые компоненты
4. Как парсить jsx
调用React.createElement函数创建对象
5. Какие типы жизненных циклов существуют и что они делают на какой стадии? Зачем отказываться от некоторых жизненных циклов?
componentWillMount, componentWillReceiveProps и componentWillUpdate устарели в версии 16 и будут удалены в версии 17. Их необходимо использовать с префиксом UNSAVE_ для обратной совместимости.
6. Методы оптимизации реакции
- Уровень кода:
Используйте Return NULL вместо CSS для управления отображением скрытых узлов. Убедитесь, что узлов DOM на той же временной странице как можно меньше.
- Данные реквизита и состояния максимально простые, понятные и плоские.
Не используйте индексы массива в качестве ключей
использоватьshouldComponentUpdate
а такжеPureComponent
избегать слишком многогоrender function
;
render
Новых переменных и функций привязки как можно меньше, а передача параметров должна минимизировать количество передаваемых параметров.
как можно большеprops
а такжеstate
сгладить, пройти толькоcomponent
потребностиprops
(Если вы нанесете слишком много или слишком глубоко, это усугубитshouldComponentUpdate
Данные внутри более обременительны), будьте осторожныcomponent
так какprops
входящий
- Размер кода:
использоватьbabel-plugin-import
Оптимизируйте внедрение бизнес-компонентов для достижения загрузки по требованию
использоватьSplitChunksPlugin
Разделить общий код
использовать динамическийimport
, ленивая загрузкаReact
компоненты
7. Несколько способов связать это
bind/箭头函数
8. Понимание клетчатки
React Fiber 是一种基于浏览器的单线程调度算法.
9. Является ли setState синхронным или асинхронным?
-
setState
«Асинхронный» только в синтетических событиях и хуках, синхронный в нативных событиях и setTimeout. -
setState
«Асинхронность» не означает, что внутренняя реализация реализована асинхронным кодом, на самом деле процесс и код, исполняемый сам по себе, являются синхронными, но последовательность вызова синтетических событий и функций-ловушек предшествует обновлению, так что синтетические события а хуки-функции сразу получить нельзя.К обновленному значению формируется так называемая "асинхронность".Конечно, обновленный результат можно получить через callback во втором параметре setState(partialState, callback). -
setState
Оптимизация пакетного обновления также основана на «асинхронности» (синтетические события, функции ловушек) и не будет обновляться пакетами в собственных событиях и setTimeout.В «асинхронном режиме», если вы выполняете несколько setState для одного и того же значения, Стратегия обновления перезапишет его и выполнит последнее.Если одновременно установлено несколько разных значений setState, они будут объединены и обновлены партиями во время обновления.
10. Redux, React-Redux
Процесс реализации Redux
Поведение пользователя на странице вызываетAction
,ПотомStore
передачаReducer
и передать два параметра: текущийState
и получилAction
.Reducer
вернется новыйState
. в любое времяstate
После обновленияview
будет основываться наstate
Запустить повторный рендеринг.
React-Redux:
Provider
: инкапсулирует все приложение от самого внешнегоconnect
доставка модуляstore
.Connect
:
- упаковка оригинальных компонентов,
state
а такжеaction
пройти черезprops
Входящий путь к оригинальным внутренним компонентам. - монитор
store tree
Измените так, чтобы исходный компонент, который он обертывает, реагировалstate
Разнообразие
11. Понимание компонентов высшего порядка
Компонент высшего порядка — это функция, параметр которой является компонентом, а возвращаемое значение — новым компонентом.HOC
это чистая функция без побочных эффектов.HOC
существуетReact
распространен в сторонних библиотеках, таких какRedux
изconnect
компоненты.
Роль компонентов высшего порядка:
- Повторное использование кода, логическая абстракция и подготовка с нижнего уровня (
bootstrap
) код - рендеринг угона
-
State
абстрагироваться и измениться -
Props
Изменять
12. Какие методы можно использовать для созданияReact
компоненты?
React.createClass()、ES6 class
и функции без сохранения состояния
13.React
В чем разница между элементом и компонентом?
Компоненты состоят из элементов. Структуры данных элементов — это обычные объекты, а структуры данных компонентов — это классы или чистые функции.
Vue против React?
поток данных:
reactОн выступает за функциональное программирование, поэтому он защищает чистые компоненты, неизменяемые данные, односторонний поток данных,
vueИдея адаптивного, то есть основанного на переменных данных, путем создания Watcher для каждого атрибута для мониторинга, когда атрибут изменяется, соответствующий виртуальный дом обновляется в ответ.
Принцип мониторинга изменений данных:
-
Vue
пройти черезgetter/setter
А также захват некоторых функций, он может точно знать изменения данных и достигать хорошей производительности без специальной оптимизации. -
React
По умолчанию сравниваются ссылки, если они не оптимизированы (PureComponent/shouldComponentUpdate
) может привести к большому количеству ненужных повторных рендеров VDOM.
Разница между взаимодействием компонентов: шаблоны jsx и .vue.
-
HoC和Mixins
(То, как мы комбинируем различные функции в Vue,Mixin
, пока вReact
в котором мы проходимHoC
(Компонент высшего порядка)).
оптимизация производительности
React: shouldComponentUpdate
-
Vue
: Внутренняя реализацияshouldComponentUpdate
оптимизация, благодаря наличию системы отслеживания зависимостей, путемwatcher
Определить, требуется ли повторный рендеринг (когда на странице большой объем данных,Vue
Производительность низкая, что приводит к зависанию страницы, поэтому обычно проекты с относительно большими данными, как правило, используютReact
).
Разница между vuex и redux?
Из принципа реализации самое большое отличие состоит в двух моментах:
Reduxиспользуя неизменяемые данные, в то время какVuex
Данные изменчивы.Redux
каждый раз новыйstate
заменить старыйstate
,а такжеVuex
является прямой модификацией
ReduxПри обнаружении изменений данных, это черезdiff
способ сравнения различий, в то время какVuex
По сути, так же, как и принцип Vue, черезgetter/setter
для сравнения (если посмотретьVuex
Исходник будет знать, на самом деле он напрямую создаетVue
Экземпляры используются для отслеживания изменений данных)
Что происходит, когда браузер переходит от ввода URL к отображению страницы?
三个方面:
网络篇:
构建请求
查找强缓存
DNS解析
建立TCP连接(三次握手)
发送HTTP请求(网络请求后网络响应)
浏览器解析篇:
解析html构建DOM树
解析css构建CSS树、样式计算
生成布局树(Layout Tree)
浏览器渲染篇:
建立图层树(Layer Tree)
生成绘制列表
生成图块并栅格化
显示器显示内容
最后断开连接:TCP 四次挥手
(浏览器会将各层的信息发送给GPU,GPU会将各层合成,显示在屏幕上)
Сетевая безопасность, протокол HTTP
Разница между TCP и UDP
1.`TCP`向上层提供面向连接的可靠服务 ,`UDP`向上层提供无连接不可靠服务。
2.虽然 `UDP` 并没有 `TCP` 传输来的准确,但是也能在很多实时性要求高的地方有所作为
3.对数据准确性要求高,速度可以相对较慢的,可以选用`TCP`
разница | UDP | TCP |
---|---|---|
подключаться ли | Нет соединения | ориентированный на соединение |
Это надежно | Ненадежная передача, не используются управление потоком и контроль перегрузки | Надежная передача с использованием управления потоком и контролем перегрузки |
Количество объектов подключения | Поддержка интерактивного общения «один к одному», «один ко многим», «многие к одному» и «многие ко многим». | общение только один на один |
способ передачи | ориентированный на сообщение | байтовый поток |
Накладные расходы заголовка | Заголовок небольшой, всего 8 байт. | Заголовок минимум 20 байт, максимум 60 байт |
Применимая сцена | Идеально подходит для приложений реального времени (IP-телефония, видеоконференции, прямые трансляции и т. д.) | Идеально подходит для приложений, требующих надежной передачи, таких как передача файлов |
Разница между Http и Https (высокая частота)
1.`HTTP` 的URL 以http:// 开头,而HTTPS 的URL 以https:// 开头
2.`HTTP` 是不安全的,而 HTTPS 是安全的
3.`HTTP` 标准端口是80 ,而 HTTPS 的标准端口是443
4.`在OSI` 网络模型中,HTTP工作于应用层,而HTTPS 的安全传输机制工作在传输层
5.`HTTP` 无法加密,而HTTPS 对传输的数据进行加密
6.`HTTP`无需证书,而HTTPS 需要CA机构wosign的颁发的SSL证书
Разница между GET и POST (высокая частота)
1.GET在浏览器回退不会再次请求,POST会再次提交请求
2.GET请求会被浏览器主动缓存,POST不会,要手动设置
3.GET请求参数会被完整保留在浏览器历史记录里,POST中的参数不会
4.GET请求在URL中传送的参数是有长度限制的,而POST没有限制
5.GET参数通过URL传递,POST放在Request body中
6.GET参数暴露在地址栏不安全,POST放在报文内部更安全
7.GET一般用于查询信息,POST一般用于提交某种信息进行某些修改操作
8.GET产生一个TCP数据包;POST产生两个TCP数据包
Понимать принципы xss, csrf, ddos атак и как их избежать
XSS
(Cross-Site Scripting
,Атака с использованием межсайтовых сценариев) — это атака с внедрением кода. Злоумышленник внедряет вредоносный код на целевой веб-сайт, и этот вредоносный код запускается, когда жертва попадает на веб-сайт.Эти сценарии могут читатьcookie,session tokens
, или другую конфиденциальную информацию веб-сайта, фишинговые и мошеннические действия пользователей или даже запуск червей.
CSRF
(Cross-site request forgery
)Подделка межсайтовых запросов: Злоумышленник побуждает жертву зайти на сторонний веб-сайт и на стороннем веб-сайте отправляет межсайтовый запрос на атакуемый веб-сайт. Используя регистрационные данные, которые жертва получила на атакованном веб-сайте, аутентификация пользователя в фоновом режиме обходится, и достигается цель выдачи себя за пользователя для выполнения операции на атакуемом веб-сайте.
Способы избежать XSS:
-
url
использование параметраencodeURIComponent
метод побега - попробуй не иметь
InnerHtml
вставлятьHTML
содержание - Используйте специальные символы, escape-символы.
CSRF
Способы избежать:
- Добавить код подтверждения
- использовать токен
- Сервер генерирует токен для пользователя, шифрует его и передает пользователю
- Пользователь должен иметь этот токен при отправке запроса.
- Сервер проверяет правильность токена
DDoS
Также называется распределенным отказом в обслуживании, полное имяDistributed Denial of Service
, принцип заключается в использовании большого количества запросов, вызывающих перегрузку ресурсов, что приводит к недоступности службы.
DDos
Способы избежать:
- Ограничить частоту запросов одного IP.
- Брандмауэр и другие настройки защиты запрещены
ICMP
пакет и т. д. - Проверить открытие привилегированных портов
функции http и коды состояния
比如:
200响应成功
301永久重定向
302临时重定向
304资源缓存
403服务器禁止访问
404服务器资源未找到
500 502服务器内部错误
504 服务器繁忙
1xx Informational(信息状态码) 接受请求正在处理
2xx Success(成功状态码) 请求正常处理完毕
3xx Redirection(重定向状态码) 需要附加操作已完成请求
4xx Client Error(客户端错误状态码) 服务器无法处理请求
5xx Server Error(服务器错误状态码) 服务器处理请求出错
http трехстороннее рукопожатие
- Шаг 1: Клиент отправляет SYN-сообщение на сервер, чтобы инициировать рукопожатие.После отправки клиент находится в состоянии SYN_Send.
- Шаг 2: После получения сообщения SYN сервер отвечает клиенту сообщениями SYN и ACK.
- Шаг 3: клиент получает SYN и ACK, отправляет сообщение ACK на сервер, и клиент переходит в установленное состояние.В это время сервер также находится в установленном состоянии после получения сообщения ACK, и обе стороны установили связь.
http волна четыре раза
В начале обе стороны были в establised
Статус, если клиент сначала инициирует запрос на отключение, то:
- Первая волна: клиент отправляет сообщение FIN, в сообщении указывается серийный номер. В этот момент клиент находится в состоянии FIN_WAIT1.
- Вторая волна: после того, как сервер получит FIN, он отправит сообщение ACK и использует значение серийного номера клиента + 1 в качестве значения серийного номера сообщения ACK, указывая, что сообщение клиента было получено. сервер в состоянии CLOSE_WAIT.
- Третья волна: Если сервер тоже хочет отключиться, как и первая волна клиента, отправьте сообщение FIN и укажите серийный номер. В этот момент сервер находится в состоянии LAST_ACK.
- Четвертая волна: после того, как клиент получает FIN, он также отправляет сообщение ACK в качестве ответа и использует значение серийного номера сервера + 1 в качестве значения серийного номера своего собственного сообщения ACK. Состояние TIME_WAIT. Потребуется некоторое время, чтобы убедиться, что сервер не перейдет в состояние CLOSED, пока не получит собственное сообщение ACK.
- После того, как сервер получает сообщение ACK, он закрывает соединение и находится в состоянии CLOSED.
Разница между http1.0, http1.1, http2.0
- 1 По сравнению с 1.0, 1.1 может передавать несколько файлов одновременно
- Анализ http1.x основан на тексте, http2.0 использует двоичный формат, а новые функции включают мультиплексирование, сжатие заголовков, отправку на стороне сервера (статические ресурсы HTML).
Как http реализует кеширование
- Сильный кеш==>Expires (срок действия)/Cache-Control(без кэша) (высокий приоритет) Negotiate cache ==>Last-Modified/Etag (высокий приоритет) Etag подходит для небольших файлов, которые часто изменяются. Last-Modified подходит для Большие файлы, которые редко изменяются
- Сильная стратегия кэширования и согласованная стратегия кэшированияПри попадании в кеш копия локального кеша будет использоваться напрямую, с той лишь разницей, что согласованный кеш будет отправлять запрос на сервер. Когда они пропустят кеш, они отправят запрос на сервер, чтобы получить ресурс. В реальном механизме кэширования строгая стратегия кэширования и согласованная стратегия кэширования используются вместе. Браузер сначала определит, попал ли сильный кеш в соответствии с запрошенной информацией, и если он попадет, ресурс будет использоваться напрямую. Если не попадает, то инициирует запрос к серверу в соответствии с информацией из заголовка и использует согласованный кеш.Если согласованный кеш попадает, сервер не возвращает ресурс, а браузер напрямую использует копию локального ресурса , Если согласованный кеш не попадает, браузер возвращает браузеру последний ресурс.
Полный процесс http-запроса после ввода URL
Установить TCP-соединение -> отправить строку запроса -> отправить заголовок запроса -> (прийти на сервер) отправить строку состояния -> отправить заголовок ответа -> отправить данные ответа -> отключить TCP-соединение
Оптимизация производительности интерфейса
Несколько способов оптимизировать производительность интерфейса
1. 浏览器缓存
2. 防抖、节流
3. 资源懒加载、预加载
4.开启Nginx gzip压缩
三个方面来说明前端性能优化
一: webapck优化与开启gzip压缩
1.babel-loader用 include 或 exclude 来帮我们避免不必要的转译,不转译node_moudules中的js文件
其次在缓存当前转译的js文件,设置loader: 'babel-loader?cacheDirectory=true'
2.文件采用按需加载等等
3.具体的做法非常简单,只需要你在你的 request headers 中加上这么一句:
accept-encoding:gzip
4.图片优化,采用svg图片或者字体图标
5.浏览器缓存机制,它又分为强缓存和协商缓存
二:本地存储——从 Cookie 到 Web Storage、IndexedDB
说明一下SessionStorage和localStorage还有cookie的区别和优缺点
三:代码优化
1.事件代理
2.事件的节流和防抖
3.页面的回流和重绘
4.EventLoop事件循环机制
5.代码优化等等
Что такое политика одинакового происхождения
Сценарии JS в одном домене не могут без разрешения получать доступ к контенту в другом домене. Обычно основанием для оценки кросс-доменности является то, совпадают ли протокол, имя домена и номер порта. Политика одного и того же происхождения является ограничением для сценариев js, а не ограничением для браузеров.Как и img, запросы сценариев сценариев не будут иметь междоменных ограничений.
Как взаимодействуют интерфейс и сервер
Ajax : 短连接
Websocket : 长连接,双向的。
Form表单(最原始的)
Несколько способов междоменной связи
решение:
-
jsonp
(использоватьscript
Уязвимая реализация тегов без междоменных ограничений. Недостаток: поддерживает толькоGET
просить) -
CORS
(настраиватьAccess-Control-Allow-Origin
: укажите доменное имя доступного ресурса) -
postMessage
(message, targetOrigin, [transfer]
)(HTML5
Добавлен API для многооконного сообщения, доставки сообщений iframe на странице), черезonmessage
контролировать входящие данные -
Websocket
Это постоянный протокол HTML5, который реализует полнодуплексную связь между браузером и сервером, а также является междоменным решением. -
Node
промежуточный прокси -
Nginx
обратный прокси - различная вложенность
iframe
метод, который обычно не используется. - Междоменные решения для наиболее часто используемых в повседневной работе являются CORS и NGINX обратный прокси
Можете ли вы рассказать о локальном хранилище браузера? Каковы плюсы и минусы каждого?
Локальное хранилище браузера в основном разделено наCookie、WebStorage和IndexDB
, вWebStorage
можно еще разделить наlocalStorage和sessionStorage
.
Общая основа:Все сохраняются на стороне браузера и имеют одинаковое происхождение.
разница:
-
cookie
данные всегда в одном и том же источникеhttp
переносятся в запросе (даже если не нужны), т.е.cookie
Переход туда и обратно между браузером и сервером.cookie
Данные также имеют путь (path
) концепция, которая может ограничиватьcookie
принадлежат только определенному путиsessionStorage
а такжеlocalStorage
Данные не отправляются автоматически на сервер, а сохраняются только локально. - Пределы размера хранилища также отличаются,
-
cookie
Данные не могут превышать 4K,sessionStorage和localStorage
может достигать 5 м -
sessionStorage
: действует только до закрытия текущего окна браузера; -
localStorage
: всегда действителен, всегда сохраняется при закрытии окна или браузера, сохраняется локально, поэтому он используется как постоянные данные; -
cookie
: только когда установленоcookie
Он действителен до истечения срока действия, даже если окно закрыто или браузер закрыт.
- разная сфера
-
sessionStorage
: не делите между разными окнами браузера даже одну и ту же страницу; -
localstorage
: Доступно для всех окон одного и того же источника, то есть пока браузер не закрыт, данные все еще существуют. -
cookie
: он также используется всеми окнами одного и того же происхождения, то есть пока браузер не закрыт, данные все еще существуют.
Фронтенд-инжиниринг
конфигурация webpack, каковы точки оптимизации webpack 4.0
module.exports={
entry: {},
output: {},
plugins: [],
module: [rules:[{}]]
}
Как webpack достигает разделения кода
-
入口起点
:использоватьentry
Конфигурация вручную разделяет код. -
防止重复
:использоватьCommonsChunkPlugin
Дедупликация и разделениеchunk
. -
动态导入
: Разделение кода путем встраивания вызовов функций модулей.
Общий загрузчик Webpack?Как получить загрузчик Webpack (НЕТ)
loader
: экспортируемая функцияjavascript
модуль, судя поrule
Конвертер, соответствующий расширению файла, обрабатывающий файл.
file-loader
: вывести файл в папку, передать относительный код в кодеURL
Выходные файлы разыменования (обработка изображений и шрифтов)
url-loader
: а такжеfile-loader
Подобное, разница состоит в том, что пользователь может установить порог, который больше порогового значения.file-loader
Обработать, вернуть файл, если меньше порогового значенияbase64
Кодирование форм (обработка изображений и шрифтов)
image-loader
: загружать и сжимать файлы изображений
babel-loader
:ПучокES6
Перевести в ES5
sass-loader
:БудуSCSS/SASS
код вCSS
css-loader
:нагрузкаCSS
, который поддерживает модульность, сжатие, импорт файлов и другие функции.
style-loader
:ПучокCSS
код, внедренный вJavaScript
в, через DOM
операция по загрузкеCSS
postcss-loader
: расширенныйCSS
Грамматика, используя следующее поколение CSS
, может соответствоватьautoprefixer
Плагин автодополненияПрефикс CSS3
eslint-loader
:пройти черезESLint
экзаменJavaScript
код
Общий плагин Webpack?Как реализовать плагин Webpack(НЕТ)
плагин: по сути плагин, основанный на структуре потока событий Tapable
, плагин может расширитьWebpack
функция, в Webpack
Многие события транслируются в течение жизненного цикла бега,Plugin
Вы можете слушать эти события и проходить их в нужное время Webpack
который предоставилAPI
Изменить результат вывода.
html-webpack-plugin
:упрощатьHTML
создание файла (в зависимости от html-loader
)
uglifyjs-webpack-plugin
: сжать js-файлы
clean-webpack-plugin
: каталог очистить
mini-css-extract-plugin
: отдельные файлы стилей, CSS извлекается в виде отдельного файла, поддерживает загрузку по требованию (альтернативныйextract-text-webpack-plugin
)
Сравнение загрузчика и плагина?
-
Loader
существуетmodule.rules
Конфигурация в , как правило разбора модуля, тип - массив. Каждый элемент является Оbject
, который содержитtest(类型文件)、loader、options
(параметр) и другие атрибуты. -
Plugin
существуетplugins
Настраивается отдельно в типе, тип - массив, каждый элемент -Plugin
Экземпляр , параметры передаются через конструктор.
Фронтенд модульный, CMD, AMD, CommonJS
CommonJS
CommonJS
Это спецификация для серверных модулей, популяризированная и используемая Node, и веб-пакет также написан в этой спецификации.
Спецификация commonJs:
CommonJS
Спецификация модуля в основном разделена на три части:模块定义、模块标识、模块引用
.
-
Определение модуля:
module
Объект: В каждом модулеmodule
Объект представляет собой сам модуль.export
Атрибуты:module
Свойство объекта, обеспечивающее интерфейс с внешним миром. Лучший способ экспортировать переменные модуля — использоватьmodule.exports
объект. Один файл — это модуль. Каждый модуль представляет собой отдельную область, то есть переменные, определенные в модуле, не могут быть прочитаны другими модулями, если они не определены какglobal
свойства объекта. -
ID модуля: передан
require
Параметр метода должен быть строкой, соответствующей регистру маленького верблюда, или относительным путем, начинающимся с . , .. , или абсолютным путем. -
ссылка на модуль: загрузите модуль, используя
require
(синхронная загрузка), этот метод читает файл и выполняет его, возвращая внутреннийmodule.exports
объект.
Преимущество:
На заднем конце,JavaScript
Спецификация сильно отстает и имеет много недостатков, что затрудняет использованиеJavaScript
Разработать крупные приложения. Например: нет модульной системы, мало стандартных библиотек, без стандартных интерфейсов, отсутствие системы управления пакетами, списка содержимого
-
Спецификация модуля CommonJS очень хорошо решает проблему загрязнения переменных.Каждый модуль имеет независимое пространство и не мешает друг другу.Пространство имен не очень хорошее по сравнению с ним.
-
Спецификация CommonJS определяет, что модуль очень прост, а интерфейс очень лаконичен.
-
Спецификация модуля CommonJS поддерживает функции импорта и экспорта, так что каждый модуль может быть легко подключен и могут быть реализованы зависимости между собой.
-
Спецификация CommonJS была предложена главным образом для того, чтобы компенсировать тот недостаток, что JavaScript не имеет стандарта и достиг базовой способности разрабатывать крупномасштабные приложения, такие как Python, Ruby и Java, вместо того, чтобы оставаться на стадии разработки небольших скриптовых программ на сторона браузера.
недостаток:
Нет механизма параллельной загрузки
из-заCommonJS
Это загрузка модулей синхронно, что очень плохо для серверной части, т.к. все модули размещаются на локальном жестком диске. Время ожидания модуля — это время, когда жесткий диск считывает файл, который очень мал. Однако для браузера ему необходимо загрузить модуль с сервера, что связано со скоростью сети, прокси-сервером и другими причинами.Если время ожидания слишком велико, браузер будет находиться в состоянии «подвешенной смерти».
Так что браузерная сторона не очень подходитCommon.Js
, появляется другая спецификацияAMD
AMD
AMD
является спецификацией определения асинхронного модуля, работающей в среде браузера.RequireJS
Нормализованный вывод определения модуля в процессе продвижения.
Технические характеристики AMD
AMD
Предварительно соблюдается в модуле определения, когда мы должны объявить его зависимые модули
преимущество
Пользовательский опыт удобен, потому что задержки нет, а зависимые модули выполняются заранее.
CMD
CMD
Это общая спецификация определения модуля; это стандартизированный результат определения модуля в процессе продвижения SeaJs.
Спецификация CMD
CMD
Соблюдайте близость зависимостей, только когда используется модульrequire
преимущество
Производительность хорошая, потому что она выполняется только тогда, когда это нужно пользователю.
Интервью Серия рукописных кодов
防抖节流
Функция защиты от сотрясения ориентирована на непрерывный запуск в течение определенного периода времени и выполняется только один раз в конце, в то время как функция регулирования фокусируется на выполнении только один раз за период времени.
Стабилизатор
//定义:触发事件后在n秒内函数只能执行一次,如果在n秒内又触发了事件,则会重新计算函数执行时间。
//搜索框搜索输入。只需用户最后一次输入完,再发送请求
//手机号、邮箱验证输入检测 onchange oninput事件
//窗口大小Resize。只需窗口调整完成后,计算窗口大小。防止重复渲染。
const debounce = (fn, wait, immediate) => {
let timer = null;
return function (...args) {
if (timer) clearTimeout(timer);
if (immediate && !timer) {
fn.call(this, args);
}
timer = setTimeout(() => {
fn.call(this, args);
}, wait);
};
};
const betterFn = debounce(() => console.log("fn 防抖执行了"), 1000, true);
document.addEventListener("scroll", betterFn);
дросселирование
//定义:当持续触发事件时,保证隔间时间触发一次事件。
//1. 懒加载、滚动加载、加载更多或监听滚动条位置;
//2. 百度搜索框,搜索联想功能;
//3. 防止高频点击提交,防止表单重复提交;
function throttle(fn,wait){
let pre = 0;
return function(...args){
let now = Date.now();
if( now - pre >= wait){
fn.apply(this,args);
pre = now;
}
}
}
function handle(){
console.log(Math.random());
}
window.addEventListener("mousemove",throttle(handle,1000));
Глубокая и поверхностная копия объекта
//浅拷贝
1. Object.assign(target,source)
2. es6对象扩展运算符。
//深拷贝
function deepClone(obj) {
if (!obj || typeof obj !== "object") return;
let newObj = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
newObj[key] = typeof obj[key] === "object" ? deepClone(obj[key]) : obj[key];
}
}
return newObj;
}
Дедупликация массива, дедупликация объекта массива
//数组
const arr = [2,7,5,7,2,8,9];
console.log([...new Set(arr)]); // [2,7,5,8,9];
//对象
const list = [{age:18,name:'张三'},{age:18,name:'李四'},{age:18,name:'王五'}]
let hash = {};
const newArr = arr.reduce((item, next) => {
hash[next.age] ? '' : hash[next.age] = true && item.push(next);
return item;
}, []);
console.log(list);
Выравнивание массива
function flatten(arr) {
return arr.reduce((result, item) => {
return result.concat(Array.isArray(item) ? flatten(item) : item);
}, []);
}
Планирование профессиональных навыков, персонал интервью
- Куда вы собираетесь развиваться в будущем? Опытный/полностью сухой
- Личные инсайты для планирования карьеры
- Отражение собственной ценности
Причина ухода
- Причины планирования личной карьеры
- Причина компании
разное
- Каковы ваши карьерные планы на ближайшие один-три года?
- Как вы изучаете и обращаете внимание на новые технологии?
- Каковы ваши впечатления или выводы из вашей работы за последние годы?
- Как вы думаете, каковы ваши сильные и слабые стороны в работе?
- Вы пришли в нашу компанию, в чем ваши преимущества?
- У вас есть проекты с открытым исходным кодом?
- Вы когда-нибудь писали пакет npm или плагин для веб-пакета?
- Исходный код какой фреймворка или библиотеки классов вы читали и что вы получили?
Пополнить
символы в ES6
Его функция аналогична идентификатору, который идентифицирует уникальность каждогоSymbol
Экземпляры уникальны.Symbol
Тип ключа не может быть переданObject.keys()
илиfor...in
перечислить,
Он не входит в набор имен свойств самого объекта (property names
) среди.
Следовательно, используя эту функцию, мы можем использовать Symbol для определения некоторых свойств, которые не требуют внешних операций и доступа.
// использоватьObject的API
Object.getOwnPropertySymbols(obj)
// [Symbol(name)]
// Используйте новый API отраженияReflect.ownKeys(obj)
// [Symbol(name), 'age', 'title']
установить и сопоставить в ES6
-
Map
Объекты содержат пары ключ-значение. Любое значение (объект или примитив) может использоваться как ключ или значение. Конструктор Map может принимать в качестве параметра массив. -
Set
Объекты позволяют хранить значения любого типа, будь то примитивное значение или ссылка на объект. Он похож на массив, но все значения членов уникальны и нет повторяющихся значений.
vue ключ
-
key
Роль в основном заключается в эффективном обновлении виртуальногоDOM
, принцип такойvue
существуетpatch
через процессkey
Он может точно определить, являются ли два узла одинаковыми,
Тем самым избегая частых обновлений разных элементов, делая весьpatch
Процесс более эффективен и менееDOM
Количество операций, чтобы улучшить производительность.
2. Далее, если предусмотреноkey
Это также может вызвать некоторые скрытые ошибки при обновлении списка.
3.vue
При переключении перехода элементов с одинаковым именем тега также используется ключевой атрибут, и цель также состоит в том, чтобы позволить Vue различать их.
иначеvue
заменит только свои внутренние свойства, не вызывая эффекта перехода.
Разница между нормальной функцией и функцией стрелки
- Стрелочные функции — это анонимные функции, их нельзя использовать в качестве конструкторов и нельзя использовать новые значения.
- Стрелочные функции не привязаны
arguments
, вместоrest
Параметры... разрешены - Стрелочные функции не привязаны
this
, он захватит значение this контекста, в котором оно находится, как собственное значение this. - стрелочная функция через
call() 或 apply()
Когда метод вызывает функцию, передается только один параметр, и он на это не влияет. - Стрелочные функции не имеют свойства прототипа
- Стрелочные функции нельзя использовать как
Generator
функция, не может быть использованаyield
ключевые слова
Суммировать:
- стрелочная функция
this
всегда ссылайтесь на его контекстthis
, который нельзя изменить никаким способом, напримерcall() , bind() , apply()
- this нормальной функции указывает на объект, вызвавший ее
Карринг функций JS
- Повторное использование параметра
- Подтвердите заранее
- Отложенная операция
// 普通的add函数
function add(x, y) {
return x + y
}
// Currying后
function curryingAdd(x) {
return function (y) {
return x + y
}
}
add(1, 2) // 3
curryingAdd(1)(2) // 3
Реализовать диктат наследования
Наследование цепочки прототиповНапишите родительский класс и подкласс Прототип подкласса является экземпляром суперкласса subclass.prootype = новый родительский класс Исправьте прототип подкласса для самого подкласса подкласс.прототип.конструктор=подкласс Новый подкласс может вызывать метод родительского класса Наследование конструктора Напишите родительский класс и подкласс В родительском подклассе class.call(this) может быть достигнут
mapState, mapGetters, mapActions, mapMutations
Когда компоненту необходимо получить несколько состояний, объявление их всех как вычисляемых свойств является несколько повторяющимся и избыточным. Чтобы решить эту проблему, мы можем использовать вспомогательную функцию mapState, которая поможет нам сгенерировать вычисляемые свойства. mapMutations на самом деле похож на mapState, который сопоставляет методы в компоненте с вызовами store.commit.
Простота вычисления функции
Как показано выше, его можно грубо разделить на две категории: полиномиальная величина и неполиномиальная величина. Среди них всего две неполиномиальные величины: O(2n) и O(n!) Соответствующий темп роста показан на рисунке ниже.
Понимание исходного кода Vue
xxxxx...
модель уровня osi7, модель уровня tcp5
модель слоя osi7:物理层-数据链路层-传输层-网络层-应用层-会话层-表示层
Модель слоя tcp5:物理层-数据链路层-传输层-网络层-应用层
напиши в конце
яИрен а, Я очень счастлив встретить тебя.
-
Если в статье есть ошибки, исправьте их в комментариях, если статья вам поможет, ставьте лайк 👍 и подписывайтесь на 😊
-
Эта статья была впервые опубликована на Наггетс, перепечатка без разрешения запрещена 💌