AngularJS ทำอะไรได้ดีกว่า jQuery [ปิด]


168

ฉันได้ใช้ไลบรารี jQuery เป็นหลักและเพิ่งเริ่มใช้ AngularJS ฉันได้อ่านบทแนะนำเกี่ยวกับวิธีการการใช้ Angular แต่ฉันยังไม่ชัดเจนว่าทำไมหรือเมื่อไรที่จะใช้หรือสิ่งที่มีประโยชน์เมื่อเปรียบเทียบกับการใช้ jQuery

สำหรับฉันแล้ว Angular ทำให้คุณคิดว่า MVC ซึ่งอาจหมายความว่าคุณดูหน้าเว็บของคุณเป็นชุดข้อมูล + แม่แบบ คุณใช้{{data bindings}}ทุกครั้งที่คุณรู้สึกว่ามีข้อมูลแบบไดนามิก Angular จะให้ตัวจัดการ $ scope ซึ่งคุณสามารถเติมข้อมูลแบบสแตติกหรือผ่านการเรียกไปยังเว็บเซิร์ฟเวอร์ สิ่งนี้จะมีลักษณะคล้ายกับวิธีการออกแบบหน้าเว็บของ JSP ฉันต้องการ Angular สำหรับสิ่งนี้หรือไม่?

สำหรับการจัดการ DOM แบบง่าย ๆ ซึ่งไม่เกี่ยวข้องกับการจัดการข้อมูล (เช่นการเปลี่ยนสีของ mousehover การซ่อน / แสดงองค์ประกอบเมื่อคลิก) jQuery หรือ vanilla JS นั้นเพียงพอและสะอาดกว่า นี้อนุมานว่ารูปแบบในมุมของMVCเป็นสิ่งที่สะท้อนให้เห็นถึงข้อมูลเกี่ยวกับหน้าและด้วยเหตุนี้คุณสมบัติ CSS เช่นสี, การแสดง / ซ่อน ฯลฯ การเปลี่ยนแปลงไม่ได้ส่งผลกระทบต่อรูปแบบ Angular มีข้อดีมากกว่า jQuery หรือ vanilla JS สำหรับ DOM หรือไม่

Angular ทำอะไรได้บ้างที่ทำให้มีประโยชน์สำหรับการพัฒนาเปรียบเทียบกับ jQuery ที่สามารถทำกับปลั๊กอินได้


13
ฉันขอแนะนำให้ตรวจสอบโพสต์ที่ยอดเยี่ยมนี้: stackoverflow.com/questions/14994391/…
Anthony

ก่อนที่จะเปิดการโหวตอีกครั้งคุณควรอ่านการอภิปรายเมตาเกี่ยวกับคำถามนี้: meta.stackoverflow.com/questions/277773/…
cimmanon

สำเนาที่เป็นไปได้ของสิ่งนี้: stackoverflow.com/questions/14994391/…
superluminary

คำตอบ:


274

การผูกข้อมูล

คุณทำการสร้างเว็บเพจของคุณและวาง {{data bindings}} ต่อไปทุกครั้งที่คุณรู้สึกว่ามีข้อมูลแบบไดนามิก Angular จะให้ตัวจัดการ $ scope ซึ่งคุณสามารถเติม (แบบคงที่หรือผ่านการเรียกไปยังเว็บเซิร์ฟเวอร์)

นี่เป็นความเข้าใจที่ดีของการเชื่อมโยงข้อมูล ฉันคิดว่าคุณผิดพลาดแล้ว

การจัดการ DOM

สำหรับการจัดการ DOM อย่างง่ายซึ่งไม่เกี่ยวข้องกับการจัดการข้อมูล (เช่นการเปลี่ยนสีใน mousehover การซ่อน / แสดงองค์ประกอบเมื่อคลิก) jQuery หรือ js โรงเรียนเก่านั้นเพียงพอและสะอาดกว่า สิ่งนี้อนุมานว่าโมเดลใน mvc ของแองกูลาร์เป็นอะไรที่สะท้อนข้อมูลในหน้าและด้วยเหตุนี้คุณสมบัติ css เช่นสีการแสดง / ซ่อน ฯลฯ การเปลี่ยนแปลงจะไม่มีผลกับโมเดล

ฉันเห็นจุดของคุณที่นี่เกี่ยวกับการจัดการ DOM แบบ "เรียบง่าย" ที่สะอาดกว่า แต่ไม่ค่อยบ่อยและมันจะต้อง "ง่าย" จริงๆ ฉันคิดว่าการจัดการ DOM เป็นหนึ่งในพื้นที่เช่นเดียวกับการผูกข้อมูลซึ่ง Angular ส่องแสงจริงๆ การเข้าใจสิ่งนี้จะช่วยให้คุณเห็นว่า Angular พิจารณามุมมองอย่างไร

ฉันจะเริ่มต้นด้วยการเปรียบเทียบวิธีเชิงมุมกับแนวทางวานิลลา js กับการจัดการ DOM ตามเนื้อผ้าเราคิดว่า HTML ไม่ใช่ "ทำอะไร" และเขียนเช่นนั้น ดังนั้นอินไลน์ js เช่น "onclick" ฯลฯ เป็นแนวปฏิบัติที่ไม่ดีเพราะพวกเขาวาง "กำลังทำ" ในบริบทของ HTML ซึ่งไม่ได้ "ทำ" พลิกมุมที่แนวคิดบนหัวของมัน เมื่อคุณเขียนมุมมองคุณคิดว่า HTML สามารถ "ทำ" สิ่งต่างๆมากมาย ความสามารถนี้ถูกแยกออกไปในคำสั่งเชิงมุม แต่ถ้ามันมีอยู่แล้วหรือคุณเขียนมันขึ้นมาคุณไม่จำเป็นต้องพิจารณาว่ามันทำอย่างไรคุณแค่ใช้พลังที่มีให้คุณใน HTML ที่เพิ่มขึ้นนี้ เชิงมุมช่วยให้คุณใช้ นอกจากนี้ยังหมายความว่าตรรกะการดูทั้งหมดของคุณมีอยู่ในมุมมองอย่างแท้จริง ไม่ได้อยู่ในไฟล์จาวาสคริปต์ของคุณ อีกครั้งเหตุผลก็คือคำสั่งที่เขียนในไฟล์จาวาสคริปต์ของคุณอาจถูกพิจารณาว่าเป็นการเพิ่มขีดความสามารถของ HTML ดังนั้นคุณจึงให้ DOM กังวลเกี่ยวกับการจัดการตัวเอง (เพื่อพูด) ฉันจะสาธิตด้วยตัวอย่างง่ายๆ

นี่คือมาร์กอัปที่เราต้องการใช้ ฉันให้ชื่อที่เข้าใจง่าย

<div rotate-on-click="45"></div>

ครั้งแรกผมต้องการเพียงเพื่อแสดงความคิดเห็นว่าถ้าเราได้รับ HTML ของเราทำงานนี้ผ่านทางที่กำหนดเองเชิงมุมสั่งที่เรากำลังทำอยู่แล้ว นั่นคือลมหายใจของอากาศบริสุทธิ์ เพิ่มเติมเกี่ยวกับที่ในสักครู่

การใช้งานกับ jQuery

การสาธิตสดที่นี่ (คลิก)

function rotate(deg, elem) {
  $(elem).css({
    webkitTransform: 'rotate('+deg+'deg)', 
    mozTransform: 'rotate('+deg+'deg)', 
    msTransform: 'rotate('+deg+'deg)', 
    oTransform: 'rotate('+deg+'deg)', 
    transform: 'rotate('+deg+'deg)'    
  });
}

function addRotateOnClick($elems) {
  $elems.each(function(i, elem) {
    var deg = 0;
    $(elem).click(function() {
      deg+= parseInt($(this).attr('rotate-on-click'), 10);
      rotate(deg, this);
    });
  });
}

addRotateOnClick($('[rotate-on-click]'));

การดำเนินการกับเชิงมุม

การสาธิตสดที่นี่ (คลิก)

app.directive('rotateOnClick', function() {
  return {
    restrict: 'A',
    link: function(scope, element, attrs) {
      var deg = 0;
      element.bind('click', function() {
        deg+= parseInt(attrs.rotateOnClick, 10);
        element.css({
          webkitTransform: 'rotate('+deg+'deg)', 
          mozTransform: 'rotate('+deg+'deg)', 
          msTransform: 'rotate('+deg+'deg)', 
          oTransform: 'rotate('+deg+'deg)', 
          transform: 'rotate('+deg+'deg)'    
        });
      });
    }
  };
});

ค่อนข้างเบาสะอาดมากและนั่นเป็นเพียงการจัดการที่ง่าย! ในความคิดของฉันวิธีการเชิงมุมชนะในทุกเรื่องโดยเฉพาะอย่างยิ่งวิธีการทำงานที่เป็นนามธรรมออกไปและมีการประกาศการจัดการ dom ใน DOM ฟังก์ชั่นนั้นติดอยู่กับองค์ประกอบผ่านทางแอตทริบิวต์ html ดังนั้นจึงไม่จำเป็นต้องค้นหา DOM ผ่านตัวเลือกและเรามีการปิดที่ดีสองครั้ง - ปิดหนึ่งครั้งสำหรับโรงงานคำสั่งที่มีการใช้ตัวแปรร่วมกันในทุกคำสั่ง และหนึ่งการปิดสำหรับแต่ละการใช้คำสั่งในlinkฟังก์ชั่น (หรือcompileฟังก์ชั่น)

การเชื่อมโยงข้อมูลแบบสองทางและคำสั่งสำหรับการจัดการ DOM เป็นเพียงจุดเริ่มต้นของสิ่งที่ทำให้ Angular ยอดเยี่ยม Angular ส่งเสริมรหัสทั้งหมดเป็นแบบแยกส่วนนำมาใช้ใหม่และทดสอบได้ง่ายและยังมีระบบการกำหนดเส้นทางแอปหน้าเดียว เป็นสิ่งสำคัญที่จะต้องทราบว่า jQuery เป็นห้องสมุดของวิธีการอำนวยความสะดวก / ข้ามเบราว์เซอร์ที่ต้องการโดยทั่วไป แต่ Angular เป็นเฟรมเวิร์กที่มีคุณสมบัติครบถ้วนสำหรับการสร้างแอปหน้าเดียว สคริปต์เชิงมุมประกอบด้วย jQuery เวอร์ชัน "lite" ของตัวเองเพื่อให้วิธีการที่สำคัญที่สุดบางอย่างพร้อมใช้งาน ดังนั้นคุณอาจโต้แย้งว่าการใช้ Angular IS ใช้ jQuery (เบา) แต่ Angular ให้ "เวทมนต์" มากขึ้นเพื่อช่วยคุณในกระบวนการสร้างแอป

นี่เป็นโพสต์ที่ยอดเยี่ยมสำหรับข้อมูลที่เกี่ยวข้องเพิ่มเติม: ฉันจะ“ คิดใน AngularJS” ได้อย่างไรถ้าฉันมีพื้นหลัง jQuery

ความแตกต่างทั่วไป

ประเด็นข้างต้นมุ่งเป้าไปที่ข้อกังวลเฉพาะของ OP ฉันจะให้ภาพรวมของความแตกต่างที่สำคัญอื่น ๆ ฉันขอแนะนำให้อ่านเพิ่มเติมเกี่ยวกับแต่ละหัวข้อด้วย

ไม่สามารถเปรียบเทียบเชิงมุมกับ jQuery ได้

Angular เป็นเฟรมเวิร์ก jQuery เป็นไลบรารี กรอบมีที่ของพวกเขาและห้องสมุดมีที่ของพวกเขา อย่างไรก็ตามไม่มีคำถามว่ากรอบงานที่ดีมีพลังในการเขียนแอปพลิเคชันมากกว่าห้องสมุด นั่นคือจุดของกรอบ คุณยินดีที่จะเขียนโค้ดของคุณใน JS ธรรมดาหรือคุณสามารถเพิ่มในไลบรารีของฟังก์ชั่นทั่วไปหรือคุณสามารถเพิ่มกรอบการทำงานเพื่อลดรหัสที่คุณต้องการในการทำสิ่งต่างๆให้สำเร็จ ดังนั้นคำถามที่เหมาะสมกว่าคือ:

ทำไมต้องใช้เฟรมเวิร์ก

เฟรมเวิร์กที่ดีสามารถช่วยออกแบบโค้ดของคุณเพื่อให้เป็นแบบแยกส่วน (ดังนั้นสามารถใช้ซ้ำได้), DRY, สามารถอ่านได้, มีประสิทธิภาพ jQuery ไม่ใช่เฟรมเวิร์กดังนั้นจึงไม่ช่วยในเรื่องนี้ เราทุกคนเห็นกำแพงทั่วไปของรหัสสปาเก็ตตี้ jQuery นี่ไม่ใช่ความผิดของ jQuery - เป็นความผิดของนักพัฒนาที่ไม่ทราบวิธีการออกแบบรหัส อย่างไรก็ตามหาก devs รู้วิธีการออกแบบรหัสพวกเขาจะต้องเขียน "framework" ที่น้อยที่สุดเพื่อให้พื้นฐาน (achitecture และอื่น ๆ ) ที่ฉันพูดถึงเมื่อไม่นานมานี้หรือพวกเขาจะเพิ่มบางสิ่งบางอย่างเข้ามาเช่นคุณ อาจเพิ่ม RequireJS เพื่อทำหน้าที่เป็นส่วนหนึ่งของกรอบงานของคุณสำหรับการเขียนโค้ดที่ดี

นี่คือบางสิ่งที่กรอบการทำงานสมัยใหม่ให้บริการ:

  • templating
  • การผูกข้อมูล
  • การกำหนดเส้นทาง (แอปหน้าเดียว)
  • สถาปัตยกรรมแบบโมดูลาร์ที่สะอาดและนำกลับมาใช้ซ้ำได้
  • ความปลอดภัย
  • ฟังก์ชั่น / คุณสมบัติเพิ่มเติมเพื่อความสะดวก

ก่อนที่ฉันจะพูดคุยเกี่ยวกับ Angular ต่อไปฉันอยากจะชี้ให้เห็นว่า Angular ไม่ใช่คนเดียว ตัวอย่างเช่น Durandal เป็นกรอบงานที่สร้างขึ้นจาก jQuery, Knockout และ RequireJS อีกครั้ง jQuery ไม่สามารถจัดเตรียมสิ่งที่น่าพิศวง, RequireJS และกรอบทั้งหมดที่สร้างไว้ด้านบน มันไม่เทียบเท่า

หากคุณต้องการทำลายดาวเคราะห์และคุณมีดาวมรณะให้ใช้ดาวมรณะ

เชิงมุม (มาเยือน)

จากจุดก่อนหน้านี้ของฉันเกี่ยวกับกรอบการทำงานที่มีให้ฉันอยากจะยกย่องวิธีที่ Angular ให้พวกเขาและพยายามอธิบายว่าทำไมเรื่องนี้ถึงสำคัญกว่า jQuery เพียงอย่างเดียว

การอ้างอิง DOM

ในตัวอย่างด้านบนของฉันมันหลีกเลี่ยงไม่ได้อย่างแน่นอนที่ jQuery ต้องขอเข้า DOM เพื่อให้สามารถใช้งานได้ ซึ่งหมายความว่ามุมมอง (html) เกี่ยวข้องกับการทำงาน (เพราะมีป้ายกำกับที่มีตัวระบุบางอย่างเช่น "ตัวเลื่อนภาพ") และ JavaScript มีความกังวลเกี่ยวกับการให้บริการการทำงานนั้น เชิงมุมกำจัดแนวคิดดังกล่าวผ่านทางนามธรรม โค้ดที่ถูกเขียนอย่างเหมาะสมด้วย Angular หมายความว่ามุมมองนั้นสามารถประกาศพฤติกรรมของตนเองได้ ถ้าฉันต้องการที่จะแสดงนาฬิกา:

<clock></clock>

เสร็จสิ้น

ใช่เราต้องไปที่ JavaScript เพื่อทำให้สิ่งนั้นมีความหมาย แต่เรากำลังทำสิ่งนี้ในลักษณะตรงกันข้ามกับวิธี jQuery คำสั่งเชิงมุมของเรา (ซึ่งอยู่ในโลกเล็ก ๆ ของตัวเอง) มี "augumented" html และ html ที่เชื่อมโยงการทำงานเข้ากับตัวมันเอง

Architecure MVW / โมดูล / การพึ่งพาการฉีด

เชิงมุมช่วยให้คุณสามารถจัดโครงสร้างโค้ดของคุณได้อย่างตรงไปตรงมา ดูสิ่งต่าง ๆ ที่อยู่ในมุมมอง (html) ฟังก์ชันการทำงานของมุมมองที่เพิ่มขึ้นอยู่ในคำสั่งตรรกะอื่น ๆ (เช่นการโทร ajax) และฟังก์ชันที่อยู่ในบริการและการเชื่อมต่อบริการและตรรกะกับมุมมองนั้นอยู่ในตัวควบคุม มีองค์ประกอบเชิงมุมอื่น ๆ เช่นกันที่ช่วยจัดการกับการกำหนดค่าและการปรับเปลี่ยนการบริการ ฯลฯ ฟังก์ชั่นใด ๆ ที่คุณสร้างขึ้นสามารถใช้ได้โดยอัตโนมัติทุกที่ที่คุณต้องการผ่านระบบย่อย Injector ซึ่งดูแลการฉีดพึ่งพาตลอดทั้งแอปพลิเคชัน เมื่อเขียนแอปพลิเคชัน (โมดูล) ฉันจะแบ่งมันเป็นโมดูลที่สามารถนำกลับมาใช้ใหม่ได้แต่ละตัวมีองค์ประกอบที่ใช้ซ้ำได้ของตัวเองแล้วรวมไว้ในโครงการที่ใหญ่กว่า เมื่อคุณแก้ปัญหากับ Angular แล้วคุณจะ แก้ไขโดยอัตโนมัติในวิธีที่มีประโยชน์และจัดโครงสร้างเพื่อนำมาใช้ใหม่ในอนาคตและรวมไว้ในโครงการถัดไปได้อย่างง่ายดาย ขนาดใหญ่โบนัสทั้งหมดนี้คือรหัสของคุณจะง่ายขึ้นในการทดสอบ

การทำสิ่งต่าง ๆ เป็น "งาน" ในเชิงมุมไม่ใช่เรื่องง่าย

ขอบคุณพระเจ้า. รหัสสปาเก็ตตี้ jQuery ดังกล่าวเป็นผลมาจาก dev ที่ทำบางสิ่งบางอย่าง "ทำงาน" แล้วย้ายไป คุณสามารถเขียนโค้ด Angular ที่ไม่ดี แต่มันยากกว่ามากที่จะทำเช่นนั้นเพราะ Angular จะต่อสู้กับคุณ ซึ่งหมายความว่าคุณต้องใช้ประโยชน์ (อย่างน้อยบ้าง) กับสถาปัตยกรรมที่สะอาดที่มีให้ กล่าวอีกนัยหนึ่งเป็นการยากที่จะเขียนโค้ดที่ไม่ดีด้วย Angular แต่สะดวกกว่าในการเขียนโค้ดที่สะอาด

เชิงมุมอยู่ไกลจากความสมบูรณ์แบบ โลกการพัฒนาเว็บมีการเติบโตและเปลี่ยนแปลงอยู่ตลอดเวลาและมีวิธีการใหม่ ๆ ที่ดีกว่าในการแก้ปัญหา ยกตัวอย่างเช่น React and Flux ของ Facebook มีข้อได้เปรียบเหนือ Angular แต่มีข้อเสียของตัวเอง ไม่มีอะไรสมบูรณ์แบบ แต่ Angular ได้รับและยังยอดเยี่ยมสำหรับตอนนี้ เช่นเดียวกับ jQuery ที่ครั้งหนึ่งเคยช่วยให้เว็บโลกก้าวไปข้างหน้าดังนั้น Angular จึงมีหลายอย่างที่จะตามมา


1
อีกเหตุผลหนึ่งก็คือคำสั่งและการเชื่อมโยงเชิงมุมคือ ประกาศแทนการผสมรหัสimparativeเข้ากับมุมมองของคุณ
Jess

1
วิธีที่ดีกว่าคือการใช้คำสั่งrotation="thisRotation"และมีตัวแปรที่กำหนดการหมุน จากนั้นคุณต้องเปลี่ยนตัวแปรเมื่อใดก็ตามที่คุณต้องการเปลี่ยนการหมุน จากนั้นคุณสามารถเพิ่มng-click="thisRotation = 45"สิ่งนี้ให้ความยืดหยุ่นที่คุณไม่เคยมีกับ JQuery
บาปθ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.