μ§λ 1λ κ° Front-end μμμμμ λ³νμ μμΌλ‘μ μ λ§μ μ΄ν΄λ³Ό μ μλ State of JS 2021 κ²°κ³Όκ° λ°νλμλ€.
κΈ°μ μ λν μ μΈκ³μ κ°λ°μλ€μ μ νΈλμ λ§μ‘±λλ₯Ό μ 리λ μλ£λ₯Ό ν΅ν΄ μ½κ² μμλ³Ό μ μλ€.
TL;DR
- νλ μμν¬: Angularμ 좩격μ μμμ Vue.jsμ νλ½μΈ
- λΉλ λꡬ: Webpackμ μ§μμ νλ½μΈμ Vite, esbuild, swcλ‘μ μΈλκ΅μ²΄
- Back-end: Gastbyλ μμμ μ μΌ λ§μ§λ§μ λνΉ
- λͺ¨λ°μΌ & λ°μ€ν¬ν±: Tauriμ λ±μ₯
[μ°Έκ³ ] λΉ λ₯΄κ² μ 체 μ€λ¬Έ κ²°κ³Όμ λν μΈμ¬μ΄νΈλ₯Ό νμ΄ λ³΄κ³ μΆλ€λ©΄, λ€μ λμμμ μ°Έκ³ νλΌ. The Shocking State of JavaScript // The Code Report
The Harsh Reality for JS Developers: If You Don't Study The Fundamentals You Will Be Just Another βCoderβ
μμ μ΄ 15μκ° λ΄λ΄ μμ±ν μ½λμ λν μ½λ 리뷰 κ³Όμ μμ λͺ¨λκ° λμ μ견과 λ΅λ³μ κΈ°λ€λ¦¬λ μν©μμ, μμ±ν μ½λλ₯Ό μ€λͺ ν μ μ ν λ¨μ΄λ₯Ό μ°Ύμ§ λͺ»νκ±°λ λλ λ§€μΌ λ€λ£¨λ λΌμ΄λΈλ¬λ¦¬/μΈμ΄(React Hooks, TypeScript λ±)λ€μ΄ μ€μ λ‘ μ΄λ»κ² λμνλμ§ μ΄ν΄νμ§ λͺ»νκ³ μλ€λ©΄, μ€λλ μ μννΈμ¨μ΄ κ°λ°μλ‘μ¨ μ°λΌλ¦° λ€μμ νμ€μ μ§λ©΄νκ² λλ€.
"κΈ°μ μ λΉ λ₯Έ λ°μ μ λλΉν΄, μ°λ¦¬λ μκ°κ³Όμ μΈμμμ μ§κ³ μλ€"λΌλ μ¬μ€μ΄λ€.
κΈμ μ μλ 4λ λμ, κΈ°μ μ μ€ν¬ ν₯μμ μν μ΅μ μ λ°©λ²λ€μ μ°ΎκΈ° μν κ³Όμ λ€μ ν΅ν΄ JavaScript κ°λ°μλ‘μ μ€/κ³ κΈ λ 벨μ λ 빨리 λλ¬νλ λ°©λ²μ λν μ£Όμ μ 보(5λ¨κ³)λ₯Ό 곡μ νλ€.
μ GitHub CTOμλ Jason Warner(ν Redpoint λ²€μ² μΊνΌνΈ λ§€λμ )μ νμΊμ€νΈ μΈν°λ·°(νμΊμ€νΈ 15:20 λΆκ²½)μμ κ·Έλ Full-stack κ°λ°μ΄ μ ννκ³ μμ§λ§, λ―Έλμλ κ°λ°λλ μ νμ 볡μ‘μ± μ¦κ°μ λ°λΌ νλ‘κ·Έλλ°μ λ―Έλμμ Full-stack μμ§λμ΄μ κ°μκ° μΌμ΄λ κ²μ΄λ©°, back-end μμμμλ μ λ¬Έμ±μ μ§ν₯νλ λ°©ν₯μΌλ‘μ λ³νμ μ΄λμ΄ μ΄λ€μ§ κ²μΌλ‘ μμΈ‘νλ€.
μλλ Markdown Mermaid syntaxλ‘ λ§λ λ€μ΄μ΄κ·Έλ¨
graph TD;
A-->B;
A-->C;
B-->D;
C-->D;
μ΄μ Githubμμ markdown νμΌμμ λ€μ΄μ΄κ·Έλ¨μ λ λλ§ ν μ μλ€.
μ΄λ€ λ°©μμΌλ‘ λ€μ΄μ΄κ·Έλ¨μ λ§λ€κ³ λ λλ§ νλμ§λ νμ΄νλΌμΈμ ν΅ν΄ μ€λͺ ν΄ μ£Όκ³ μλ€.
2013λ Reactκ° μ΄κΈ°μ λ°νλμμ λ μμ₯μμμ λ°μμ μ© μ’μ§ μμλ€. νμ§λ§ μ§κΈμ Reactμ μλλΌ ν΄λ κ³ΌμΈμ΄ μλ μ λλ‘ κ°μ₯ μΈκΈ° μκ³ μν₯λ ₯ μλ νλ‘μ νΈκ° λμλ€.
μ΄ μμμ jQuery, Backbone, Angular μλλ₯Ό κ±Έμ³ React μλλ‘ μ΄λ»κ² μλμ§μ μμ¬λ₯Ό μ λ¨Έ μκ² μ΄μΌκΈ°νκ³ μλ€. 10λΆμ μμ² μκ° λμ Reactμ κ΄μ μμ Front-endμ μμ¬λ₯Ό κ°λ³κ² λκ»΄λ³Ό μ μμ κ²μ΄λ€.
Meta(Facebook)μ μΈκΈ° μλ ν μ€νΈ νλ μμν¬μΈ Jestμ μ£Όμ κΈ°μ¬μμΈ Simen Bekkhus(νλ‘μ νΈ μ΅λ€ μ»€λ° κΈ°μ¬μ)λ νλ‘μ νΈμ ν μ΄μλ₯Ό ν΅ν΄ μλ κ° Meta μμ μΈμλ€μ΄ μλ κ° κ°λ°μ μ°Έμ¬νμ§ μκ³ μλ€λ μ½λ©νΈλ₯Ό λ±λ‘νλ€.
Simenμ μΆκ° μ½λ©νΈλ₯Ό ν΅ν΄ λΆνμν μ€ν΄(μμ μ½λ©νΈμ λν μλ)κ° μκΈ°λ κ²μ λ°©μ§νκΈ° μν΄, μμ μ Metaλ‘λΆν° Jest νλ‘μ νΈ κΈ°μ¬μ λν νλμ νλ©΄μ μ΄λ ν λΉμ©(보μμ λν κΈ°νλ μ 곡λμμΌλ)λ μ§κΈλ°μ§ μμμΌλ©°, μ΄λ 보μ μ§κΈμ λ°κ² λλ©΄ νλ‘μ νΈ μ°Έμ¬κ° μ 무μ μ±κ²©μΌλ‘ λ³νλ κ²μ λν κ°μΈμ κ±°λΆκ°μΌλ‘ μΈν΄, κ°μΈμ μ νμ λ°λΌ 보μμ λν κΈ°νλ₯Ό κ±°λΆνλ€λ λ΄μ©λ ν¨κ» 곡μ νλ€.
JavaScriptμμ λ°°μ΄μ ν©μΉλ λ°©λ²μ concat, push λ©μλλ₯Ό νμ©νκ±°λ spread μ€νΌλ μ΄ν°λ₯Ό μ¬μ©ν μ μλ€.
κ°κ°μ λ°©λ²λ€μ΄ λ°°μ΄ μ리먼νΈμ μ«μμ νμ
(μμ νμ
νΉμ κ°μ²΄)μ λ°λΌ λ²€μΉλ§ν¬κ° μ΄λ»κ² λμ€λμ§ κ·Έ κ²°κ³Όλ₯Ό νμΈν΄λ³΄μ.
(μ λ¬Έμμ μλ [...array1, ...array2] μΌμ΄μ€κ° κΆκΈνλ€λ©΄ μμ μ½λλ₯Ό μ§μ μμ ν΄μ νμΈν΄ 보μ.)
[μ°Έκ³ ] λΉ λ₯΄κ² μ½κ³ μΆλ€λ©΄ λ²μκΈμ μ°Έκ³ νμ.
Monoreposμ λν΄ μμμΌ νλ λͺ¨λ μ 보λ€μ μ λ¦¬ν΄ λμλ€. Monorepoκ° λ¬΄μμΈμ§λΆν°, polyrepo ꡬ쑰μμ λΉκ΅ λ± Monorepoμ λν΄ λ μ μ΄ν΄ν μ μλ λͺ¨λ 리μμ€(λμμ, νν 리μΌ, ebook λ±) λ€μ λν λ§ν¬λ₯Ό μ 곡νλ€.
λν μνκ³μμ μ°Ύμλ³Ό μ μλ 7κ° λꡬλ€μ λν λΉκ΅ ν μ΄λΈλ μ 곡νκΈ° λλ¬Έμ κ° λꡬλ€μ μ₯λ¨μ μ νλμ λΉκ΅ν΄ λ³Ό μ μλ€.
μ μμΈ Jarrod Oversonκ° 21λ 12μ 1μΌ λΆν° 24μΌκ° λ§€μΌ μμ μ κ°λ° λΈλ‘κ·Έ λ₯Ό ν΅ν΄ μ°μ¬λ₯Ό μμν "24 days from node.js to Rust" μλ¦¬μ¦ κΈμ΄ κΈ°λνλ κ²λ³΄λ€ λ§μ μ΄λ€μ κ΄μ¬μ λΆλ¬μΌμΌν€μ μ΄λ₯Ό λ€μμ κΈ°μ¬μλ€μ λμμ ν΅ν΄ ebook ννλ‘ λ§λ€κ³ 곡κ°νλ€.
μ± μ μ λͺ©μμ μ μΆν μ μλ―, μ΄ μ± μ JavaScript(node.js) κ°λ°μλ€μ κ΄μ μμ Rustλ₯Ό νμ΅ν μ μλλ‘ λμμ€λ€.
React Three Fiber(Three.js)λ₯Ό μ¬μ©ν΄μ 3D μ μ ν¨κ³Όλ₯Ό λ§λλ λ°©λ²μ μκ°νλ€.Front-endμμ μ€λ₯ λͺ¨λν°λ§μ μ£Όλ‘ μ μ μλ¬ μ΄λ²€νΈ νΈλ€λ¬λ₯Ό ν΅ν΄ μ΄λ€μ§λ€.
// λλ window.addEventListener("error", function(){})
window.onerror = function (message, source, lineno, colno, error) {
console.log("Global error: " + error.message + ", lineno: " + lineno);
return true;
};
function triggerError() {
throw new Error('Oh no!');
}
triggerError();
// μΆλ ₯: Global error: Oh no!, lineno: 10νμ§λ§ λͺ λ¨κ³ λ κΉμ λ 벨μ call stackμμμ μ€λ₯ μ²λ¦¬λ 볡μ‘ν΄μ§λ©°, μν©μ λ°λΌ μ€λ₯ κ°μ²΄κ° μ€λ₯ νΈλ€λ¬λ‘ μ λ¬λμ§ μλ λ¬Έμ κ° μλ€.
μ μ λ©μλμΈ reportError()λ₯Ό μ¬μ©νλ©΄ call stack μ€νμ μ€λ¨ μμ΄ μ€λ₯λ₯Ό μ μ μ€λ₯ νΈλ€λ¬λ‘ μ λ¬ν μ μλ€.
const fns = [
() => { console.log("I'm first!"); },
() => { throw new Error("Oh no!"); },
() => { console.log("I'm third!"); },
];
// Iterate over the functions
for (const fn of fns) {
// (1) μλ¬ μ΄ν, λ°λ³΅λ¬Έ μνμ΄ μ€λ¨λλ€.
fn();
try {
fn();
} catch(error) {
// (2) try...catchλ‘ κ°μΈλ©΄, λ°λ³΅λ¬Έμ΄ μ€λ¨λμ§ μμ§λ§, μ μ μ€λ₯ νΈλ€λ¬λ‘ μ€λ₯κ° λ²λΈλ§ λμ§ μλλ€.
console.error(error);
// (3) reportError()λ₯Ό ν΅ν΄ μ€λ₯κ° λ²λΈλ§ λλλ‘ ν μ μλ€.
reportError(error);
}
}Three.jsλ₯Ό νμ©νμ¬ λ§λ κ°λ°μμ μ΄λ ₯μ νμ΄μ§μ΄λ€. λΈλΌμ°μ νμ΄νλ°μ μ°¨λμ μμ§μκΉμ§ ννν μμ±λ λμ κ°μΈ μ¬μ΄νΈμ΄λ€. μ΄ μ¬μ΄νΈλ₯Ό ν΅ν΄ WebGLμ κ°λ₯μ±μ μ΄ν΄λ³΄κΈ° λ°λλ€.
νλμ¨μ΄ κ°μμ μ΄μ©ν κ³ μ±λ₯μ 2D WebGL λ λλ§ λΌμ΄λΈλ¬λ¦¬.
React Windows95 μ»΄ν¬λνΈ. μμ λΆν° μ΄μ체μ UIλ₯Ό μΉμμ ꡬννλ νλ‘μ νΈκ° μ’ μ’ μμμ§λ§ μ΄ νλ‘μ νΈλ μμ±λκ° μ’ λ λμ 보μΈλ€. μ€ν 리λΆμμ λ€μν μ»΄ν¬λνΈλ€μ μ§μ νμΈν΄ λ³Ό μ μλ€.
Hotkeyλ κΉνμμ κ°λ°ν λΌμ΄λΈλ¬λ¦¬λ‘ λ¨μΆν€λ₯Ό μ¬μ©νκ³ μ νλ μμμ data-hotkey μμ±μ μΆκ°νλ©΄ κ°νΈνκ² λ¨μΆν€λ₯Ό λ±λ‘ν μ μλ€. κ°λ¨ν μ¬μ©λ²μ λ€μ μ½λλ₯Ό μ°Έκ³ νμ.
<a href="/page/2" data-hotkey="j">Next</a>
<a href="/help" data-hotkey="Control+h">Help</a>
<a href="/rails/rails" data-hotkey="g c">Code</a>
<a href="/search" data-hotkey="s,/">Search</a>import {install} from '@github/hotkey'
// Install all the hotkeys on the page
for (const el of document.querySelectorAll('[data-hotkey]')) {
install(el)
}v8nμ λ©μλ 체μ΄λμ μ¬μ©ν΄ μ§κ΄μ μΌλ‘ μ ν¨μ± κ²μ¬λ₯Ό ꡬνν μ μλ λΌμ΄λΈλ¬λ¦¬λ€. λ€μκ³Ό κ°μ΄ μ¬μ©ν μ μλ€.
v8n()
.string()
.minLength(5)
.first("H")
.last("o")
.test("Hello"); // true





