반응형

Hyuntae Hwang, https://medium.com/keep/what-is-jwt-89889759ae37
그랩의 블로그, https://tansfil.tistory.com/58?category=475681
그랩의 블로그, https://tansfil.tistory.com/59?category=475681
그랩의 블로그, https://tansfil.tistory.com/60?category=475681

참고 사이트에 내용을 개인적으로 복습하기 편하도록 재구성한 글입니다.
자세한 설명은 참고 사이트를 살펴보시기 바랍니다.

 

세션과 쿠키를 이용한 인증


인증 순서

  • 사용자가 로그인을 합니다.
  • 서버에서는 계정 정보를 읽어 사용자를 확인한 후, 사용자에게 고유한 ID값을 부여하여 세션 저장소에 저장한 후, 이와 연결되는 Session ID를 발급합니다.
  • 서버는 HTTP 응답 헤더에 발급된 Session ID를 실어 보냅니다. 이후 매 요청마다 HTTP 요청 헤더에 Session ID가 담킨 쿠키를 실어 보냅니다.
  • 서버에서는 쿠키를 받아 세션 저장소에서 대조를 한 후 대응되는 정보를 가져옵니다.
  • 인증이 완료되고 서버는 사용자에 맞는 데이터를 보내줍니다.

장점

  • 사용자의 정보는 세션 저장소에 저장되고, 쿠키는 그 저장소를 통과할 수 있는 출입증 역할을 합니다. 따라서 쿠키가 담긴 HTTP 요청이 도중에 노출되더라도 쿠키 자체에는 유의미한 값을 갖고있지 않아서 쿠키에 사용자 정보를 담아 인증을 거치는 것 보다 안전합니다.
  • 각 각의 사용자는 고유의 Session ID를 발급 받기 때문에 일일이 회원 정보를 확인할 필요가 없어 서버 자원에 접근하기 용이합니다.

단점

  • 쿠키에 사용자 정보를 담아 인증을 거치는 것 보다 안전하지만, 해커가 쿠키를 탈취한 후 그 쿠키를 이용해 HTTP 요청을 보내면 서버는 사용자로 오인해 정보를 전달하게 됩니다. 이를 세션 하이재킹 공격이라고 합니다. 해결책으로는 HTTPS 프로토콜 사용과 세션에 만료 시간을 넣어주는 것 입니다.
  • 서버에서 세션 저장소를 사용하기 때문에 추가적인 저장공간을 필요로 합니다.

Access Token을 이용한 인증


JWT

JWT는 JSON Web Token의 약자로 인증에 필요한 정보들을 암호화시킨 토큰을 말하며, Access Token으로 사용됩니다. JWT를 생성하기 위해서는 Header, Payload, Verify Signature 객체를 필요로 합니다.

Header는 토큰의 타입을 나타내는 typ과 암호화할 방식을 정하는 alg로 구성되어 있습니다.

{
  'alg': 'HS256',
  'typ': 'JWT'
}

Payload

Payload는 토큰에 담을 정보를 포함합니다. 여기서 하나의 정보 조각을 클레임으로 부릅니다. 클레임의 종류로는 Registered, Public, Private로 3가지가 존재합니다. 보통 만료 일시, 발급 일시, 발급자, 권한정보 등을 포함합니다.

{
  'sub': '1234567890',
  'name': 'John Doe',
  'admin': true,
  'iat': 1516239022
}

Verify Signature

Verify Signature는 Payload가 위변조되지 않았다는 사실을 증명하는 문자열입니다. Base64 방식으로 인코딩한 Header, Payload 그리고 SECRET KEY를 더한 후 서명됩니다.

HMACSHA256 {
  base64UrlEncode(header) + '.' +
  base64UrlEncode(payload),
  your-256-bit-secret
}

완성된 토큰


Header, Payload는 인코딩될 뿐, 따로 암호화되지 않습니다. 따라서 Header, Payload는 누구나 디코딩하여 확인할 수 있기에 정보가 쉽게 노출될 수 있습니다. 하지만 Verify Signature는 SECRET KEY를 알지 못하면 복호화할 수 없습니다.

만약에 해커가 사용자의 토큰을 훔쳐 Payload의 데이터를 변경하여 토큰을 서버로 보낸다면, 서버에서 Verify Signature을 검사하게 됩니다. 여기서 Verify Signature는 해커의 정보가 아닌 사용자의 정보를 기반으로 암호화되었기 때문에 해커가 변경한 정보로 보낸 토큰은 유효하지 않은 토큰으로 간주합니다. 이를 통해 사용자의 SECRET KEY를 알지 못하면 토큰을 조작할 수 없다는 것을 알 수 있습니다.

인증 순서

  • 사용자가 로그인을 합니다.
  • 서버에서는 계정 정보를 읽어 사용자를 확인 후, 사용자의 고유한 ID값을 부여하고 Payload에 정보를 넣습니다.
  • JWT 토큰의 유효기간을 설정합니다.
  • SECRET KEY를 통해 암호화된 Access Token을 HTTP 응답 헤더에 실어 보냅니다.
  • 사용자는 Access Token을 받아 저장한 후, 인증이 필요한 요청마다 토큰을 HTTP 요청 헤더에 실어 보냅니다.
  • 서버에서는 해당 토큰의 Verify Signature를 SECRET KEY로 복호화한 후, 조작 여부, 유효 기간을 확인합니다.
  • 검증이 완료된다면, Payload를 디코딩하여 사용자의 ID에 맞는 데이터를 가져옵니다.

장점

  • 간편합니다. 세션과 쿠키를 이용한 인증은 별도의 세션 저장소의 관리가 필요합니다. 그러나 JWT는 발급 후 검증만 거치면 되기 때문에 추가 저장소가 필요없습니다.
  • 확장성이 뛰어납니다. 토큰 기반으로 하는 다른 인증 시스템에 접근이 가능합니다.

단점

  • JWT는 한 번 발급되면 유효기간이 완료될 때까지는 계속 사용이 가능하며 중간에 삭제가 불가능합니다. 따라서 해커에 의해 정보가 털린다면 대처할 방법이 없습니다.
    해결책으로는 Refresh Token을 추가적으로 발급하여 해결하는 방식으로 아래에서 설명하겠습니다.
  • Payload 정보가 디코딩하면 누구나 접근할 수 있기에 중요한 정보들을 보관할 수 없습니다.
  • JWT의 길이가 길기 때문에, 인증 요청이 많아지면 서버의 자원낭비가 발생합니다.

Access Token + Refresh Token을 이용한 인증


Access Token을 이용한 인증 방식의 문제는 해커에게 탈취당할 경우 보안에 취약하다는 점입니다. 토큰의 유효기간을 짧게 하면 사용자는 로그인을 자주 해야해서 번거롭고, 길게 하면 보안이 취약해지기 때문에 이를 해결하고자 나온 것이 Refresh Token입니다.

Refresh Token은 Access Token과 같은 형태인 JWT입니다. Refresh Token은 Access Token보다 긴 유효기간을 가지고, Access Token이 만료됐을 때 새로 발급해주는 열쇠가 됩니다. 예를 들어 Refresh Token의 유효 기간이 2주, Access Token의 유효 기간이 1시간이라고 한다면, 2주 동안 Access Token이 만료 되는 1시간 주기마다 Access Token을 새롭게 발급받을 수 있습니다.

인증 순서

  • 사용자가 로그인을 합니다.
  • 서버에서는 회원 DB에서 값을 비교합니다.
  • 로그인이 완료되면 Access Token, Refresh Token을 발급하여 HTTP 응답 헤더에 실어 보냅니다. 이때 일반적으로 회원 DB에 Refresh Token을 저장해둡니다.
  • 사용자는 Refresh Token은 안전한 저장소에 저장 후, Access Token을 HTTP 요청 헤더에 실어 요청을 보냅니다.
  • Access Token을 검증하여 이에 맞는 데이터를 보냅니다.
  • 시간이 지나 Access Token이 만료됐다고 보겠습니다.
  • 사용자는 이전과 동일하게 Access Token을 HTTP 요청 헤더에 실어 보냅니다.
  • 서버는 Access Token이 만료됨을 확인하고 권한 없음을 신호로 보냅니다.
  • 사용자는 Refresh Token과 Access Token을 HTTP 요청 헤더에 실어 보냅니다.
  • 서버는 받은 Access Token이 조작되지 않았는지 확인한 후, HTTP 요청 헤더의 Refresh Token과 사용자의 DB에 저장되어 있던 Refresh Token을 비교합니다. Token이 동일하고 유효기간도 지나지 않았다면 새로운 Access Token을 발급해줍니다.
  • 서버는 새로운 Access Token을 HTTP 응답 헤더에 실어 다시 API 요청을 진행합니다.

장점

  • Access Token의 유효 기간이 짧기 때문에, 기존의 Access Token만을 이용한 인증보다 안전합니다.

단점

  • 구현이 복잡합니다.
  • Access Token이 만료될 때마다 새롭게 발급하는 과정에서 서버의 자원 낭비가 생깁니다.

OAuth 2.0을 이용한 인증


OAuth

OAuth는 외부서비스의 인증 및 권한부여를 관리하는 범용적인 프로토콜입니다.

OAuth 2.0

현재 범용적으로 사용되고 있는 것은 OAuth 2.0입니다. 2007년에 OAuth 1.0의 초안이 발표되었는데, 네트워크 시장이 커감에 따라 한계가 나타나기 시작했습니다. 그리고 2012년에 OAuth 2.0를 발표하면서 현재까지 사용되고 있습니다. 바뀐 점은 크게 3가지 입니다.

  • 모바일에서도 사용이 용이합니다.
  • 반드시 HTTPS를 사용하므로 보안이 강화됐습니다.
  • Access Token의 만료 기간이 생겼습니다.

OAuth 2.0의 인증 방식은 4가지가 있지만, 가장 범용적으로 쓰이는 Authorization Code Grant에 대해 알아보겠습니다.

인증 순서

  • Resource Owner : 일반 사용자
  • Client : 우리가 만든 웹 어플리케이션
  • Authorization Server : 권한 관리 및 Access Token, Refresh Token을 발급해주는 서버
  • Resource Server : OAuth 2.0을 관리하는 서버의 자원을 관리하는 곳
  • Resource Owner가 Client에게 인증 요청을 합니다.
  • Client는 Authorization Request를 통해 Resource Owner에게 인증할 수단(Facebook, Google 로그인 url)을 보냅니다.
  • Resource Owner는 해당 Request를 통해 인증을 진행하고 인증을 완료했다는 신호로 Authorization Grant를 url에 실어 Client에게 보냅니다.
  • Client는 해당 권한 증서를 Authorization Server에 보냅니다.
  • Authorization Server는 권한 증서를 확인 후, 유저가 맞다면 Client에게 Access Token, Refresh Token, 그리고 유저의 정보를 발급해줍니다.
  • Client는 해당 Access Token을 DB에 저장하거나 Resource Owner에게 넘깁니다.
  • Resource Owner가 Resource Server에 자원이 필요하면, Client는 Access Token을 담아 Resource Server에 요청합니다.
  • Resource Server는 Access Token이 유효한 지 확인 후, Client에게 자원을 보냅니다.
  • 만일 Access Token이 만료됐거나 위조되었다면, Client는 Authorization Server에 Refresh Token을 보내 Access Token을 재발급 받습니다.
  • 그 후 다시 Resource Server에 자원을 요청합니다.
  • 만일 Refresh token도 만료되었을 경우, Resource Owner는 새로운 Authorization Grant를 Client에게 넘겨야합니다.

SNS 로그인


인증 순서

  • 사용자가 서버에게 로그인을 요청합니다.
  • 서버는 사용자에게 특정 쿼리들을 붙인 페이스북 로그인 URL을 사용자에게 보냅니다.
  • 사용자는 해당 URL로 접근하여 로그인을 진행한 후 권한 증서를 담아 서버에게 보냅니다.
  • 서버는 해당 권한 증서를 Facebook의 Authorization Server로 요청합니다.
  • 서버는 권한 증서를 확인 후, Access Token, Refresh Token, 유저의 정보를 돌려줍니다.
  • 받은 고유 ID를 Key값으로 해서 DB에 유저가 있다면 로그인, 없다면 회원가입을 진행합니다.
  • 로그인이 완료되었다면 세션과 쿠키 , 토큰 기반 인증 방식을 통해 사용자의 인증을 처리합니다.

참고 사항

  • 우리가 만들 서버에서 OAuth를 이용하기 위해서는 사전에 OAuth에 등록하는 과정이 필요합니다. 개발자 사이트에서 웹 어플리케이션을 등록 후 APP_ID와 CLIENT_ID 등을 보내야 OAuth 에서는 어느 서비스인지를 알 수 있습니다.
  • 페이스북 로그인을 인증을 이용하는 경우, 대부분은 Resource Server(페이스북 자체 API)를 사용하지 않습니다. 따라서 Access Token, Refresh Token은 실제로 쓰이지 않습니다. 우리의 서버에서 Access token을 검증할 수도 없을 뿐더러 인증의 수단으로 활용하기엔 부족한 점이 많습니다. 따라서 보통 Authorization Server로 부터 얻는 고유 ID값을 활용해서 DB에 회원관리를 진행합니다.
반응형

'etc' 카테고리의 다른 글

npx 란?  (1) 2023.12.05
Iframe 높이 조절  (0) 2023.11.23
퍼블리셔 면접 관련 질문 정리  (3) 2023.11.20
on-demand Atomic CSS (unocss)  (0) 2023.11.16
프론트엔드 개발자 면접 질문 답변  (0) 2023.11.15
반응형

 

 

출처 : 재그지그, 'JavaScript 번들러로 본 조선시대 붕당의 이해'

 

 

 

모듈 시스템

최초의 모듈 시스템

최초에는 script 테그로 자바스크립트 파일을 삽입하면 브라우저에서 순서대로 로드 하는 방식 이었습니다.

<html>
  <script src="/foo.js"></script>
  <script src="/bar.js"></script>
</html>

문제점

  • 모듈 간 스코프 구분이 되지 않습니다. 즉, foo 에 있는 변수명과 bar에 있는 변수명이 겹치면 잘못 동작하게 됩니다.
  • 모듈 순서를 신경쓰면서 개발해야 합니다.

해결책

  • 자바스크립트를 모듈화 하여 서로 간섭하지 않게 만들자

 

 

이에 따라 자바스크립트를 모듈화 하기 위한 새로운 기술 등장 했습니다.

 

CommonJS

module.exports = foo; // 모듈 export

const foo = require("./foo"); // 모듈 import

특징

  • CommonJS 는 브라우저 외에도 사용가능한 범용적인 JS Module System 입니다. 즉, 브라우저에 초짐을 맞춘 기술이 아닙니다.
  • 모든 디펜던시가 로컬 디스크에 존재하여 필요한 모듈을 바로 사용할 수 있는 환경을 전제로 하여, 동기적으로 모듈을 호출합니다.
  • Node.js 에서도 모듈 시스템으로 CommonJS 를 기본적으로 제공하게 되었습니다.

문제점

  • 비동기 방식보다 느립니다.
  • 트리쉐이킹이 어렵습니다.
  • 순환 참조에 취약합니다.

 

AMD(Asynchronous Module Definition)

define([ // 모듈 export
  'jquery',
  'underscore',
], function ($, _) {
  return {
  };
});

require([ // 모듈 import
  ...
], function (...) {
});

특징

  • AMD는 비동기 상황에서도 JS 모듈을 쓰기 위해 CommonJS 에서 논의하다 합의점을 이루지 못하고 독립한 그룹입니다.
  • 필요한 모듈을 네트워크로 비동기적으로 내려받아서 사용해야 하는 브라우저 환경에 초점을 맞춰서 만들어졌습니다.
  • define() 함수를 이용해 모듈을 구현하므로 전역변수 문제가 없습니다.

문제점

  • 코드가 복잡합니다.

 

 

그러나 CommonJS, AMD는 목적이 다르고 서로 통일되지 않은 규격으로 인해 호환성 문제가 생기게 됩니다.

결국 CommonJS  AMD 방식을 모두 호환할 수 있게 조건문으로 분기하고 팩토리 패턴으로 구현한 UMD가 나왔습니다.

 

UMD(Universal Module Definition)

(function (root, factory) {
  if (typeof define === "function" && define.amd) { // AMD 방식
    define(["jquery", "underscore"], factory); 
  } else if (typeof exports === "object") { // CommonJS 방식
    module.exports = factory(require("jquery"), require("underscore"));
  } else {
    root.foo = factory(root.$, root._);
  }
})(this, function ($, _) {
  var foo = {
    // ...
  };
  return foo;
});

 

UMD 는 CommonJS, AMD 의 호환성을 해결해주었습니다.

그러나 여전히 자바스크립트 언어 자체에서 모듈 시스템을 지원하는 것이 아니었기 때문에 그 필요성이 높아졌습니다.

 

 

ES6 Module

2015년 쯤 ES6(ECMAScript 6) 사양에서 자바스크립트 표준 모듈 시스템이 명세되었습니다.

import foo from "bar"; // 모듈 import

export default qux; // 모듈 export

특징

  • 동기/비동기 로드 모두를 지원합니다.
  • 문법도 간단합니다.
  • CommonJS 와 달리 실제 객체/함수를 바인딩하기 때문에 순환 참조 관리도 편합니다.
  • 정적 분석 (코드 실행하지 않아도 분석 가능)이 가능하여 트리 쉐이킹이 쉬워졌습니다.

문제점

  • 최근 정의된 문법이라 IE 같은 구형 브라우저에서 제대로 동작하지 않습니다.

해결책

  • ES6 문법을 구형 브라우저에서 사용할 수 있게 구형 브라우저에서 동작하는 JS 코드로 변환

 

트렌스파일러

바벨(Babel)

  • ES6 문법을 구형 브라우저에서 사용할 수 있게 구형 브라우저에서 동작하는 JS 코드로 변환 해줍니다.
  • 브라우저 호환성 걱정없이 최신 자바스크립트 문법을 사용할 수 있게 해줍니다.

 

모듈 번들러

앞에서 기나긴 역사를 살펴봤듯이 모듈 시스템은 결국 스코프를 구분하기 위해 만들어졌습니다.

스코프를 분리하여 서로의 간섭을 없애고 모듈을 조합하여 중복 코드를 줄일 수 있게 되었습니다.

 

그러나 이게 끝이 아닙니다.

이렇게 만들어놓은 빌드하기 위해서는 트렌스파일러, 전처리, 최적화, 트리쉐이킹, 호환성 처리, 테스팅 등 일련의 과정을 거쳐야 합니다.

그래서 Grunt, Gulp 와 같이 일련의 과정을 수행하기 위한 자동화 도구인  테스크 러너 가 사용되어야 했습니다.

 

빌드 과정 중에서도 번들 과정을 전문적으로 도와주는 모듈 번들러들이 등장하게 되었습니다.

 

특징

  • 자바스크립트 모듈을 브라우저에서 실행할 수 있는 단일 자바스크립트로 번들링 해줍니다.
  • 번들러 자체에서 여러 플러그인을 제공하여 별도 테스크 러너, 최적화 도구가 필요 없게 되었습니다. 즉, 번들러가 필요한 모든 과정을 처리해주는 만능 도구가 된 것입니다.

 

Webpack

특징

  • 오래된 만큼 안정적인 강점이 있습니다.
  • Sass, TS 등 사용시 번들러가 컴파일 과정에서 필요한 플러그인 추가하고 번들러 실행해줍니다.
  • Code Splitting 을 통해 원하는 때 모듈 로딩할 수 있는 Dynamic Loading & Lazy Loading 가능합니다.
  • 트리 쉐이킹 등 최적화 수행해줍니다. (별도 설정 필요)
  • ES5가 호환되는 모든 브라우저를 지원합니다(IE8 이하는 지원되지 않습니다).
  • CSS, Asset 등을 JS로 변환합니다. 이를 위한 플러그인, 로더 등이 필요합니다.
  • 다양한 Boilerplate에서 쓰고 있어 자료가 많습니다. (CRA 등)

 

문제점

  • 비교적 복잡한 configuration
  • 번들 크기가 큽니다.
  • 개발 모드 속도가 느립니다.
  • ES6 모듈 형식으로 빌드 결과물을 출력할 수 없습니다.

 

Rollup

특징

  • ES6 모듈 형식으로 빌드 결과물을 출력할 수 있습니다.
  • Code Splitting 에 강점이 있습니다. 
  • 트리 쉐이킹에 특화되어 있습니다. 특히 진입점이 여러 개 있을때 두드러집니다. 진입점이 다르기 때문에 중복해서 번들될 수 있는 공통된 부분을 알아내고 독립된 모듈로 분리할 수 있습니다.
  • 라이브러리 개발에 적합한 번들러 입니다.

 

Parcel

특징

  • JS 엔트리포인트를 지정하는게 아니라 어플리케이션 진입을 위한 HTML 파일 자체를 읽기 때문에 별도 설정 없이도 동작합니다. (Zero Config 번들러 입니다.)
  • HTML 파일을 순서대로 읽어가면서 JS, CSS, Asset을 직접 참조합니다.
  • 트렌스파일러 설정이 간편합니다. JS 파일만 읽을 수 있는 일반적인 번들러와 달리 CSS, Asset 을 직접 참조하기 때문에 트렌스파일이 필요한 파일 유형을 일일이 설정해줄 필요 없이 .bablerc, .postcssrc, .posthtml 같은 설정 파일들을 루트 디렉토리에 만들기만 하면 자동으로 파일을 읽어와서 세팅 해줍니다.
  • 모든 모듈에서 Babel을 사용하여 최신 JS를 브라우저에 지원하는 형식으로 컴파일합니다.
  • 트리 쉐이킹에 강점이 있습니다. ES6, CommonJS 모듈 모두에 대해 트리 쉐이킹 지원합니다.

문제점

  • 웹팩, 롤업에 비해 좁은 생태계, 안정성이 떨어집니다.
  • 일반적인 케이스만 다루고 커스텀한 설정이 필요하면 결국 설정 파일을 다시 작성해야 합니다.

 

 

차세대 번들러

대부분의 번들러는 NodeJS 기반으로 돌아가며, 번들링 중 진행되는 트랜스파일링 등 역시 대부분 NodeJS로 돌아갑니다.

문제는 NodeJS는 싱글 스레드 구조다보니 이로 인한 처리 한계가 발생하여 번들링 동작들을 Native 영역에서 돌려 성능 높이려는 시도 나타났습니다.

그래서 esbuild, SWC 등의 차세대 번들러가 등장하게 되었습니다.

 

esbuild

특징

  • Extreme speed without needing a cache
  • ES6 and CommonJS modules
  • Tree shaking of ES6 modules
  • An API for JavaScript and Go
  • TypeScript and JSX syntax
  • Source maps
  • Minification
  • Plugins
  • GO 로 작성되어 웹팩보다 100배 빠릅니다.
    • JS는 인터프리터 언어라서 한줄한줄 기계어 변환합니다. 하지만 GO는 컴파일 단계에서 미리 소스 코드를 모두 기계어로 변환합니다. JS는 싱글 스레드 기반인 반면 GO는 멀티 스레드 기반으로 동작 가능함. 즉, 코드 파싱과 출력, 소스맵 생성을 모두 병렬로 처리하빈다.

문제점

  • 단지 빌드 도구일 뿐이라서 타입 체킹, HMR 등의 기능이 없음
  • 코드 분할 및 CSS 관련 처리가 아직은 미비함.

 

SWC

특징

  • Rust 언어로 작성된 빌드 툴입니다. Rust 언어는 병렬 처리를 고려하여 설계된 언어로 자바스크립트에 비해 압도적으로 빠릅니다.
  • 자바스크립트 프로젝트 컴파일, 번들링에 모두 사용될 수 있고 확장가능하게 설계되어 있어서 하나의 종합 플랫폼으로 볼 수 있습니다.
  • 트렌스파일링을 지원하여 기존의 Babel 역할을 대체하며 성능 비교시 압도적으로 빠릅니다.
  • 타입스크립트 컴파일을 지원하지만, 타입 체킹을 수행하지는 않기 때문에 tsc를 완전히 대체하지는 않습니다.
  • Esbuild 와 비슷하거나 뛰어넘는 성능을 보여줍니다.
  • terser 대체를 목표로 소스 압축 및 죽은 코드 제거 기능을 지원합니다.
  •  

문제점

  • SWC는 크기가 큽니다. (58MB) Vite 에서 SWC 안쓰는 이유가 VIte 19MB, SWC 58MB 라서…
  • 아직 지원되지 않는 플러그인들이 많습니다. 빌드 속도를 높이기 위해 기존에 사용하던 라이브러리를 교체해야할 수도 있습니다.

 

카카오 FE 기술 블로그의 말을 빌리면...

빌드 시 SWC를 사용하면 바벨과 Terser를 사용했을 때 보다 빌드 속도가 향상되며, 향상되는 정도는 프로젝트의 규모와 빌드 환경에 따라 달라진다고 합니다. (Next.js v12에서 테스트한 결과, 빌드가 5배는 아니지만 2배정도 빠름!)

https://fe-developers.kakaoent.com/2022/220217-learn-babel-terser-swc/

 

 

Vite

특징

  • 디펜던시(개발 시 그 내용이 바뀌지 않을 일반적인(Plain) JavaScript 소스 코드. 보통 패키지 들을 뜻합니다.) 와 소스코드(개발 시 내용이 계속 바뀌는 코드) 를 분리하여 다룹니다.
  • 개발 환경에서
    • 사전번들링으로  Esbuild 를 사용합니다. 
    • 디펜던시를 esbuild로 미리 트랜스파일링 해놓은 뒤, 로컬에서 개발 서버를 띄우면, 소스 코드를 불러오면서 의존성이 있는 패키지만 가져옵니다. 한 번 빌드한 결과는 캐싱을 해두어 다음 개발 빌드 때 바로 뜨게 됩니다.
    • 번들러가 아닌  브라우저의 Native ESM을 통한 HMR 을 지원합니다. 브라우저가 해당 모듈 요청하면 교체된 모듈을 전달합니다. 한마디로 브라우저가 번들러 역할을 한다고 볼 수 있습니다.
      • Native ESM  브라우저가 현재 화면에 보여져야해서 필요한 Module 을 요청하면 그 Module 만 전달하기 때문에 빠르고 효율적입니다.
      • HMR 는 앱을 종료하지 않고 갱신된 파일만을 교체하는(Replacement) 방식을 뜻합니다. 다만 앱 사이즈가 커질수록 선형적으로 갱신에 필요한 시간이 증가합니다.
    • HTTP 헤더를 이용해 퍼포먼스를 높였습니다.
      • 캐시를 활용하여 한 번의 요청이라도 덜 요청되게 개선하였습니다.
      • 소스코드는 304 Not Modified로, 디펜던시는 Cache-Control: max-age=31536000,immutable
  • 프로덕션 빌드시 사전번들링 및 Native ESM을 사용하지 않습니다. 내부적으로 Rollup 을 사용하여 번들링 합니다.

 

문제점

  • 디펜던시가 CommonJS, UMD 등으로 작성되어있을 수 있기 때문에 ESM 으로 불러올 수 있게 변환 작업 해야 합니다.
  • 개발 환경에서는 큰 강점이 있을 지 몰라도 프로덕션 환경으로 사용하기에 안정적인지는 아직 의문입니다.

 

 

Turbopack

특징

  • 번들링 및 캐싱, 병렬화를 통해 최대 속도로 최소 작업을 수행합니다.
  • 개발 서버에 번들을 제공 합니다.
  • Rust로 작성되어 프로덕션에만 필요한 최적화 작업을 건너뛰기 때문에 빠릅니다.
  • Turbo 엔진은 함수 호출을 위한 스케줄러처럼 작동하여 함수 호출을 사용 가능한 모든 코어에서 병렬화 합니다.
  • 예약한 모든 기능의 결과를 캐시하므로 동일한 작업을 두 번 수행할 필요가 없습니다. 간단히 말해서 최대 속도로 최소 작업을 수행합니다 .
  • Turbopack은 Vite 와 경쟁자 입니다. Vite 에서 사용하는 기술들의 문제를 아래와 같은 이유들로 사용하지 않고, 다른 방법으로 개선을 시도하였습니다.
    • esbuild 를 사용하지 않습니다.
      • esbuild 의 코드는 하나의 작업에 대해 매우 최적화되어 있어 빠른 번들링이 가능합니다. 그러나 HMR이 없습니다.
      • 매우 빠른 번들러이지만 많은 캐싱을 수행하지 않습니다.
      • 즉, 해당 작업이 기본 속도로 진행되더라도 동일한 작업을 반복해서 수행하게 됩니다 .
    • 전체 모듈을 번들로 묶어서 전달하는 것이 아니라 요청한 페이지만 번들로 묶어서 전달합니다. 이는 Native ESM과 비슷하지만, Native ESM을 사용하지 않는 이유는 빠르지만, 대규모 APP 에서 확장 문제를 일으킬 수 있기 때문입니다.
      • 브라우저에서 계단식 네트워크 요청이 너무 많으면 시작 시간이 느려질 수 있습니다.
      • 대규모 어플리케이션에서 Native ESM 보다 빠릅니다.
      • 딱 필요한 최소한의 코드만 번들로 묶어서 줘버려서 네트워크 요청 수를 줄이려고자 하는게 Turbopack 의 목표입니다.

 

 

 

 

이렇게 전체적으로 자바스크립트 모듈 및 번들러 역사를 쭉 훑어보았습니다.

어떤 문제를 해결하기 위하여 여러 접근 방식으로 해결하는 기술들이 나오고,

또 그 기술들에서 나오는 문제를 해결하기 위한 새로운 기술들이 계속 나오고 있습니다. 참 재미있네요.

 

지금까지 공부한 것과 개인적으로 경험한 것으로 종합해보면 이렇게 정리가 됩니다.

  • 안정적인 서비스 운영에는 Webpack
  • 라이브러리는 Rollup
  • 앞으로 안정화가 되고, 생태계가 커진다면 대단한 혁신을 가져올 것으로 기대되는 Vite, Turbopack 는 실험적으로 사용

 

 

 

 

출처 : https://11001.tistory.com/213

반응형

'module bundler' 카테고리의 다른 글

webpack, rollup, esbuild, vite  (4) 2023.11.21
Vite  (1) 2023.11.20
Webpack이란  (1) 2023.11.20
Webpack vs Vite  (0) 2023.11.20
모듈 번들러(module bundler) 란?  (1) 2023.11.20
반응형

cra로 생성하지 않고 vite로 생성하는 이유

cra는 webpack로 번들링하고 코드가 바뀌면 모든 자바스크립트 코드를
새로 번들링 해서 앱이 커질수록 HMR(Hot Module Reloading)이 느려짐


Vite는 esbuild를 이용해서 변경된 부분만 새로 번들링하는 형식

첫 번째 실행해서 전체를 한 번을 번들링 그 이후 변경된 부분만 새로 번들링 


 

 

webpack은 Nodejs로 만들어졌고,

esbuild는 Go


다음 주소는
BRAD PEABODY의 글 URL입니다.
Server-side I/O Performance: Node vs. PHP vs. Java vs. Go

서버 I/O 성능 비교
https://www.toptal.com/back-end/server-side-io-performance-node-php-java-go
 

Server-side I/O Performance: Node vs. PHP vs. Java vs. Go | Toptal®

Clearly, Go is the winner here, followed by Java, Node and finally PHP.

www.toptal.com

 

 

 esbuild가 훨씬 빠르죠.

 

 

그리고 CRA는 개발 서버로 express 서버

반면 Vite는 Koa라는 조그마한 서버

여기서도 리소스 차이가 발생

 

 

Vite가 변경된 코드만 번들링 하는 원리는 Native ESM 모듈을 통해 import나 export 부분을 유심히 관찰하고

어떤 특정 import나 export가 코드가 변경됐다면 그 부분만 번들링 하는 방식입니다.

 

실제 구현 방식은 변경된 지 않은 모듈은 304 코드인 "not modified"를 리턴해서 브라우저가 그냥 무시하는 방식

 

Vite는 CommonJS나 UMD 방식을 ESM 방식으로 컨버팅 합니다.

그래서 위와 같이 ESM의 변경된 부분만 선별이 가능한 거죠.

 

 


Vite 설정

Vite 설정은 npm이나 yarn 또는 pnpm으로도 설정할 수 있습니다.

먼저, 다음과 같이 터미널에 입력하십시오.

npm create vite@latest

or 

yarn create vite

or

pnpm create vite

위와 같은 화면이 나오는데요.

원하는 UI Framework을 골라주고, Javascript나 Typescript 중에 골라 주면 됩니다.

CRA 앱과 다른 점은 npm install을 해주지 않는다는 점입니다.

직접 해줘야 하는데요.

그럼, 매번 골라주지 말고 바로 실행할 수 있는 명령어를 알아보겠습니다.

# npm 6.x
npm create vite@latest my-vue-app --template vue

# npm 7+, extra double-dash is needed:
npm create vite@latest my-vue-app -- --template vue

# yarn
yarn create vite my-vue-app --template vue

# pnpm
pnpm create vite my-vue-app --template vue

위 그림을 보시면 저는 npm 버전이 8.11.0 이기 때문에 '--'를 한번 꼭 더 써야 합니다.

예상대로 한 번에 실행되는 걸 볼 수 있습니다.

그리고 template에 올 수 있는 문장은 다음과 같습니다.

vanilla, vanilla-ts,
vue, vue-ts,
react, react-ts,
preact, preact-ts,
lit, lit-ts,
svelte, svelte-ts

이제 만들었던 폴더로 들어가서 npm install을 실행해서 Node 모듈을 설치하고 개발서버를 돌려볼까요?

cd vite-project

npm install

npm run dev

Vite는 개발서버 포트가 3000번이 아닙니다.

기본으로 5173포트를 쓰는데요.

브라우저를 열어서 접속해 볼까요?

참고로 127.0.0.1은 localhost와 같은 의미입니다.

그래서 localhost:5173으로 접속해도 결과는 똑같습니다.

반응형
반응형

일반 HTML 페이지에 react를 추가하는 방법도 있으나.

https://ko.legacy.reactjs.org/docs/add-react-to-a-website.html

 

웹사이트에 React 추가 – React

A JavaScript library for building user interfaces

ko.legacy.reactjs.org

이 방법이 제일 쉽게 React를 이미 만들어진 웹사이트에 추가하는 방법입니다.

그리고 언제나 도움이 될 것 같으면 더 많은 툴체인을 추가할 수가 있습니다.

 

 


 

 

 

 

React 팀의 추천 방법은 아래와 같습니다

  • React를 배우고 있거나 아니면 새로운 싱글 페이지 앱을 만들고 싶다면 Create React App.
  • 서버 렌더링 Node.js 웹사이트를 만들고 있다면 Next.js
  • 고정적인 콘텐츠 지향적 웹사이트를 만들고 있다면 Gatsby
  • 컴포넌트 라이브러리 혹은 이미 있는 코드 베이스에 통합을 한다면 더 유연한 툴체인.

 

 


Create React App

Create React App은 React 배우기에 간편한 환경입니다.

그리고 시작하기에 최고의 방법은 새로운 싱글 페이지 애플리케이션 입니다.

이것은 개발 환경을 설정하고, 최신 JavaScript를 사용하게 해주며, 좋은 개발 경험과 프로덕션 앱 최적화를 해줍니다. Node 14.0.0 혹은 상위 버전 및 npm 5.6 혹은 상위 버전이 필요합니다.

 

 

새로운 프로젝트를 만들기 위해 아래의 명령어를 실행합니다.

npx create-react-app my-app
cd my-app
npm start

 

첫 번째 줄의 ‘npx’는 실수가 아니며 npm 5.2+ 버전의 패키지 실행 도구입니다.

 

 

Create React App 은 백 앤드 로직이나 데이터베이스를 제어할 수 없습니다.

Create React App 은 프런트 앤드 빌드 파이프라인만 생성하기 때문에 원하는 어떤 백엔드와도 함께 사용할 수 있습니다. Create React App는 Babel이나 webpack같은 build 도구를 사용하나, 설정 없이도 동작합니다.

프로덕션을 배포할 준비가 되었을 때, npm run build 를 실행하면 build 폴더 안에 제작한 앱의 최적화된 Build를 생성합니다. 

 

 

Next.js

Next.js는 인기 있는 경량의 프레임워크로 React로 만들어진 스태틱 서버 렌더링 애플리케이션입니다. 기본적으로 스타일링과 라우팅 해결책을 가지고 있으며, 사용자가 Node.js를 서버 환경으로 사용하고 있다고 생각합니다.


Next.js 정식 가이드

 

 

 

Gatsby

Gatsby는 정적 웹사이트를 React로 만들기에는 최고의 방법입니다. React 컴포넌트를 사용하게 해주지만 미리 렌더링 된 HTML과 CSS를 사용하여 가장 빠르게 로드됩니다.

 

정식 가이드 스타터 키트

 

 

 

 

더 유연한 툴체인

밑에 있는 툴체인은 조금 더 많은 선택과 다르기 쉬운 옵션입니다. 숙련된 사용자들에게 추천합니다.

  • Neutrino webpack의 장점과 React의 단순함과 미리 설정된 과 컴포넌트를 합친 것입니다.
  • Nx는 풀스택 모노레포 개발을 위한 도구이며, React, Next.js, Express 등을 기본적으로 지원합니다.
  • Parcel React와 함께 사용할 수 있고 빠르고 설정이 필요 없는 웹 애플리케이션 bundler입니다.
  • Razzle 서버 렌더링 프레임워크며 설정이 필요 없지만, Next.js보다 다루기 쉽습니다.

 

JavaScript build 툴체인은 주로 아래와 같이 구성되어있습니다

  • Yarn 혹은 npm같은 package 매니저는 서드 파티 패키지의 방대한 생태계를 활용할 수 있게 하며, 쉽게 설치하고 업데이트할 수 있게 합니다.
  • webpack 아니면 Parcel 같은 bundler는 코드를 모듈방식으로 작성할 수 있게 하고 이를 작은 package로 묶어서 로딩 시간을 최적화할 수 있습니다.
  • Babel 같은 컴파일러는 최신 JavaScript 코드를 구형 브라우저에도 실행되게 도와줍니다.

 

 

 


React와 ReactDOM 모두 CDN을 통해 사용할 수 있습니다.

<script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>

위의 코드는 개발용으로 적합하며 배포용 버전에는 적합하지 않습니다. React의 용량 및 성능 최적화된 배포용 버전은 아래와 같이 제공되고 있습니다.

<script crossorigin src="https://unpkg.com/react@18/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"></script>

react와 react-dom의 특정 버전을 로딩하려면 18을 사용하고자 하는 버전 넘버로 대체하면 됩니다.


crossorigin 속성이 필요한 이유

CDN을 통해 React를 사용한다면, crossorigin 어트리뷰트(attribute)와 함께 사용하는 것을 권장합니다.

<script crossorigin src="..."></script>

또한 사용 중인 CDN이 Access-Control-Allow-Origin: * HTTP 헤더 설정을 사용하는지 확인하는 것이 좋습니다.

이를 통해 React 16 버전과 다음 버전에서 더 쉽게 에러 처리를 할 수 있습니다.

 

 

 


 

React의 각 배포 채널은 하나의 고유한 사용 경우를 위해 설계되었습니다.

  • Latest 는 안정적이고, 유의적인 React 배포입니다. npm에서 React를 설치할 때 얻는 것입니다. 이것은 이미 여러분이 사용하고 있는 채널입니다. 모든 사용자용 애플리케이션을 위해서는 이것을 사용해주세요.
  • Next 는 React 소스 코드 저장소의 main branch를 추적합니다. 이것을 다음 minor 유의적인 배포를 위한 배포 후보자라고 생각하세요. 이것을 React와 타사 프로젝트 간의 통합 테스트에 사용해주세요.
  • Experimental 는 실험용 API 및 stable 배포에서는 사용할 수 없는 기능이 포함됩니다. 이것은 또한 main branch를 추적하지만, 추가 기능 플래그가 켜져 있습니다. 배포하기 전에 배포가 예정된 기능들을 실험하는데 사용해주세요.

모든 배포는 npm에 게시되지만 오직 Latest만 의미론적 버전 관리를 사용합니다.

Prereleases는 (Next와 Experimental 채널에 있는 것) 내용의 hash와 커밋 날짜로부터 생성된 버전들을 가집니다,

 

예: Next를 위한 0.0.0-68053d940-20210623와 Experimental을 위한 0.0.0-experimental-68053d940-20210623.

 

사용자용 애플리케이션에 대해 공식적으로 지원되는 배포 채널은 Latest입니다.

 

Next와 Experimental 배포는 테스트 목적으로만 제공되며 배포 간에 동작이 변경되지 않는다는 보장을 제공하지 않습니다.

 

그것들은 Latest의 배포에 사용하는 유의적 버전원칙 프로토콜을 따르지 않습니다.

 

Latest 채널

Latest는 stable React 배포에 사용되는 채널입니다.

npm의 latest tag에 해당합니다. 실제 사용자들에게 제공되는 모든 React app에 권장되는 채널입니다.

 

어떤 채널을 사용해야 할지 잘 모르겠다면 Latest를 사용해야 합니다. 

 

Latest로 업데이트가 매우 안정적이다고 기대할 수 있습니다. 

 

 

Next 채널

Next 채널은 React 저장소의 main branch를 추적하는 prerelease 채널입니다.

 

 

Experimental 채널

Next와 마찬가지로 Experimental 채널은 React 저장소의 main branch를 추적하는 prerelease 채널입니다. Next와 달리, Experimental 배포는 광범위한 배포를 위해 준비되지 않은 추가 기능과 API를 포함합니다.

 

일반적으로, Next에 대한 업데이트는 Experimental에 대한 해당 업데이트와 함께 동반됩니다.

그것들은 동일한 소스 수정을 기반으로 하지만 다른 기능 플래그 세트를 사용하여 빌드됩니다.

 






출처 : https://ko.legacy.reactjs.org/docs/release-channels.html

반응형
반응형

Webpack

2012년 Tobias Koppers에 의해 webpack v1.0이 효율적으로 js파일을 통합해주는 도구로 공개되었습니다.
2016년 webpack v2.0이 릴리즈되고 ES6를 지원하여 커뮤니티의 큰 관심을 얻게 되었습니다.
2017년 webpack v3.0이 릴리즈되고 성능 개선, 기능 추가 되면서 사람들이 열광하기 시작했습니다.
2018년 webpack v4.0이 릴리즈되었는데 동시에 React, Anglular의 등장으로 SPA가 급부상하게 되면서 번들러의 역할 더욱 막중해지자 이른바 "대웹팩시대"가 도래하게 되었습니다.
현재는 2020-10-10에 릴리즈된 v5에서 지속적으로 업데이트되고 있습니다.

 

webpack의 정체성은 번들러의 목적인 "통합"에 있습니다.
'번들을 통합해서 관리할 순 없을까?'에 대한 고민이 webpack이 부상할 수밖에 없게 만들어 주었죠.

 

설정이 간편하고 직관적.
하나의 설정 파일에서 원하는 번들이 생성 될 수 있도록 컨트롤할 수 있습니다.
entry와 output을 명시하고 어떤 plugin과 loader로 파일들을 다룰 건지 명시하면 됩니다.

const path = require('path');
const HtmlWebpackPlugin = require("html-webpack-plugin");

module.exports = {
  entry: {
    home: './pages/home.js',
  },
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].bundle.js',
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: ["babel-loader"],
      },
    ],
  },
  plugins: [new HtmlWebpackPlugin()],
};

 

 

 

풍부한 plugins과 loaders.
webpack은 굉장히 강력한 개발 커뮤니티가 뒷바침해주고 있습니다.
쉽게 plugin과 loader를 부착할 수 있기 때문인데요. loader를 통해서 파일들을 변환, 번들링, 빌드를 진행하고 plugin을 통해서 output 파일을 튜닝해줍니다.

 

강력한 개발서버.
webpack은 Hot Module Replacement(HMR)를 처음으로 제안했고 2012년부터 사용되어왔습니다.
HMR는 소스코드의 변화를 감지하여 브라우저를 직접 새로고침할 필요가 없이 변화를 바로 반영해줍니다. 개발자는 덕분에 더욱 신속하게 개발할 수가 있게 되었죠.
webpack v2, v3, v4을 거쳐서 다양한 파일(css)의 변화도 감지할 수 있게 되었고 안정화되었습니다.

 

Code Splitting.

webpack의 꽃이라고도 할 수 있는 Code Splitting의 얘기도 빠질 수가 없습니다.

"Code splitting is one of the most compelling features of webpack."

 

한마디로 설명하자면 번들 로드 최적화하는 작업입니다.
파일들을 여러 번들 파일으로 분리하여 병렬로 스크립트를 로드하여 페이지 로딩속도를 개선할 수 있습니다.
추가로 초기에 구동될 필요가 없는 코드를 분리하여 lazy loading을 통해 페이지 초기 로딩속도를 개선할 수 있습니다.

끝으로 당시 같이 거론되었던 번들링 라이브러리에 대해서 비교하면서 webpack 설명을 마치겠습니다.

vs grunt

grunt는 task runner입니다.
minifying, 파일 통합, lint 적용 등 등록된 task를 순서대로 실행시켜 줍니다.
설정이 파편화되고 개발자가 직접 컨트롤해야하는 영역이 많습니다.
반면 webpack은 module bundler로 모듈을 통합하는 것에 초첨이 맞춰져 있습니다.

vs glup

glup은 grunt와 흡사한 task runner입니다.
다만 stream-based로 파일을 접근하기에 grunt에 비해 성능이 더 우수하다고 평가를 받고 있습니다.


Rollup

webpack 시대 개막과 함께 2017년부터 개발이 시작된 module bundler입니다.
대세적으론 webpack의 열풍에 가려져 있었지만 점차 그의 매력이 인정을 받아 많은 차세대 번들러가 rollup을 벤치마킹하게 되었습니다.

v1.0 2018-12-28
v2.0 2020-03-06
v3.0 2022-10-11

Rollup의 정체성은 "확장"에 있습니다.

 

"compiles small pieces of code into something larger and more complex, such as a library or application"

 

 

작은 코드조각들을 거대하고 복잡한 어플리케이션 혹은 라이브러리로 만들어 준다고 스스로 소개합니다.
같은 소스코드를 다양한 환경에 맞춰 다르게 발드하는 것을 생각하면 될 것 같습니다.
그러면서 자연스럽게 아래 여론이 형성되었습니다.

 

"어플리케이션 만들 땐 webpack으로, 라이브러리 만들 땐 rollup으로!"

 

 

rollup의 사용방식과 구성방식은 webpack과 거의 흡사합니다.
input과 entry를 설정하고 번들링에 적용할 기능을 plugin 형태로 끼워 넣으면 됩니다.

import commonjs from '@rollup/plugin-commonjs';
import resolve from '@rollup/plugin-node-resolve';
import { terser } from 'rollup-plugin-terser';

const production = !process.env.ROLLUP_WATCH;

export default {
  input: 'src/main.js',
  output: {
    file: 'public/bundle.js',
    format: 'iife',
    sourcemap: true,
  },
  plugins: [
    resolve(),
    commonjs(),
    production && terser(),
  ],
};

 

 

webpack과의 차이를 비교해보면 더 정확하게 rollup의 특성을 이해할 수 있습니다.

vs webpack

한마디로 정리하면,
webpack은 내부적으로 Commonjs를 사용하고 rollup은 typescript(ES6)를 사용합니다.
이로 인해서 아래 특성들이 있다고 볼 수 있습니다.

 

rollup은 ES6 모듈 형태로 빌드할 수 있습니다.
webpack은 CommonJS 형태로만 번들링이 가능했습니다. 물론 webpack v5부턴 ES6로 번들할 수 있습니다.
라이브러리는 ES6 번들에 생성에 대한 수요가 강합니다.
ES6 환경에서는 ES6 번들이 사용되고 CommonJS 환경에서는 CommonJS 번들이 사용되도록 해줘야 라이브러리 사용자는 더욱 최적화된 애플리케이션을 빌드해줄 수 있습니다.

 

rollup은 좀 더 빠릅니다.
webpack은 모듈들을 함수로 감싸서 평가하는 방식을 사용하지만 rollup은 모듈들을 호이스팅하여 한번에 평가하기에 성능상 이점이 있습니다.

 

rollup은 더 가벼운 번들을 생성합니다
tree shaking은 기본적으로 ES6 코드에서 제대로 동작합니다.
단순히 레퍼런스되지 않는 코드를 제거하는 것이 아닌 사용되는 모듈만 AST 트리에 포함시키는 방식으로 불필요한 코드를 제거하기 때문입니다.
rollup은 공식 플로그인을 통해서 CommonJS 코드를 ES6 코드로 변환할 수도 있습니다.

 

rollup은 CommonJS 코드를 ES6코드에서 사용할 수 있습니다.
기본적으로 ES6에서는 CommonJS식의 require를 지원하지 않습니다.
webpack에서도 공식적으론 ES6 혹은 CommonJS 한 형태의 코드 베이스를 사용하기를 권장합니다.


ESBuild

앞서 봐왔던 번들러는 모두 내부적으로 JavaScript을 기반으로 번들링을 합니다.
따라서 JavaScript 언어가 가질 수 밖에 없는 성능상의 한계가 있습니다.
그 한계를 뿌수고자하는 움직임이 있었으니 그 라이브러리가 바로 ESBuild 입니다.

ESBuild는 내부적으로 Go로 작성되었고 JS 기반의 번들러보다 10배에서 100배까지 빠른 엄청난 퍼포먼스를 보여줬습니다. 빠른 이유에 대해서는 아래와 같이 소개하고 있습니다.

문제는 2020년도에 파격적으로 등장 했지만 아직까지도 메이저 버전이 릴리즈 되지 못했습니다. (현재 기준 v0.17.3)
사실 번들러로서 필수적인 기능들이 갖춰졌습니다.

  • JavaScript, CSS, TypeScript, and JSX built-in
  • Bundles ESM and CommonJS modules
  • Tree shaking, minification, and source maps
  • Local server, watch mode, and plugins

하지만 설정이 webpack, rollup처럼 유연하지 못하고 아직 안전성 관련 이슈가 있습니다.

  • code splitting 및 CSS와 관련된 처리가 아직 미비합니다.
  • esbuild는 es5 이하의 문법을 아직 100% 지원하지 않습니다.

Vite

ESBuild의 단점을 보완시킨 라이브러리 Vite(비트) 입니다.
Vue.js의 창시자인 Evan You가 만든 frontend build tool 입니다.

2021년에 등장했지만 벌써 v4가 나온 만큼 굉장히 활발하게 업데이트 되고 있는 라이브러리입니다.
v1 rc에서 바로 v2 alpha로 넘어간 것 같습니다.
v2.0.0 2021-02-16
v3.0.0 2022-07-13
v4.0.0 2022-12-09

vite를 2가지 키포인트로 설명할 수 있을 것 같습니다.

  • native ES modules 기반의 강력한 개발서버
  • esbuild로 파일들을 통합하고 rollup을 통해 번들링

전반적으로 esbuild로 성능을 극적을 끌어오고 rollup을 통해서 번들링의 유연성을 챙겼다고 볼 수 있습니다.
공식문서 (Vite를 사용해야 하는 이유)에서 자신에 대해 너무 잘 설명하고 있어 꼭 한번 정독해보시길 바랍니다!

특성을 아래와 같이 요약할 수 있을 것 같습니다.

  • 개발 서버 구동 시간이 거의 0에 가까움,
  • 모든 CommonJS 및 UMD 파일을 ESM으로 불러올 수 있도록 변환함
  • 별도의 설정이 없이 다양한 리소스 import 가능
  • CSS 빌드 최적화
    • Direct Import 구문에 대해 Preload 하도록 함으로써, 네트워크 비용 줄임

주의 해야할 점

vites는 기본적으로 ES6을 타겟으로 번들을 생성합니다.
따라서 ES5이하로 타겟을 잡으려면 별도로 polyfill를 다뤄야 합니다.
그래도 공식적으로 @vitejs/plugin-legacy 플러그인을 제공 해줍니다.

vite는 기본적으로 <root>/index.html 파일이 빌드를 위한 진입점입니다.
순수한 JS 번들을 생성하기 위해서는 라이브러리 모드를 설정해야 합니다.
( 3.2.0 에서야 멀티 entry를 지원하게 되어 고생한 기억이 있습니다... )


참고한 문헌

http://2016.stateofjs.com/2016/buildtools/
https://2017.stateofjs.com/2017/build-tools/results
https://2018.stateofjs.com/other-tools/
https://2019.stateofjs.com/other-tools/#build_tools
https://2020.stateofjs.com/en-US/technologies/build-tools/
https://2021.stateofjs.com/en-US/libraries/build-tools/
https://2022.stateofjs.com/en-US/libraries/build-tools/

https://github.com/webpack/webpack/releases
https://github.com/rollup/rollup/blob/master/CHANGELOG.md
https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md
https://yoon-dumbo.tistory.com/entry/롤업과-웹팩의-차이점-rollup-vs-webpack
https://so-so.dev/web/tree-shaking-module-system/

 

 

 

 

출처 : https://bepyan.github.io/blog/2023/bundlers

반응형

'module bundler' 카테고리의 다른 글

자바스크립트 모듈 & 번들러로 본 붕당의 이해  (1) 2023.11.21
Vite  (1) 2023.11.20
Webpack이란  (1) 2023.11.20
Webpack vs Vite  (0) 2023.11.20
모듈 번들러(module bundler) 란?  (1) 2023.11.20
반응형

Vite(프랑스어로 "빠르다(Quick)"를 의미하며, 발음은 "veet"와 비슷한 /vit/ 입니다.)는 빠르고 간결한 모던 웹 프로젝트 개발 경험에 초점을 맞춰 탄생한 빌드 도구이며, 두 가지 컨셉을 중심으로 하고 있습니다.

  • 개발 시 네이티브 ES Module을 넘어 더욱 다양한 기능을 제공합니다. 가령, Hot Module Replacement (HMR)과 같은 것들 말이죠.
  • 번들링 시, Rollup 기반의 다양한 빌드 커맨드를 사용할 수 있습니다. 이는 높은 수준으로 최적화된 정적(Static) 리소스들을 배포할 수 있게끔 하며, 미리 정의된 설정(Pre-configured)을 제공합니다.

Vite는 합리적인 기본 설정을 제공합니다. 기능 가이드에서 더 자세히 알아보세요. 프레임워크 지원이나 다른 도구와의 통합은 플러그인을 통해 가능합니다. Vite 설정하기 섹션에서는 필요에 따라 프로젝트에 Vite를 적용하는 방법을 설명합니다.

또한 Vite는 타입이 완벽하게 제공되는 플러그인 API JavaScript API를 통해 높은 수준의 확장성을 제공합니다.

 


이런 문제점이 있었어요

브라우저에서 ESM(ES Modules)을 지원하기 전까지, JavaScript 모듈화를 네이티브 레벨에서 진행할 수 없었습니다. 그래서 소스 모듈을 브라우저에서 실행할 수 있는 파일로 크롤링, 처리 및 연결하는 "번들링(Bundling)"이라는 해결 방법을 사용해야 했습니다.

Webpack, Rollup 그리고 Parcel과 같은 도구는 이런 번들링 작업을 진행해줌으로써 프런트엔드 개발자의 생산성을 크게 향상시켰습니다.

하지만 애플리케이션이 점점 더 발전함에 따라 처리해야 하는 JavaScript 모듈의 개수도 극적으로 증가하고 있습니다. 심지어 수천 개의 모듈이 존재하는 것도 대규모 프로젝트에서는 그리 드문 일이 아닙니다. 이러한 상황에서 JavaScript 기반의 도구는 성능 병목 현상이 발생되었고, 종종 개발 서버를 가동하는 데 비합리적으로 오랜 시간을 기다려야 한다거나 HMR을 사용하더라도 변경된 파일이 적용될 때 까지 수 초 이상 소요되곤 했습니다. 이와 같은 느린 피드백 루프는 개발자의 생산성과 행복에 적지 않은 영향을 줄 수 있습니다.

Vite는 이러한 것에 초점을 맞춰, 브라우저에서 지원하는 ES Modules(ESM) 및 네이티브 언어로 작성된 JavaScript 도구 등을 활용해 문제를 해결하고자 합니다.

지루할 정도로 길었던 서버 구동

콜드 스타트 방식으로 개발 서버를 구동할 때, 번들러 기반의 도구의 경우 애플리케이션 내 모든 소스 코드에 대해 크롤링 및 빌드 작업을 마쳐야지만이 실제 페이지를 제공할 수 있습니다. (콜드 스타트는 최초로 실행되어 이전에 캐싱한 데이터가 없는 경우를 의미합니다. - 옮긴이)

vite는 애플리케이션의 모듈을 dependencies source code 두 가지 카테고리로 나누어 개발 서버의 시작 시간을 개선합니다.

  • Dependencies: 개발 시 그 내용이 바뀌지 않을 일반적인(Plain) JavaScript 소스 코드입니다. 기존 번들러로는 컴포넌트 라이브러리와 같이 몇 백 개의 JavaScript 모듈을 갖고 있는 매우 큰 디펜던시에 대한 번들링 과정이 매우 비효율적이었고 많은 시간을 필요로 했습니다.
  • Vite의 사전 번들링 기능은 Esbuild를 사용하고 있습니다. Go로 작성된 Esbuild는 Webpack, Parcel과 같은 기존의 번들러 대비 10-100배 빠른 속도를 제공합니다.
  • Source code: JSX, CSS 또는 Vue/Svelte 컴포넌트와 같이 컴파일링이 필요하고, 수정 또한 매우 잦은 Non-plain JavaScript 소스 코드는 어떻게 할까요? (물론 이들 역시 특정 시점에서 모두 불러올 필요는 없습니다.)
  • vite는 Native ESM을 이용해 소스 코드를 제공합니다. 이것은 본질적으로 브라우저가 번들러의 작업의 일부를 차지할 수 있도록 합니다. vite는 브라우저가 요청하는 대로 소스 코드를 변환하고 제공하기만 하면 됩니다. 조건부 동적 import 이후의 코드는 현재 화면에서 실제로 사용되는 경우에만 처리됩니다.

Bundle based dev serverentry···routeroutemodulemodulemodulemodule···BundleServer readyNative ESM based dev serverentry···routeroutemodulemodulemodulemodule···Server readyDynamic import (code split point)HTTP request

느렸던 소스 코드 갱신

기존의 번들러 기반으로 개발을 진행할 때, 소스 코드를 업데이트 하게 되면 번들링 과정을 다시 거쳐야 했었습니다. 따라서 서비스가 커질수록 소스 코드 갱신 시간 또한 선형적으로 증가하게 됩니다.

일부 번들러는 메모리에서 작업을 수행하여 실제로 갱신에 영향을 받는 파일들만을 새롭게 번들링하도록 했지만, 결국 처음에는 모든 파일에 대한 번들링을 수행해야 했습니다. "모든 파일"을 번들링 하고, 이를 다시 웹 페이지에서 불러오는 것이 얼마나 비효율적인 것인지 느껴지시나요? 이러한 이슈를 우회하고자 HMR(Hot Module Replacement) 이라는 대안이 나왔으나, 이 역시 명확한 해답은 아니었습니다.

물론, vite는 HMR을 지원합니다. 이는 번들러가 아닌 ESM을 이용하는 것입니다. 어떤 모듈이 수정되면 vite는 그저 수정된 모듈과 관련된 부분만을 교체할 뿐이고, 브라우저에서 해당 모듈을 요청하면 교체된 모듈을 전달할 뿐입니다. 전 과정에서 완벽하게 ESM을 이용하기에, 앱 사이즈가 커져도 HMR을 포함한 갱신 시간에는 영향을 끼치지 않습니다.

또한 vite는 HTTP 헤더를 활용하여 전체 페이지의 로드 속도를 높입니다. 필요에 따라 소스 코드는 304 Not Modified로, 디펜던시는 Cache-Control: max-age=31536000,immutable을 이용해 캐시됩니다. 이렇게 함으로써 요청 횟수를 최소화하여 페이지 로딩을 빠르게 만들어 줍니다.

이렇게나 빠른 Vite를 사용하지 않을 이유가 있나요?

배포 시 번들링 과정이 필요한 이유

이제 기본적으로 ESM이 대부분의 환경에서 지원되지만, 프로덕션에서 번들 되지 않은 ESM을 가져오는 것은 중첩된 import로 인한 추가 네트워크 통신으로 인해 여전히 비효율적입니다(HTTP/2를 사용하더라도). 프로덕션 환경에서 최적의 로딩 성능을 얻으려면 트리 셰이킹, 지연 로딩 및 청크 파일 분할(더 나은 캐싱을 위해)을 이용하여 번들링 하는 것이 더 좋습니다.

개발 서버와 프로덕션 빌드 간에 최적의 출력과 동작 일관성을 보장하는 것은 쉽지 않습니다. 이것이 바로 Vite가 미리 설정된 빌드 커맨드를 이용하고, 빌드 퍼포먼스 최적화를 진행하는 이유입니다.



Webpack vs vite

실제로 웹팩과 비교해서 vite 가 얼마나 빌드시간이 빠른지 React - TypeScript 보일러 플레이트를 생성하여 비교해보았습니다.

build time

vite (1.40s)      <    webpack (2.83s) 

dev-server ready time

vite (1.81s)      <    webpack (7.80s) 

완벽히 같은 파일로 컴파일 해본 건 아니지만 vite 서버의 빌드 타임과 dev server ready time 이 훨씬 더 빠른 것으로 알 수 있습니다.

왜 빠를까?

우선 dev server 시작 시간이 빠른 이유는 esbulid를 이용하여 종속성을 미리 묶기 때문입니다. esbulid는 Go 언어로 작성된 매우 빠른 번들러로, Go 언어의 특화된 병렬처리로 빠르게 번들링 해줍니다.

Vite는 기본 ESM 을 통해 소스 코드를 제공합니다 . 이것은 본질적으로 브라우저가 번들러 작업의 일부를 인계받게 하는 것입니다. Vite는 브라우저가 요청할 때 요청에 따라 소스 코드를 변환하고 제공하기만 하면 됩니다. 조건부 동적 가져오기 뒤에 있는 코드는 현재 화면에서 실제로 사용되는 경우에만 처리됩니다.

 

 

그러나, 프로덕션 빌드에서는 esbulid를 사용하지 않고 있다고 합니다. (아직 esbuild가 1버젼이 넘지 않았고 용량이 큰 프로덕션 버젼에서 필요한 트리쉐이킹이나 코드스플리팅과 같은 최적화 기능을 제공하지 않기 때문입니다.)
대신, 당분간 이런 측면에서 보다 유연한 Rollup을 이용하여 번들링하고 있습니다.

Rollup 또한 역시 Webpack 보다는 번들링 속도가 빠릅니다.

롤업의 작동방식은 모든 모듈을 함수로 랩핑하는 webpack 과는 다르게 코드들을 동일한 수준으로 올리고 한번에 번들링을 진행하기 때문에 빠릅니다. 롤업에서 식별자 충돌을 상황에 따라 식별자를 변경해 방지하고 있습니다.

 

 




참고자료
https://ko.vitejs.dev/guide/

 

Vite

Vite, 차세대 프런트엔드 개발 툴

ko.vitejs.dev

 

 

내용출처 : https://velog.io/@eamon3481/Vite-%EB%8A%94-Webpack%EC%9D%84-%EB%8C%80%EC%B2%B4-%EA%B0%80%EB%8A%A5%ED%95%A0%EA%B9%8C

반응형

'module bundler' 카테고리의 다른 글

자바스크립트 모듈 & 번들러로 본 붕당의 이해  (1) 2023.11.21
webpack, rollup, esbuild, vite  (4) 2023.11.21
Webpack이란  (1) 2023.11.20
Webpack vs Vite  (0) 2023.11.20
모듈 번들러(module bundler) 란?  (1) 2023.11.20
반응형

Webpack이란?

자바스크립트 어플리케이션을 위한 정적 모듈 번들러 이다.

At its core, webpack is a static module bundler for modern JavaScript applications. When webpack processes your application, it internally builds a dependency graph from one or more entry points and then combines every module your project needs into one or more bundles, which are static assets to serve your content from.
Webpack Concepts

html에 들어가는 다수의 js 파일들을 하나의 js 파일로 만들어 주는 것을 의미한다.

js 파일 뿐만 아니라 css, image, html 등을 모듈로 로드해서 사용할 수 있고
코드를 압축하는 기능을 제공하며 번들링 된 파일이 너무 무거워질 경우, 다시 여러 개의 파일로 코드 스플리팅(Code Spliting) 할 수 있다.

여기서 말하는 모듈(module)이란?

관련된 데이터와 함수들이 묶여 module을 형성하고 주로 파일 단위로 관리된다.
 모달은 isShow라는 상태와 show, close 함수를 가진 하나의 모듈이라고 할 수 있다.

모듈들은 각각의 javascript 파일에서 관리된다.

여기서 말하는 번들러(bundler)란?

모듈별로 나누어진 파일을 연관되어 있는 단위로 묶어 하나의 파일로 만들어주는 역할을 한다. (모듈 또는 외부 라이브러리 간의 의존성을 쉽게 관리할 수 있다.)
🧐 alert, confirm, propmt라는 모듈이 있을 때, 이들을 대화상자라는 하나의 번들로 묶을 수 있다. alert이 a 라이브러리를 사용하고 있다면 a 라이브러리도 함께 번들링 된다.

웹 페이지에서 모듈을 사용하려면 해당 모듈과 모듈에서 사용하는 라이브러리를 로드해야 하는데 선후 관계를 따져 순서대로 로드해야 한다.
모듈의 수가 얼마 되지 않는다면 간단하게 로드할 수 있지만 수가 많아지면 매우 복잡해진다.
또한 이렇게 많은 양의 파일을 로드한다면 네트워크 병목현상이 발생할 수 있다.
하나의 자바스크립트 파일 안에 많은 양을 작성하면 해결할 수 있지만 이럴 경우 가독성도 떨어지고 유지보수도 힘들어진다.
이때, 번들링 된 파일을 로드하면 문제를 해결할 수 있다.
모듈을 번들링 하는 과정 중, 모듈이나 외부 라이브러리의 의존성들을 로드하기 때문에 선후 관계를 따질 필요가 없으며, 여러 파일로 작성된 모듈들을 연관된 특정 단위로 묶어서 하나의 파일로 만들기 때문에 병목현상도 예방할 수 있다.

웹팩은 프로젝트에 필요한 모든 모듈을 매핑하고 하나 이상의 번들을 생성하는 디펜던시 그래프를 생성한다.

주요 개념

// webpack.config.js

module.exports = {
  entry: './path/to/my/entry/file.js',
};
  • Entry
    엔트리 포인트는 웹팩이 내부의 디펜던시 그래프를 생성하기 위해 사용하는 모듈이다.
    즉, 엔트리 포인트는 웹팩이 번들링을 시작할 메인 파일이다.엔트리 포인트는 꼭 하나가 아니라 여러 엔트리 포인트를 지정할 수 있는데 이때 이름(name)과 콘텐츠 해시(contentHash) 가진 여러 개의 번들로 만들 수 있다.
  • // webpack.config.js module.exports = { entry: './path/to/my/entry/file.js', };
  • 값으로 입력된 파일의 의존성을 찾아 나머지 파일을 알아낸다.
  • Output
    output 속성은 생성된 번들을 내보낼 위치와 파일의 이름을 지정하는 역할을 한다. publicPath 옵션
    다른 도메인이나 CDN에서 일부 또는 모든 출력 파일을 호스팅 하려는 경우 사용할 수 있으며 Webpack Dev Server에서는 출력 파일의 URL 경로로 사용된다.
  • // webpack.config.js module.exports = { output: { path: path.resolve(__dirname, 'dist'), // 내보낼 위치 filename: 'my-first-webpack.bundle.js', // 생성된 번들 파일 이름 }, };
  • Loaders
    웹팩은 자바스크립트와 JSON 파일만 이해한다. 만약 JSX 같은 코드를 이해하기 원한다면 로더를 사용하여 해당 코드들을 웹팩이 이해할 수 있도록 변환할 로더를 옵션으로 설정하고 그것들을 디펜던시 그래프에 추가할 수있는 유효한 모듈로 변환한다.
    • test: 변환이 필요한 파일들을 식별한다.
    • use: 변환을 수행하는 데 사용되는 로더를 가리킨다.
      babel-loader를 사용하면 최신 문법으로 작성된 Javascript를 모든 브라우저에서 해석할 수 있도록 변환할 수 있다.
  • // webpack.config.js module.exports = { module: { rules: [{ test: /\.?js$/, use: 'babel-loader' }], }, };
  • Plugins
    로더는 특정 유형의 모듈(JSX 파일 같은)을 변환하는 데 사용하지만 플러그인은 번들을 최적화하거나 asset을 관리하고 환경 변수 주입 등과 같은 작업을 수행한다.
    Webpack 패키지에 포함된 내장 플러그인 외에 추가로 필요한 기능은 외부 플러그인을 받아서 사용할 수 있다.HtmlWebpackPlugin은 HTML 파일을 생성하고 자동으로 생성된 모든 번들을 삽입한다.
  • // webpack.config.js module.exports = { plugins: [new HtmlWebpackPlugin({ template: './src/index.html' })], };
  • Mode
    웹팩에 내장된 환경별 최적화를 활성화할 수 있다.
    모드 옵션의 값으로 development production none을 선택할 수 있다.

Webpack이 필요한 이유

페이지마다 새로운 HTML을 요청해 뿌려주는 방식이었던 예전에는 괜찮았지만
SPA 즉, 하나의 HTML 페이지에서 여러 개의 js 파일을 포함하게 되면서 파일을 컴파일 할 때 다수의 js 파일을 불러오는데 시간이 오래 걸리게 된다.

그러한 부분을 해결하기 위해서 하나의 js 파일로 번들링 해주는 것이 필요하다. 생성된 번들 파일은 번들 파일의 용량을 최대한 줄이거나 분할하는 등 최적화되어야 하고 모든 브라우저에서 작동해야 한다.

 

 

출처 : https://velog.io/@suyeon9456/Webpack

 

 

 


위 출처블로그와 그안에 참고된 블로그들을 보면 자세히 알수가 있습니다.






최초 출시일: 
2012년 3월 10일
Webpack4 버전은 (2018년) 
Webpack5 릴리즈판이 2020년 10월 10일 공개






다만 현재 Webpack 팀이 Vercel 에 합류하면서 Rust 기반으로 새롭게 다지고 있는 Turbopack 을 개발하고 있습니다.
현재 Vercel 의 주력 프레임워크인 Next.js 에서 도입 중이며, 현재 베타 단계입니다.

 

반응형

'module bundler' 카테고리의 다른 글

자바스크립트 모듈 & 번들러로 본 붕당의 이해  (1) 2023.11.21
webpack, rollup, esbuild, vite  (4) 2023.11.21
Vite  (1) 2023.11.20
Webpack vs Vite  (0) 2023.11.20
모듈 번들러(module bundler) 란?  (1) 2023.11.20
반응형

모듈 번들러

모듈 번들러의 뜻부터 알아볼까요?

Module(분리된 코드 조각) + Bunlder(묶는다)

모듈 번들러는 분리된 코드 조각들을 하나로 병합하는 개발 도구입니다.
핵심 작업은 JS 파일, CSS 파일 등 여러 리소스를 하나로 결합하여 단일 파일을 만드는 것입니다.
따라서, 크롬과 같은 브라우저는 하나의 단일 파일을 로드함으로써 애플리케이션이 동작하게 됩니다.

사용 이유

  • 한 번의 요청으로 파일을 받아올 수 있기 때문에 로딩 속도에서의 이점이 있습니다.
  • JS 압축, CSS 전처리기 변환과 같은 작업 등을 자동화 해줍니다.

 

Webpack

Webpack은 Entry 포인트를 시작으로, 의존적인 모듈을 전부 찾아내서 하나의 파일로 번들링을 해줍니다.

기능

  • CommonJS, AMD, ES6 Module 포맷을 모두 지원합니다.
  • JS 뿐만 아니라 CSS, Image 등의 복잡한 의존성을 관리합니다.
  • 성능 최적화
    • 사용하지 않는 코드를 제거하는 Tree Shaking 같은 최적화를 수행합니다.
    • HTTP 요청 수가 감소하여 네트워크 비용이 감소됩니다.
  • Code Splitting
    • 원하는 때에 모듈을 로딩할 수 있는 Dynamic Loading, Lazy Loading이 가능합니다.

장점

  • 로딩에 대한 네트워크 비용이 감소됩니다.
  • 모듈 단위로 개발이 가능하기 때문에 가독성이 높아지고 유지보수가 쉽습니다.
  • 최신 JS 문법을 지원하지 않는 브라우저에서도 사용할 수 있습니다.

Webpack의 기능과 장점에 대해서 알아보았습니다.
지금부터는 Webpack의 동작 원리를 이해하기 위해 함께 쓰이는 Babel에 대해 배워보겠습니다.


Babel이란?

Babel은 최신 ES6+ 버전을 구버전인 ES5로 변환해주는 JS 트랜스파일러입니다.
Babel은 두 가지 역할을 수행합니다.

1. 트랜스파일러

  • 기존 코드가 구표준을 준수하는 코드로 변경됩니다.

2. 폴리필 (Polyfill)

  • 브라우저가 지원하지 않는 코드를 지원 가능하도록 기존 함수의 동작 방식을 수정하거나 새롭게 구현합니다.
  • 구현이 누락된 부분의 기능을 메꿔주는 (fill in) 역할을 합니다.

 

Babel을 왜 사용해야 할까요?

ES5에서 JS는 모듈을 지원하지 않았습니다.
그렇다면 한 파일에 모든 코드를 다 넣어야 할까요..? 

개발자들은 어떻게든 코드를 모듈화하고 서로 import하는 개념을 만들어냈습니다!
그렇게 등장한 두 가지 방법이 바로 CommonJS와 AMD입니다.

ES6에서는 위 두 방법의 특장점들을 가져와서 JS 내에서도 모듈을 지원하도록 하였습니다.

하지만 ES6 버전을 지원하지 않는 브라우저들이 있습니다.

따라서 모듈을 사용하기 위해서, 그리고 ES6 문법들을 사용하기 위해서 Babel을 이용하여 구버전으로 변환해주는 것이 필요한 것입니다.


Webpack vs Vite

그렇다면 Webpack은 대체 불가능한 완벽한 도구일까요?
변화가 매우 빠른 프론트엔드 업계에서는 이 기술이 최선일지 항상 의심하고 또 의심해야 합니다...

Vite란 이름의 뜻 그대로 "빠른" 자바스크립트 번들링 툴으로, esbuild 번들링을 통해 개발 환경에서 높은 속도를 자랑합니다.

Vite의 등장으로 CRA나 Webpack 대신 Vite를 사용하는 개발자들이 많아졌습니다.

Webpack과 Vite의 차이점

  • 개발 서버
    • Webpack: 소스 코드와 모든 종속 관계의 모듈을 번들링 한 후 서버가 준비됩니다.
    • Vite: esbuild로 미리 번들링한 모듈을 필요할 때 동적으로 가져오기 때문에 즉각적으로 서버가 구동됩니다.
    • dev-server ready time(보일러 플레이트 기준): Vite(1.8s) > Webpack(7.8s)
  • 프로덕션 빌드
    • Webpack: 각 모듈을 범위마다 함수로 맵핑하여 결합합니다.
    • Vite: 하나의 파일에 모든 종속 모듈을 전역 범위로 선언하여 결합합니다. 중복을 제거하기 때문에 가볍고 빠르게 빌드할 수 있습니다.

그렇다면 Webpack을 Vite로 교체해야 할까요?

Vite는 번들링 속도에서 강점이 있지만, 마이그레이션과 안정성 측면에서의 문제가 거론되고 있습니다.

Vite는 개발 환경에서 esbuild를 사용하지만 프로덕션 환경에서는 Rollup으로 번들링을 수행합니다.
따라서 Webpack에서 Vite로 마이그레이션을 한다면 Rollup config를 설정하는 것에 많은 시간을 투자해야합니다.

Rollup 설정에는 CommonJS 처리, Polyfill 처리 등이 되어있지 않기 때문에 일일이 플러그인을 설치해야해서 번거롭습니다. 하지만 설정을 마치게 되면 정작 프로덕션 환경에서는 Webpack과 빌드 시간에서 차이가 크게 나지 않는다고 합니다.

게다가 개발 환경과 프로덕션 환경의 설정이 다르기 때문에 빌드 안정성이 낮아서 개발 환경에서만 사용한다는 의견도 많습니다.

저 또한 프로덕션 환경에서는 안정성이 매우 중요하다고 생각하기 때문에 개발 또는 테스트 환경에서는 Vite를 사용하여 속도를 높이고, 프로덕션에서는 Webpack으로 빌드 안정성을 확보하는 것이 좋다고 생각합니다.


글을 마치며

지금까지 모듈 번들러의 사용 이유와 대표적인 번들링 툴인 Webpack에 대해서 알아보았습니다.
그리고 최근 높은 번들링 속도로 주목을 받고 있는 Vite와 Webpack의 차이점에 대해서 알아보면서
Webpack을 교체하는 것이 필요한 지에 대해서 생각해보기도 했습니다.

환경과 목적에 맞는 번들링 도구를 선택할 수 있도록 이번 글이 도움이 되었으면 좋겠습니다.

이미지 출처





출처 : https://enjoydev.life/blog/frontend/4-module-bundler

반응형

'module bundler' 카테고리의 다른 글

자바스크립트 모듈 & 번들러로 본 붕당의 이해  (1) 2023.11.21
webpack, rollup, esbuild, vite  (4) 2023.11.21
Vite  (1) 2023.11.20
Webpack이란  (1) 2023.11.20
모듈 번들러(module bundler) 란?  (1) 2023.11.20
반응형

JavaScript 프레임워크인 React, Vue, Svelte, Angular 등을 사용하다 보면 모듈 번들러(module bundler)는 필수적으로 언급되는 내용입니다. 모듈 번들러는 개념적으로 생각보다 쉬운 내용이지만 웹팩, 롤업, 파셀, 모듈, 번들러, 종속성, 로더 등 해당 용어는 무엇이고 어떻게 동작하는지 잘 모르기 때문에 대부분 이해하지 않고 넘어가게 됩니다.

 

하지만, FrontEnd 개발자라면 모듈 번들러의 개념과 필요성을 꼭 알아야 한다고 생각하고 개인적으로 헷갈리는 부분이 있어서 이번 포스팅에서 모듈 번들러에 대해 정리하고자 합니다.


모듈(Module)

모듈 번들러는 Module + Bundling이 혼합된 단어인데, 모듈은 '분리된 코드 조각'을 의미하고 번들링은 '묶는다'는 의미입니다. 즉, 모듈 번들러는 분리된 코드 조각을 묶는다는 의미입니다. '분리된 코드 조각'이라는 의미를 가지는 모듈에 대해 알아봅시다.

 

애플리케이션의 기능이 많아질수록 작성해야하는 코드가 길어질 수 있습니다. 모든 코드를 한 개의 파일에 작성하는 대신 기능(변수, 객체, 배열, 함수, 클래스 등)에 따라 별도의 파일에 코드를 분리할 수 있습니다. 코드를 분리하는 기준에 따라 파일이 상당히 많아질 수 있지만, 한 개의 파일에 코드를 작성하는 것보다 체계적이고 유지보수가 쉬워집니다.

 

결국 모듈은 분리된 파일을 의미합니다. JavaScript에서 현재 모듈을 다른 모듈에서 접근할 수 있도록 export 키워드를 사용하며, 분리된 모듈을 불러오기 위해 import 키워드를 사용합니다.


모듈 번들러(Module Bundler)의 필요성

React, Angular, Vue와 같은 JavaScript 프레임워크가 등장하기 전에는 웹 사이트를 구축하기 위해 HTML, CSS, JavaScript 뿐이었기 때문에 파일 관리가 복잡하지 않았습니다. 하지만, 시간이 지나면서 조금 더 나은 성능, 속도를 만족하기 위해 다양한 JavaScript 프레임워크가 등장하였으며, 웹 사이트를 구축하기 위해 필요한 파일들이 점점 많아집니다.

 

 

스벨트의 node_modules 폴더만 봐도 상당히 많은 모듈이 존재합니다. 참고로 스벨트는 다른 프레임워크에 비해 모듈이 적은 편입니다.

 

이렇게 많은 모듈을 하나로 묶는 과정은 쉽지 않으며, 변수 또는 함수 이름이 중복되는 경우 그리고 모듈간 종속성 때문에 배포하기 전부터 수많은 문제가 발생합니다.

 

모듈간 종속성이란 예를 들어 설명하자면, A.js 파일은 B.js를 import 하고 B.js 파일은 C.js 파일을 import 하고.. 이렇게 모듈끼리 서로 종속되는 것을 의미하며, 모듈 간 종속성이 복잡한 경우 어떤 모듈에서 문제가 발생했는지 추적하는 것도 쉽지 않습니다.

 

하나의 파일로 병합하더라도 병합하는 과정에서 발생하는 문제를 해결하는데 상당히 많은 시간을 소모하게 되므로 상당히 비효율적입니다.


모듈 번들러(module bundler)

모듈 번들러는 위에서 언급한 모든 문제를 해결하여 짧은 시간에 최상의 성능을 위해 애플리케이션을 최적화하는 개발 도구입니다. 모듈 번들러의 핵심 작업은 여러 JS 파일을 하나의 결합하여 단일 파일을 만드는 것입니다. 따라서, Chrome과 같은 브라우저는 하나의 단일 파일을 로드함으로써 애플리케이션이 동작합니다.

 

모듈 번들러는 JS 파일뿐만 아니라 CSS 파일과, 이미지, 글꼴 등 여러 리소스에 대해서도 번들링 됩니다. 모듈 번들러는 웹팩, 롤업처럼 다양한 개발 도구가 존재하며 번들링 동작 방식은 개발 도구마다 다릅니다.


정리

  • 모듈은 특정 목적 또는 기능에 따라 분리된 파일을 의미합니다.
  • 모듈 번들러는 분리된 파일을 하나의 파일로 병합하는 개발 도구입니다.

출처: https://developer-talk.tistory.com/550 [DevStory:티스토리]

반응형

'module bundler' 카테고리의 다른 글

자바스크립트 모듈 & 번들러로 본 붕당의 이해  (1) 2023.11.21
webpack, rollup, esbuild, vite  (4) 2023.11.21
Vite  (1) 2023.11.20
Webpack이란  (1) 2023.11.20
Webpack vs Vite  (0) 2023.11.20
반응형

검색하여 나올만한것들을 썻고 관련한 답변은 각 출처란에 자세히 기록되어있습니다.

자세히 안나와있는건 코멘트로 추가하였습니다.

질문중 프론트엔드가 받을만한 질문이 있냐고 하실수있지만 퍼블리셔는 UI를 만들어야하고
그렇기때문에 스크립트를 잘 알아야합니다.
특히 요새는 react,vue 퍼블이라고 하여 마크업과  ui기능동작을 만들어줄 사람을 찾기때문에 프론트 면접 질문과 겹치는
부분들이 있을수 있습니다.


 

웹 표준

웹 표준(Web Standards)
1. 웹 표준이란?  - '웹에서 표준적으로 사용되는 기술이나 규칙'  - 표준화 단체인 W3C가 권고한 표준안에 따라 웹사이트를 작성할 때 이용하는 HTML, CSS, JavaScript 등에 대한 규정이 담겨 있다.  - 어떤 운영체제나 브라우저를 사용하더라도 웹페이지가 동일하게 보이고 정상 작동해야함을 의미.  - 표준 스펙을 잘 지키는 것 뿐만 아니라 구조적 마크업(XHTML)과 표현 및 레이아웃(CSS) 및 사용자 행위 제어(DOMScripting)를 잘 분리하는 고급 홈페이지 구축 방식.  - CSS 와 HTML(XHTML)로 웹 문서를 작성하는 것의 명확한 용어는 권고(recommend)라고 하며 버전과 상관없이 HTML, XHTML은 그 자체로 표준이라고 한다.

출처: https://goddaehee.tistory.com/244 [갓대희의 작은공간:티스토리]

 

웹접근성

웹 접근성이란?

  • 일반적으로 웹 접근성은 장애인, 고령자 등이 웹 사이트에서 제공하는 정보에 비장애인과 동등하게 접근하고 이해할 수 있도록 보장하는 것
    - 물론 비장애인도 정보 접근에 제한을 받는 불편함을 겪을 수 있음
  • 웹 접근성을 갖추면 웹에 접근했을 때 그 어떤 상황에서도 항상 동등한 수준의 정보를 제공받도록 보장받을 수 있다!
  • 결국, 궁극적인 목적은 어떤 상황이든 , 어떤 사람이든 정보를 제공받지 못하는 경우가 없도록 하는 것

웹 콘텐츠 접근성 지침

웹 접근성을 잘 확보했는지 판단할 기준이 되는 웹 콘텐츠 접근성 지침!

  • W3C이 웹 접근성 권고안인 ‘WCAG(Web Content Accessibility Guidelines) 2.0’을 기반으로 한국 실정에 맞게 조금 수정한 ‘한국형 웹 콘텐츠 접근성 지침 2.1’ 내용을 정리해보았다.


https://t1.daumcdn.net/cfile/tistory/1162174250B247F71B


출처 :https://velog.io/@jos9187/%EC%9B%B9-%ED%91%9C%EC%A4%80%EA%B3%BC-%EC%9B%B9-%EC%A0%91%EA%B7%BC%EC%84%B1%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C

 

 

doctype에 종류는? doctype란?

DTD(DOCTYPE)란?

DTD는 Document Type Definition의 약자이다. 즉, 문서형식을 정의해주는 것이다.

DOCTYPE 종류

HTML 4.01 and HTML5 공통 사용

<!DOCTYPE html> W3C에서 html5를 공식 표준 권고안으로 2014년 10월 28일에 확정 발표했다.
HTML5 표준 권고안

공통의 DOCTYPE 선언하기

HTML5

 

HTML 4.01 Strict (엄격모드)

http://www.w3.org/TR/html4/strict.dtd">

HTML 4.01 Transitional (호환모드)

http://www.w3.org/TR/html4/loose.dtd">

XHTML 1.0 Strict (엄격모드)

http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

XHTML 1.0 Transitional (호환모드)

http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
위의 다섯가지가 제일 많이 사용되는 것이다.
DTD를 적지 않는 브라우저들은 Quirks Mode 상태(어물쩡한 상태)로 렌더링 되기 때문에 바른 DTD를 적어주는 것이 좋다. 크로스 브라우징을 하기 위해서는 꼭 필요한 원칙이다.
우리나라에서는 DOCTYPE 중에서 XHTML 1.0 Transitional를 제일 많이 사용중이다. 그 이유중에 하나는 IE중에서도 하위 브라우저를 사용하는 곳이 많기 때문이다. 또 하나는 표준모드는 너무 엄격하여 적용하기가 쉽지 않아 하위 브라우저 호환성을 고려하여 느슨한 상태의 호환모드 DOCTPYE 이다.
그렇지만 IE7이상에서 사용할 때는 HTML5를 사용해도 무관하니 참고 바람.

Quirks MODE(쿼크모드) 렌더링과 DTD

쿼크모드(Quirks mode)

오래된 웹 브라우저를 위하여 디자인된 웹 페이지의 하위 호환성을 유지하기 위해 W3C나 IETF의 표준을 엄격히 준수하는 표준모드(Standards Mode)를 대신하여 쓰이는 웹 브라우저 기술을 가리킨다.
참고문헌

쿼크모드의 발생 원인

  • DOCTYPE 선언이 존재하지 않거나 잘못 적혀있을 경우, 웹 브라우저는 문서를 쿼크 모드로 해석한다.
  • DOCTYPE 선언 내의 URL이 생략된 경우, 웹 브라우저는 문서를 쿼크 모드로 해석한다.

호환 출력 방식(Quirks Rendering Mode)의 특징

  • 브라우저가 HTML을 읽는데 시간이 더 걸린다.
  • 브라우저가 HTML을 해석하는데 시간이 더 걸린다.
  • 브라우저가 HTML을 출력하는데 시간이 더 걸린다.
  • 브라우저마다 HTML을 각각 다르게 출력한다.

IE10에서 쿼크 모드를 볼 수 있다.

DTD 정의 필요성

  1. 문서의 가독성 증가
  2. 브라우저 별 호환성 증가(크로스 브라우징)
  3. 문서 제작의 효율성 증가

참고사항

HTML5가 표준이 되었지만 아직 IE 웹 브라우저에서는 호환성 보기 헤더(X-UA-Compatible header)가 설정되지 않을 경우, 쿼크모드(Quirksmode)로 변경되는 문제를 가진다.



출처 : https://singihae.gitbooks.io/front-end-developer-guide-book/content/chapter01.html

 

 

반응형웹과 적응형의 차이

반응형웹 이란 무엇 입니까?

반응형웹 디자인(responsive web design, RWD)이란 하나의 웹사이트에서 PC, 스마트폰, 태블릿 PC 등 접속하는 디스플레이의 종류에 따라 화면의 크기가 자동으로 변하도록 만든 웹페이지 접근 기법을 말합니다.

출처 : https://duopix.co.kr/%EC%99%9C-%EB%B0%98%EC%9D%91%ED%98%95%EC%9B%B9-%EC%9D%B4%EC%96%B4%EC%95%BC-%ED%95%A0%EA%B9%8C%EC%9A%94/

적응형 웹 디자인이란?

적응형 웹 디자인을 사용하면 웹 페이지에서 감지된 기기를 기반으로 미리 만들어진 정적인 레이아웃을 불러올 수 있습니다. 이러한 작업이 수행되기 위해선 디자이너가 다양한 화면 너비에 맞춰 별도로 디자인 작업을 해야 합니다. 가장 일반적인 너비는 다음과 같습니다(픽셀 단위):
  • 320
  • 480
  • 760
  • 960
  • 1200
  • 1600

출처 : https://ko.wix.com/blog/post/responsive-vs-adaptive-design

개인 코멘트  

어느 블로그도 실제적으로 사용에 대한 자세한 내용이 없기에 추가합니다.

개발에서 보는 적응형과 
퍼블/디자인에서 보는 적응형은 차이가 존재합니다.

개발 보는 적응형은
www.PC사이트.com
www.MO사이트.com
이런 분류된 방식을 말하는 것이고.

퍼블과 디자인팀에서 보편적으로 이해하는건 적응형이란 브레이크 포인트를 둬서 레이아웃을 바꾸는형식을 말합니다.

그렇기때문에 커뮤니케이션을 할때 이 차이를 확인해서 어느 이야기인지 체크를 하셔야합니다.

그리고 적응형은 어떻게 보면 반응형안에 포함된 작업방식의 차이입니다.

해외는 100%로 작업하여 %기반의 작업이 많은 반면 국내는 브레이크 포인트의 차이로 작업하는걸 이야기하는부분이 많습니다.

그런데 요새 추세는 이러한것들이 에매한것이 테블릿과 테블릿PC가 나오며 SIZE로 구분하기 어려워졌습니다.
테블릿이 1980을 넘는것들이 나오기시작하면서 기준을 어떻게 해야하는지
기획팀과 확실히 이야기를 하는것이 좋습니다.

 

 

css 방법론

 

OOCSS(Object Oriented CSS)는 CSS를 모듈(module) 방식으로 작성하여 중복을 줄이는 방식의 방법론이다
BEM(Block Element Modifier)은 블록(block), 요소(element), 상태(modifier)로 구분하여 클래스 이름을 작성하는 방식의 방법론이다
SMACSS(Scalable and Modular Architecture for CSS)는 CSS를 범주화(Categorization)로 패턴화 하고자 하는 방법론이다


사용이유

  • 원활한 유지보수를 위함
  • 코드의 재사용성을 높이기 위함
  • 클래스명 만으로도 무슨 내용인지 예측할 수 있게 함


출처 :https://velog.io/@hahan/CSS%EB%B0%A9%EB%B2%95%EB%A1%A0OOCSS-BEM-SMACSS

css Sass와 Scss의 차이

  • SASS와 SCSS는 CSS를 편리하게 사용할 수 있도록 하며 추가 기능 또한 있는 확장판 스크립트 언어
  • SASS, SCSS에서 기존의 CSS의 기능 부재 단점을 보완한 다양한 기능 추가
  • SASS는 들여 쓰기+줄 바꿈 형식, SCSS는 중괄호+세미콜론 형식
  • 전 세계적으로 SCSS 사용자 수, SCSS를 활용한 라이브러리&프레임워크 수가 SASS 보다 더 많음
  • SASS보다 SCSS가 CSS와의 호환성이 더 좋음

출처 : https://cocoon1787.tistory.com/843

Ir기법

 

 

IR(Image Replacement) 기법은 이미지를 볼 수 없는 사용자에게 적절한 대체 텍스트를 제공하는 것으로 이는 웹 접근성 준수를 위한 스크린 리더 사용자뿐 아니라 검색 엔진의 효과적인 내용 수집을 위해서도 필요하다.


출처 : https://velog.io/@chumil7432/CSSIR%EA%B8%B0%EB%B2%95

SEO 란? 최적화 작업?

 

요즘 사람들은 궁금한 것에 대한 답을 대부분 Google에 검색하여 답을 얻곤 하는데요. 그렇기 때문에 당연히 모든 비즈니스 및 웹사이트 소유주들은 Google에서 자신들의 정보를 사람들이 찾기 쉽도록 만들기 위해서라면 할 수 있는 모든 것을 합니다. 이것이 바로 SEO입니다. 즉, 검색 결과에서 상위에 노출될 수 있도록 내 콘텐츠를 최적화하는 방식을 말합니다.

SEO(검색 엔진 최적화)는 웹사이트가 유기적인(무료) 검색 방식을 통해 검색 엔진에서 상위에 노출될 수 있도록 최적화하는 과정을 말합니다. 비즈니스 유형이 어떤 것이든 SEO는 가장 중요한 마케팅 유형 중 하나입니다.

왜냐하면 Google은 검색하는 사람들에게 긍정적인 사용자 경험을 선사하는 것이 목표이기 때문에 가능한 한 최고의 정보를 제공하길 원합니다. 따라서, SEO 노력은 검색 엔진이 여러분의 콘텐츠를 특정 검색어에 대한 웹 상의 주요한 정보로 인식하도록 하는 과정에 포커스를 맞추어야 합니다.

  1. SEO 계획 세우기
  2. 키워드 리서치
  3. 페이지 속도 최적화
  4. 타이틀 태그 및 메타 설명 작성
  5. 대체 텍스트 추가
  6. 내부 링크를 제작
  7. 외부 링크에 노력을 기울이기
  8. 모바일 친화적인 사이트인지 확인
  9. 결과 분석

 

출처 : https://ko.wix.com/blog/post/what-is-seo

meta태그와 종류

 

메타 데이터는 데이터에 대한 데이터 (정보)입니다.

<meta> 태그는 HTML 문서에 대한 메타 데이터를 제공합니다. 메타 페이지에 표시되지 않지만, 기계 분석 할 것이다.
메타 엘리먼트는 일반적으로 페이지 설명, 키워드, 문서 저자, 마지막 수정, 및 다른 메타 데이터를 지정하는 데 사용된다.
메타 데이터 브라우저에서 사용할 수있는 검색 엔진 (키워드), 또는 다른 웹 서비스 (콘텐츠 또는 다시로드 페이지를 표시하는 방법).

예제

예제 1 - 검색 엔진 키워드를 정의:

<meta name="keywords" content="HTML, CSS, XML, XHTML, JavaScript">

예제 2 - 웹 페이지에 대한 설명을 정의:

<meta name="description" content="Free Web tutorials on HTML and CSS">

예제 3 - 페이지의 저자를 정의:

<meta name="author" content="홍길동">

예제 4 - 30초마다 새로고침을 한다:

<meta http-equiv="refresh" content="30">

예제 5 - 인터넷 익스플로러 호환 모드
http-equiv는 컨텐츠의 속성 정보/값에 대한 것을 HTTP헤더에 제공하는 것.

<meta http-equiv="X-UA-Compatible" content="IE=Edge">

예제 6 - 문자열 인코딩 HTML5

<meta charset="UTF-8">

HTML 4.01

<meta http-equiv="content-type" content="text/html; charset=UTF-8">

웹 사이트의 기본 정보를 제공

필요한 항목만 <head> 태그 요소에 삽입하여 사용.

<meta name="generator" content="사이트 제작 툴 혹은 에디터">
<meta name="author" content="저자 제작자"> 
<meta name="keywords" content="검색을 위한 키워드">
<meta name="description" content="페이지의 요약설명">
<meta name="copyright" content="저작권 정보">
<meta name="subject" content="사이트의 주제 입력">
<meta name="title" content="사이트의 타이틀">
<meta name="publisher" content="발행인 조직 혹은 기업">
<meta name="other agent" content="사이트 책임자">
<meta name="classification" content="카테고리 분류">
<meta name="reply-to(email)" content="메일주소">
<meta name="filename" content="파일명">
<meta name="author-date(date)" content="제작일">
<meta name="location" content="위치/국가">
<meta name="distribution" content="배포자">

효과를 나타내는 제공

각 옵션의 선택사항 : 
Page-Enter : 페이지 들어갈 때 효과 줌
Page-Exit : 페이지 나올 때 효과 줌
blendtrans : 점점 밝게 또는 점점 어둡게 나타나도록 설정
revealtrans : 문서 전환 효과 지정
duration : 시현 시간 지정

transition=0 사각형 작아지기
transition=1 사각형 커지기
transition=2 원 작아지기
transition=3 원 커지기
transition=4 위에서 아래로
transition=5 아래이서 위로
transition=6 왼쪽에서 오른쪽
transition=7 오른쪽에서 왼쪽
transition=8 수직 블라인드
transition=9 수평 블라인드
transition=10 체크무늬 왼쪽에서 오른쪽으로
transition=11 체크무늬 위에서 아래로
transition=12 랜덤 뿌리기
transition=13 수직 2등분 가운데로 모움
transition=14 수직 2등분 바깥으로 퍼짐
transition=15 수평 2등분 가운데로 모움
transition=16 수평 2등분 바깥으로 퍼짐
transition=17 45도 오른쪽 위에서 왼쪽 아래로
transition=18 45도 오른쪽 아래에서 왼쪽위로
transition=19 -45도 왼쪽 위에서 오른쪽 아래로
transition=20 -45도 왼쪽 아래에서 오른쪽 위로
transition=21 수평 랜덤
transition=22 수직 랜덤
transition=23 1~22 랜덤 선택

로봇을 제어하는 메타태그

robot.txt 파일을 생성하지 않고 메타태그를 활용하여 로봇을 제어할 수 있습니다.

<meta name="robots" content="all" />
<!-- // 로봇 검색을 허가한다. // -->
<meta name ="robots" content="none" />
<!-- // 로봇 검색을 허가하지 않는다. // -->
<meta name="robots" content="index,follow" />
<!-- // 이 파일을 읽는다. 링크 연결 문서도 읽는다. // --> 
<meta name="robots" content="noindex,follow" />
<!-- // 이 파일은 읽지 않는다. 링크 연결 문서만 읽는다. // --> 
<meta name="robots" content="index,nofollow" />
<!-- // 이 파일을 읽는다. 링크 연결은 무시한다. // --> 
<meta name="robots" content="noindex,nofollow" />
<!-- // 이 파일를 읽지 않는다. 링크 연결도 무시한다. // -->

 

 

 출처 :https://singihae.gitbooks.io/front-end-developer-guide-book/content/chapter03.html 

 css size rem em px 

 

px

px은 우리가 알고 있는 픽셀값입니다. 우리가 해상도를 지정할 때 1920x1080 로 지정한다면, width(너비)는 1920px이고, height(높이)는 1080px이라는 것입니다. 위의 예시에서 p태그 속성값에 400px을 주었다면 p태그로 묶인 문장들은 너비가 400px로 고정됩니다. 창이 400px보다 줄어들면 스크롤이 생기게 됩니다. font-size의 기본값은 16px입니다. 즉, 아무런 지정을 하지 않는다면 font-size는 16px이 기본값입니다.

 

%

%는 사용자가 보이는 화면에서 차지하는 비중입니다. 가령 위의 예시에서 p의 속성값이 400px가 아닌 70%라면 창이 줄어들든 늘어나든 사용자 입장에서 보이는 화면의 70%만 <p>태그가 사용하게 됩니다. 즉, 부모가 만들어준 공간안에서의 너비 비율로 볼 수 있습니다. 가령, 위 예시에서 p의 속성값이 70%라면, p의 부모는 body이므로, body(부모)가 만들어준 공간 안에서의 70%로 볼 수 있습니다. body자체에 margin값(여백)이 살짝 존재하므로 화면에 살짝 여백이 존재합니다. margin=0을 주어서 없앨 수도 있습니다.

 

em

em단위는 em단위가 있는 곳의 폰트사이즈의 배수입니다. 가령 위의 예시에서 h1의 폰트 속성값이 1.5em, h2의 폰트 속성값이 1.2em, p의 폰트 속성값이 1em이라면, h1의 폰트사이즈는 1.5*16px=24px이고, h2의 폰트사이즈는 1.2*16px=19.2px이며, p의 폰트사이즈는 16px이 되는 것입니다. p의 width가 가령 20em이라면, 20*16px=320px이 됩니다. em은 기준이 되는 값만 수정을 하면 나머지는 비율대로 조정을 해줄 수 있기 때문에 가장 유용한 단위라고 생각합니다. 앞으로 저도 작업을 할 때, 가급적 em단위를 쓰는 습관을 기르려고 합니다.

 

rem

rem단위는 문서의 기본값의 배수입니다. em과 비슷하지만 em단위는 em단위가 쓰여진 곳(부모 태그)의 기준값에 따라 달라지지만, rem단위는 문서 전체의 기본값의 배수이므로, 문서 전체의 기준값에 따라 달라집니다. 만약, 문서 전체의 기준값을 바꿔야 한다면, style에 :root{font-size:16px} 의 코드를 달아주시면 됩니다. root는 뿌리, 근간이기 때문에 저런 표현을 쓰나봅니다. rem의 r도 root의 약자입니다. 사이트 전체적으로 font-size를 조정해야 한다면 root의 속성값을 변경해주면 됩니다.

출처: https://esef.tistory.com/117 [굴리고 굴리는 블로그:티스토리]

 

 

 

grid

 

  • Grid는 두 방향(가로-세로) 레이아웃 시스템 (2차원)


출처 : https://studiomeal.com/archives/533


플러그인 사용
AGGrid
https://www.ag-grid.com/example

AUIGrid
https://www.auisoft.net/demo/auigrid/index.html?init&theme=default&s=0

 

 

flex


Flex(플렉스)는 Flexible Box, Flexbox라고 부르기도 합니다.
Flex는 레이아웃 배치 전용 기능으로 고안되었습니다. 그래서 레이아웃을 만들 때 딱히 사용할게 없어서 쓰던 float나 inline-block 등을 이용한 기존 방식보다 훨씬 강력하고 편리한 기능들이 많아요.
출처 :https://studiomeal.com/archives/197



css 전처리기/ 후처리기 

 

전처리기 : 화면에 보여주기 전에 (렌더링 전에) CSS를 변경해서, 스타일을 보여준다.
    사용자가 작성하기 쉬운 코드로 작성 => 기본 CSS로 변환 => 렌더링
후처리기 : 화면에 보여주고 나서, CSS 변경
    기본 CSS파일 작성 => 렌더링 => 외부 프로그램 사용해서 스타일 변경

 

전처리기 : Scss, Stylus, Less
후처리기 : PostCSS

 

 

버전관리툴 git /svn


형상관리(Version Control Revision Control)툴

  • 소프트웨어 버전 관리 툴이라고도 한다.
  • 형상관리는 소스의 변화를 끊임없이 관리하는 것을 말한다.
  • 소스를 버전 별로 관리할 수 있어서 개발할 때 실수로 소스를 삭제하거나, 수정하기 이전으로 돌아가야되는 경우 유용하게 사용되는 툴.
  • 또한 팀 프로젝트에서도 누가 무엇을 어떻게 수정했는지도 알 수 있기 때문에 코드를 병합하거나 수정된 소스를 추적하는 데에도 쓰인다.
SVN vs GIT 비교

0.3.1 SVN

  • SVN은 보통 대부분의 기능을 완성해놓고 소스를 중앙 저장소에 commit
  • commit의 이미 자체가 중앙 저장소에 해당 기능을 공개한다는 의미.
  • (GIT 과 가장 큰 차이점) 개발자가 자신만의 version history를 가질 수 없다. (그렇기 때문에 local History를 이용하긴 하지만, 일시적이다. 내가 몇일전 까지에 한하여 작업했던 내역을 확인 가능하지만 버전 관리가 되진 않는다.)
  • commit한 내용에 실수가 있을 시에 다른 개발자에게 바로 영향을 미치게 되는 단점도 있다.

0.3.2 GIT

  • (GIT 과 가장 큰 차이점) 반면, git은 개발자가 자신만의 commit history를 가질 수 있고, 개발자와 서버의 저장소는 독립적으로 관리가 가능.
  • commit한 내용에 실수가 있더라도 이 바로 서버에 영향을 미치지 않는다
  • 개발자는 마음대로 commit(push)하다가 자신이 원하는 순간에 서버에 변경 내역(commit history)을 보낼 수 있으며, 서버의 통합 관리자는 관리자가 원하는 순간에 각 개발자의 commit history를 가져올 수 있음.

이렇게 git은 서버 저장소와 개발자 저장소가 독립적으로 commit history를 가져갈 수 있기 때문에 매우 유연한 방식으로 소스를 운영할 수 있으며, 이러한 유연성이 git의 가장 큰 장점이다.

 

es5, es6 문법 차이

레거시 코드가 프로젝트에 존재할수있기때문에

1.let,const keyword
2.Arrow function
3.for/of
4.Class
5.Promise
6.Symbol
7.Default parameter
8.function rest parameter
9.String.inclues()/.startsWith()/.endsWith()
10.Array.from()/.keys()/.find()/.findIndex()
11.New Math Methods
12.New Number Properties, Methods
13.New Global Methods
14.Iterable Object.entries
15.Javascript Module

 

 

gulp 

 

Gulp는 Node.js 기반의 프로세스 자동화 도구이며 MIT 라이센스의 오픈소스 프로젝트입니다. 회사 일을 하면서 스크립트를 난독화하거나 파일을 복사하는 등의 작업이 반복될 때가 많았는데, Gulp는 이런 반복되는 작업들을 자동화하기 위해 개발된 도구입니다. 또한 Gulp의 플러그인을 사용하면 기능을 다양하게 확장할 수도 있습니다.

 

출처 :https://haeguri.github.io/2019/03/31/introduction-gulp/

 

 

css reflow와 repaint 에 설명

브라우저 렌더링 과정을 알아보았으니 최적화시키는 방법을 알아보자. 

 

 

[출처]https://dev.to/gopal1996/understanding-reflow-and-repaint-in-the-browser-1jbg

 

위와 같은 렌더링 과정에서 Reflow와 Repaint는 둘다 비용이 많이 드는 작업이다.

먼저 이 두 과정에 대해 알아보자. 

 

Reflow(Layout)이란?

화면구조(Layout)이 변경되었을 때 뷰 포트 내에서 렌더 트리상 노드의 정확한 위치과 크기를 계산하는 과정이다. element의 reflow는 DOM에 있는 모든 하위, 상위 요소의 후속 리플로우를 유발한다. 

 

- 모든 엘리먼트의 위치나 길이, 크기 등등을 다시 계산하는 과정

- 상위 엘리먼트를 변경시키면 하위 엘리먼트에도 영향을 끼침

- render tree를 재생성하므로 부하가 크고 레이아웃에 영향을 줌

- DOM노드를 추가, 제거 , 업데이트하는 경우 발생 

Repaint(Redraw)란?

화면에 가시성이 변하지만 레이아웃에 영향을 미치지 않는 요소의 외관을 변경할 때 발생한다. 

 

- 레이아웃에 영향을 주지않지만 눈에 보이는 요소들(background-color, color, visibility,..)이 변경됨

- reflow 보다는 부하가 크지는 않음

 

 

[출처]https://dev.to/gopal1996/understanding-reflow-and-repaint-in-the-browser-1jbg

 

Reflow와 Repaint가 모두 일어나는 경우 

- DOM 노드를 추가, 제거 업데이트하는 경우 

- DOM 요소의 위치 변경, 크기 변경 (margin, padding, border, width, height, 등..) 

- display : none으로 DOM 요소를 숨기는 경우

- DOM 노드를 이동하거나 애니메이션을 생성하는 경우

- 창 크기를 조정하는 경우 (Resizing)- 글꼴 스타일을 변경하는 경우 (요소의 geometry가 변경되고 이는 페이지에 있는 다른 요소의 위치나 크기에 영향을 미칠 수 있고 두 요소 모두 브라우저에서 reflow를 수행하고 repaint 과정을 거침)- 스타일 시트를 추가하거나 제거하는 경우- DOM을 조작하는 스크립트를 수정하는 경우

- offset, scrollTop, scrollLeft와 같은 계산된 스타일 정보 요청

- 이미지  크기 변경

Repaint만 일어나는 경우 

- visibility :  hidden 으로 DOM 요소를 숨기는 경우 (레이아웃이나 위치 변경이 없어 repaint만 발생)

- background-color, visibillty, outline 등의 스타일 변경

 

Reapint와 Reflow 최소화하는 방법

1) 개별 스타일을 바꾸기보다 클래스 이름을 변경. 동적인 스타일인 경우 cssText속성을 편집한다.

 

[출처]https://webclub.tistory.com/346

 

2) DOM 변경사항을 일괄처리

  - documentFragment를 사용하여 DOM사용을 최소화한다. ( documentFragment는 DOM에 적용되기 전까지는 메모리상에만 존재)

 

[출처]https://beomy.github.io/tech/browser/reflow-repaint/

 

  - display :none으로 요소를 숨기고 (1 reflow, 1 repaint) 변경사항 100개를 추가한 후 display를 복원한다. ( 총 2 reflow, 2 repaint)

3) 계산된 스타일을 반복적으로 묻지 않고 변수에 캐싱

:offset, scrollTop과 같은 계산된 스타일 정보를 요청할 때마다 정확한 정보를 제공하기 위해 큐를 비우고 모든 변경사항을 적용하기 때문에 스타일 정보를 변수에 저장하여 사용을 권장

 

[출처]https://beomy.github.io/tech/browser/reflow-repaint/

 

4) 영향받는 엘리먼트 제한하기 ( position fixed, absolute를 활용)

 

5) <table> 레이아웃을 피한다.

:<table>은 점진적으로 렌더링 되지 않고 모두 로드되고 테이블 너비가 계산된 후 화면에 그려진다. 콘텐츠의 값에 따라 테이블 너비가 계산되기 때문에, 테이블 콘텐츠의 작은 변경만 있어도 테이블 너비가 다시 계산되고 테이블의 모든 노드들이 Reflow가 발생. 데이터 표시용 도로 사용 시 table-layout:fixed를 사용하자.

 

6) IE의 CSS표현식을 사용하지 않는다.

: Reflow가 발생할 때마다 자바스크립트 표현식이 다시 계산되기 때문이다.

 

[출처]https://beomy.github.io/tech/browser/reflow-repaint/

 

6) 되도록 실행 사이클 안에서 실행하도록 처리

타이머에서 실행되게 하면 추가적인 실행 사이클이 발생하게 되는데, 첫 번째 요소에 대한 작업이 한 사이클 내에서 실행되고, 타이머의 실행은 먼저 실행된 사이클이 끝난 다음에 진행된다. 이로 인해 결과적으로 리플로와 리페인트가 두 번 일어나게 되므로 리플로우와 리페인트가 일어날 수 있는 작업은 가능하면 실행 사이클 안에서 실행하도록 처리하는 편이 효과적이다.

 

7) 노드복제 

: 변경하려는 요소의 노드를 복제한 후 복제된 노드에 필요한 작업을 실행하는 방법. 복제된 노드는 DOM 트리에 추가된 상태가 아니므로 렌더링 성능에 영향을 줄 수 있는 작업을 실행하더라도 리플로나 리페인트가 발생하지 않는다.

작업이 모두 완료된 이후 복제된 노드를 원래 노드와 치환해 DOM 트리에 변경된 사항이 적용되게하면 치환 시점에만 리플로와 리페인트가 발생한다.

var element = document.getElementById("box1");
var clone = element.cloneNode(true);     // 원본 노드를 복제한다.

for(var i=0; i < 100; i++) {
    clone.style.width = i + "px";
}

// 변경된 복제 노드를 DOM 트리에 반영하기 위해 기존 노드와 치환한다.
parentNode.replaceChild(clone, element);

Chorme Tool을 통한 성능 확인

-Bad Code

 

 

- Optimized Code

 

 

출처 :https://ekimnida.tistory.com/45
----

참고사이트

- <Reflow or Repaint(or ReDraw) 과정 설명 및 최적화 방법>

- <[Browser] Critical Rendering Path 최적화>

- <[Browser] Reflow와 Repaint>

- <브라우저 렌더링에 대한 이해와 최적화>

- <FrontEnd-성능 최적화-기본>

- <Understanding Reflow and Repaint in the browser>

- <[자바스크립트] 브라우저 렌더링>

- https://ekimnida.tistory.com/45 [기록:티스토리]

출처 :https://k0102575.github.io/articles/2020-11/reflow-repaint

 

 

브라우저 랜더링 원리

홈페이지가 사용자에게 보이는 순서(브라우저 렌더링 과정)

  1. 주소창에 입력된 주소를 통해 서버를 찾아간다.
  2. 이후 DNS가 연결해줄 곳을 찾는다.(실제 서버)
  3. 서버에서 HTML 파일을 클라이언트로 보낸다.
  4. HTML 문서는 파싱되어 DOM을 생성한다.(객체 형식)
  5. 중간에 css를 로드하는 link혹은 style 태그를 만나면 DOM 생성을 중지한다.
  6. CSS를 파싱하고 CSSOM을 생성한다.
  7. 이렇게 만들어진 DOM와 CSSOM은 렌더링(브라우저에 시각적으로 출력하는 것)을 위해 렌더 트리로 결합된다.
  8. 만약 script 태그를 만나면, css와 동일하게 JS코드를 실행하기 위해 파싱을 중단한다.
  9. 이후 JS엔진을 실행하고 JS코드를 파싱한다.

자바스크립트가 DOM, CSSOM을 변경하는 경우 리렌더링을 하게 된다.
리플로우: 레이아웃 계산을 다시 하는 것
리페인트: 재결합된 렌더 트리를 기반으로 다시 페인트를 하는 것

여기서 script태그를 만날때마다 파싱이 중단되는 문제를 script 태그 뒤에 async 혹은 defer를 붙여줌으로써 해결할 수 있다.
async: HTML 파싱, JS 파일 로드가 동시에 진행
defer: DOM 생성이 완료된 직후, JS의 파싱과 실행이 진행된다.

출처 :https://velog.io/@wkahd01/%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-%EB%A9%B4%EC%A0%91-%EB%AC%B8%EC%A0%9C-%EC%9D%80%ED%96%89-HTML-%EC%A7%88%EB%AC%B8-%EB%8B%B5%EB%B3%80

 

호이스팅

 

모든 선언이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징.

아래는 호이스팅의 예시이다.

console.log(name1) // undefined 출력
var name1 = ‘자몽’
/////////
console.log(name2)
let name2 = ‘자몽’; // ReferenceError 에러출력

var는 선언, 초기화가 동시에 이루어지고,
let,const는 선언단계만 호이스팅 되기때문에 실행 결과가 다름을 확인할 수 있다.

(선언 => 초기화 => 할당) 과정을 거침

 

 

 

클로저

 

로저는 함수와 함수가 선언된 어휘적 환경의 조합이다.

외부 함수보다 중첩 함수가 더 오래 유지되는 경우,
중첩 함수는 이미 생명 주기가 다한 외부 함수의 변수를 참조할 수 있으며,
이러한 중첩 함수를 "클로저(closure)"라고 한다.

클로저는 은닉성이라는 강점을 지니고 있다.

function closureF(){
  let name = 'jamong';
  return function(){
    return name;
  };
}
let closure = closureF();
console.log(closure()); // 'jamong' 출력

코드를 보면 closureF 함수가 종료되었음에도 name에 저장된 값이 그대로 출력되는 것을 확인할 수 있다.

 

 

자바스크립트는? 

JavaScript는 싱글 스레드이면서 논 블록킹 언어이다.

스레드
어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다.

싱글 스레드
스레드가 하나밖에 존재하지 않아 한번에 하나의 작업만 할 수 있다.

싱글 스레드 논 블록킹
자바스크립트는 비동기 처리를 통해 싱글 스레드이지만 블록킹 되지 않게 한다.
하나의 요청이 완료될 때까지 기다리지 않고 동시에 다른 작업을 수행함으로써(비동기) 문제를 해결한다.

비동기 처리
특정 로직의 실행이 끝날때까지 기다려주지 않고 나머지 코드를 먼저 실행하는 것

=> 멀티 스레드가 아닌 이유는 동시성 문제(동시에 공유된 자원에 접근하는 경우)를 해결하기 까다롭기 때문.

자바스크립트에서 비동기적으로 코딩하기

Promise
비동기 작업이 맞이할 미래의 완료 또는 실패와 그 결과 값
=> 쉽게 말해 비동기 작업의 결과라고 생각하면 된다.

  • 콜백 함수
    콜백 지옥에 빠지게 될 수도 있다는 단점 존재
  • Promise
    .then: promise가 처리될 때까지 대기
  • async/await
    async: 해당 함수는 항상 promise를 반환
    await: promise가 처리될 때까지 대기

비동기 처리가 필요한 이유: https://velog.io/@dev-katrina/%EB%B9%84%EB%8F%99%EA%B8%B0

자바스크립트 동작 원리(이벤트 루프)


gif 출처: https://beomy.github.io/tech/javascript/javascript-runtime/

  • 일반적인 작업은 Call Stack에서 이루어짐
  • 시간이 소요되는 작업들(setTimeout, 이벤트, HTTP 요청 메서드 등)은 Web API에서 대기하다가 Callback Queue로 보내진다.
  • Call Stack이 비워져 있을때만 Callback Queue에 저장되어있던 작업들을 Call Stack으로 보낸다.

 

REST API

REST 기반으로 서비스 API를 구현한 것

REST(Representational State Transfer)
자원을 이름으로 구분하여 해당 자원의 상태를 주고받는 모든 것

  • HTTP URI를 통해 자원을 명시하고,
  • HTTP 메서드(POST, GET, PUT, DELETE)를 통해 해당 자원에 대한 CRUD를 적용하는 것
    => 즉, 자원 기반의 구조 설계의 중심에 자원이 있고, HTTP 메서드를 통해 이를 처리한다.

API(Application Programming Interface)

  • 응용프로그램에서 사용할 수 있도록 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스
    => 쉽게 말해 프로그램끼리 통신할 수 있도록 하는 중재자이다.
  • REST API의 특징
    REST API는 HTTP 표준을 기반으로 구현됨
    REST 기반으로 시스템을 분산시켜 확장성, 재사용성을 높여 유지보수와 운용을 쉽게 할 수 있게 만들어준다.


이벤트 전파

생성된 이벤트 객체는 이벤트를 발생시킨 DOM 요소인 이벤트 타깃을 중심으로 DOM트리를 통해 전파된다.

이벤트 버블링
이벤트가 하위 요소에서 상위 요소 방향으로 전파

이벤트 캡처링
이벤트가 상위 요소에서 상위 요소 방향으로 전파

+) 이벤트 버블링과 캡처링를 막기 위해서 e.stopPropagation()을 사용한다.
해당 웹 API를 통해 이벤트가 전파되는 것을 막을 수 있다.

타깃 단계
이벤트가 이벤트 타깃에 도달

이벤트 위임: 이벤트 버블링 활용하기

이벤트 위임을 사용하지 않고, 동일한 이벤트를 일일히 수동으로 달아주기에는 코드 낭비가 너무 심하다.

따라서 부모 요소에 이벤트를 부여해 버블링을 통해 하위 요소를 동작시킬때도 해당 이벤트가 발생하도록 만드는 것이 바람직하다.

아래와 같은 상황에서

 <div class="itemList">
      <li>
        <input type="checkbox" id="item1" />
        <label for="item1">1</label>
      </li>
      <li>
        <input type="checkbox" id="item2" />
        <label for="item2">2</label>
      </li>
    </div>
  • case1: 각각 이벤트들을 부여해주기
    inputs의 내부 input에 각각 이벤트를 달아주었다.
let inputs = document.querySelectorAll("input");
inputs.forEach((input) => {
  input.addEventListener("click", () => {
    alert("clicked");
  });
});
  • case2: 부모 요소에 이벤트 부여하기
    부모 요소인 itemList를 클릭했을 때, 이벤트 버블링을 통해 checkbox type을 클릭했을 경우, 이벤트가 똑같이 동작하도록 만들었다.
let itemList = document.querySelector(".itemList");
itemList.addEventListener("click", (e) => {
  console.log(e);
  if (e.target.type === "checkbox") {
    alert("click");
  }
});

이처럼 이벤트 버블링을 통한 이벤트 위임은 하위 요소에 각각의 이벤트를 붙이지 않고도 상위 요소에서 하위 요소의 이벤트들을 제어할 수 있다.

 

 

실행 문맥(실행 컨텍스트)
var x = 10;
const y = 20;

function edit(a){
  var x = 1;
  const y = 2;

  return x+y+a;
}
edit(12);

위와 같은 코드에서의 실행 컨텍스트를 확인하면 다음과 같다.

  1. 전역 실행 컨텍스트 생성/소스코드 실행
  • var로 선언한 전역 변수는 객체 환경 레코드에 저장됨.
  • const, let으로 선언한 전역 변수는 선언적 환경 레코드에 저장됨.
  1. edit 함수 실행 컨텍스트 생성/소스코드 실행
  • 전역 환경 레코드와 달리 함수 환경 레코드는 분리되지 않고, 한 장소에서 var,const,let 모두를 처리한다.

추가로 알아야 하는 것들:

  • 실행 컨텍스트들은 실행 컨텍스트 스택에 하나씩 쌓이고 사라진다.
  • 소스코드 평가 과정에서는 선언문이 실행되고, 스코프에 등록된다.
  • 소스코드 실행 과정에서는 변수에 값이 할당되고 함수가 호출된다.

 

SPA CSR SSR
  • SPA
    [싱글 페이지 렌더링]
    SPA는 최초 한번 페이지 전체를 로딩한 후부터 데이터만 변경해서 사용할 수 있는 웹 애플리케이션
    => 하나의 페이지에서 실행됨.
  • CSR
    [클라이언트 사이드 렌더링]
    최초 로드시 필요한 파일들을 전부 받고, 사용자의 인터렉션에 따라서 클라이언트단에서 받아와 랜더링을 해주는 방식
    => 기본 틀만 받고, 브라우저에서 동작으로 DOM을 그림

단점: 초반에 뼈대만 다운받기 때문에, SEO에 취약, 초기 화면의 렌더링 속도가 느리다
장점: 렌더링 속도가 빠름

  • SSR
    [서버 사이드 렌더링]
    요청시마다 새로고침이 일어나며 서버에 새로운 페이지에 대한 요청을 하는 방식
    => 이미 다 만들어진 DOM을 받음

단점: 매 랜더링마다 서버를 거침으로 속도가 느림
장점: 초기 화면의 렌더링 속도가 빠르며, SEO에 최적화됨.

 

null, undefined, undeclared, NaN 

  • null
    => 빈 값
    null이라는 빈 값을 할당했을 때, 생기는 타입.
  • undefined
    => 정의되지 않음
    var 선언문의 경우, 호이스팅 되었을 때, 변수 선언과 초기화가 동시에 일어나기 때문에, 변수가 undefined됨.(타입 결정 안됨)
console.log(data) // undefined
const data = 'data'
  • undeclared
    => 선언되지 않음
    let, const 선언문의 경우, 호이스팅 되었을 때, 변수 선언과 초기화가 따로 이루어지기에, 변수가 undeclared되어 에러가 생긴다.
console.log(data) // error
let data = 'data'
  • NaN
    => 표현 불가능한 수치형 결과
typeof 1/0 // NaN

 

 

this 
  • 일반 함수 호출
    전역 객체 바인딩된
  • 메서드 호출
    메서드를 호출한 객체 가리킴
  • 생성자 함수 호출
    생성자 함수가 생성할 인스턴스를 가리킴
  • apply/call/bind 메서드에 의한 호출

 

Property와 Attribute의 차이

우선, 둘 다 속성을 의미한다.

  • Property
    프로퍼티는 정의되는 위치가 DOM이다. 브라우저에서 DOM 트리를 생성할 때, div 태그의 attribute와 value를 읽어서 노드를 생성한다.
  • Attribute
    어트리뷰트는 정의되는 위치가 HTML로, HTML 태그에 추가적인 정보를 제공한다.

https://yeoulcoding.tistory.com/157 참고

 

HTML 렌더링 중에 JavaScript가 실행되면 렌더링이 멈추는 이유?

 

렌더링 엔진은 HTML 한 줄씩 순차적으로 파싱하며 DOM을 생성해 나가다가 JavaScript를 만나면 DOM 생성을 임시 중단한다.

DOM 생성을 임시 중단하고, 자바스크립트 코드를 파싱하기 위해 자바스크립트 엔진에 제어권을 넘기게 되는데, 파싱이 끝나면 다시 렌더링 엔진에 제어권을 넘겨 중단된 부분부터 HTML 파싱을 재개하며 DOM 트리를 생성한다.

 

 


 

 

[신입 웹퍼블리셔 예상 면접 질문 리스트]

- 간단한 자기소개 (이건 회사 by 회사 )

- 웹 이전에 했던 일과 '웹 퍼블리셔'를 선택한 이유 (많이 물어봄)

- 웹접근성 / 웹표준의 뜻과 차이점

- 자바스크립트, 제이쿼리 얼마나 사용가능한가?

- 본인이 생각하기에 HTML,CSS의 능력은 어느정도?

- 포트폴리오 제작 기간

- 포토샵, 일러스트 사용가능 여부

- 성격의 장단점

- 트러블이 생겼을 때 해결방안

- 해당 디자인이나 사이트를 보여주며 얼마만에 작업 가능한지

- 반응형 웹 퍼블리싱 가능 여부

- 벤치마킹할 때 자주 보는 사이트 (디자이너/퍼블리셔 면접)

- 요소를 세로,가로 가운데 배치하는 방법 

- 워드프레스 사용 여부

- 플러그인이 무엇인지, 사용 여부

- 부트스트랩 사용 여부

 

 

[경력 웹퍼블리셔 예상 면접 질문 리스트]

- 기술 자기소개 (많이 물어봄) : 직전회사에서 했던 작업물 위주나 사용했던 기술로 대답

- 부트스트랩 사용 여부

- 웹 이전에 했던 일과 '웹 퍼블리셔'를 선택한 이유 (많이 물어봄)

- 자바스크립트, 제이쿼리 얼마나 사용가능한가?

- 본인이 생각하기에 HTML,CSS의 능력은 어느정도?

- 자바스크립트, 제이쿼리 얼마나 사용가능한가?

- 트러블이 생겼을 때 해결방안

- 해당 디자인이나 사이트를 보여주며 얼마만에 작업 가능한지

- 웹접근성 마크 획득 경험

- 협업 여부, git이나 제플린과 같은 협업 툴 사용여부 (제플린을 우대하는 곳이 많음)

- 전 회사 그만 둔 이유와 본 회사에서 같은일이 발생하면 그만 둘 것인지?

- dom이란 ?

- react 사용 -> react를 사용하는 이유

- javascript es6 가능 여부

- css 사이즈인 rem, em 사용 여부

- 취미

- 사수가 없어도 괜찮은지

- 회사를 어떻게 알게되었고 지원한 동기

- 지금 하는 일(퍼블리싱)에  만족하는가?

- (퇴사후 구직기간이 길었을 때) 공백기간 동안 어떻게 지냈는지

 

[면접시 질문 리스트]

아래는 제가 면접했을때 물어본 질문 리스트입니다 :)
면접때 참고하세요!

- 같이 일하게 될 팀원 나이대와 몇명인지
- 연봉
- 야근 유무와 빈도
- 직원들 근속 기간
- 사수가 있는지
- 직원 수가 몇명인지
- 하는 업무에 대해 자세한 설명
- 연차같은 기본 복리
- 그 외의 복지

출처: https://eunyoe.tistory.com/45 [eunyo의 it이야기:티스토리]

 

 

 

반응형

'etc' 카테고리의 다른 글

Iframe 높이 조절  (0) 2023.11.23
로그인 인증의 방식  (1) 2023.11.23
on-demand Atomic CSS (unocss)  (0) 2023.11.16
프론트엔드 개발자 면접 질문 답변  (0) 2023.11.15
웹뷰 구분 못하게 막기  (0) 2023.11.14

+ Recent posts