이 기사는 기본 지식을 정리하고 Vue 지식 보유량을 향상하는 데 도움이 되는 20개 이상의 Vue고전적인 인터뷰 질문(자세한 소스 코드 수준 설명 포함)을 요약하고 공유합니다.
01-Vue 컴포넌트 간 통신 방법은 무엇인가요?
Vue는 컴포넌트 기반 개발 프레임워크이므로 Vue 애플리케이션에서는 컴포넌트 간의 데이터 통신이 매우 중요합니다.
이 질문은 주로 Vue의 기본 API 사용에 대한 모든 사람의 기본 Vue 기술과 숙련도를 테스트합니다.
제공/주입/$attrs와 같은 기타 경계 지식은 면접관의 지식의 폭을 보여줍니다.
답변 샘플1. 각 Vue 구성 요소 인스턴스는 생성된 후 일련의 초기화 단계를 거치며, 인스턴스를 DOM에 마운트하고 업데이트해야 합니다. 데이터가 변경될 때의 DOM. 이 프로세스 중에 수명 주기 후크라는 기능이 실행되어 사용자가 특정 단계에서 자신의 코드를 추가할 수 있는 기회를 제공합니다.
2. Vue 라이프 사이클은 총 8단계로 나눌 수 있습니다:
생성 전과 후, 로드 전과 후, 업데이트 전과 후, 파괴 전과 후
, 일부 특수 장면의 라이프 사이클. 디버깅 및 서버 측 렌더링을 위한 세 가지 새로운 장면이 vue3에 추가되었습니다.
vue를 예로 들면, 데이터 응답성과 가상 DOM 및 패치 알고리즘을 통해 개발자는 지루한 DOM 작업을 전혀 처리할 필요 없이 데이터를 운영하고 비즈니스에만 관심을 가지면 되므로 개발 효율성이 크게 향상되고 개발 난이도가 줄어듭니다. .
vue2의 데이터 응답성은 데이터 유형에 따라 다르게 처리됩니다. 객체인 경우 데이터 가로채기를 정의하는 데 Object.defineProperty()가 사용됩니다. 배열인 경우 배열 객체 프로토타입의 7가지 변경 메서드를 재정의하여 응답하므로 이러한 메서드는 추가 업데이트 알림을 제공할 수 있습니다. 이 메커니즘은 데이터 응답성 문제를 매우 잘 해결하지만 실제 사용에는 몇 가지 단점도 있습니다. 예를 들어 초기화 중 재귀 순회는 성능 손실을 초래하므로 사용자는 Vue.set/delete만 사용해야 합니다. 특수 API가 적용될 수 있습니다. es6에서 생성된 새로운 Map 및 Set 데이터 구조와 같은 문제는 지원되지 않습니다.
이러한 문제를 해결하기 위해 vue3은 구현의 다음 부분을 다시 작성했습니다. ES6의 프록시 프록시를 사용하여 데이터에 응답하면 많은 이점이 있고 프로그래밍 경험이 일관되며 특수 API를 사용할 필요가 없습니다. , 초기화 성능 및 메모리 소비가 크게 향상되었습니다. 또한 반응형 구현 코드가 독립적인 반응성 패키지로 추출되었기 때문에 더 유연하게 사용할 수 있고 타사 확장 프로그램을 더 유연하게 개발할 수 있습니다.
거의 모든 기존 프레임워크는 현재 VNode 및 VDOM으로 알려진 실제 DOM을 추상화하기 위해 가상 DOM을 도입합니다. 그러면 왜 가상 DOM을 도입해야 할까요? 이 질문에 답해보세요!
생각
vdom이란 무엇입니까
vdom 도입의 이점
vdom이 생성되는 방식과 dom이 되는 방식
이후 diff에서의 역할
답변 샘플
이름에서 알 수 있듯이 가상 돔은 가상 돔 개체로 그 자체가 JavaScript 개체이지만 다양한 속성을 통해 뷰 구조를 설명합니다.
vdom을 도입하면 다음과 같은 이점을 얻을 수 있습니다.
실제 요소 노드를 VNode로 추상화하여 DOM에 대한 직접 작업 수를 효과적으로 줄여 프로그램 성능을 향상시킵니다.
직접 작업에는 제한이 있습니다. dom, 예: diff , clone 및 기타 작업 실제 요소에 대해 직접 diff 작업을 수행하면 일부 불필요한 내용이 추가로 diff됩니다. 모든 내용을 복사해야 합니다. 이것도 필요하지 않습니다. 그러나 이러한 작업을 JavaScript 개체로 이동하면 더 간단해집니다.
dom 작업은 비교적 비용이 많이 드는 작업입니다. 빈번한 dom 작업은 쉽게 페이지 다시 그리기 및 리플로우를 유발할 수 있습니다. 그러나 중간 처리를 위한 추상 VNode를 통해 직접 DOM 작업 횟수를 효과적으로 줄일 수 있으므로 페이지 다시 그리기 및 리플로우가 줄어듭니다.
크로스 플랫폼 구현을 촉진합니다
동일한 VNode 노드를 다양한 플랫폼의 해당 콘텐츠로 렌더링할 수 있습니다. 예를 들어 브라우저에서의 렌더링은 DOM 요소 노드이고, 네이티브(iOS, Android)에서의 렌더링은 해당 컨트롤은 SSR을 구현하고 WebGL로 렌더링하는 등의 작업을 수행할 수 있습니다.
Vue3을 사용하면 개발자는 VNode 기반 사용자 정의 렌더러를 구현하여 다양한 플랫폼에 대한 렌더링을 용이하게 할 수 있습니다.
vdom을 생성하는 방법은 무엇입니까? Vue에서는 종종 구성 요소에 대한 템플릿을 작성합니다. 이 템플릿은 후속 마운트 프로세스에서 렌더링 함수가 호출되고 반환된 개체는 가상 DOM입니다. 하지만 아직은 실제 DOM이 아니므로 후속 패치 프로세스에서 DOM으로 추가 변환될 예정입니다.
마운팅 프로세스가 완료된 후 vue 프로그램은 업데이트 프로세스에 들어갑니다. 일부 반응형 데이터가 변경되면 컴포넌트가 다시 렌더링됩니다. 이때 새로운 vdom이 생성되며, 마지막 렌더링 결과를 비교하여 변경 사항을 얻을 수 있으므로 최소량의 dom으로 변환됩니다. 운영 및 효율적인 업데이트를 볼 수 있습니다.
vue 업데이트 원칙과 관련된 필수 질문, 이해의 깊이를 비교 테스트합니다. ㅋㅋㅋ 구체적인 실행 방법
Raise up: say vue3의 최적화를 살펴보겠습니다
답변 예시
1 Vue의 diff 알고리즘은 Snabbdom에서 수정된 패칭 알고리즘입니다. 실제 DOM을 사용하려면 Convert 패치 메서드를 사용해야 합니다.
2. 처음에는 Vue1.x 뷰의 각 종속성에 해당하는 업데이트 기능이 있으므로 정확한 업데이트를 달성할 수 있습니다. 따라서 가상 DOM 및 패치 알고리즘 지원은 필요하지 않습니다. Vue 2.x에서 Watcher 세분성을 줄이기 위해 각 구성 요소에는 해당하는 Watcher가 하나만 있습니다. 이때 변경 사항을 정확하게 찾아 효율적으로 업데이트하려면 패치 알고리즘을 도입해야 합니다. 3. Vue에서 diff가 실행되는 순간은 구성 요소의 반응형 데이터 변경으로 인해 인스턴스가 업데이트 기능을 실행하는 순간입니다. 업데이트 기능은 최신 가상 DOM을 얻기 위해 다시 렌더링 기능을 실행합니다. 함수를 패치하고 새 가상 DOM과 이전 가상 DOM을 전달하고, 두 가지를 비교하여 변경 사항을 찾은 다음, 마지막으로 해당 DOM 작업으로 변환합니다.
4. 패치 프로세스는 깊이 우선 및 동일 레이어 비교 전략을 따르는 재귀 프로세스입니다. vue3 패치를 예로 들어 보겠습니다.
먼저 두 노드가 동일한 유형의 노드인지 확인합니다. 다르게 삭제하고 다시 만듭니다.
두 당사자가 모두 텍스트인 경우 텍스트 내용이 업데이트됩니다.
두 당사자가 모두 요소 노드인 경우 하위 요소가 재귀적으로 업데이트되고 요소 속성도 동시에 업데이트됩니다
하위 노드를 업데이트할 때 여러 가지 상황이 있습니다.
새 하위 노드가 텍스트이고 이전 노드가 배열인 경우 이를 지우고 텍스트를 설정합니다.
새 하위 노드가 텍스트이고 이전 노드는 하위 노드가 텍스트인 경우 텍스트를 직접 업데이트합니다.
새 하위 노드가 배열이고 이전 하위 노드가 텍스트인 경우 텍스트를 지우고 새 하위 노드 배열에 하위 요소를 만듭니다. 노드는 배열이고 이전 하위 노드도 배열입니다. 그런 다음 두 하위 노드 세트를 비교하고 세부 정보를 업데이트합니다 blabla
5. vue3에 도입된 업데이트 전략: patchFlags, 블록 등의 컴파일 시간 최적화 .
이유를 알아보세요
패치 키 코드https://github1s.com/vuejs/core/blob/HEAD/packages/runtime-core/src/ renderer.ts#L354-L355
Debug test-v3.html
11 - 당신이 알고 있는 vue3의 새로운 기능은 무엇입니까?
Analytic
공식 웹사이트에 나열된 가장 주목할만한 새로운 기능: https:/ /v3-migration.vuejs .org/
즉, 다음과 같습니다: Composition API
SFC Composition API 구문 설탕Teleport PortalFragments 조각Emits 옵션
Custom 렌더러 SFC 변수
서스펜스 위 내용은 API와 관련된 내용으로, 빼놓을 수 없는 프레임워크 기능이 많습니다.
답변 예
1 API 수준에서 Vue3의 새로운 기능에는 주로 Composition API, SFC Composition API 구문 설탕, Teleport 포털, 조각, 방출 옵션, 사용자 정의 렌더러, SFC CSS 변수, Suspense가 포함됩니다.
2 또한 Vue3.0에는 프레임워크 수준에서 눈길을 끄는 많은 개선 사항이 있습니다.
더 빨라짐 가상 DOM 재작성컴파일러 최적화: 정적 승격, patchFlags, 블록 등 프록시 기반 응답성 시스템 더 작음: 더 나은 트리 쉐이킹 최적화 더 쉬운 유지 관리: TypeScript + Modular
12 - 동적 라우팅을 정의하는 방법은 무엇입니까? 전달된 동적 매개변수를 얻는 방법은 무엇입니까?
Analytics
API 질문, 기본 능력 테스트, 오류의 여지 없음, 최대한 자세히 설명하려고 노력하세요.
생각
동적 라우팅이란 무엇입니까
동적 라우팅을 사용할 때, 동적 라우팅을 정의하는 방법
매개변수를 얻는 방법
세부 사항 및 주의사항
답변 예시
주어진 일치 패턴에 대한 경로를 동일한 구성 요소에 매핑해야 하는 경우가 많습니다. 이 경우 동적 라우팅을 정의해야 합니다.
예를 들어, 모든 사용자에게 렌더링해야 하지만 사용자 ID가 다른 User 구성 요소가 있을 수 있습니다. Vue Router에서는 이를 달성하기 위해 경로의 동적 필드를 사용할 수 있습니다. 예: { path: '/users/:id', component: User }, 여기서 :id< / code>는 경로 매개변수<p><code>User 组件,它应该对所有用户进行渲染,但用户 ID 不同。在 Vue Router 中,我们可以在路径中使用一个动态字段来实现,例如:{ path: '/users/:id', component: User },其中:id就是路径参数
경로 매개변수는 콜론 :로 표시됩니다. 경로가 일치하면 해당 params 값이 각 구성 요소에 this.$route.params로 노출됩니다. $route.params, $route 외에도 <code>/users/:username/posts/:postId와 같은 여러 매개변수가 있을 수 있습니다. 개체는 $route.query, $route.hash 등과 같은 다른 유용한 정보도 노출합니다.
가능한 후속 질문
동적 라우팅 매개변수의 변경에 대응하는 방법
https://router.vuejs.org /zh/guide /essentials/dynamic-matching.html#라우팅 매개변수 변경에 대한 응답
404 Not Found 라우팅을 처리하는 방법
https://router.vuejs.org/zh/guide/essentials /dynamic-matching.html #모든 경로 캡처 또는 -404-not-found-route
13-처음부터 vue 경로를 작성하라는 요청을 받은 경우 알려주십시오. your ideas
아이디어 분석:
먼저 vue 라우팅이 해결해야 하는 문제에 대해 생각해 보세요. 사용자가 콘텐츠를 전환하기 위해 점프 링크를 클릭하면 페이지가 새로 고쳐지지 않습니다.
새로 고침 없이 URL 점프 페이지를 구현하려면 해시 또는 히스토리 API를 사용하세요동시에 hashchange 이벤트 또는 popstate 이벤트를 수신하여 점프를 처리하세요
해시 값이나 상태에 따라 경로 테이블의 해당 구성 요소를 일치시키세요. value and render it
예제 답변:
SPA 애플리케이션의 라우팅에서 해결해야 할 문제는 새로 고침 없이 페이지 점프 내용이 변경됩니다
동시에 라우팅도 필요합니다.
먼저 라우터 인스턴스를 반환하는 createRouter 함수를 정의하겠습니다. 이 함수는 인스턴스 내부에서 여러 가지 작업을 수행합니다. 구성을 저장합니다. 사용자가 전달한 항목
해시 또는 팝스테이트 이벤트 수신 콜백의 경로에 따라 해당 경로 일치
라우터를 Vue 플러그인으로 정의, 즉 설치 방법 구현 및 내부적으로 두 가지 작업을 수행합니다.
페이지 이동과 콘텐츠 표시를 각각 구현하는 router-link 및 router-view라는 두 가지 전역 구성 요소를 구현합니다. 두 가지 전역 변수인 $route 및 $router를 정의합니다. 현재 경로와 라우터 인스턴스는 다음과 같습니다. 구성 요소 내에서 액세스
이유를 알아보세요:
🎜createRouter 인스턴스를 만드는 방법🎜🎜🎜https://github1s.com/vuejs/router/blob/HEAD/src/router.ts #L355-L356🎜🎜🎜이벤트 모니터링🎜🎜🎜https://github1s.com/vuejs/router/blob/HEAD/src/history/html5.ts#L314 -L315🎜🎜RouterView🎜🎜🎜페이지 점프 RouterLink🎜🎜 🎜https://github1s.com/vuejs/router/blob/HEAD/src/RouterLink.ts#L184-L185🎜🎜🎜콘텐츠 표시 RouterView🎜🎜🎜https://github1s.com/vuejs/router/blob/HEAD /src/RouterView.ts#L43-L44🎜🎜🎜🎜14-키의 기능에 대해 알려주실 수 있나요? 🎜🎜🎜🎜🎜분석: 🎜🎜🎜🎜이 질문은 주로 모든 사람의 가상 DOM 숙달도와 패치 세부 사항을 테스트하며 면접관의 이해 수준을 반영할 수 있습니다. 🎜🎜🎜🎜 생각 분석 : KEY의 역할은 패치 성능을 최적화하는 것임을 결론을 내립니다. key key areactual 사용의 필요성 : 소스에서 사용할 수 있습니다. code vue가 두 노드가 동일한지 어떻게 결정하는지 설명하세요🎜
// 首次循环patch A
A B C D E
A B F C D E
// 第2次循环patch B
B C D E
B F C D E
// 第3次循环patch E
C D E
F C D E
// 第4次循环patch D
C D
F C D
// 第5次循环patch C
C
F C
// oldCh全部处理结束,newCh中剩下的F,创建F并插入到C前面
// 首次循环patch A
A B C D E
A B F C D E
// 第2次循环patch B
B C D E
B F C D E
// 第3次循环patch E
C D E
F C D E
// 第4次循环patch D
C D
F C D
// 第5次循环patch C
C
F C
// oldCh全部处理结束,newCh中剩下的F,创建F并插入到C前面
html, url, 스타일 등이 삽입되지 않도록 v-html, :url, :style 등을 주의 깊게 사용하세요.
등...
21 - 개요 설명 vuex를 이해하시나요? ㅋㅋㅋ 개인적인 생각, 실제 경험 등
예제
Vuex는 Vue.js 애플리케이션용으로 특별히 개발된
상태 관리 패턴 + 라이브러리
입니다. 중앙 집중식 저장소를 사용하여 애플리케이션의 모든 구성 요소 상태를 관리하고 해당 규칙을 사용하여 상태가 예측 가능한 방식으로 변경되도록 합니다.
간단한 "단방향 데이터 흐름" 방식, 즉 상태 -> 보기 -> 작업의 단방향 루프로 애플리케이션을 관리할 수 있기를 기대합니다. 그러나 애플리케이션이
상태를 공유하는 여러 구성 요소
를 발견하는 경우, 예를 들어 여러 뷰가 동일한 상태에 의존하거나 여러 뷰의 작업이 동일한 상태를 변경해야 합니다. 단방향 데이터 흐름의 단순성은 이 시점에서 쉽게 깨질 수 있습니다. 따라서 컴포넌트의 공유 상태를 추출하여 글로벌 싱글톤 모드로 관리하는 것이 필요합니다. 상태 관리의 다양한 개념을 정의 및 분리하고 규칙을 적용하여 뷰와 상태 간의 독립성을 유지함으로써 코드가 더욱 구조화되고 유지 관리가 용이해집니다. 이는 vuex의 존재를 위한 필수 요소이며, React 생태계의 redux와 동일한 개념입니다.
Vuex는 상태 관리를 해결하면서 상태, 돌연변이, 액션 등과 같은 많은 개념을 도입합니다. 도입이 필요한지 여부는 애플리케이션의 실제 상황에 따라 측정해야 합니다. 대신 Vuex를 사용하는 대규모 단일 페이지 애플리케이션은 번거롭고 중복되며 간단한
스토어 모드
이면 충분합니다. 그러나 중대형 단일 페이지 애플리케이션을 구축하려는 경우 기본적으로 Vuex가 표준입니다.
vuex를 사용하면서 뭔가 블라블라 느낌이 나요
가능한 질문
vuex의 단점은 무엇인가요? 개발 과정에서 문제가 발생했나요?
액션과 돌연변이의 차이점은 무엇인가요? 왜 구별합니까?
22-템플릿에서 렌더링까지의 과정에 대해 이야기하기
분석
템플릿을 렌더링하는 과정에 대해 묻는 것은 실제로 vue 컴파일러<strong>의 작동 원리에 대해 묻는 것입니다. </strong>
생각하기
vue 컴파일러의 개념 소개
컴파일러의 필요성 설명
컴파일러 작업 흐름 설명
답변 예시
编译器
Vue "컴파일러"라는 고유한 컴파일러 모듈이 있습니다. 이 모듈의 주요 기능은 사용자가 작성한 템플릿을 js의 실행 가능한 렌더링 함수로 컴파일하는 것입니다.
이 컴파일 프로세스가 필요한 이유는 프런트 엔드 프로그래머가 뷰 템플릿을 효율적으로 작성할 수 있도록 하기 위해서입니다. 이에 비해 우리는 여전히 직관적이고 효율적인 뷰 작성을 위해 HTML을 선호합니다. 직접 작성한 렌더링 기능은 비효율적일 뿐만 아니라 컴파일 시간 최적화 기능도 상실합니다.
Vue에서 컴파일러는 먼저 템플릿을 구문 분석합니다. 이 단계를 구문 분석이라고 합니다. 마지막에 JS 객체가 얻어지고, 그런 다음 심층 처리의 변환 프로세스가 수행됩니다. AST는 변환이 되고, 마지막으로 이전에 얻은 AST를 렌더링 함수인 JS 코드로 생성합니다.
이유를 알아보세요
vue3 컴파일 프로세스 엿보기: https://github1s.com/vuejs/core/blob/HEAD/packages/compiler-core/src/compile.ts# L61 -L62
test, test-v3.html
가능한 후속 질문
Vue의 컴파일러는 언제 실행되나요?
React에 컴파일러가 있나요?
23-Vue 인스턴스 마운트 프로세스 중에 무슨 일이 발생했나요?
Analytics마운팅 프로세스에서 가장 중요한 두 가지 작업이 완료되었습니다.
초기화
업데이트 메커니즘 구축
이 두 가지만 분명히 하세요!
답변 샘플
마운팅 프로세스는 app.mount() 프로세스를 참조합니다. 이 프로세스는 일반적으로 초기화 및 업데이트 메커니즘 설정
초기화는 구성 요소 인스턴스를 생성하고 다양한 반응형 구성 요소 상태를 초기화합니다. data
업데이트 메커니즘을 설정합니다. 이 단계에서는 구성 요소 업데이트 기능을 즉시 실행하고 동시에 패치를 실행하여 이전에 얻은 vnode를 dom으로 변환합니다. 처음으로 렌더링 기능을 사용하면 내부적으로 생성됩니다. 반응형 데이터와 구성 요소 업데이트 기능 간의 종속성을 통해 향후 데이터가 변경될 때 해당 업데이트 기능이 실행될 수 있습니다.