๐ฑ๐ค ์๋ฌธ : https://github.com/thedaviddias/Front-End-Checklist
ํ๋ก ํธ์๋ ์ฒดํฌ๋ฆฌ์คํธ
ํ๋ก ํธ์๋ ์ฒดํฌ๋ฆฌ์คํธ๋ ์น์ฌ์ดํธ๋ HTML ํ์ด์ง๋ฅผ ํ๋ก๋์ ์ ์ถ์ํ๊ธฐ ์ ์ ๊ฐ์ ธ์ผ ํ ๋ชจ๋ ์์ ๋ฐ ํ ์คํธ ํญ๋ชฉ์ ์์ธํ๊ฒ ๋์ดํ ๋ชฉ๋ก์ ๋๋ค.
๋ค๋ฅธ ์ฒดํฌ๋ฆฌ์คํธ:
๐ฎ ํ๋ก ํธ์๋ ์ฑ๋ฅ ์ฒดํฌ๋ฆฌ์คํธ • ๐ ํ๋ก ํธ์๋ ๋์์ธ ์ฒดํฌ๋ฆฌ์คํธ
์ฌ์ฉ ๋ฐฉ๋ฒ
ํญ๋ชฉ์ ํ์์ฑ์ ๊ธฐ์ค์ผ๋ก 3๋จ๊ณ๋ก ์ ์ํ์ต๋๋ค:
๐ข ํด๋น ํญ๋ชฉ์ ๊ถ์ฅ๋์ง๋ง ํน์ ์ํฉ์์ ์๋ตํ ์ ์๋ค๋ ๊ฒ์ ๋ํ๋
๋๋ค.
๐ ํด๋น ํญ๋ชฉ์ ๊ฐ๋ ฅํ ๊ถ์ฅ๋์ง๋ง ๋งค์ฐ ํน์ ํ ๊ฒฝ์ฐ์๋ง ์๋ตํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ์์๋ฅผ ์๋ตํ๋ฉด ์ฑ๋ฅ์ด๋ SEO์ ๋ถ์ ์ ์ธ ์ํฅ์ ์ค ์ ์์ต๋๋ค.
๐ด ํด๋น ํญ๋ชฉ์ ์ด๋ ํ ๊ฒฝ์ฐ์๋ ์๋ตํ ์ ์์์ ๋ํ๋
๋๋ค. ์ด๋ฌํ ์์๋ฅผ ์ ๊ฑฐํ๋ฉด ํ์ด์ง ๊ธฐ๋ฅ์ด ๋์ํ์ง ์์ ์ ์๊ฑฐ๋ ์ ๊ทผ์ฑ ๋ฐ SEO ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์์๋ฅผ ํ
์คํธํ ๋ ์ฐ์ ์์๋ก ๋์ด์ผ ํฉ๋๋ค.
์ด๋ค ์ ํ์ ๋ ํผ๋ฐ์ค์ธ์ง ์ดํดํ๋ ๋ฐ ๋์์ด ๋๋ ์ด๋ชจํฐ์ฝ:
- ๐: ๋ฌธ์ ๋๋ ๊ธฐ์ฌ
- ๐ : ์จ๋ผ์ธ ๋๊ตฌ / ํ ์คํธ ๋๊ตฌ
- ๐น: ๋ฏธ๋์ด ๋๋ ๋น๋์ค ์ฝํ ์ธ
Head
์ฐธ๊ณ : HTML ๋ฌธ์์์์ ์ฐพ์ ์ ์๋ ๋ชจ๋ ๊ฒ์ ๋ํ ๋ชฉ๋ก์ ์ฌ๊ธฐ์์ ์ฐพ์ ์ ์์ต๋๋ค.
๋ฉํ ํ๊ทธ
- Doctype: ๐ด Doctype์ HTML5์ด๋ฉฐ ๋ชจ๋ HTML ํ์ด์ง์ ๋งจ ์์ ์์ต๋๋ค.
<!doctype html> <!-- HTML5 -->
๋ค์ 2๊ฐ์ ๋ฉํ ํ๊ทธ(Charset ๋ฐ Viewport)๋ head ํ๊ทธ ๋ด์์ ๊ฐ์ฅ ๋จผ์ ์์ผ ํฉ๋๋ค.
- Charset: ๐ด ๋ฌธ์ ์ธ์ฝ๋ฉ(UTF-8)์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ธ๋์์ต๋๋ค.
<!-- ๋ฌธ์์ ๋ฌธ์ ์ธ์ฝ๋ฉ์ ์ค์ ํ์ธ์. -->
<meta charset="utf-8">
- Viewport: ๐ด ๋ทฐํฌํธ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ธ๋์์ต๋๋ค.
<!-- ๋ฐ์ํ ์น ๋์์ธ์ ์ํ ๋ทฐํฌํธ ์ค์ -->
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
- Title: ๐ด ๋ชจ๋ ํ์ด์ง์๋ ํ์ดํ์ด ์ฌ์ฉ๋ฉ๋๋ค (SEO: Google์ ์ ๋ชฉ์ ์ฌ์ฉ๋ ๋ฌธ์์ ํฝ์ ๋๋น๋ฅผ ๊ณ์ฐํ๊ณ 472์์ 482 ํฝ์ ์ฌ์ด์์ ์๋ฆ ๋๋ค. ํ๊ท ๋ฌธ์ ์ ํ์ ์ฝ 55์์ ๋๋ค).
<!-- Document Title -->
<title>Page Title less than 55 characters</title>
- ๐ Title - HTML - MDN
- ๐ SERP Snippet Generator
- Description: ๐ด ๋ฉํ ์ค๋ช ์ด ์ ๊ณต๋์์ผ๋ฉฐ, ์ด๋ ๊ณ ์ ํ๋ฉฐ 150์๋ฅผ ์ด๊ณผํ์ง ์์ต๋๋ค.
<!-- Meta Description -->
<meta name="description" content="Description of the page less than 150 characters">
- Favicons: ๐ ๊ฐ ํ๋น์ฝ์ด ๋ง๋ค์ด์ก์ผ๋ฉฐ ์ฌ๋ฐ๋ฅด๊ฒ ํ์๋ฉ๋๋ค. ๋ง์ฝ
favicon.ico
๋ง ๊ฐ์ง๊ณ ์๋ค๋ฉด, ์ด๋ฅผ ์ฌ์ดํธ์ ๋ฃจํธ์ ๋ก๋๋ค. ๋ณดํต์ ์๋ฌด๋ฐ ๋งํฌ์ ์ ์ฌ์ฉํ์ง ์์๋ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์๋์ ์์์ฒ๋ผ ๋งํฌ๋ฅผ ๊ฑธ์ด๋๋ ๊ฒ์ด ์ข์ต๋๋ค..ico
ํ์ ๋์ PNG ํ์์ด ๊ถ์ฅ๋ฉ๋๋ค. (ํฌ๊ธฐ: 32x32px).
<!-- Standard favicon -->
<link rel="icon" type="image/x-icon" href="https://example.com/favicon.ico">
<!-- Recommended favicon format -->
<link rel="icon" type="image/png" href="https://example.com/favicon.png">
- Apple Web App Meta: ๐ข Apple ๋ฉํ ํ๊ทธ๊ฐ ์กด์ฌํฉ๋๋ค.
<!-- Apple Touch Icon (at least 200x200px) -->
<link rel="apple-touch-icon" href="/custom-icon.png">
<!-- To run the web application in full-screen -->
<meta name="apple-mobile-web-app-capable" content="yes">
<!-- Status Bar Style (see Supported Meta Tags below for available values) -->
<!-- Has no effect unless you have the previous meta tag -->
<meta name="apple-mobile-web-app-status-bar-style" content="black">
- Canonical: ๐ ์ค๋ณต ์ฝํ
์ธ ๋ฅผ ํผํ๊ธฐ ์ํด
rel="canonical"
์ ์ฌ์ฉํ์ธ์.
<!-- ์ค๋ณต ์ฝํ
์ธ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํฉ๋๋ค. -->
<link rel="canonical" href="http://example.com/2017/09/a-new-article-to-read.html">
HTML ํ๊ทธ
- Language attribute: ๐ด ์น์ฌ์ดํธ์
lang
์์ฑ์ด ์ง์ ๋์ด ์๊ณ ํ์ฌ ํ์ด์ง์ ์ธ์ด์ ๊ด๋ จ์ด ์์ต๋๋ค.
<html lang="en">
- Direction attribute: ๐ ํ ์คํธ ๋ฐฉํฅ์ด HTML ํ๊ทธ์ ์ง์ ๋์ด ์์ต๋๋ค (๋ค๋ฅธ HTML ํ๊ทธ์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค).
<html dir="rtl">
- ๐ dir - HTML - MDN
- CSS Critical: ๐ CSS ํฌ๋ฆฌํฐ์ปฌ(๋๋ "above the fold: ์๋ฌด๋ฐ ํ๋์ ํ์ง ์์ ๊ธฐ๋ณธ ํ๋ฉด")์ ํ์ด์ง์ ๊ฐ์์ ์ธ ๋ถ๋ถ์ ๋ ๋๋งํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ชจ๋ CSS๋ฅผ ์์งํฉ๋๋ค. ์ด๋ ๊ธฐ๋ณธ CSS ํธ์ถ ์ ์
<style></style>
์ฌ์ด์ ํ ์ค๋ก ํฌํจ๋ฉ๋๋ค(์ต์ํ๋จ).
- ๐ Critical by Addy Osmani on GitHub automates this.
- CSS order: ๐ด ๋ชจ๋ CSS ํ์ผ์
<head>
์์์ ์ด๋ค ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ๋ณด๋ค ๋จผ์ ๋ก๋๋ฉ๋๋ค. (ํ์ด์ง์ ๋งจ ์์์ ๊ฐ๋์ฉ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ด ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋๋๋ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ )
โฌ ํ์ด์ง ์๋จ์ผ๋ก ์ด๋
HTML
๋ชจ๋ฒ ์ฌ๋ก
- HTML5 Semantic Elements: ๐ด HTML5 ์๋ฏธ ์๋(Semantic) ์์๋ค์ด ์ ์ ํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค (header, section, footer, main...).
- ๐ HTML Reference
- Error pages: ๐ด 404 ํ์ด์ง์ 5xx ์๋ฌ ํ์ด์ง๊ฐ ์กด์ฌํฉ๋๋ค. 5xx ์๋ฌ ํ์ด์ง๋ ํด๋น CSS๊ฐ ํตํฉ๋์ด ์์ด์ผ ํฉ๋๋ค (ํ์ฌ ์๋ฒ์์ ์ธ๋ถ ํธ์ถ ์์ด).
- Noopener: ๐ ๋ง์ฝ
target="_blank"
๋ก ์ธ๋ถ ๋งํฌ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ๋งํฌ์๋ ํญ๋ด๋น์ ๋ฐฉ์งํ๊ธฐ ์ํดrel="noopener"
์์ฑ์ด ์์ด์ผ ํฉ๋๋ค. ์ค๋๋ ๋ฒ์ ์ Firefox๋ฅผ ์ง์ํด์ผ ํ๋ค๋ฉด,rel="noopener noreferrer"
๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- Clean up comments: ๐ข ํ์ด์ง๋ฅผ ํ๋ก๋์ ์ผ๋ก ๋ณด๋ด๊ธฐ ์ ์ ๋ถํ์ํ ์ฝ๋๋ฅผ ์ ๊ฑฐํด์ผ ํฉ๋๋ค.
HTML testing
- HTML Lint: ๐ด HTML ์ฝ๋์์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ฅผ ๋ถ์ํ๋ ๋ฐ ๋์์ด ๋๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๐ Dirty markup
- ๐ webhint
- Link checker: ๐ด ํ์ด์ง์ ์ ํจํ์ง ์์ ๋งํฌ๊ฐ ์๊ณ , 404 ์ค๋ฅ๊ฐ ์์ต๋๋ค.
- ๐ W3C Link Checker
- Adblockers test: ๐ ๊ด๊ณ ์ฐจ๋จ๊ธฐ๋ฅผ ์ฌ์ฉํด๋ ์ฝํ ์ธ ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ํ์ํฉ๋๋ค. ๊ด๊ณ ์ฐจ๋จ๊ธฐ๋ฅผ ํด์ ํ๋๋ก ์ฌ๋๋ค์๊ฒ ๋ฉ์์ง๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
โฌ ํ์ด์ง ์๋จ์ผ๋ก ์ด๋
์นํฐํธ
์ฐธ๊ณ : ์น ํฐํธ ์ฌ์ฉ์ผ๋ก ์คํ์ผ์ด ์ ์ฉ๋์ง ์์ ํ ์คํธ์ ์๊ฐ์ ์ธ ๋ํ๋จ ํ์(Flash Of Unstyled Text) ๋๋ ํ ์คํธ๊ฐ ๋ณด์ด์ง ์๋ ์๊ฐ์ ์ธ ํ์(Flash Of Invisible Text)์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋์ฒด ํฐํธ๋ฅผ ์ค์ ํ๊ฑฐ๋ ์น ํฐํธ ๋ก๋๋ฅผ ํ์ฉํ์ฌ ๋์์ ์ ์ดํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- Webfont format: ๐ด ๋ชจ๋ ์ต์ ๋ธ๋ผ์ฐ์ ์์ WOFF, WOFF2 ๋ฐ TTF ํ์์ ์ง์ํฉ๋๋ค.
- Webfont size: ๐ด ์นํฐํธ ํฌ๊ธฐ๊ฐ ๋ชจ๋ ๋ณํ์ ํฌํจํ์ฌ 2 MB๋ฅผ ์ด๊ณผํ์ง ์์ต๋๋ค.
- Webfont loader: ๐ข ์นํฐํธ ๋ก๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๋ฉ ๋์์ ์ ์ดํฉ๋๋ค.
โฌ ํ์ด์ง ์๋จ์ผ๋ก ์ด๋
CSS
์ฐธ๊ณ : ๋ง์ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๊ฐ ๋ฐ๋ฅด๋ CSS ๊ฐ์ด๋๋ผ์ธ๊ณผ Sass ๊ฐ์ด๋๋ผ์ธ์ ์ดํด๋ณด์ธ์. CSS ์์ฑ์ ๋ํ ์๋ฌธ์ด ์๋ค๋ฉด CSS ๋ ํผ๋ฐ์ค๋ฅผ ๋ฐฉ๋ฌธํ์ธ์. ์ผ๊ด์ฑ์ ์ํ ๊ฐ๋จํ ์ฝ๋ ๊ฐ์ด๋๋ ์์ต๋๋ค.
- Responsive Web Design: ๐ด ๋ฐ์ํ ์น ๋์์ธ์ ์ฌ์ฉํฉ๋๋ค.
- CSS Print: ๐ ์ธ์ ์คํ์ผ ์ํธ๊ฐ ๊ฐ ํ์ด์ง์์ ์ ๊ณต๋๋ฉฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋์ด ์์ต๋๋ค.
- Preprocessors: ๐ข CSS ์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. (์: Sass, Less, Stylus)
- Unique ID: ๐ด ID๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ๊ฐ๊ฐ ํ์ด์ง์ ID๊ฐ ๊ณ ์ ํฉ๋๋ค.
- Reset CSS: ๐ด CSS ๋ฆฌ์ (reset), ์ ๊ทํ(normalize), ๋๋ ์ฌ๋ถํ (reboot)์ด ์ฌ์ฉ๋๊ณ ์ต์ ์ํ์ ๋๋ค. (๋ถํธ์คํธ๋ฉ์ด๋ ํ์ด๋ฐ์ด์ ๊ฐ์ CSS ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์ ๊ทํ๊ฐ ์ด๋ฏธ ํฌํจ๋์ด ์์ต๋๋ค.)
- ๐ Reset.css
- ๐ Normalize.css
- ๐ Reboot
- JS prefix: ๐ข ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์์ ์ฌ์ฉ๋๋ ๋ชจ๋ ํด๋์ค(๋๋ id)๋ js- ๋ก ์์ํ๋ฉฐ CSS ํ์ผ์ ์คํ์ผ์ด ์ง์ ๋์ง ์์ต๋๋ค.
<div id="js-slider" class="my-slider">
<!-- Or -->
<div id="id-used-by-cms" class="js-slider my-slider">
- embedded or inline CSS: ๐ด
<style>
ํ๊ทธ์ CSS๋ฅผ ํฌํจํ๊ฑฐ๋ ์ธ๋ผ์ธ CSS๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ง์ํฉ๋๋ค. ์ ํจํ ์ด์ (์: ์ฌ๋ผ์ด๋์ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง, ์ค์ํ CSS)๋ง์ ์ํด ์ฌ์ฉํฉ๋๋ค. - Vendor prefixes: ๐ด CSS ๋ฒค๋ ํ๋ฆฌํฝ์ค๋ฅผ ์ฌ์ฉํ๊ณ ๋ธ๋ผ์ฐ์ ์ง์ ํธํ์ฑ์ ๋ฐ๋ผ ์ ์ ํ๊ฒ ์์ฑํฉ๋๋ค.
์ฑ๋ฅ
- Concatenation: ๐ด CSS ํ์ผ์ด ํ๋์ ํ์ผ๋ก ๋ณํฉ๋ฉ๋๋ค. (HTTP/2์ ๊ฒฝ์ฐ์๋ ํด๋นํ์ง ์์)
- Minification: ๐ด ๋ชจ๋ CSS ํ์ผ์ด ์ต์ํ๋์์ต๋๋ค.
- Non-blocking: ๐ CSS ํ์ผ์ DOM์ด ๋ก๋๋๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฌ์ง ์๋๋ก Non-Blocking(๋ค๋ฅธ ์ฃผ์ฒด์ ์์ ์ ๊ด๋ จ์์ด ์์ ์ ์์ ์ ํ๋ ๊ฒ)๋์ด์ผ ํฉ๋๋ค.
- Unused CSS: ๐ข ์ฌ์ฉ๋์ง ์๋ CSS๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
- ๐ UnCSS Online
- ๐ PurifyCSS
- ๐ PurgeCSS
- ๐ Chrome DevTools Coverage
CSS ํ ์คํธ
- Stylelint: ๐ด ๋ชจ๋ CSS ๋๋ SCSS ํ์ผ์ ์ค๋ฅ๊ฐ ์์ด์ผ ํฉ๋๋ค.
- ๐ stylelint, a CSS linter
- ๐ Sass guidelines
- Responsive web design: ๐ด ๋ชจ๋ ํ์ด์ง๋ ๋ค์์ ์ค๋จ์ ์์ ํ ์คํธ๋์์ต๋๋ค: 320px, 768px, 1024px (๋ถ์์ ๋ฐ๋ผ ๋ ๋ง๊ฑฐ๋ ๋ค๋ฅผ ์ ์์).
- Responsive Checker -*
- ๐ Am I Responsive?
- ๐ Mobile Friendly Test
- ๐ Responsive Website Design Tester
- ๐ Responsinator
- ๐ XRespond
- CSS Validator: ๐ CSS๊ฐ ํ ์คํธ๋๊ณ ๊ด๋ จ๋ ์ค๋ฅ๊ฐ ์์ ๋์์ต๋๋ค.
- ๐ CSS Validator
- Desktop Browsers: ๐ด ๋ชจ๋ ๋ฐ์คํฌํฑ ๋ธ๋ผ์ฐ์ (Safari, Firefox, Chrome, EDGE ๋ฑ)์์ ๋ชจ๋ ํ์ด์ง๊ฐ ํ ์คํธ๋์์ต๋๋ค.
- Mobile Browsers: ๐ด ๋ชจ๋ฐ์ผ ๋ธ๋ผ์ฐ์ (Native browser, Chrome, Safari ๋ฑ)์์ ๋ชจ๋ ํ์ด์ง๊ฐ ํ ์คํธ๋์์ต๋๋ค.
- OS: ๐ด ๋ชจ๋ ํ์ด์ง๊ฐ ๋ชจ๋ ์ด์ ์ฒด์ (Windows, Android, iOS, Mac ๋ฑ)์์ ํ ์คํธ๋์์ต๋๋ค.
- Design fidelity: ๐ข ํ๋ก์ ํธ ๋ฐ ๋์์ธ์ ํ์ง์ ๋ฐ๋ผ ๋์์ธ๊ณผ์ ์ผ๊ด์ฑ์ ์ ์งํด์ผ ํฉ๋๋ค. ์ฝ๋ ๊ตฌํ๊ณผ ํฌ๋ฆฌ์์ดํฐ๋ธ๋ฅผ ๋น๊ตํ๊ณ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- Reading direction: ๐ด ๋ชจ๋ ํ์ด์ง๋ LTR ๋ฐ RTL ์ธ์ด์ ๋ํด ์ง์ํด์ผํ๋ ๊ฒฝ์ฐ๋ฅผ ์ํด ํ ์คํธ๋์ด์ผ ํฉ๋๋ค.
โฌ ํ์ด์ง ์๋จ์ผ๋ก ์ด๋
์ด๋ฏธ์ง
์ฐธ๊ณ : ์ด๋ฏธ์ง ์ต์ ํ์ ๋ํ ์ดํด๋ฅผ ์ํด Addy Osmani์ ๋ฌด๋ฃ eBook์ธ Essential Image Optimization ๋ฅผ ํ์ธํ์ธ์.
๋ชจ๋ฒ ์ฌ๋ก
- Optimization: ๐ด ๋ชจ๋ ์ด๋ฏธ์ง๊ฐ ๋ธ๋ผ์ฐ์ ์์ ๋ ๋๋ง๋ ์ ์๋๋ก ์ต์ ํ๋์์ต๋๋ค. ํํ์ด์ง์ ๊ฐ์ ์ค์ํ ํ์ด์ง์๋ WebP ํ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๐ Imagemin
- ๐ Use ImageOptim to optimise your images for free.
- ๐ Use KeyCDN Image Processing for image optimization in real time.
- ๐ Use Kraken.io awesome alternative for both png and jpg optimization. Up to 1mb per files on free plan.
- ๐ TinyPNG optimises png, apng (animated png) and jpg images with very small loss in quality. Free and paid version available.
- ๐ ZorroSVG jpg-like compression for transparent images using svg masking.
- ๐ SVGO a Nodejs-based tool for optimizing SVG vector graphics files.
- ๐ SVGOMG a web-based GUI version of SVGO for optimising your svgs online.
- Picture/Srcset: ๐ ์ฌ์ฉ์์ ํ์ฌ ๋ทฐํฌํธ์ ๊ฐ์ฅ ์ ํฉํ ์ด๋ฏธ์ง๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด picture/srcset์ ์ฌ์ฉํฉ๋๋ค.
- Retina: ๐ข ๋ ํฐ๋ ๋์คํ๋ ์ด๋ฅผ ์ง์ํ๊ธฐ ์ํด ๋ ์ด์์ ์ด๋ฏธ์ง๋ฅผ 2๋ฐฐ ๋๋ 3๋ฐฐ๋ก ์ ๊ณตํฉ๋๋ค.
- Sprite: ๐ ์์ ์ด๋ฏธ์ง๋ ์คํ๋ผ์ดํธ ํ์ผ์ ์์ต๋๋ค. (์์ด์ฝ์ ๊ฒฝ์ฐ SVG ์คํ๋ผ์ดํธ ์ด๋ฏธ์ง์ ์์ ์ ์์ต๋๋ค.)
- Width and Height: ๐ด ์ด๋ฏธ์ง์ ์ต์ข
๋ ๋๋ง ํฌ๊ธฐ๋ฅผ ์๊ณ ์๋ค๋ฉด
<img>
์width
์height
์์ฑ์ ์ค์ ํ์ธ์. (CSS ํฌ๊ธฐ ์ง์ ์ ๋ํด์๋ ์๋ตํ ์ ์์ต๋๋ค.) - Alternative text: ๐ด ๋ชจ๋
<img>
์๋ ์ด๋ฏธ์ง๋ฅผ ์๊ฐ์ ์ผ๋ก ์ค๋ช ํ๋ ๋์ฒด ํ ์คํธ๊ฐ ์์ด์ผ ํฉ๋๋ค.
- Lazy loading: ๐ ์ด๋ฏธ์ง๋ ๋ ์ด์ง ๋ก๋ฉ๋์ด ์์ต๋๋ค (noscript ๋์ฒด๊ฐ ํญ์ ์ ๊ณต๋ฉ๋๋ค).
โฌ ํ์ด์ง ์๋จ์ผ๋ก ์ด๋
์๋ฐ์คํฌ๋ฆฝํธ
๋ชจ๋ฒ ์ฌ๋ก
- JavaScript Inline: ๐ด HTML ์ฝ๋์ ํผํฉ๋ ์ธ๋ผ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ ์์ต๋๋ค.
- Concatenation: ๐ด ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ด ์ฐ๊ฒฐ๋์ด ์์ต๋๋ค.
- Minification: ๐ด ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ด ์ต์ํ๋์์ต๋๋ค (.min ์ ๋ฏธ์ฌ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค).
- JavaScript security: ๐ด
-
noscript
tag: ๐ ๋ธ๋ผ์ฐ์ ์์ ์คํฌ๋ฆฝํ ์ด ์ง์๋์ง ์๊ฑฐ๋ ํ์ฌ ์คํฌ๋ฆฝํ ์ด ๊บผ์ ธ ์๋ ๊ฒฝ์ฐ HTML ๋ณธ๋ฌธ์<noscript>
ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ธ์. ์ด๋ React.js์ ๊ฐ์ ํด๋ผ์ด์ธํธ ์ธก ๋ ๋๋ง์ด ๋ง์ด ํ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฉํ ๊ฒ์ ๋๋ค. ์์๋ฅผ ์ฐธ์กฐํ์ธ์.
<noscript>
์ด ์ฑ์ ์คํํ๋ ค๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํ์ฑํํด์ผ ํฉ๋๋ค.
</noscript>
- Non-blocking: ๐ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์
async
์์ฑ์ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋๋๊ฑฐ๋defer
์์ฑ์ ์ฌ์ฉํ์ฌ ์ง์ฐ๋์ด ๋ก๋๋ฉ๋๋ค.
- Optimized and updated JS libraries: ๐ ํ๋ก์ ํธ์์ ์ฌ์ฉ๋๋ ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํ๋ฉฐ(๊ฐ๋จํ ๊ธฐ๋ฅ์๋ Vanilla ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค), ์ต์ ๋ฒ์ ์ผ๋ก ์ ๋ฐ์ดํธ๋์ด ์์ผ๋ฉฐ ๋ถํ์ํ ๋ฉ์๋๋ก ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๊ณผ๋ํ๊ฒ ๋ฌด๊ฑฐ์์ง์ง ์๋๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ํ ์คํธ
- ESLint: ๐ด ESLint์ ์ํด ์ค๋ฅ๊ฐ ํ๋๊ทธ๋์ง ์์ต๋๋ค (๊ตฌ์ฑ ๋๋ ํ์ค ๊ท์น์ ๋ฐ๋ผ).
โฌ ํ์ด์ง ์๋จ์ผ๋ก ์ด๋
๋ณด์
์น ์ฌ์ดํธ ์ค์บ ๋ฐ ์ฒดํฌ
๋ชจ๋ฒ ์ฌ๋ก
- HTTPS: ๐ด ๋ชจ๋ ํ์ด์ง์ ์ธ๋ถ ์ฝํ ์ธ (ํ๋ฌ๊ทธ์ธ, ์ด๋ฏธ์ง ๋ฑ)์ HTTPS๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- HTTP Strict Transport Security (HSTS): ๐ HTTP ํค๋๊ฐ 'Strict-Transport-Security'๋ก ์ค์ ๋์ด ์์ต๋๋ค.
- Cross Site Request Forgery (CSRF): ๐ด ์๋ฒ ์ธก์ผ๋ก์ ์์ฒญ์ด ์ ๋นํ๋ฉฐ ์ฐ๋ฆฌ ์น์ฌ์ดํธ/์ฑ์์ ์์๋์์์ ํ์ธํ์ฌ CSRF ๊ณต๊ฒฉ์ ๋ฐฉ์งํฉ๋๋ค.
- Cross Site Scripting (XSS): ๐ด ํ์ด์ง๋ ์น์ฌ์ดํธ์ XSS ๊ฐ๋ฅํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
- Content Type Options: ๐ Google Chrome์ด ์๋ฒ์์ ์ ์ธ๋ content-type๊ณผ ๋ค๋ฅธ ๊ฒ์ ์๋ํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
- X-Frame-Options (XFO): ๐ ๋ฐฉ๋ฌธ์๋ฅผ ํด๋ฆญ์ญํน ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ๋ณดํธํฉ๋๋ค.
- Content Security Policy: ๐ ์น์ฌ์ดํธ์์ ์ฝํ ์ธ ๊ฐ ์ด๋ป๊ฒ ๋ก๋๋๋์ง ๋ฐ ์ด๋์์ ๋ก๋๋์ด ํ์ฉ๋๋์ง๋ฅผ ์ ์ํฉ๋๋ค. ๋ํ ํด๋ฆญ์ญํน ๊ณต๊ฒฉ์ ๋๋นํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค.
โฌ ํ์ด์ง ์๋จ์ผ๋ก ์ด๋
์ฑ๋ฅ
๋ชจ๋ฒ ์ฌ๋ก
- Goals to achieve: ๐ ํ์ด์ง๋ ๋ค์ ๋ชฉํ๋ฅผ ๋ฌ์ฑํด์ผ ํฉ๋๋ค:
- ์ฒซ ๋ฒ์งธ ์๋ฏธ ์๋ ํ์ธํธ๋ 1์ด ์ด๋ด์ ์๋ฃ๋์ด์ผ ํฉ๋๋ค.
- "ํ๊ท " ๊ตฌ์ฑ(๋๋ฆฐ 3G ๋คํธ์ํฌ์์ 400ms RTT ๋ฐ 400kbps ์ ์ก ์๋๋ฅผ ๊ฐ๋ $200 Android ์ฅ์น)์ Time To Interactive๋ 5์ด ์ด๋ด์ด์ด์ผ ํ๋ฉฐ, ๋ฐ๋ณต ๋ฐฉ๋ฌธ์์๋ 2์ด ์ด๋ด์ฌ์ผ ํฉ๋๋ค.
- ํฌ๋ฆฌํฐ์ปฌ ํ์ผ ํฌ๊ธฐ๋ ์์ถ ํ 170KB ์ด๋ด์ฌ์ผ ํฉ๋๋ค.
- Minified HTML: ๐ HTML์ ์์ถ๋์ด ์์ต๋๋ค.
- Lazy loading: ๐ ์ด๋ฏธ์ง, ์คํฌ๋ฆฝํธ ๋ฐ CSS๋ ํ์ฌ ํ์ด์ง์ ์๋ต ์๊ฐ์ ๊ฐ์ ํ๊ธฐ ์ํด ๋ ์ด์ง ๋ก๋ฉ๋์ด์ผ ํฉ๋๋ค. (ํด๋น ์น์ ์์ ์์ธํ ๋ด์ฉ ์ฐธ์กฐ)
- Cookie size: ๐ ์ฟ ํค๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ฐ ์ฟ ํค๊ฐ 4096๋ฐ์ดํธ๋ฅผ ์ด๊ณผํ์ง ์๋๋กํ๊ณ ๋๋ฉ์ธ ์ด๋ฆ์ 20๊ฐ ์ด์์ ์ฟ ํค๊ฐ ์๋๋กํฉ๋๋ค.
- ๐ Cookie specification: RFC 6265
- ๐ Cookies
- ๐ Browser Cookie Limits
- Third party components: ๐ ๊ฐ๋ฅํ ๊ฒฝ์ฐ, ์ธ๋ถ ์๋ฐ์คํฌ๋ฆฝํธ์ ์์กดํ๋ ์จ๋ํํฐ iframe์ด๋ ๊ตฌ์ฑ ์์(๊ณต์ ๋ฒํผ๊ณผ ๊ฐ์)๋ ์ ์ ๊ตฌ์ฑ ์์๋ก ๋์ฒดํ์ฌ ์ธ๋ถ API ํธ์ถ์ ์ ํํ๊ณ ์ฌ์ฉ์์ ํ๋์ ๋ณดํธํฉ๋๋ค.
๋ค๊ฐ์ค๋ ์์ฒญ ์ค๋นํ๊ธฐ
- DNS resolution: ๐ข ์ ๊ณต๋ ์ ์๋ ํ์ํ ์ 3์ ์๋น์ค์ DNS๋
dns-prefetch
๋ฅผ ์ฌ์ฉํ์ฌ ์ ํด ์๊ฐ ๋์ ๋ฏธ๋ฆฌ ํด๊ฒฐ๋ฉ๋๋ค.
<link rel="dns-prefetch" href="https://example.com">
- Preconnection: ๐ข ๋น ๋ฅธ ์ ์์ ์ํด ํ์ํ ์๋น์ค์์ DNS ์กฐํ, TCP ํธ๋์
ฐ์ดํฌ ๋ฐ TLS ํ์์ ์ ํด ์๊ฐ ๋์
preconnect
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฏธ๋ฆฌ ์ฒ๋ฆฌ๋ฉ๋๋ค.
<link rel="preconnect" href="https://example.com">
- Prefetching: ๐ข ๋น ๋ฅธ ์ ์์ ์ํด ํ์ํ ๋ฆฌ์์ค(์: ์ง์ฐ๋ก๋๋ ์ด๋ฏธ์ง)๋ ์ ํด ์๊ฐ ๋์
prefetch
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฏธ๋ฆฌ ์์ฒญ๋ฉ๋๋ค.
<link rel="prefetch" href="image.png">
- Preloading: ๐ข ํ์ฌ ํ์ด์ง์์ ํ์ํ ๋ฆฌ์์ค(์:
<body>
๋์ ๋ฐฐ์น๋ ์คํฌ๋ฆฝํธ)๋preload
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฏธ๋ฆฌ ๋ก๋๋ฉ๋๋ค.
<link rel="preload" href="app.js">
์ฑ๋ฅ ํ ์คํธ
- Google PageSpeed: ๐ด ๋ชจ๋ ํ์ด์ง(ํํ์ด์ง๋ฟ๋ง ์๋๋ผ)๊ฐ ํ ์คํธ๋์์ผ๋ฉฐ ์ ์ด๋ 90/100์ ์ ์๋ฅผ ๋ฐ์์ต๋๋ค.
โฌ ํ์ด์ง ์๋จ์ผ๋ก ์ด๋
์ ๊ทผ์ฑ
์ฐธ๊ณ : A11ycasts with Rob Dodson ์ฌ์ ๋ชฉ๋ก์ ์์ฒญํ ์ ์์ต๋๋ค. ๐น
๋ชจ๋ฒ ์ฌ๋ก
- Progressive enhancement: ๐ ์ฃผ์ ๊ธฐ๋ฅ์ธ ์ฃผ ๋ฉ๋ด ๋ฐ ๊ฒ์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ ์๋ํด์ผ ํฉ๋๋ค.
- Color contrast: ๐ ์ ๋๋น๋ ์ ์ด๋ WCAG AA๋ฅผ ํต๊ณผํด์ผ ํฉ๋๋ค (๋ชจ๋ฐ์ผ์ ๊ฒฝ์ฐ AAA).
- ๐ Contrast ratio
Headings
- H1: ๐ด ๋ชจ๋ ํ์ด์ง์๋ ์น ์ฌ์ดํธ ์ ๋ชฉ์ด ์๋ H1์ด ์์ต๋๋ค.
- Headings: ๐ด Headings์ ์ ์ ํ๊ฒ ์ฌ์ฉ๋๊ณ ์ฌ๋ฐ๋ฅธ ์์๋ก (H1์์ H6๊น์ง) ์ฌ์ฉ๋์ด์ผ ํฉ๋๋ค.
์๋งจํฑ์ค
- Specific HTML5 input types are used: ๐ ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ์์ ๊ฐ ์์์ ์ ํ์ ๋ฐ๋ผ ์ฌ์ฉ์ ์ง์ ๋ ํคํจ๋์ ์์ ฏ์ด ํ์๋ฉ๋๋ค.
- ๐ Mobile Input Types
ํผ
- Label: ๐ด ๊ฐ ์
๋ ฅ ํผ ์์์๋ ๋ ์ด๋ธ์ด ์ฐ๊ฒฐ๋์ด ์์ต๋๋ค. ๋ ์ด๋ธ์ ํ์ํ ์ ์๋ ๊ฒฝ์ฐ์๋ ๋์
aria-label
์ ์ฌ์ฉํ์ธ์.
์ ๊ทผ์ฑ ํ ์คํธ
- Accessibility standards testing: ๐ด ํ์ด์ง๊ฐ ์ ๊ทผ์ฑ ํ์ค์ ์ค์ํ๋์ง ํ ์คํธํ๊ธฐ ์ํด WAVE ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ธ์.
- ๐ Wave testing
- Keyboard navigation: ๐ด ์ฌ์ฉ์๊ฐ ํค๋ณด๋๋ง ์ฌ์ฉํ์ฌ ์น์ฌ์ดํธ์ ๋ชจ๋ ์ํธ ์์ฉ ๊ฐ๋ฅํ ์์๊ฐ ์์ธก ๊ฐ๋ฅํ ์์๋ก ์ ๊ทผ ๊ฐ๋ฅํ๊ณ ์ฌ์ฉ ๊ฐ๋ฅํ์ง ํ์ธํ์ธ์.
- Screen-reader: ๐ ๋ชจ๋ ํ์ด์ง๊ฐ ์คํฌ๋ฆฐ ๋ฆฌ๋(๋ณด์ด์ค์ค๋ฒ, ChromeVox, NVDA ๋๋ Lynx)์์ ํ ์คํธ๋์์ต๋๋ค.
- Focus style: ๐ด ํฌ์ปค์ค๊ฐ ๋นํ์ฑํ๋ ๊ฒฝ์ฐ, CSS์์ visible ์ํ๋ก ๋์ฒด๋ฉ๋๋ค.
โฌ ํ์ด์ง ์๋จ์ผ๋ก ์ด๋
SEO
- Google Analytics: ๐ข ๊ตฌ๊ธ ์ ๋๋ฆฌํฑ์ค๊ฐ ์ค์น๋์ด ์๊ณ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑ๋์์ต๋๋ค.
- Search Console: ๐ข ์์น ์ฝ์์ด ์ค์น๋์ด ์๊ณ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑ๋์์ต๋๋ค. ์ด๊ฒ์ Google์์ ์ ๊ณตํ๋ ๋ฌด๋ฃ ์๋น์ค๋ก, Google ๊ฒ์ ๊ฒฐ๊ณผ์์ ์ฌ์ดํธ์ ์กด์ฌ๋ฅผ ๋ชจ๋ํฐ๋ง, ์ ์ง ๋ฐ ๋ฌธ์ ํด๊ฒฐํ๋ ๋ฐ ๋์์ ์ค๋๋ค.
- ๐ Search Console
- Headings logic: ๐ Heading ํ ์คํธ๊ฐ ํ์ฌ ํ์ด์ง์ ๋ด์ฉ์ ์ดํดํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- sitemap.xml: ๐ด sitemap.xml์ด ์์ผ๋ฉฐ ๊ตฌ๊ธ ๊ฒ์ ์ฝ์(์ด์ ์๋ ๊ตฌ๊ธ ์น๋ง์คํฐ ๋๊ตฌ)์ ์ ์ถ๋์์ต๋๋ค.
- robots.txt: ๐ด robots.txt๊ฐ ์นํ์ด์ง๋ฅผ ์ฐจ๋จํ์ง ์์ต๋๋ค.
- ๐ The robots.txt file
- ๐ Test your robots.txt with Google Robots Testing Tool
- Structured Data: ๐ด ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ํ์ด์ง๋ ํ ์คํธ๋์๊ณ ์ค๋ฅ๊ฐ ์์ต๋๋ค. ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ๋ ํฌ๋กค๋ฌ๊ฐ ํ์ฌ ํ์ด์ง์ ์ฝํ ์ธ ๋ฅผ ์ดํดํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ๐ Introduction to Structured Data - Search - Google Developers
- ๐ JSON-LD
- ๐ Microdata
- ๐ Test your page with the Rich Results Test
- ๐ Complete list of vocabularies that can be used as structured data. Schema.org Full Hierarchy
- Sitemap HTML: ๐ HTML ์ฌ์ดํธ๋งต์ด ์ ๊ณต๋๋ฉฐ ์น์ฌ์ดํธ์ ํธํฐ์ ์๋ ๋งํฌ๋ฅผ ํตํด ์ ๊ทผํ ์ ์์ต๋๋ค.
โฌ ํ์ด์ง ์๋จ์ผ๋ก ์ด๋
์ฐธ๊ณ
'๋ฒ์ญ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฆฌ๋์ค๋ก ๋ชจ๋ฌ ์ํ ์ ์ดํ๊ธฐ [๋ฒ์ญ] (0) | 2022.06.10 |
---|---|
๋ฆฌ์กํธ๋ก ์ฑํ ํ๋ก ํธ์๋ ๊ตฌ์ถํ๊ธฐ [๋ฒ์ญ] (2) | 2022.05.31 |