Следующие вопросы интервью взяты из проекта github.Руководство по интерфейсу, есть более 200 высокочастотных вопросов и ответов для интервью, и в настоящее время он имеет 1400 звезд.
Почему стоит использовать фреймворк вместо нативного?
Преимущества фреймворков:
- Компонентизация: среди них компонентизация React является наиболее тщательной, и она может даже достигать атомарных компонентов на функциональном уровне.Высокая степень компонентизации может сделать наши проекты простыми в обслуживании, а также легко комбинировать и расширять.
- Естественная многоуровневость: код в эпоху JQuery в основном представляет собой спагетти-код с серьезными связями.Современные фреймворки, будь то режим MVC, MVP или MVVM, могут помочь нам в многоуровневости, а развязку кода легче читать и писать.
- Экология: теперь основные интерфейсные фреймворки имеют свою собственную экологию, будь то архитектура управления потоками данных или библиотека пользовательского интерфейса, есть зрелые решения.
- Эффективность развития: современные фронт-конечные рамки автоматически обновляют DOM по умолчанию вместо нашей ручной работы, которая освобождает разработчиков из ручных затрат DOM, повышает эффективность разработки и принципиально решает проблему синхронизации UI и состоянию.
Каковы плюсы и минусы виртуального DOM?
преимущество:
- Гарантированный нижний предел производительности: виртуальный DOM может найти минимальную разницу с помощью diff, а затем патчить в пакетах.Хотя эта операция не так хороша, как ручная оптимизация, она имеет гораздо лучшую производительность, чем грубая операция DOM, поэтому виртуальный DOM может гарантировать более низкую производительность. предел.
- Нет необходимости вручную манипулировать DOM: сравнение и исправление виртуального DOM автоматически выполняются в одном обновлении, нам не нужно вручную манипулировать DOM, что значительно повышает эффективность разработки.
- Кроссплатформенность: виртуальный DOM, по сути, является объектом JavaScript, а DOM тесно связан с платформой.Напротив, виртуальный DOM может выполнять более удобные кроссплатформенные операции, такие как серверный рендеринг, мобильная разработка и т. д.
недостаток:
- Мы не можем быть конечной оптимизацией: виртуальный DOM не может быть нацелен на оптимизацию максимальных требований к экстремальной производительности некоторых приложений, таких как прямое ручное управление VScode DOM, способ экстремальной оптимизации производительности.
Как работает виртуальный DOM?
- Виртуальный DOM — это, по сути, объект JavaScript, абстракция реального DOM.
- Когда состояние изменится, запишите разницу между новым деревом и старым деревом.
- Наконец, обновите разницу до настоящего дома
Каков последний жизненный цикл React?
Три жизненных цикла устарели после React 16 (но не удалены)
- componentWillMount
- componentWillReceiveProps
- componentWillUpdate
Официальный план состоит в том, чтобы полностью удалить эти три функции в версии 17 и оставить только три функции с префиксом UNSAVE_ в целях обратной совместимости, но разработчики должны стараться избегать их использования и вместо этого использовать новые функции жизненного цикла. заменить их
В настоящее время жизненный цикл React 16.8+ разделен на три этапа: этап монтирования, этап обновления и этап выгрузки.
Стадия монтирования:
- Конструктор: конструктор выполняется первым, мы обычно инициализируем объект состояния в конструкторе или привязываем его к пользовательскому методу.
- getDerivedStateFromProps:
static getDerivedStateFromProps(nextProps, prevState)
, Это статический метод. Когда мы получаем новые свойства и хотим изменить наше состояние, мы можем использовать getDerivedStateFromProps - render: Функция рендеринга — это чистая функция, она возвращает только то, что нужно отобразить, и не должна содержать другой бизнес-логики.Она может возвращать собственный DOM, компоненты React, фрагменты, порталы, строки и числа, логические значения и нулевые значения и т. д.
- ComponentDidMount: когда компонент загружен, мы можем получить узел DOM и работать, например, в нем можно записать операции Canvas, SVG, запрос сервера и подписки, но не забудьте отменить подписки в ComponentWillunmount.
Этап обновления:
- getDerivedStateFromProps: этот метод может быть вызван как на этапе обновления, так и на этапе монтирования.
- shouldComponentUpdate:
shouldComponentUpdate(nextProps, nextState)
, Есть два параметра nextProps и nextState, которые представляют новое свойство и состояние после изменения и возвращают логическое значение. True означает, что повторный рендеринг будет запущен, false означает, что повторный рендеринг не будет запущен, а по умолчанию возвращает true Мы обычно используем этот жизненный цикл для оптимизации производительности программы React. - render: фаза обновления также запускает этот жизненный цикл
- getSnapshotBeforeUpdate:
getSnapshotBeforeUpdate(prevProps, prevState)
, Этот метод вызывается после рендеринга и перед componentDidUpdate.Есть два параметра prevProps и prevState, которые представляют предыдущие свойства и предыдущее состояние.Эта функция имеет возвращаемое значение, которое будет передано в componentDidUpdate в качестве третьего параметра.Если вы это сделаете не хочет возвращать значение, может возвращать значение null, этот жизненный цикл должен использоваться с componentDidUpdate - componentDidUpdate:
componentDidUpdate(prevProps, prevState, snapshot)
, Этот метод вызывается после метода getSnapshotBeforeUpdate с тремя параметрами prevProps, prevState, snapshot, указывающими предыдущие реквизиты, предыдущее состояние и моментальный снимок. Третий параметр возвращается getSnapshotBeforeUpdate.Если состояние элемента DOM необходимо использовать при запуске некоторых функций обратного вызова, процесс сравнения или вычисления переносится в getSnapshotBeforeUpdate, а затем состояние обратного вызова или обновления единообразно запускается в componentDidUpdate.
Этап удаления:
- componentWillUnmount: она будет вызываться, когда наш компонент будет размонтирован или уничтожен.Мы можем использовать эту функцию для очистки некоторых таймеров, отмены сетевых запросов, очистки недопустимых элементов DOM и других работ по очистке мусора.
Взгляд на жизненный цикл реакцииВеб-сайт
В каком жизненном цикле должны проходить запросы React?
В какой жизненный цикл следует поместить асинхронный запрос React, некоторые думают, что вcomponentWillMount
В этом случае асинхронные запросы могут быть сделаны заранее, чтобы избежать белых экранов. На самом деле, этот взгляд проблематичен.
Из-за природы асинхронных событий в JavaScript, когда вы инициируете вызов API, браузер тем временем возвращается к другой работе. Когда React рендерит компонент, он не ждет, пока componentWillMount завершит что-либо — React движется дальше и продолжает рендеринг, нет возможности «приостановить» рендеринг, чтобы дождаться поступления данных.
И вcomponentWillMount
Запрос будет иметь ряд потенциальных проблем.Во-первых, во время серверного рендеринга, если данные извлекаются в componentWillMount, выборка данных будет выполняться дважды, один раз на сервере и один раз на клиенте, что вызывает избыточные запросы.Во-вторых, в React 16 После перезаписи React Fiber,componentWillMount
Может вызываться несколько раз в одном рендере.
В настоящее время официально рекомендуемый асинхронный запрос находится вcomponentDidmount
в ходе выполнения.
Если у вас есть особые потребности, необходимо запросить заранее, можно в исключительных обстоятельствах вconstructor
Средний запрос:
После реакции 17
componentWillMount
будет отброшено, останется толькоUNSAFE_componentWillMount
Является ли setState асинхронным или синхронным?
Сначала ответьте: иногда ведет себя асинхронно, иногда ведет себя синхронно
setState
"Асинхронный" только в синтетических событиях и хуках, в нативных событиях иsetTimeout
синхронизированы.setState
«Асинхронный» не означает, что внутренняя реализация реализуется асинхронным кодом. Фактически, процесс и код, выполняемый самим собой, синхронно, но вызывающая последовательность синтетических событий и функций крючков является до обновления, так что синтетические события и функции крючка не могут быть немедленно получены. На обновленное значение, образующее так называемое «асинхронное», конечно, через второй параметрsetState(partialState, callback)
серединаcallback
Получите обновленные результаты.setState
Оптимизация пакетного обновления также основана на «асинхронности» (синтетические события, функции-ловушки) и не будет обновляться пакетами в собственных событиях и setTimeout.В «асинхронном режиме», если одно и то же значение повторяется несколько разsetState
,setState
Стратегия пакетного обновления перезапишет его, возьмет последнее выполнение, если оно одновременноsetState
Несколько разных значений включаются в объединенные пакетные обновления при обновлении.
Как реализована коммуникация компонентов React?
Связь между компонентами React:
- Родительский компонент взаимодействует с дочерним компонентом: родительский компонент может общаться с дочерним компонентом, передавая реквизиты дочернему компоненту.
- Дочерний компонент общается с родительским компонентом: метод props+callback, родительский компонент передает реквизиты дочернему компоненту для связи, этот реквизит представляет собой функцию, областью действия которой является сам родительский компонент, дочерний компонент вызывает эту функцию, а информация, которую хочет передать дочерний компонент, используется в качестве параметров, передаваемых в область действия родительского компонента.
- Связь компонентов Brother: найдите общий родительский узел двух одноуровневых узлов и объедините два вышеуказанных метода для пересылки информации от родительского узла для связи.
- Связь между слоями:
Context
Он предназначен для обмена данными, которые являются «глобальными» для дерева компонентов, такими как текущий аутентифицированный пользователь, тема или предпочтительный язык, для глобальных данных на нескольких уровнях черезContext
Общение не может быть более подходящим - Режим публикации-подписки: издатели публикуют события, подписчики слушают события и реагируют, мы можем общаться, вводя модуль событий.
- Инструменты управления глобальным состоянием: взаимодействуйте с инструментами управления глобальным состоянием, такими как Redux или Mobx, которые поддерживают глобальное хранилище центра состояний и генерируют новые состояния в соответствии с различными событиями.
Каковы средства оптимизации производительности в React?
Средства оптимизации производительности часто являются общими.Подробнее см.Статьи по оптимизации производительности передней работы
Как React выполняет повторное использование компонентов/логики?
Помимо микса, который был официально устарел, в настоящее время существует три основных технологиях для абстракции компонентов:
- Компоненты более высокого порядка:
- Риелтером
- обратное наследование
- свойства рендеринга
- react-hooks
Подробнее о повторном использовании компонентов см.Повторное использование компонентов
Каковы плюсы и минусы mixin, hoc, render props и react-hooks?
Недостатки миксина:
-
Существует неявная зависимость между компонентом и примесью (примесь часто зависит от конкретного метода компонента, но не знает об этой зависимости, когда компонент определен)
-
Могут быть конфликты между несколькими миксинами (например, определение одного и того же поля состояния)
-
Миксины, как правило, добавляют больше состояния, что снижает предсказуемость вашего приложения (чем больше государства в вашем приложении, тем сложнее оно состоит в том, чтобы рассуждать об этом.), Приведет к резкому увеличению сложности.
-
Неявные зависимости приводят к непрозрачным зависимостям, быстро возрастающим затратам на обслуживание и понимание:
-
Сложно быстро понять поведение компонентов, и необходимо полностью понимать все поведения расширений, которые зависят от Mixin и их взаимодействия.
-
Поле метода и состояния самой цены группы не может быть легко удалено, потому что трудно определить, есть ли какой-либо Mixin, который зависит от него.
-
Mixin также сложно поддерживать, потому что логика Mixin в конечном итоге будет выровнена и объединена воедино, трудно понять ввод и вывод Mixin.
-
Преимущества HOC по сравнению с Mixin:
- HOC влияет на состояние внутреннего компонента через внешний компонент через Props, вместо прямого изменения его состояния, нет конфликтов и взаимных помех, что снижает степень связанности
- В отличие от выравнивания + слияния Mixin, HOC имеет естественную иерархическую структуру (структура дерева компонентов), что снижает сложность
Недостатки ХОК:
- Ограничения расширяемости: HOC не может получить доступ к состоянию подкомпонентов извне, поэтому не может отфильтровывать ненужные обновления через shouldComponentUpdate.React предоставляет React.PureComponent после поддержки класса ES6 для решения этой проблемы
- Проблема прохождения рефов: Реф обрезается, позже React.forwardRef решает эту проблему
- Wrapper Hell: HOC может иметь несколько уровней обернутых компонентов, а несколько уровней абстракции также увеличивают сложность и стоимость понимания.
- Конфликт имен: если компоненты более высокого порядка вложены несколько раз, возникнут конфликты, если пространство имен не используется, а затем старые свойства будут перезаписаны.
- Невидимость: HOC эквивалент оригинальным компонентам внешнего слоя переупаковки компонента, вы не имеете представления, какой внешний слой упаковки, для вас черный ящик
Преимущества рендеринга ProPS:
- Недостатки вышеупомянутого HOC могут быть решены с помощью Render Props.
Недостатки рендер-реквизита:
- Громоздкий в использовании: HOC можно повторно использовать только с одной строкой кода с помощью синтаксиса декоратора, реквизиты рендеринга не могут быть такими простыми.
- Слишком глубокая вложенность: хотя Render Props избавляется от проблемы многослойной вложенности компонентов, она трансформируется во вложенность обратных вызовов функций.
Преимущества React-хуков:
- Кратко: Реактивные крюки решают проблему гнездования HOC и рендеринга, что делает его более лаконичным
- Развязка: React Hooks может более легко отделить пользовательский интерфейс и состояние для более тщательной развязки.
- Комбинация: хуки могут ссылаться на другие хуки для формирования новых хуков, и комбинации могут быть разнообразными.
- Дружественный к функциям: React Hooks созданы для функциональных компонентов, таким образом, решая несколько основных проблем компонентов класса:
- Этот момент легко принять
- Логика, разделенная на разные циклы объявлений, затрудняет понимание и поддержку кода.
- Высокая стоимость повторного использования кода (компоненты более высокого порядка могут легко увеличить объем кода)
Реагистрационные крюки дефекты:
-
Дополнительные затраты на обучение (путаница между функциональным компонентом и компонентом класса)
-
Есть ограничения на способ записи (не может появляться в условиях и циклах), а ограничения на способ записи увеличивают стоимость реконструкции
-
Уничтожен эффект оптимизации производительности поверхностного сравнения PureComponent и React.memo (чтобы получить последние реквизиты и состояние, каждый render() должен воссоздать функцию события)
-
В сценарии закрытия можно ссылаться на старое состояние и значения реквизита.
-
Внутренне неинтуитивный (полагающийся на изменяемое глобальное состояние, больше не «чистое»)
-
React.memo не может полностью заменить необходимость)
Комментарии к комментариям реагированных крючков происходит от официальногоreact-hooks RFC
Как вы понимаете клетчатку?
React Fiber — это браузерныйАлгоритм планирования одного потока.
До Реакта 16,reconcilation
Fiber
:Аrecocilation
(recursive diff), алгоритм, разбитый на бесчисленное множество мелких задач; он может остановиться и возобновиться в любой момент. Время остановки и возобновления зависит от того, достаточно ли времени в текущем кадре (16 мс) для расчета.
Что вы понимаете под Time Slice?
разрезание времени
- React не будет блокировать текущий поток при рендеринге (рендеринге)
- Если ваше устройство достаточно быстрое, вы почувствуете, что рендеринг синхронизирован.
- Если ваше устройство очень медленное, вы почувствуете себя достаточно отзывчивым.
- Хотя рендеринг является асинхронным, вы увидите полный рендеринг вместо рендеринга компонента построчно.
- Точно так же писать компоненты
То есть это то, что React делает за кулисами.Для нас, разработчиков, это прозрачно.Какой конкретный эффект?
Есть три графика, есть поле ввода и три режима вышеЭтот компонент очень огромный, а в поле ввода** каждый ввод чего-либо, он будет обработан. ** Чтобы увидеть лучшую производительность рендеринга, Дэн сделал для нас таблицу.
Давайте сначала посмотрим на синхронный режим:
В синхронном режиме мы все знаем, что React начинает рендеринг без ввода символа.Когда React рендерит огромное дерево, то оно сильно застревает, поэтому должен появиться Update.Еще Дэн показывал его здесь, Такая карта!
Давайте посмотрим на второй (режим Debounced):
Проще говоря, режим отложенного рендеринга заключается в том, чтобы отложить рендеринг, например, когда ваш ввод завершен, а затем начать рендеринг всех изменений.
Недостаток этого в том, что он хотя бы не блокирует ввод пользователя, но все равно есть очень серьезное заикание.
Переключиться в асинхронный режим:
Асинхронный режим рендеринга заключается в продолжении работы без блокировки текущего потока. Вы можете увидеть все входы в видео, и таблица будет прощена.
Квантование времени основано на архитектуре Fiber, которая может быть прервана и перезапущена в любое время, что может прервать текущую задачу, расставить приоритеты срочных и важных задач и обеспечить бесперебойную работу страницы.
Как работает редукция?
Во-первых, давайте рассмотрим несколько основных концепций:
- Магазин: место для сохранения данных, вы можете думать об этом как о контейнере, у всего приложения может быть только один Магазин.
- Состояние: объект Store содержит все данные. Если вы хотите получить данные в определенный момент времени, вам необходимо создать снимок хранилища. Этот набор данных на данный момент времени называется состоянием.
- Действие: изменение состояния приведет к изменению представления. Однако пользователи с досягаемостью State могут иметь доступ только к View. Следовательно, состояние должно быть вызвано изменениями просмотра. Действие выдается уведомлением View, представляющим состояние, которое должно измениться.
- Создатель действий: существует столько видов действий, сколько представление хочет отправить. Будет очень хлопотно, если все будет написано вручную, поэтому мы определяем функцию для генерации Action, эта функция называется Action Creator.
- Редуктор: после того, как магазин получит действие, он должен дать новое состояние, чтобы представление изменилось. Процесс расчета этого состояния называется Reducer. Редьюсер — это функция, которая принимает действие и текущее состояние в качестве параметров и возвращает новое состояние.
- диспетчеризация: это единственный способ для представления выполнить действие.
Затем проходим весь рабочий процесс:
- Сначала пользователь (через View) отправляет Action, а в методе отправки используется метод dispatch.
- Затем Store автоматически вызывает Reducer и передает два параметра: текущее состояние и полученное действие, а Reducer возвращает новое состояние.
- Укажите, если есть изменение, функция прослушивателя Store вызывается для обновления представления.
На этом процесс взаимодействия с пользователем заканчивается. Видно, что данные текут в одном направлении на протяжении всего процесса, что обеспечивает наглядность процесса.
Как работает реакция-редукция?
- Поставщик: Роль поставщика заключается в том, чтобы инкапсулировать все приложение из самой внешней части и передать хранилище в модуль подключения.
- Connect: отвечает за подключение реагирования и Redux
- Получите состояние: Connect получает хранилище в провайдере через контекст и получает все состояния на всей дереве магазина через Store.getState ()
- Оберните исходный компонент: передайте состояние и действие исходному компоненту через реквизиты. wrapWithConnect возвращает объект ReactComponent. компонент После объединения реквизитов они передаются в WrappedComponent через свойства
- Мониторинг изменений дерева хранилища: connect кэширует состояние состояния в дереве хранилища и сравнивает текущее состояние с состоянием до изменения, чтобы определить, следует ли вызывать
this.setState()
Метод запускает повторную визуализацию Connect и его дочерних компонентов.
В чем разница между редуксом и мобксом?
Сравните два:
- Redux хранится в одном хранилище данных, данные MOBX, хранящиеся в магазине в дисперсной множественности
- Redux использует простой объект для сохранения данных и должен обрабатывать измененные операции вручную; mobx применяет наблюдаемые для сохранения данных и автоматически обрабатывает операцию ответа после изменения данных.
- redux использует неизменяемое состояние, что означает, что состояние доступно только для чтения и не может быть изменено напрямую, но должно возвращать новое состояние при использовании чистых функций; состояние в mobx является изменяемым и может быть изменено напрямую
- mobx относительно прост, в нем много абстракций, mobx использует более объектно-ориентированное мышление программирования; redux сложнее, потому что идеи функционального программирования не так легко понять, и в то же время необходимо использовать ряд промежуточных компоненты для обработки асинхронности и побочных эффектов
- В mobx больше абстракций и инкапсуляций, что делает отладку более сложной, а результаты непредсказуемыми; в то время как redux предоставляет инструменты разработки, которые могут отслеживать время, а его чистые функции и меньшее количество абстракций облегчают отладку.
Анализ сценария:
Основываясь на вышеуказанных различиях, мы можем просто проанализировать разные сценарии использования этих двух.
MOBX больше подходит для приложений с несложными данными: MOBX сложно отлаживать, многие состояния невозможно отследить, а когда приложение высокое, оно часто не от души.
Redux подходит для приложений с ретроспективными требованиями: таких как приложение для чертежной доски, табличное приложение, много раз нужно отменять, повторять и другие операции, благодаря неизменяемым характеристикам redux, эти операции естественным образом поддерживаются.
mobx подходит для коротких и быстрых проектов: mobx прост в использовании и содержит меньше шаблонного кода, что может значительно повысить эффективность разработки.
Конечно, mobx и redux не обязательно имеют отношение «или-или».
Как выполнять асинхронные операции в редуксе?
Конечно можемcomponentDidmount
Делайте запросы напрямую без избыточности.
Однако в проекте определенного масштаба описанным выше методом сложно управлять асинхронным потоком, поэтому обычно для асинхронной обработки мы будем использовать асинхронное промежуточное ПО redux.
На самом деле существует много промежуточного программного обеспечения с избыточным асинхронным потоком, но есть только два основных типа асинхронного промежуточного программного обеспечения: redux-thunk и redux-saga.Конечно, redux-observable также может занять место. промежуточное ПО, будь то активность сообщества или загрузка npm, количество довольно скудное.
Плюсы и минусы асинхронного промежуточного программного обеспечения redux?
Преимущества redux-thunk:
- Небольшой размер: реализация redux-thunk очень проста, менее 20 строк кода.
- Простота в использовании: redux-thunk не вводит дополнительных парадигм, таких как redux-saga или redux-observable, и с ним легко начать работу.
дефекты redux-thunk:
- Слишком много стандартного кода: как и в случае с самим редуксом, обычно запрос требует большого количества кода, и многие из них повторяются по своей природе.
- Сильная связь: асинхронные операции связаны с редукторными действиями, которыми неудобно управлять.
- Слабая функция: некоторые функции, обычно используемые в реальной разработке, должны быть инкапсулированы сами по себе.
Преимущества редукс-саги:
- Асинхронная развязка: асинхронные операции перемещены в отдельный saga.js и больше не смешиваются с action.js или component.js.
- действие избавляется от функции thunk: параметр отправки по-прежнему является чистым действием (FSA), а не функцией thunk «черной магии»
- Обработка исключений: выгода от внедрения SAGA-реализации генераторной функции, исключений кода / неудачи запроса могут быть непосредственно захвачены и обработаны через Syrt / Catch Syntax
- Мощный: redux-saga предоставляет большое количество вспомогательных функций Saga и создателей эффектов для разработчиков, и разработчики могут использовать его без инкапсуляции или простой инкапсуляции.
- Гибкость: redux-saga может объединять несколько Saga последовательно/параллельно, чтобы сформировать очень практичный асинхронный поток.
- Легко тестируется, предоставляет различные решения для кейс-тестов, включая фиктивные задачи, охват веток и т. д.
недостатки редукс-саги:
- Дополнительные затраты на обучение: redux-saga не только использует непонятную функцию генератора, но и имеет десятки API, и стоимость обучения намного выше, чем у redux-thunk, Самое главное, что ваши дополнительные затраты на обучение относятся только к этой библиотеке. , с отличием от redux-observable, redux-observable тоже имеет дополнительные затраты на обучение, но за этим стоит rxjs и целый набор идей
- Огромный объем: объем немного больше, код составляет почти 2000 строк, а минимальная версия составляет около 25 КБ.
- Избыток функций: на самом деле сложно использовать контроль параллелизма и другие функции, но нам все равно нужно ввести эти коды.
- поддержка ts не является дружественной: yield не может возвращать тип TS
редукс-наблюдаемые преимущества:
- Самый мощный: благодаря rxjs, мощной библиотеке адаптивного программирования, с помощью операторов rxjs вы можете выполнять практически любую асинхронную обработку, о которой только можете подумать.
- При поддержке rxjs: благодаря благословению rxjs, если вы уже изучили rxjs, стоимость обучения redux-observable невелика, и redux-observable станет более мощным с обновлением rxjs.
редукс-наблюдаемые недостатки:
- Стоимость обучения необычайно высока: если вы не rxjs, нам нужно изучить две дополнительные сложные библиотеки.
- Общее сообщество: объем загрузок redux-observable составляет всего 1/5 от объема redux-saga, а сообщество недостаточно активно Redux-saga по-прежнему занимает лидирующие позиции на уровне промежуточного программного обеспечения для сложных асинхронных потоков.
Подробное сравнение redux-saga и redux-observable можно найти здесь.эта ссылка
Нет публики
Если вы хотите следить за последними статьями автора и последними обновлениями документов в режиме реального времени, обратите внимание на официальный аккаунт.программист интервьюер, Последующие статьи будут сначала обновляться в общедоступной учетной записи.
Резюме шаблон:Подпишитесь на официальный аккаунт, чтобы ответить на «шаблон», чтобы получить
Справочник по фронтенд-интервью:Руководство по нападению, сопровождающее это руководство, следуйте официальной учетной записи и ответьте на «fed», чтобы получить его.