AngularJS와 jQuery
AngularJS와 jQuery는 매우 다른 이데올로기를 채택합니다. jQuery에서 오는 경우 놀라운 차이점을 발견 할 수 있습니다. 각도가 화나게 만들 수 있습니다.
이것은 정상적인 현상입니다. Angular는 그만한 가치가 있습니다.
큰 차이 (TLDR)
jQuery는 DOM의 임의 비트를 선택하고 임시로 변경하기위한 툴킷을 제공합니다. 한 조각 씩 좋아하는 거의 모든 것을 할 수 있습니다.
AngularJS는 대신 컴파일러 를 제공합니다 .
이것이 의미하는 바는 AngularJS가 전체 DOM을 위에서 아래로 읽고이를 코드로, 문자 그대로 컴파일러에 대한 명령으로 취급한다는 것입니다. DOM을 통과 할 때 AngularJS 컴파일러에게 동작 방식과 수행 방식을 알려주는 특정 지시문 (컴파일러 지시문)을 찾습니다 . 지시문은 속성, 태그, 클래스 또는 주석과 일치 할 수있는 JavaScript로 가득 찬 작은 객체입니다.
Angular 컴파일러는 DOM 조각이 특정 지시문과 일치한다고 판단하면 지시문 함수를 호출하여 DOM 요소, 속성, 현재 $ scope (로컬 변수 저장소) 및 기타 유용한 비트를 전달합니다. 이러한 속성에는 지시문에 의해 해석 될 수있는 표현과 렌더링 방법 및 언제 다시 그려야하는 표현이 포함될 수 있습니다.
지시문은 컨트롤러, 서비스 등과 같은 추가 Angular 구성 요소를 차례로 가져올 수 있습니다. 컴파일러의 맨 아래에 나오는 것은 완전히 구성된 웹 응용 프로그램으로, 유선으로 연결되어 바로 사용할 수 있습니다.
이것은 Angular가 Template Driven이라는 것을 의미합니다 . 템플릿은 다른 방식이 아닌 JavaScript를 구동합니다. 이것은 역할의 급진적 인 반전이며 지난 10 년 동안 우리가 작성해 온 명백한 JavaScript와 완전히 반대입니다. 익숙해지는 데 시간이 좀 걸릴 수 있습니다.
이것이 지나치게 규범적이고 제한적인 것처럼 들리면 진실에서 멀어지는 것은 없습니다. AngularJS는 HTML을 코드로 취급하므로 웹 애플리케이션에서 HTML 레벨의 세분성 을 얻습니다 . 모든 것이 가능하며, 개념적으로 도약하면 대부분의 일이 놀라 울 정도로 쉽습니다.
멍청한 녀석에게로 갑시다.
먼저 Angular는 jQuery를 대체하지 않습니다.
Angular와 jQuery는 다른 작업을 수행합니다. AngularJS는 웹 애플리케이션을 생성하는 도구 세트를 제공합니다. jQuery는 주로 DOM 수정 도구를 제공합니다. 페이지에 jQuery가 있으면 AngularJS가 자동으로 사용합니다. 그렇지 않은 경우 AngularJS는 jQuery Lite를 제공합니다. 이는 jQuery Lite이지만, 여전히 완벽하게 사용 가능한 jQuery 버전입니다.
Misko는 jQuery를 좋아하며이를 사용하는 것에 반대하지 않습니다. 그러나 범위, 템플릿 및 지시문의 조합을 사용하여 거의 모든 작업을 수행 할 수 있다는 것을 알게 될 것이므로 코드가 더 개별적이며 구성 가능하며 더 많기 때문에 가능한 경우이 워크 플로를 선호해야합니다. 모난.
jQuery를 사용한다면 어디서나 jQuery를 뿌려서는 안됩니다. AngularJS에서 DOM 조작의 올바른 위치는 지시문에 있습니다. 이것들에 대해서는 나중에 더 설명하겠습니다.
선택기 vs. 선언적 템플릿이있는 눈에 잘 띄지 않는 JavaScript
jQuery는 일반적으로 눈에 잘 띄지 않게 적용됩니다. JavaScript 코드는 머리글 (또는 바닥 글)에 연결되어 있으며 이것이 유일하게 언급 된 곳입니다. 우리는 선택기를 사용하여 페이지의 비트를 선택하고 플러그인을 작성하여 해당 부분을 수정합니다.
JavaScript가 제어됩니다. HTML은 완전히 독립적으로 존재합니다. JavaScript 없이도 HTML은 의미 론적으로 유지됩니다. Onclick 속성은 매우 나쁜 습관입니다.
AngularJS에 대해 가장 먼저 알게 될 것은 사용자 정의 속성이 어디에나 있다는 것 입니다. HTML의 속성은 ng 속성으로 흩어지며 이는 스테로이드의 onClick 속성입니다. 이들은 지시문 (컴파일러 지시문)이며 템플릿이 모델에 연결되는 주요 방법 중 하나입니다.
처음 볼 때 AngularJS를 구식 침입 JavaScript로 작성하고 싶을 수도 있습니다 (처음에했던 것처럼). 실제로 AngularJS는 이러한 규칙을 따르지 않습니다. AngularJS에서 HTML5는 템플릿입니다. 웹 페이지를 생성하기 위해 AngularJS에 의해 컴파일됩니다.
이것이 첫 번째 큰 차이입니다. jQuery에서 웹 페이지는 조작 할 DOM입니다. AngularJS에게 HTML은 컴파일 할 코드입니다. AngularJS는 전체 웹 페이지를 읽고 내장 컴파일러를 사용하여 문자 그대로 새 웹 페이지로 컴파일합니다.
템플릿은 선언적이어야합니다. 그것의 의미는 단순히 그것을 읽음으로써 분명해야합니다. 의미있는 이름을 가진 사용자 정의 속성을 사용합니다. 의미있는 이름으로 새로운 HTML 요소를 다시 구성합니다. HTML 지식이 거의없고 코딩 기술이없는 디자이너는 AngularJS 템플릿을 읽고 그것이 무엇을하고 있는지 이해할 수 있습니다. 그 또는 그녀는 수정할 수 있습니다. 이것은 각도 방식입니다.
템플릿이 운전석에 있습니다.
AngularJS를 시작하고 튜토리얼을 실행할 때 가장 먼저 제기 한 질문 중 하나는 "내 코드는 어디에 있습니까?"입니다. . JavaScript를 작성하지 않았지만이 모든 동작이 있습니다. 답은 분명하다. AngularJS는 DOM을 컴파일하기 때문에 AngularJS는 HTML을 코드로 취급합니다. 많은 간단한 경우에는 템플릿을 작성하고 AngularJS가 응용 프로그램으로 컴파일하도록하는 것으로 충분합니다.
템플릿이 애플리케이션을 주도합니다. DSL 로 취급됩니다 . AngularJS 구성 요소를 작성하면 AngularJS가 템플릿 구조를 기반으로 올바른 구성 요소를 가져와 적절한 시간에 사용할 수 있도록합니다. 이것은 템플릿이 출력용 인 표준 MVC 패턴과 는 매우 다릅니다 .
예를 들어 Ruby on Rails 보다 XSLT 와 더 비슷합니다 .
이것은 약간의 익숙해지는 제어의 근본적인 반전입니다.
JavaScript에서 애플리케이션을 구동하려고하지 마십시오. 템플릿이 응용 프로그램을 구동하게하고 AngularJS가 구성 요소를 함께 배선하도록합니다. 이것은 또한 각도 방식입니다.
시맨틱 HTML과 시맨틱 모델
jQuery를 사용하면 HTML 페이지에 의미있는 의미있는 내용이 포함되어야합니다. 사용자 또는 검색 엔진이 JavaScript를 끄면 컨텐츠에 액세스 할 수 있습니다.
AngularJS는 HTML 페이지를 템플릿으로 취급하기 때문입니다. 콘텐츠는 일반적으로 API에서 제공되는 모델에 저장되므로 템플릿은 의미가 없어야합니다. AngularJS는 DOM을 모델로 컴파일하여 시맨틱 웹 페이지를 생성합니다.
HTML 소스는 더 이상 의미가 없으며 대신 API와 컴파일 된 DOM은 의미가 있습니다.
AngularJS에서 모델에 존재 함을 의미하는 HTML은 표시 전용 템플릿 일뿐입니다.
이 시점에서 SEO 및 접근성에 관한 모든 종류의 질문 이있을 것입니다. 여기에 공개 된 문제가 있습니다. 대부분의 스크린 리더는 이제 JavaScript를 구문 분석합니다. 검색 엔진은 AJAXed 컨텐츠를 색인 할 수도 있습니다. 그럼에도 불구하고, 푸시 스테이트 URL을 사용하고 적절한 사이트 맵이 있는지 확인하고 싶을 것입니다. 문제에 대한 토론은 여기를 참조하십시오 : https : //.com/a/23245379/687677
우려 분리 (SOC) 및 MVC
우려 분리 (SOC)는 SEO, 접근성 및 브라우저 비 호환성을 포함하여 다양한 이유로 수년간 웹 개발을 통해 성장한 패턴입니다. 다음과 같이 보입니다 :
- HTML-의미 적 의미. HTML은 독립적이어야합니다.
- CSS-스타일링, CSS가 없으면 페이지를 여전히 읽을 수 있습니다.
- JavaScript-동작은 스크립트없이 내용이 유지됩니다.
다시 한 번 AngularJS는 규칙에 따라 행동하지 않습니다. 뇌졸중에서 AngularJS는 10 년간의 지혜를 버리고 대신 템플릿이 더 이상 의미가없고 조금도 의미가없는 MVC 패턴을 구현합니다.
다음과 같이 보입니다 :
- 모델-모델에 의미 데이터가 포함되어 있습니다. 모델은 일반적으로 JSON 객체입니다. 모델은 $ scope라는 객체의 속성으로 존재합니다. 템플릿에 액세스 할 수있는 편리한 유틸리티 기능을 $ scope에 저장할 수도 있습니다.
- 보기-보기가 HTML로 작성되었습니다. 데이터가 모델에 존재하므로보기는 일반적으로 의미가 없습니다.
- 컨트롤러-컨트롤러는 뷰를 모델에 연결하는 JavaScript 함수입니다. 그 기능은 $ scope를 초기화하는 것입니다. 응용 프로그램에 따라 컨트롤러를 생성하거나 생성하지 않아도됩니다. 한 페이지에 많은 컨트롤러가있을 수 있습니다.
MVC와 SOC는 같은 축척의 반대쪽 끝에 있지 않으며 완전히 다른 축에 있습니다. SOC는 AngularJS 컨텍스트에서 의미가 없습니다. 당신은 그것을 잊고 계속해야합니다.
나처럼, 당신이 브라우저 전쟁을 겪었다면,이 아이디어는 상당히 공격적 일 수 있습니다. 그만해, 그만한 가치가 있다고 약속 해
플러그인과 지시어
플러그인은 jQuery를 확장합니다. AngularJS 지시문은 브라우저의 기능을 확장합니다.
jQuery에서는 jQuery.prototype에 함수를 추가하여 플러그인을 정의합니다. 그런 다음 요소를 선택하고 결과에서 플러그인을 호출하여이를 DOM에 연결합니다. 아이디어는 jQuery의 기능을 확장하는 것입니다.
예를 들어, 페이지에 회전식 메뉴를 원하는 경우 정렬되지 않은 그림 목록 (예 : nav 요소로 묶여 있음)을 정의 할 수 있습니다. 그런 다음 페이지에서 목록을 선택하기 위해 jQuery를 작성하고 시간 초과가있는 갤러리로 슬라이딩 애니메이션을 수행하도록 스타일을 다시 지정할 수 있습니다.
AngularJS에서는 지시어를 정의합니다. 지시문은 JSON 객체를 반환하는 함수입니다. 이 객체는 AngularJS에게 어떤 DOM 요소를 찾고 어떤 변경을하는지 알려줍니다. 지시문은 사용자가 발명 한 속성 또는 요소를 사용하여 템플리트에 연결됩니다. 아이디어는 새로운 속성과 요소로 HTML의 기능을 확장하는 것입니다.
AngularJS 방식은 네이티브 HTML의 기능을 확장하는 것입니다. 사용자 정의 속성 및 요소로 확장 된 HTML처럼 보이는 HTML을 작성해야합니다.
회전 목마를 원한다면 <carousel />
요소를 사용하고 지시문을 정의하여 템플릿을 가져 와서 빨래를 작동 시키십시오.
구성 스위치가있는 많은 작은 지시문 대 큰 플러그인
jQuery의 경향은 라이트 박스와 같은 큰 플러그인을 작성하여 수많은 값과 옵션을 전달하여 구성하는 것입니다.
이것은 AngularJS의 실수입니다.
드롭 다운의 예를 보자. 드롭 다운 플러그인을 작성할 때 클릭 처리기에서 코드를 작성하려고 할 수 있습니다. 어쩌면 위 또는 아래에있는 갈매기 형에 추가하는 기능, 펼친 요소의 클래스를 변경하거나 메뉴를 숨기거나 모든 유용한 것들을 숨길 수 있습니다.
약간 변경하고 싶을 때까지
호버에서 펼치려는 메뉴가 있다고 가정하십시오. 이제 문제가 생겼습니다. 플러그인은 클릭 핸들러에 연결되어 있으며,이 특정 상황에서 다르게 작동하도록 구성 옵션을 추가해야합니다.
AngularJS에서는 더 작은 지시문을 작성합니다. 드롭 다운 지시문은 엄청나게 작습니다. 접힌 상태를 유지하고 fold (), unfold () 또는 toggle ()에 메소드를 제공 할 수 있습니다. 이 메소드는 상태를 유지하는 부울 인 $ scope.menu.visible을 간단히 업데이트합니다.
이제 템플릿에서 이를 연결할 수 있습니다.
<a ng-click="toggle()">Menu</a>
<ul ng-show="menu.visible">
...
</ul>
마우스 오버시 업데이트가 필요하십니까?
<a ng-mouseenter="unfold()" ng-mouseleave="fold()">Menu</a>
<ul ng-show="menu.visible">
...
</ul>
템플릿은 응용 프로그램을 구동하여 HTML 수준의 세분성을 얻습니다. 사례별로 예외를 적용하려는 경우 템플릿을 사용하면이를 쉽게 수행 할 수 있습니다.
마감 대 $ scope
JQuery 플러그인은 클로저에서 생성됩니다. 프라이버시는 그 폐쇄 내에서 유지됩니다. 해당 폐쇄 내에서 스코프 체인을 유지 관리하는 것은 귀하의 책임입니다. jQuery에 의해 플러그인으로 전달 된 DOM 노드 세트와 클로저에 정의 된 모든 로컬 변수 및 정의한 전역 변수에만 액세스 할 수 있습니다. 이것은 플러그인이 자체 포함되어 있음을 의미합니다. 이것은 좋은 일이지만 전체 응용 프로그램을 만들 때 제한을받을 수 있습니다. 동적 페이지의 섹션간에 데이터를 전달하려고하면 문제가됩니다.
AngularJS에는 $ scope 객체가 있습니다. 이들은 모델을 저장하는 AngularJS에 의해 생성 및 유지 관리되는 특수 객체입니다. 특정 지시문은 기본적으로 JavaScript 프로토 타입 상속을 사용하여 $ scope를 래핑하여 상속하는 새로운 $ scope를 생성합니다. $ scope 객체는 컨트롤러와보기에서 액세스 할 수 있습니다.
이것은 영리한 부분입니다. $ scope 상속의 구조는 대략 DOM의 구조를 따르기 때문에 요소는 전역 $ scope (전역 범위와 동일하지 않음)까지 자체 범위 및 포함 범위에 완벽하게 액세스 할 수 있습니다.
이를 통해 데이터를보다 쉽게 전달하고 적절한 수준으로 데이터를 저장할 수 있습니다. 드롭 다운이 펼쳐지면 $ scope 만 알면됩니다. 사용자가 기본 설정을 업데이트하면 전역 $ scope를 업데이트 할 수 있으며 사용자 기본 설정을 수신하는 중첩 된 범위에 자동으로 경고됩니다.
실제로 복잡한 것처럼 들리면 일단 긴장을 풀면 마치 비행하는 것과 같습니다. $ scope 객체를 만들 필요가 없습니다. AngularJS는 템플릿 계층 구조에 따라 적절하고 적절하게 인스턴스화하고 구성합니다. 그런 다음 AngularJS는 의존성 주입의 마법을 사용하여 구성 요소에서 사용할 수 있습니다 (나중에 자세히 설명).
수동 DOM 변경과 데이터 바인딩
jQuery에서는 모든 DOM을 수동으로 변경합니다. 프로그래밍 방식으로 새 DOM 요소를 생성합니다. JSON 배열이 있고이를 DOM에 넣으려면 HTML을 생성하고 삽입하는 함수를 작성해야합니다.
AngularJS 에서도이 작업을 수행 할 수 있지만 데이터 바인딩을 사용하는 것이 좋습니다. 모델을 변경하십시오. DOM은 템플릿을 통해 모델에 바인딩되므로 DOM이 자동으로 업데이트되며 개입 할 필요가 없습니다.
데이터 바인딩은 속성 또는 중괄호 구문을 사용하여 템플릿에서 수행되므로 매우 쉽습니다. 인지적인 오버 헤드가 적기 때문에 항상 자신이 할 수 있습니다.
<input ng-model="user.name" />
입력 요소를에 바인딩합니다 $scope.user.name
. 입력을 업데이트하면 현재 범위의 값이 업데이트되고 그 반대도 마찬가지입니다.
마찬가지로:
<p>
{{user.name}}
</p>
단락에서 사용자 이름을 출력합니다. 라이브 바인딩이므로 $scope.user.name
값이 업데이트되면 템플릿도 업데이트됩니다.
항상 아약스
jQuery에서 Ajax 호출은 매우 간단하지만 여전히 두 번 생각할 수도 있습니다. 추가로 고려해야 할 복잡성과 유지해야 할 스크립트가 있습니다.
AngularJS에서 Ajax는 기본 이동 솔루션이며 거의 눈치 채지 않고 항상 발생합니다. ng-include와 함께 템플릿을 포함 할 수 있습니다. 가장 간단한 사용자 지정 지시문을 사용하여 템플릿을 적용 할 수 있습니다. 서비스에서 Ajax 호출을 래핑하고 GitHub 서비스 또는 Flickr 서비스를 직접 만들 수 있습니다.
서비스 객체와 도우미 함수
jQuery에서 API에서 피드를 가져 오는 것과 같은 작은 비 DOM 관련 작업을 수행하려는 경우 클로저에서이를 수행하는 작은 함수를 작성할 수 있습니다. 유효한 솔루션이지만 해당 피드에 자주 액세스하려면 어떻게해야합니까? 다른 응용 프로그램에서 해당 코드를 재사용하려면 어떻게해야합니까?
AngularJS는 서비스 객체를 제공합니다.
서비스는 함수와 데이터를 포함하는 간단한 개체입니다. 그것들은 항상 싱글 톤이므로 둘 이상을 가질 수 없습니다. Stack Overflow API에 액세스하고 싶다고 가정 해 봅시다 StackOverflowService
.
장바구니가 있다고 가정 해 봅시다. 장바구니를 유지하고 품목을 추가 및 제거하기위한 메소드를 포함하는 ShoppingCartService를 정의 할 수 있습니다. 서비스는 싱글 톤이며 다른 모든 구성 요소와 공유되므로 쇼핑 카트에 쓰고 데이터를 가져올 수있는 모든 개체입니다. 항상 같은 카트입니다.
서비스 객체는 자체 포함 된 AngularJS 구성 요소로, 적합하다고 생각하면 재사용하고 사용할 수 있습니다. 함수와 데이터를 포함하는 간단한 JSON 객체입니다. 이들은 항상 싱글 톤이므로 서비스에 데이터를 한 곳에 저장하면 동일한 서비스를 요청하여 해당 데이터를 다른 곳으로 가져올 수 있습니다.
의존성 주입 (DI) vs. 인스톨레이션-일명 De-spaghettification
AngularJS는 당신을 위해 당신의 의존성을 관리합니다. 객체를 원하면 간단히 참조하면 AngularJS가 객체를 가져옵니다.
이것을 사용하기 시작할 때까지 이것이 얼마나 큰 시간인지 설명하기는 어렵습니다. AngularJS DI와 같은 것은 jQuery 안에 없습니다.
DI는 애플리케이션을 작성하고 함께 배선하는 대신 각각 문자열로 식별되는 구성 요소 라이브러리를 정의 함을 의미합니다.
Flickr에서 JSON 피드를 가져 오는 메소드를 정의하는 'FlickrService'라는 구성 요소가 있다고 가정하겠습니다. 이제 Flickr에 액세스 할 수있는 컨트롤러를 작성하려면 컨트롤러를 선언 할 때 이름으로 'FlickrService'를 참조하면됩니다. AngularJS는 구성 요소를 인스턴스화하고 내 컨트롤러에서 사용할 수 있도록 관리합니다.
예를 들어 여기에 서비스를 정의합니다.
myApp.service('FlickrService', function() {
return {
getFeed: function() { // do something here }
}
});
이제 해당 서비스를 사용하려면 다음과 같이 이름으로 참조하십시오.
myApp.controller('myController', ['FlickrService', function(FlickrService) {
FlickrService.getFeed()
}]);
AngularJS는 컨트롤러를 인스턴스화하기 위해 FlickrService 객체가 필요하다는 것을 인식하고 우리에게 제공 할 것입니다.
이로 인해 배선이 매우 쉬워지고 파쇄 경향을 거의 제거 할 수 있습니다. 우리는 간단한 컴포넌트 목록을 가지고 있으며, AngularJS는 필요할 때마다 하나씩 우리에게 전달합니다.
모듈 식 서비스 아키텍처
jQuery는 코드를 구성하는 방법에 대해 거의 이야기하지 않습니다. AngularJS는 의견이 있습니다.
AngularJS는 코드를 넣을 수있는 모듈을 제공합니다. 예를 들어 Flickr와 대화하는 스크립트를 작성하는 경우 Flickr 모듈을 작성하여 모든 Flickr 관련 기능을 래핑 할 수 있습니다. 모듈에는 다른 모듈 (DI)이 포함될 수 있습니다. 기본 응용 프로그램은 일반적으로 모듈이며 여기에는 응용 프로그램이 의존 할 다른 모든 모듈이 포함되어야합니다.
Flickr 기반의 다른 응용 프로그램을 작성하려면 간단한 코드 재사용이 가능합니다. Flickr 모듈과 voila 만 포함하면 새 응용 프로그램의 모든 Flickr 관련 기능에 액세스 할 수 있습니다.
모듈에는 AngularJS 구성 요소가 포함되어 있습니다. 모듈을 포함 시키면 해당 모듈의 모든 구성 요소가 고유 한 문자열로 식별되는 간단한 목록으로 제공됩니다 . 그런 다음 AngularJS의 의존성 주입 메커니즘을 사용하여 이러한 구성 요소를 서로 주입 할 수 있습니다.
요약하자면
AngularJS와 jQuery는 적이 아닙니다. AngularJS 내에서 jQuery를 매우 잘 사용할 수 있습니다. AngularJS를 잘 사용하고 있다면 (템플릿, 데이터 바인딩, $ scope, 지시문 등) 필요한 경우 보다 훨씬 적은 jQuery가 필요하다는 것을 알 수 있습니다.
가장 중요한 사실은 템플릿이 응용 프로그램을 구동한다는 것입니다. 모든 것을하는 큰 플러그인을 작성하려고하지 마십시오. 대신 한 가지 작업을 수행하는 작은 지시문을 작성한 다음 간단한 템플릿을 작성하여 연결하십시오.
눈에 잘 띄지 않는 JavaScript에 대해서는 생각하지 말고 대신 HTML 확장에 대해 생각하십시오.
내 작은 책
나는 AngularJS에 대해 너무 흥분해서, 당신은 온라인 http://nicholasjohnson.com/angular-book/ 을 읽을 수있는 짧은 책을 썼습니다 . 도움이 되길 바랍니다.