'Front-End > Vue & Nuxt' 카테고리의 다른 글
Nuxt-2 ezst nuxt.config.js (0) | 2022.01.30 |
---|---|
Hide Navbar on Scroll Down in Vue (0) | 2022.01.05 |
Nuxt.js 동작 정리 (0) | 2021.12.28 |
Nuxt-1 (0) | 2021.12.26 |
Nuxt.js Component (0) | 2021.12.23 |
Nuxt-2 ezst nuxt.config.js (0) | 2022.01.30 |
---|---|
Hide Navbar on Scroll Down in Vue (0) | 2022.01.05 |
Nuxt.js 동작 정리 (0) | 2021.12.28 |
Nuxt-1 (0) | 2021.12.26 |
Nuxt.js Component (0) | 2021.12.23 |
https://aomee0880.tistory.com/185
https://balmostory.tistory.com/13
https://nuxtjs.org/docs/concepts/nuxt-lifecycle/
https://nuxtjs.org/docs/features/rendering-modes/
https://www.youtube.com/watch?v=iZ9csAfU5Os
처음 HTML에는 화면에 필요한 정보가 담긴 js링크와 id 루트 정보만 들어있다. 그래서 처음에 화면을 볼 때에는 빈화면이 보여지게 된다. 그 다음 링크된 자바스크립트를 서버로부터 받아오게 되는데 화면 구성에 필요한 모든 정보를 서버로 부터 받아온다. 추가로 필요한 정보가 있을 때에는 서버에 요청하여 데이터를 다시 받아오고 화면을 구성해서 사용자에게 보여주게 된다.
단점
처음 사용자에게 화면을 보여주기까지 시간이 오래걸리고 나쁜 SEO <Search Engine Optimization>가 문제로 꼽힌다.
여기서 SEO란 구글이나 네이버 같은 검색엔진들은 사이트를 돌아다니면서 타이틀과 Description을 분석하며 검색 엔진에 등록하는데 CSR로 작성된 HTML은 텅텅 비어있어서 웹페이지를 분석하는데 어려움이 있다.
흐름
1) 사이트에 접속
2) 서버에게서 인덱스 파일을 받아옴. (하지만 비어져 있기 때문에 사용자에게 아무것도 보이지가 않는다.)
3) 웹페이지에 필요한 모든 로직이 담겨 있는 자바스크립트를 서버에 요청.
4) 동적으로 웹사이트를 구성하고 나면 드디어 사용자가 화면을 볼 수 있고 클릭이 가능하게 된다.
TTV <Time To View>와 TTI <Time To Interaction> 이 동시에 가능하다.
CSR방식처럼 서버에서 필요한 정보를 가져와서 Client에서 구성하는 것이 아니라 이미 Server에서 완성된 형태의 HTML파일을 동적으로 제어할 수 있는 약간의 소스코드와 함께 Client에 보내주게 된다.
첫 번째 페이지의 로딩이 빨라지는 장점이 있고 모든 컨텐츠가 HTML에 담겨져 있기 때문에 효율적인 SEO가 가능하다.
단점
사용자가 클릭을 했을 때에 전체적인 웹사이트를 다시 받아오는 것이기 때문에 깜빡임 ISSUE가 발생한다. 그리고 서버에 과부하가 걸리기가 쉽다. 하지만 가장 치명적인 단점으로는 사용자가 빠르게 웹 사이트를 받아볼 수 있지만 동적으로 데이터를 처리하는 자바스크립트를 아직 다운로드 받지 못해서 이리저리 클릭했는데 반응이 없는 경우가 있을 수 있다.
흐름
1) 서버에서 이미 만들어진 인덱스 파일을 받아옴. (하지만 아직 동적으로 화면을 처리할 수 있는 JS를 받아오지 못했으므로 사용자가 화면을 클릭해도 처리할 수 없음.)
2) 최종적으로 자바스크립트를 받아와야지만 사용자의 클릭을 처리할 수 있다.
TTV와 TTI의 공백기간이 꽤 길다.
https://aomee0880.tistory.com/185
https://balmostory.tistory.com/13
https://joontae-kim.github.io/2021/03/18/nuxt-lifecycle/
https://webruden.tistory.com/926
SSR을 위해서 아래의 단계가 여러분의 어플리케이션에서 모든 초기요청(request) 동안에 실행될 것입니다.
정적 사이트 생성모드를 사용하면, 서버 단계에서는 오직 빌드타임에만 실행되나 모든 페이지에 대해 단 한번만 실행될 것입니다.
여러분이 Nuxt.js의 어떤 모드를 선택하든, 이 부분은 라이프사이클 중에 완전히 브라우저에서 실행된다.
클라이언트 사이드 부분과 동일하게 브라우저에서 모든것이 발생하지만 오직 <NuxtLink>를 통해 네비게이팅 될때만 발생합니다.
<NuxtLink> 에 대한 더 자세한 정보는 컴포넌트 챕터에서 확인하세요
Nuxt의 라이프사이클은 전체적으로 서버와 클라이언트 사이드 부분으로 나뉘는 것을 알 수 있으며 각 부분에서 공통으로 실행되는 과정과 아닌 과정이 있음을 확인할 수 있었습니다. 또한, 정적 (Static) 어플리케이션를 만드느냐 SSR(Server-Side Rendering) 또는 유니버설(universal) 어플리케이션을 만드느냐에 따라 과정이 달라질 수 있다.
라이프사이클에 대해 공부 및 정리하면서 봤던 내용들에 대해 정리해보자.
출처: 참조 1
Nuxt.js에는 비동기데이터 가져 오기를 위해 설계된 3가지 후크가 있다.
Nust-SSR
서버사이드에서 데이터를 가져와서 렌더링하고 싶을 때, 이때 pages 컴포넌트를 로딩하기 전에 매번 호출되는 asyncData를 사용하면 된다.
!! asyncData 안에서 컴포넌트가 생성되기 전에 호출하기 때문에 this를 엑세스할 수 없다.
출처: 참조 2
인스턴스가 생성되기 전이다. 데이터에 접근할 수 없다.
인스턴스가 생성된 후 동기적으로 호출된다. 이 단계에서는 data, computed속성 methods, watch/이벤트 콜백 등의 설정이 준비된다. 그러나 $el 속성을 사용할 수 없다. DOM을 제외한 초기 데이터 설정이 완료된 상태이다.
컴포넌트 초기에 외부에서 부여받은 설정에 의해 기본 값 변경이 필요하다면 이 단계에서 변경하는 것이 좋다.
div태그 #app의 html 코드가 생성되기 전 상태
인스턴스가 마운트 된 후 호출된다. DOM이 생성되긴 했지만 모든 자식 컴포넌트가 마운트되었음을 보장하지는 않는다. 그래서 mounted $nextTick을 사용하기도 한다.
데이터가 업데이트 되기 전, 후 (보통 watch를 사용한다.)
해당 페이지를 종료하기 전, 후
Hide Navbar on Scroll Down in Vue (0) | 2022.01.05 |
---|---|
Nuxt.js Async, Fetch (0) | 2022.01.05 |
Nuxt-1 (0) | 2021.12.26 |
Nuxt.js Component (0) | 2021.12.23 |
Vue.js 문법 정리 (지속적으로 업데이트) (0) | 2021.12.18 |
1.
<img src="~assets/svg/fire-extinguisher.svg" alt="fire-extinguisher" class="image">
Tag에서 파일경로 Project 루트로 가는 방법은 '~' 이다.
Script에서는 @이다.
2.
Git hub에서 파일 가져오는 방법
클릭해서 코드 붙여넣기.
3. 문법 참고
https://joshua1988.github.io/web-development/translation/essential-es6-features-for-vuejs/
4. require()
https://m.blog.naver.com/jdub7138/221022257248
5. NuxtLink
동적일 경우 :to, 정적일 경우 to
Nuxt.js Async, Fetch (0) | 2022.01.05 |
---|---|
Nuxt.js 동작 정리 (0) | 2021.12.28 |
Nuxt.js Component (0) | 2021.12.23 |
Vue.js 문법 정리 (지속적으로 업데이트) (0) | 2021.12.18 |
Vue.js 작성 팁들 (0) | 2021.12.18 |
https://nuxtjs.org/tutorials/improve-your-developer-experience-with-nuxt-components
Improve Your Developer Experience With Nuxt Components
Explore how you can import and register Vue components automatically using @nuxt/components module.
nuxtjs.org
컴포넌트(Component)란 조합하여 화면을 구성할 수 있는 블록을 의미.
Vue에 강력한 기능이다. Component를 적절히 사용하면 화면을 구조화하여 일괄적인 패턴으로 개발 할 수 있으며, 코드를 쉽게 이해하고 재사용이 용이해진다.
kebab-case와 pascal-case로 정의한다.
페이지에서 컴포넌트로 데이터를 전달할 때, props를 사용한다.
정적 전달
<blog-post title="Vue와 떠나는 여행"></blog-post>
동적 전달
<!-- 변수의 값을 동적으로 할당 -->
<blog-post :title="post.title"></blog-post>
<!-- 복잡한 표현을 포함한 동적 값 할당 -->
<blog-post :title="post.title + ' by ' + post.author.name"></blog-post>
페이지에서 컴포넌트로 전달하는 데이터 값이 바뀌었을 때, Component에서 watch를 사용하여 데이터 변경을 감지하고 동작을 정의하면 된다.
Props 선언에는 Camel case, 템플릿에는 케밥 케이스를 사용한다.
<!-- Nuxt 예시 -->
<Component full-stack='hello world!' />
props: {
fullStack: {
type: String,
required: true
}
}
컴포넌트에서 페이지로 데이터를 전달하고 싶을 때에는 emit을 사용하면 된다.
component.vue
this.$emit('updated', this.usercode.id, this.usercode.password)
page에 updated라는 명칭으로 페이지에 값을 전달하는 코드이다.
page에서는 다음과 같이 받는다.
page.vue
<Component @updated='getFunction' />
...
methods: {
getFunction(id, password) {
console.log(id, password);
}
}
}
컴포넌트에서 템플릿으로 $emit할 때에 이름은 케밥 케이스를 사용해야한다.
<!-- Component -->
this.$emit('full-stack');
<!-- Template -->
<Component @fullStack="doSomething()" />
Nuxt.js Async, Fetch (0) | 2022.01.05 |
---|---|
Nuxt.js 동작 정리 (0) | 2021.12.28 |
Nuxt-1 (0) | 2021.12.26 |
Vue.js 문법 정리 (지속적으로 업데이트) (0) | 2021.12.18 |
Vue.js 작성 팁들 (0) | 2021.12.18 |
지금까지는 python manage.py runserver 명령을 사용해서 서버를 실행시켰다. 하지만 실제로 서버에서 웹사이트를 운영할 때 방문자가 많아지면 성능, 보안 등의 문제가 발생할 수 있다. 이런 상황에 대응하기 위해 전문적인 웹 서버 소프트웨어를 사용해 서버를 실행시켜야한다. 웹 서버 소프트웨어를 사용하면 방문자의 요청에 더 빠르게 응답할 수 있고, 많은 사용자가 동시에 접속했을 때 여러 대의 서버로 요청을 분산하는 로드 밸런싱 같은 기능도 제공.
Django에서 웹 서버 소프트웨어는 보통 Nginx를 사용한다. 웹 서버 소프트웨어와 Django를 연결하기 위해 WSGI(Web Server Gateway Interface)인 Gunicorn을 사용한다.
1) 설치
pip install gunicorn
2) settings.py 수정
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
3) urls.py 수정
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
Nginx 적용이라기보단 Docker에서 Nginx 적용을 위한 설정 파일의 생성이다.
nginx/nginx.conf
upstream do_it_django {
server web:8000;
}
server {
listen 80;
server_name something.com; # 서버 이름 설정
location / {
return 301 https://$host$request_uri;
}
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
}
server {
listen 443 ssl;
server_name something.com; # 서버 이름 설정
location / {
proxy_pass http://something; # 서버 domain (.com 제외)
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
location /static/ {
alias /usr/src/app/_static/;
}
location /media/ {
alias /usr/src/app/_media/;
}
ssl_certificate /etc/letsencrypt/live/서버 도메인(something.com)/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/서버 도메인(something.com)/privkey.pem; # 서버 접속 .pem 키
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
DumpData (0) | 2022.01.08 |
---|---|
Wagtail RichText API (0) | 2022.01.07 |
1. PostgreSQL 적용 (0) | 2021.12.22 |
3. Docker(Django, Wagtail) (0) | 2021.12.22 |
4. AWS (인스턴스 생성, 서버 접속) (0) | 2021.12.20 |