자바 스크립트의 메타 프로그래밍에 대한 간략한 소개

이 강의에서는 "메타 프로그래밍"이 (일반적으로) 무엇인지, 그리고 이전 및 새 API를 사용하여 JavaScript에서 일부 메타 프로그래밍 개념을 구현하는 방법에 대해 알아 봅니다.

(출처 : unsplash.com)

Wikipedia 에 따르면

"메타 프로그래밍" 은 컴퓨터 프로그램이 다른 프로그램을 데이터로 취급 할 수있는 프로그래밍 기술입니다. 이는 프로그램이 다른 프로그램을 읽고, 생성하고, 분석하거나 변환하도록 설계 될 수 있으며 실행 중에도 스스로 수정할 수 있음을 의미합니다.

글쎄요,이 정의는 매우 정확하지만 꽤 입이 많습니다. 사실 그것은 메타 프로그래밍의 개념 대부분을 거의 요약 한 것입니다. 그래서 그것을 분해하고 각각을 탐구합시다.

💡 우리가 메타 프로그래밍에 대해 이야기하기 전에 작은 면책 조항을 넣겠습니다 . 메타 프로그래밍은 다른 사람과 다른 프로그래밍 언어의 맥락에서 다른 것을 의미 할 수 있습니다. 프로그래밍 언어 기능이 아니며 확실히 표준화되지 않았기 때문입니다. 그러니 내 설명에 동의하지 않으시면 전쟁을 시작하기 위해 코멘트를 남겨주세요. 이제 그게 끝났습니다. 처음에는 이해하기 쉬울 수 있으므로 메타 프로그래밍의 정의에주의를 집중하겠습니다.

프로그램을 작성할 때, 프로그램을 실행할 때 일부 출력을 생성하는 로직이 포함되어 있습니다. 런타임시 ( 프로그램이 실행되는 동안 ) 우리 프로그램은 아마도 사용자가 제공하거나 원격 네트워크 호출을 통해 수신 한 일부 데이터를 사용하고 원하는대로 변환합니다. 요컨대, 프로그램은 원하는 결과를 얻기 위해 데이터를 조작합니다.

메타 프로그램은 다른 프로그램을 조작하는 프로그램입니다. 이제 이해하자. 방금 이해했듯이 프로그램은 데이터를 조작하므로 다른 프로그램을 조작 할 수있는 프로그램은 메타 프로그램입니다. 따라서 기술적으로 메타 프로그램은 다른 프로그램을 데이터로 받아들이고 조작합니다.

" 조작 "이 실제로 의미하는 바에 대해 더 자세히 설명하지만 간단히 말하면 다양한 수단을 통해 프로그램 의 동작검사하고 수정하는 것을 의미합니다 ( "반사"섹션에서 다룹니다 ). 또한 프로그램에서 새로운 코드를 생성하는 것과 같은 다양한 수단을 통해 프로그램에 새로운 동작 을 주입하는 것을 의미 할 수도 있습니다 ( “코드 생성”섹션에서 다룹니다 ).

완전히 다른 프로그래밍 언어로 작성된 다른 프로그램을 조작하는 프로그래밍 언어를 메타 언어 라고합니다 . TypeScript 에서 작업했다면 JavaScript로 작성된 프로그램을 생성하기 때문에 메타 언어라는 것을 깨달았습니다. 자바 는 바이트 코드 ( 언어의 한 형태)를 생성하기 때문에 일종의 메타 언어 입니다.

스스로 조작 할 수있는 프로그래밍 언어를 호모이 코닉 언어 라고합니다 . 하지만 판단을 내리기 전에이 주제에 대한이 짧은 기사 를 읽어 보는 것이 좋습니다 . 호모이 코닉 언어에서 프로그램 자체는 Lisp 개발자 가 아니라면 일상적인 프로그래밍에서 많이 볼 수없는 특정 부분을 자체 검사하고 수정할 수 있습니다 .

" 프로그램" 이라는 단어 는 메타 프로그래밍의 맥락에서 잘못된 인상을 주므로 그 이유를 말씀 드리겠습니다. 우리에게 프로그램은 일반 텍스트 형식으로 작성된 코드 조각입니다. 코드를 컴파일하여 바이너리 실행 파일 ( .exefile )을 만든 다음 기본적으로 실행 하거나 JavaScript 엔진 ( JavaScript 코드 용 )과 같은 인터프리터 ( 또는 VM ) 내에서 실행할 수 있습니다 .

메타 프로그래밍 개념은 두 가지 범주로 나뉩니다. 컴파일 시간 및 런타임. 컴파일 시간코드가 저수준 또는 고수준 프로그래밍 언어 로 컴파일되는 시기를 의미 합니다. 예를 들어 TypeScript가 JavaScript로 컴파일되는 경우입니다. 런타임코드가 실행될 때 입니다. 예를 들어 JavaScript 프로그램이 Node ( VM ) 내에서 실행되는 경우 입니다.

코드가 인터프리터 ( 또는 가상 머신 ) 내에서 실행되면 프로그램은 일반적으로 코드 ( 일반 텍스트 ) 에서 해석 된 런타임 코드논리적 동작을 의미합니다 . 예를 들어 간단한 JavaScript 코드는 런타임에 많은 복잡한 엔티티 ( 예 : 함수, 클래스, 객체 등 )를 생성 할 수 있으며 이러한 엔티티는 복잡한 동작을 가질 수 있습니다.

따라서 기술적으로 프로그래밍 언어가 런타임에 동작을 변경할 수있는 능력이 있다면 메타 프로그래밍을 지원한다고 말할 수 있습니다. 간단히 말해, 프로그램이 런타임에 ( 실행 중 ) 스스로 조작 할 수 있다면 메타 프로그래밍을 지원합니다.

이제 자바 스크립트가 런타임 ( JavaScript 프로그램 실행) 에서 동작을 확실히 변경할 수 있으므로 JavaScript에 돈을 걸고 확실히 메타 프로그래밍을 지원할 수 있습니다. 걱정하지 마십시오. 메타 프로그래밍이 JavaScript에서 정확히 어떻게 작동하는지 논의하는 데 엄청난 시간을 할애 할 것입니다.

프로그램의 동작 또는 런타임에 다른 프로그램의 동작을 조작하는 동작을 원숭이 패치 라고 합니다. 간단히 말해 몽키 패치 는 프로그램의 원본 소스 코드를 변경하지 않고 원하는 결과를 얻기 위해 런타임에 프로그램의 특정 부분 을 조정 하는 것입니다.

JavaScript 프로그램의 작은 예를 들어 보겠습니다. 여기서는 런타임에 JavaScript의 내부 구현을 조작 할 것입니다.

(소개 /monkey-patch.js)

따라서 위의 예에서 String클래스 의 소스 코드가 V8 내부에서 변경되지 않았기 때문에 일부 몽키 패치 기술을 사용하여 런타임에 클래스 ( 유형에 영향을 미침) 의 동작을 변경했습니다 .stringString

메타 프로그래밍은 프로그램이 컴파일 될 때나 프로그램이 실행될 때 다른 것을 의미하기 때문에 메타 프로그래밍은 두 부분으로 나뉩니다. 코드 생성반영 .

간단히 말해서 코드 생성 은 프로그램 코드를 생성하는 프로그래밍 언어의 능력입니다. 그래서 때때로 메타 프로그래밍이 프로그램을 작성하는 프로그램으로 일반화됩니다. 반면에 Reflection 은 프로그램이 자체 또는 다른 프로그램을 조작하는 능력입니다. 다음과 같이 추가로 분류 할 수 있습니다.

+---------------------------------------------------------------+
|                        METAPROGRAMMING                        |
+-----------------+---------------------------------------------+
| Code Generation |                  Reflection                 |
+-------+---------+---------------+--------------+--------------+
|  Eval |  Macros | Introspection | Intercession | Modification |
+-------+---------+---------------+--------------+--------------+

코드 생성

코드 생성은 메타 프로그래밍의 핵심 개념 중 하나입니다. 코드 생성은 기본적으로 컴파일 타임 또는 런타임에 기존 프로그램에 프로그램추가하는 것을 의미 합니다.

여기서도 "코드"라는 단어와 혼동하지 말고 "코드 생성" 이 프로그램 파일에 추가 코드 ( 텍스트 )를 추가 하거나 런타임에 코드를 컴파일 하는 것과 같은 다양한 방법을 통해 프로그램 을 생성 하는 것을 의미 합니다.

코드 생성은 컴파일 타임 또는 런타임에 발생할 수 있으므로 두 가지 범주 즉,으로 나뉩니다. 매크로eval .

매크로

당신이 C또는 C++개발자라면 매크로가 무엇인지 알아야합니다. 매크로 코드 (의 조각 일반적으로, 하나의 단어 컴파일 과정에서 여러 줄의 코드로 확장). 프로그램을 저수준 언어로 컴파일하기 전에 전처리 기가 이러한 마이크로를 확장하고 컴파일러에 공급합니다. 따라서 컴파일러는 항상 의미있는 프로그램 코드를 얻습니다.

💡 기사 C++에서 매크로에 대해 자세히 알아보세요 .

JavaScript에서는 JavaScript를 기계 코드로 컴파일하고이를 JavaScript 엔진에 공급하지 않기 때문에 매크로를 가질 수 없습니다. JavaScript 엔진이 자체적으로이를 수행하므로 JIT (Just-In-Time) 컴파일이라고합니다.

고 국어에서 JavaScript를 생성하는 다른 방법이 있다면 매크로가 가능합니다. 예를 들어 TypeScript에는 매크로가있을 수 있지만 불행히도 그렇지 않습니다. Sweet.js 는 마이크로를 포함하는 다소 자바 스크립트 코드에서 자바 스크립트를 컴파일하는 GitHub의 오픈 소스 프로젝트입니다.

“자바 스크립트를위한 위생적인 ​​매크로! 매크로를 사용 하면 꿈의 언어를 구축 할 수 있습니다 . 코드에 대한 새로운 구문을 정의하여 JavaScript를 멋지게 만드십시오.” — Sweet.js

GitHub의 공식 문서에 따라 .sjs파일을 .js파일로 컴파일하는 CLI 도구를 설치할 수 있습니다. 여기 .sjs파일은 마이크로를 포함하는 JavaScript 파일이며 .js파일은 바닐라 ( 순수 ) JavaScript 코드 를 포함하는 컴파일의 최종 결과입니다 .

(소개 /sweet-js/program.sjs)

위의 예 program.sjs에는 DEBUG_FUNCmicro 가 포함 된 파일이 있습니다 . sweet.js의 마이크로는 syntax키워드처럼 키워드 로 정의 된 간단한 함수입니다 var. 이 함수는 태그가 있는 태그 템플릿 리터럴 을 반환해야합니다 #. 템플릿 문자열에는이 마이크로가 배치되는 위치에 대체 될 실제 JavaScript 코드가 포함됩니다.

$ sjs -o program.js program.sjs
(소개 /sweet-js/program.js)

보시다시피, DEBUG_FUNC( 선택적 선행 포함; )은 컴파일 과정에서 매크로 함수에서 반환 된 실제 코드로 대체되었습니다. 이제 매크로의 힘을 이해할 수 있습니다.

여기서 JavaScript ( 일부 약간 수정 )는 유효한 프로그램을 생성 할 수 있습니다. 따라서 메타 프로그래밍 이론에 따르면 JavaScript는 그 자체 로 메타 언어 이지만 sweet.js의 맥락에서 볼 수 있습니다.

평가

당신이 자바 스크립트 개발자라면 아마도 eval함수를 사용했을 것입니다. 이 함수는 string값을 받아 JavaScript 코드 인 것처럼 실행합니다. 그래서 기술적으로 우리는 런타임에 JavaScript 코드를 생성하고 있습니다.

(소개 /eval.js)

보시다시피 eval는 JavaScript 코드를 나타내는 간단한 문자열에서 프로그램을 동적으로 실행하거나 생성하는 강력한 도구입니다. eval(str)프로그램에서 원하는 위치에 배치 하고 문자열이 제공 하는 코드 ( text ) streval()호출 사이트 에있는 것처럼 가정 할 수 있습니다.

처음에는 eval정말 강력 해 보이지만, 신입 사원들에게 eval입사 할 때 자신 을 지키라고 말하는 사람이 아무도 없다는 사실에 놀랐습니다 . 왜? 때문에 eval이 웹 응용 프로그램을 악용하는 해커에 문을 열어으로 이중 요원이다.

(출처 : MDN)

보시다시피 MDN 은 굵은 글씨로 울고 있습니다 . Function생성자는 또한 많은 같은 문자열에서 자바 스크립트 기능을 생성 할 수 eval있지만 같은 유사한 위험을 포즈 eval.

JavaScript뿐만 아니라 Python도 JavaScript의 eval기능과 같은 eval기능을합니다. 사실 대부분의 프로그래밍 언어, 특히 해석 된 언어 eval에는 런타임에 프로그램을 생성하는 일종의 내장 기능이 있습니다.

요약하자면, 매크로평가는 둘 다 언어가 컴파일 타임이나 런타임에 프로그래밍 방식으로 프로그램을 즉시 생성 할 수있는 문을 열어주는 훌륭한 메타 프로그래밍 도구입니다.

반사

"코드 생성"과 달리 리플렉션 은 언어 의 기본 메커니즘 을 변경하는 프로세스 입니다. 리플렉션은 컴파일 타임 또는 런타임에 발생할 수 있지만 JavaScript에 대해 이야기 할 때 런타임 리플렉션을 고수하므로 컴파일 타임 리플렉션이 불가능합니다. 그러나 여기에 설명 된 개념은 컴파일 된 언어에도 적용 할 수 있습니다.

반사 는 언어의 기본 메커니즘을 변경하는 것임을 이해 했으므로 세 가지 주요 범주 즉, 즉. 성찰 , 중보기도수정 .

내성

Introspection은 프로그램을 분석하는 프로세스입니다. 프로그램이 무엇을하는지 알 수 있다면 원하는대로 수정할 수 있습니다. 일부 프로그래밍 언어는 코드 생성 또는 코드 수정 기능을 지원하지 않지만 대부분은 인트로 스펙 션을 허용 합니다.

내부 검사의 간단한 예는 JavaScript에서 typeof또는 instanceof연산자를 사용하는 것 입니다. 는 typeof반환하는 동안 또는 LHS 값이 RHS 클래스의 인스턴스 인 경우 의 현재 데이터 유형 ( 또는을 반환하는 표현식 )을 instanceof반환합니다 . 그들이 행동하는 모습을 봅시다.truefalse

(소개 /introspection.js)

위의 프로그램에서 우리는 들어오는 데이터 유형 을 스니핑 하기 위해 함수 에서 typeofinstanceof연산자를 사용했습니다 . 이것은 내성 의 기본 데모입니다 . 그러나 메타 프로그래밍을 위해 특별히 설계된 언어는 강력한 내부 검사 도구를 제공 할 수 있습니다.coercevalue

in연산자를 사용 하여 객체에 속성이 있는지 확인할 수 있습니다 . isNaN전역 함수 검사 물체 인 경우 NaN. 고정 여부를 확인 하거나 객체 의 속성 이름을 가져 오는 것과 같이 유형의 Object값을 검사하기 위해 주위에 빌드 된 몇 가지 정적 메서드가 있습니다 .ObjectObject.isFrozen(value)valueObject.keys(value)value

ES5까지는 이러한 연산자와 이러한 방법을 사용했습니다. ES2015 (에서 ES6 ), 자바 스크립트 소개 Reflect(일부 정적 메소드를 제공하는 객체 처럼Object )하지만, 특히 자기 반성을 위해 설계를. 우리가 가지고 있기 때문에 별도의 교훈을Reflect, 이러한 방법이 설명되어 있습니다.

중재

중보기도는 JavaScript 프로세스에 개입하고 프로세스의 표준 동작을 수정하는 프로세스입니다. JavaScript는 중보기도를위한 훌륭한 도구를 제공합니다 Proxy.

Proxy클래스는 ES2015 ( ES6 ) 에 도입되어 위에서 본 것처럼 객체 주변의 기본 JavaScript 작업 을 가로 채기 ( 개입 )합니다. ( 곧 출시 예정 ) 에 대한 별도의 강의 가 있지만 간단히 말해서 객체를 가로 챌 수있는 논리를 감 쌉니다.ProxyProxy

var targetWithProxy = new Proxy(target, handler);
(소개 /proxy.js)

프록시는 공개되지 않은 데이터 에 대한 추상화 를 제공하는 좋은 방법 입니다. 예를 들어, 위의 프로그램에서 우리는 target객체에 대한 추상화를 제공 하고 그것이 대중에게 어떻게 표현되어야 하는지를 사용자 정의했습니다.

일부 중보 사용으로 잘 같은 ES5에 가능했다 gettersetters속성 기술자에 있지만의 변이를 초래 target객체입니다. Proxy원본 객체 ( target) 를 수정하지 않고도 중보를 수행 할 수있는 훨씬 더 깔끔한 방법을 제공합니다 .

가감

수정은 변형을 통해 프로그램 동작을 수정하는 것을 말합니다. 의 경우 중재 , 우리는 단지 사이 인터셉트 논리 가산함으로써 표준 자바 스크립트 처리를 도청 대상리시버 해치지 않고 타겟 . 이 경우 수정 에서는 대상 자체 의 동작을 수신자에 맞게 변경합니다 .

함수 구현을 재정의하는 것이 수정의 좋은 예입니다. 예를 들어 함수가 특정 방식으로 작동하도록 설계되었지만 조건부로 다른 것을 원할 경우 자체 재정의 함수를 설계하여이를 수행 할 수 있습니다. 예를 봅시다.

(소개 / 기능 -modification.js)

위의 예에서 우리는 새로운 함수 구현으로 자신을 재정의하는 함수를 만들었습니다. 이것은 가장 가혹한 수정 사례 이지만 더 의미있는 다른 사용 사례가 있습니다.

(소개 /readonly-object.js)

위의 예에서 우리는 사용하고 기본 변경하는 방법을 속성 기술자 의 읽기 전용으로 만들기 위해 속성을. 또한이 메서드를 사용하여 전체 개체를 잠그면 변형을 방지 할 수 있습니다.Object.defineProperty()nameObject.freeze()

위의 예에서와 같이 수정 을 통해 일부 중보 가 발생할 수 있습니다. 객체의 속성 설명자를 설정 하여 객체를 변경 ( 내부 구현 )함으로써 값 할당 작업을 받아 들였습니다.writable:false

valueOf방법에 익숙하지 않은 경우 객체를 원시 값으로 강제 변환하는 데 사용됩니다. 따라서 객체가 있고 valueOf자체 또는 프로토 타입 체인 에 메서드가있는 경우이 메서드는 산술 연산을 수행하려고 할 때 JavaScript에 의해 호출됩니다. 기본적으로 자체를 반환 Object하는 valueOf메서드가 있습니다 ( object ).

(소개 /valueof.js)

위의 예에서 볼 수 있듯이 객체는 자연수처럼 나눌 수 없기 때문에 emp1/10결과가 나타납니다 NaN. 그러나 나중에 객체의 값 을 반환하는 valueOf메서드를 Employee클래스에 추가했습니다 salary. 따라서 이후 emp2/10반환 됩니다 . 마찬가지로, 반환 우리가 추가로 온 직접 방법을 .200emp2.salary200emp3/10300valueOfemp3

따라서 위 예제의 모든 단계에서 객체가 표준 JavaScript 작업에 표시되는 방법에 개입하고 원하는대로 동작을 변경합니다. 이것은 중보기도 일뿐 입니다.

ES2015 ( ES6 )에서 JavaScript는 새로운 기본 데이터 유형 인 symbol. 이전에 본 것과는 다르며 문자 그대로 표현할 수 없습니다. Symbol함수 를 호출해야만 구성 할 수 있습니다 .

var sym1 = Symbol();
var sym2 = Symbol();
var sym3 = Symbol('description'); // description for debugging aid
sym1 === sym2 // false
sym1 === sym2 // false
typeof sym1 // 'symbol'
console.log( sym1 ); // 'Symbol()'
console.log( sym3 ); // 'Symbol(description)'

var key = Symbol();
var obj = {
  name: 'Ross',
  [key]: 200
};
console.log( obj.name ); // 'Ross'
console.log( obj[key] ); // 200
Object.keys(obj); // ["name"]
obj[key] = 300;

에서 valueOf우리가주의 또는 인식되지 않는 경우 예를 들어, 당신은 문제를 발견 할 수 있습니다. 이후 valueOfA는 string(속성을 같이emp3['valueOf'] ), 사람이 실수를 덮어 쓸 수 있습니다 또는 약 모르는 사람이 valueOf그 / 그녀의 자신의 사용을 생각 위해 그것을 사용할 계획 수있다 "이름에 무엇이?".

기호는 객체 키로도 사용할 수 있으므로 JavaScript는 일부 표준 JavaScript 작업에 대해 객체 키로 사용해야하는 일부 전역 기호를 제공했습니다. 이러한 기호는 개발자에게 잘 알려져 있기 때문에 " 잘 알려진 기호 "라고합니다. 이러한 잘 알려진 기호는 Symbol기능 의 정적 속성으로 대중에게 노출됩니다 .

잘 알려진 기호 중 하나는 Symbol.toPrimitive원시 값을 얻기 위해 객체의 키로 사용해야하는 것입니다. 예, 당신은 옳다고 생각하고 있으며, valueOf방법 의 대체이며 선호됩니다.

(소개 / 기호 -toPrimitive.js)

💡toPrimitive메서드는 객체의 숫자 값을 반환하는 것 이상을 수행합니다. 그것에 대해 더 알고 싶다면 기호 강의를 읽으 십시오.

JavaScript는 객체 주변의 기본 JavaScript 동작을 가로 채고 수정하기 위해 잘 알려진 많은 기호를 제공합니다. 기호 강의 에서 이것과 기호에 대해 일반적으로 이야기 할 것 입니다.

앞서 언급했듯이 메타 프로그래밍은 프로그래밍 언어의 기능으로 설명 할 수있는 것이 아니라 용량으로 설명 할 수 있습니다. 일부 프로그래밍 언어는 매크로를 지원하지 않는 Go ( Golang ) 와 같은 모든 메타 프로그래밍 장르를 지원하지 않을 수 있지만 ( 현재 ) 앞에서 살펴본 using 연산자 와 비슷한 패키지를 사용하여 introspection 을 통한 런타임 반영을 지원합니다 .reflecttypeof

메타 프로그래밍 정의와 구현은 당신이 말하는 프로그래밍 언어에 따라 다르기 때문에 마음에 들어서는 안되지만 개념은 동일하게 유지되어야합니다. 곧 Symbols , Reflect , Proxy 에 대한 기사를 발표 할 계획 이며이 간행물뿐만 아니라 여기에서도 찾을 수 있습니다. 그러니 계속 지켜봐주세요.

JavaScript "기호"소개 및 메타 프로그래밍에서의 사용 JavaScript에서 메타 프로그래밍을위한 "Reflect"API 소개 JavaScript에서 메타 프로그래밍을위한 "프록시"API 소개

데코레이터 는 리플렉션을 사용하는 메타 프로그래밍의 완벽한 예입니다. 클래스 상단에 주석 유형을 넣을 @abstract수 있으며 다른 클래스에서 상속 될 수 있도록 클래스를 수정하지만 객체를 생성하기 위해 인스턴스화 할 수는 없습니다. 아래 강의를 따르십시오.

JavaScript (ECMAScript) 데코레이터 및 객체의 속성 설명자에 대한 최소 가이드

새로운 ECMAScript 제안은 Reflect순전히 메타 프로그래밍에만 사용될 API에 대한 새로운 메서드를 소개 합니다. 이 API 확장에 대한 제안 사양 및 polyfill은 reflect-metadata패키지를 통해 제공 됩니다. 이 패키지는 데코레이터를 디자인 할 때 TypeScript에서도 많이 사용되기 때문에 JavaScript에서 메타 프로그래밍의 전체 환경을 다루고 있기 때문에 논의 할 필요가있었습니다.

"reflect-metadata"패키지 소개 및 ECMAScript 제안
(thatisuday.com / GitHub / Twitter / StackOverflow / Instagram)

Suggested posts

N + 1 문제 선택

모든 것은 비용이 있습니다.

N + 1 문제 선택

개발자의 경우 ORM (Object-relational mapping)을 사용하면 삶을 상당히 단순화 할 수 있지만 알아야 할 자체 캐치 세트가 있습니다. 더 심각한 문제 중 하나는 Select N + 1 문제입니다.

자신감있는 겸손 : 성공적인 리더십의 역설

자신감있는 겸손을 갖는 것은 드뭅니다. 그것을 전시하는 데 필요한 것을 알고

자신감있는 겸손 : 성공적인 리더십의 역설

자신감 겸손 시소에 대해 어떻게 균형을 잡을 수 있습니까? 내 자신감이 오만함으로 보이거나 겸손 함이 내 주장 부족의 신호로 보인다면 어떨까요. 어떻게하면 제대로됩니까? 이 생각은 내 것이 아닙니다.

Related posts

성능 최적화 된 A / B 테스트 솔루션

성능 최적화 된 A / B 테스트 솔루션

의제 : 소개 : TL;하지만 읽을 수 있습니다. A / B 테스트, CloudFront 및 Lamba @ edge에 대해 이미 알고있는 경우 AWS Lambda @ edge를 사용한 A / B 테스트로 직접 이동하십시오. A / B 테스트 란 무엇입니까? A / B 테스트는 웹 사이트의 두 가지 버전에 대한 사용자의 참여를 비교하는 데 초점을 맞춘 UX 연구 방법론입니다.

fp-ts (Typescript)에서 Option 및 둘 중 하나 사용

저는 함수형 프로그래밍을 좋아합니다. 몇 년 동안 실수를하거나 토끼 구멍을 뚫는 것으로부터 저를 몇 번 구해 주었기 때문입니다. 동일한 입력이 주어지면 출력이 항상 동일하다는 것을 알면 안심입니다.

Syncfusion Blazor 파일 업로드 구성 요소에서 이미지를 미리 보는 방법

Syncfusion Blazor 파일 업로드 구성 요소에서 이미지를 미리 보는 방법

Syncfusion Blazor 파일 업로드는 하나 이상의 파일, 이미지, 문서, 오디오, 비디오 및 기타 파일을 서버에 업로드하기위한 구성 요소입니다. 여러 파일 선택, 진행률 표시 줄, 자동 업로드, 끌어서 놓기, 폴더 (디렉터리) 업로드, 파일을 포함하는 다양한 기능을 갖춘 HTML5 업로드 구성 요소 (<input type =”file”>)의 확장 버전입니다. 검증 등.

6 React 개발자로서 후회

내가 일찍했으면하는 것

6 React 개발자로서 후회

React는 배울 수있는 훌륭한 도구입니다. 그것은 우리가 우리 자신의 방식으로 일을 할 수있게합니다.