티스토리 뷰

회사에서 클라이언트사의 스페셜 페이지를 우리 플랫폼으로 내재화 하는 작업을 맡아 진행하게 되었다.
스페셜 페이지의 가장 중요한 부분 중 하나는 SNS로 링크 공유시 적절한 이미지와 내용이 뜨는 것인데, 우리 플랫폼은 SPA로 되어있어서 SEO도 제대로 되어있지 않고 meta og 태그도 전혀 없는 상태.
기존 스페셜 페이지는 멀티 페이지로 구성하여 각 페이지마다 index.html 파일을 따로 두어 해당 기능을 처리하였는데 내재화를 하게 되면서 앞으로 발생하는 모든 스페셜 페이지를 시스템화 해야했기 때문에 링크 공유 기능과 SEO도 함께 잡을 수 있는 prerender 플러그인을 적용해보기로 하였다.
팀장님이 예제 링크와 사용법을 포스팅한 여러 블로그들을 나에게 보내주셨고 생각보다 간편해보여서 나도 금방 테스트 해볼 수 있었다.
prerender spa plugin 사용법이나 vue-meta 적용법 등은 아래 링크들에 자세히 나와있다. 내가 많이 도움받았던 링크들이다.
About :: Myeongjae Kim
myeongjae.kim
chrisvfritz/prerender-spa-plugin
Prerenders static HTML in a single-page application. - chrisvfritz/prerender-spa-plugin
github.com
https://dong-queue.tistory.com/14
Vue (Single Page App)의 검색엔진 노출 방법- Prerendering
한줄요약: vue-router를 histroy 모드로 변경 후, Prereding으로 빌드하도록 vue.config.js 변경 이번에는 Prerendering으로 사이트를 빌드하여 검색엔진에 노출시키는 법에 대해 작성하겠습니다. 기타 방법은 �
dong-queue.tistory.com
해당 블로그들을 보면 단순하게 금방 해결될 것 처럼 나온다. 실제로도 내가 새로운 간단한 프로젝트를 생성해서 해보면 정말 그대로 잘되는데 우리 앱에만 적용이 안되는 것이었다...!
몇일간의 삽질 끝에 드디어 원인을 알아냄.
결론부터 말하자면 원인은 headless 브라우저의 포트가 8000번으로 설정되어서 api호출 시 CORS 이슈로 인해 화면이 제대로 뜨지 않았기 때문이다. 해결방법은 너무나 간단했다. 옵션으로 server port값을 지정해주면 된다.
혹시 나처럼 원인 모르게 빌드에 실패하는 사람이 있다면 headless: false로 해서 직접 브라우저를 들여다보며 디버깅 해보시길 바란다. 나도 그걸 몰라서 헤맨게 거의 90퍼센트 ㅠ_ㅠ
vue.config.js 파일 configureWebpack.plugins 속성 배열값에 아래처럼 코드를 추가해 주었다.
new PrerenderSPAPlugin({
staticDir: path.join(__dirname, 'dist'),
routes: ['/about'],
// 포트값 지정
server: {
port: 8080
},
renderer: new PrerenderSPAPlugin.PuppeteerRenderer({
headless: false,
// document.querySelector로 찾을 수 있는 특정 엘리먼트를 발견할 때 까지 렌더링 딜레이
renderAfterElementExists: '#app',
})
})
(그러나 위 코드는 로컬에서 테스트 하기 위한 코드고 보통은 실제 프로덕트 빌드 시에만 사용하기 때문에 server 옵션은 바뀔 수 있다.)
혹시 몰라서 renderAfterElementExists값도 추가해 주었다. 해당 컴포넌트에 아이디를 할당하고 그 아이디값을 넣어주었는데 저 속성이 없어도 원하던 결과물이 나오긴 하더라...
renderAfterElementExists에 적용한 엘리먼트를 발견하지 못하면 타임아웃으로 렌더링에 실패하기 때문에 prerender를 적용할 모든 라우터에 대응할 수 있는 엘리먼트(ex. #app)를 넣어주어야 한다.
그리고 실제 배포시 젠킨스나 특정 서버에서 localhost로 빌드를 진행하게 되는데 이 때 나의 경우는 젠킨스 웹이 이미 8080 포트를 사용하고 있어서 자동으로 8090으로 로컬 서버가 실행되었다. 그래서 백엔드 팀과 조율 후 8090포트도 CORS를 허용하도록 하고 배포를 진행하였다.
이번 삽질은 대체로 내가 prerender-spa-plugin의 정확한 동작 방법을 몰라서 삽질했던게 더 크다.
prerender-spa-plugin은 웹팩의 빌드가 끝난 후 빌드된 파일을 가지고 headless 브라우저를 실행해서 해당 페이지를 스냅샷(?)처럼 그대로 html파일로 저장해주는것! 그래서 prerender된 파일은 자바스크립트 없이도 원하는 화면을 볼 수 있다.
이 후 실제 SEO가 잘 적용되었는지 테스트하며 고군분투한 내용은 다음 포스팅에 적어보도록 하겠다! 아래 링크 클릭!
https://soobakba.tistory.com/36
SEO를 위한 Vue 앱에 prerender-spa-plugin과 vue-meta 적용하기 2
앞서 SEO 작업을 위해 prerender-spa-plugin을 적용한 포스팅 1탄을 작성하였다. 아래 링크 참고 https://soobakba.tistory.com/35 [Vue Cli] Vue 앱에 prerender spa plugin 적용하기 회사에서 클라이언트사의 스..
soobakba.tistory.com
'프론트엔드' 카테고리의 다른 글
우아한테크러닝 3기 - React & TypeScript 합격 (0) | 2020.09.03 |
---|---|
SEO를 위한 Vue 앱에 prerender-spa-plugin과 vue-meta 적용하기 2 (2) | 2020.08.01 |
Vue-Cli multi-page 모드에서 Vue Router history 모드 적용하기 (6) | 2020.05.11 |
axios로 파일 다운로드 및 Content-Disposition 정보 사용하기 (0) | 2020.03.09 |
[JavaScript] this를 알아보자! 화살표 함수(arrow function) 에서의 this (0) | 2019.10.10 |
- Total
- Today
- Yesterday
- ES6
- til
- Python
- Vuex
- EventLoop
- frontend
- prerender-spa-plugin
- nodejs
- chartjs
- 리액트훅
- Component
- jsconf
- ReactNative
- REACT
- Docker
- js
- vuejs
- 우아한테크러닝
- vue-meta
- 인프런
- vue-cli
- 상태관리
- 프론트엔드
- vue
- promise
- JavaScript
- vue-router
- typeScript
- asyncawait
- axios
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |