ฉันควรใช้ Inline vs. External Javascript เมื่อใด


129

ฉันต้องการทราบว่าเมื่อใดที่ฉันควรรวมสคริปต์ภายนอกหรือเขียนไว้ในบรรทัดด้วยโค้ด html ในแง่ของประสิทธิภาพและความสะดวกในการบำรุงรักษา

การปฏิบัติทั่วไปสำหรับสิ่งนี้คืออะไร?

สถานการณ์ในโลกแห่งความจริง - ฉันมีเพจ html หลายเพจที่ต้องการการตรวจสอบความถูกต้องของฟอร์มฝั่งไคลเอ็นต์ สำหรับสิ่งนี้ฉันใช้ปลั๊กอิน jQuery ที่ฉันรวมไว้ในหน้าเหล่านี้ทั้งหมด แต่คำถามคือฉันจะ:

  • เขียนบิตของโค้ดที่กำหนดค่าสคริปต์นี้แบบอินไลน์?
  • รวมบิตทั้งหมดในไฟล์เดียวที่ใช้ร่วมกันระหว่างหน้า html เหล่านี้หรือไม่
  • รวมแต่ละบิตในไฟล์ภายนอกที่แยกต่างหากหนึ่งรายการสำหรับแต่ละหน้า html?

ขอบคุณ

คำตอบ:


114

ในขณะที่คำตอบนี้ถูกโพสต์ครั้งแรก (2008) กฎนั้นง่ายมากสคริปต์ทั้งหมดควรเป็นภายนอก ทั้งสำหรับการบำรุงรักษาและประสิทธิภาพ

(ทำไมต้องมีประสิทธิภาพเพราะถ้าโค้ดแยกจากกันเบราว์เซอร์จะแคชได้ง่ายกว่า)

จาวาสคริปต์ไม่ได้อยู่ในโค้ด HTML และถ้ามันมีอักขระพิเศษ (เช่น<, >) มันก็สร้างปัญหา

ปัจจุบันความสามารถในการปรับขนาดเว็บเปลี่ยนไป การลดจำนวนคำขอกลายเป็นการพิจารณาที่ถูกต้องเนื่องจากเวลาแฝงของการสร้างคำขอ HTTP หลายรายการ สิ่งนี้ทำให้คำตอบซับซ้อนขึ้น: ในกรณีส่วนใหญ่ยังคงแนะนำให้ใช้ JavaScript ภายนอก แต่สำหรับบางกรณีโดยเฉพาะโค้ดชิ้นเล็ก ๆ การแทรกโค้ดเหล่านี้ลงใน HTML ของไซต์ก็สมเหตุสมผลดี


6
@ นิค: ปัญหาส่วนใหญ่สามารถเอาชนะได้ ดีกว่าที่จะไม่สร้างมันตั้งแต่แรก
Konrad Rudolph

17
บางครั้งคุณจะได้รับประสิทธิภาพที่ดีขึ้นเมื่อซับใน ดูแหล่งที่มาของgoogle.com พวกเขารู้ว่ากำลังทำอะไร
callum

13
@callum Google มีกรณีการใช้งานที่แตกต่างจาก 99.999999% ของเว็บไซต์ แน่นอนว่าพวกเขาวัดอย่างระมัดระวังอย่างยิ่งและแม้แต่ความแตกต่างที่เล็กที่สุดก็สำคัญ แต่เพียงเพราะพวกเขาพบว่าในกรณีการใช้งานเฉพาะของพวกเขาการซับในทำงานได้ดีขึ้น (อาจเป็นเพราะสคริปต์มีการเปลี่ยนแปลงบ่อยมาก?) ไม่ได้หมายความว่าเราจะได้รับกฎทั่วไปจากสิ่งนั้นหรือแม้กระทั่งว่าเราควรเพิกเฉยต่อ "แบบแผน" กฎ (เพื่อภายนอกสคริปต์)
Konrad Rudolph

8
@KonradRudolph - ตกลงกันว่าไม่มีกฎทั่วไปควรมาจากแนวทางของ Google ฉันแค่บอกว่าเป็นคำใบ้ว่าคุณควรตั้งคำถามกับกฎในคำตอบของคุณ อย่างไรก็ตามฉันคิดว่าเหตุผลที่ Google ทำคือลดคำขอ HTTP และอาจเป็นประโยชน์ต่อไซต์มากกว่า 0.000001% แบนด์วิดท์สูงขึ้น แต่เวลาไปกลับยังคงเท่าเดิม การลบคำขอ HTTP แบบอนุกรมทั้งหมดในบางครั้งจะดีกว่าประโยชน์การแคชของ JS ภายนอก ขึ้นอยู่กับขนาดของ JS ของคุณแน่นอน
callum

5
@callum แม้ว่าจะเป็นเรื่องจริง แต่ประเด็นเกี่ยวกับการแคชยังคงอยู่และยังคงมีความสำคัญ การลด Roundtrips มีความสำคัญก็ต่อเมื่อผู้เยี่ยมชมของคุณไม่กลับมา (และคุณจะไม่ได้รับการเข้าชมหน้าเว็บมากพอที่จะทำให้เรื่องนี้มีความสำคัญ) หรือหากเนื้อหาของคุณเปลี่ยนแปลงบ่อยจนการแคชไฟล์สคริปต์จะไม่มีประโยชน์
Konrad Rudolph

31

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

โดยปกติแล้วทั้งหมดนี้จะไม่เกี่ยวข้องในขณะที่โค้ดของคุณยาวเกินสองสามบรรทัดและไม่ได้เจาะจงไปที่หน้าเดียว ช่วงเวลาที่คุณต้องการนำรหัสนั้นกลับมาใช้ใหม่ให้สร้างเป็นรหัสภายนอก หากไม่เป็นเช่นนั้นให้ดูขนาดของมันแล้วตัดสินใจ


5
นั่นเป็นหนึ่งในความกังวลของฉัน การขอ HTTP แยกต่างหากสำหรับรหัสสองสามบรรทัดดูเหมือนจะสิ้นเปลือง
Dan Burzo

คุณอาจโพสต์ตัวอย่างการกำหนดค่าโค้ดของคุณได้ไหม IMO หากมีความยาวไม่เกิน 300 อักขระและเจาะจงหน้าให้สอดแทรกไว้
Horst Gutmann

นี่น่าจะเป็นคำตอบยอดนิยม imo
sgarcia.dev

@ Dan จำไว้ว่าคำขอแยกกันเกิดขึ้นในครั้งแรกเท่านั้น หากคุณคาดว่าผู้ใช้ของคุณจะโหลดหน้าเว็บมากกว่าหนึ่งครั้งแคชภายนอก (แม้จะมีไม่กี่บรรทัด) จะเร็วกว่าการรอไบต์สำหรับสองสามบรรทัดผ่านสายบนการโหลดหน้า n = 2 +
jinglesthula

@HorstGutmann จะมีความช่วยเหลือภายนอกไฟล์ที่มีการบำรุงรักษาอย่างไร โดยส่วนตัวแล้วฉันชอบ js ภายนอกทุกครั้งที่เป็นไปได้ แต่มีวัตถุประสงค์อะไรที่ทำให้ง่ายต่อการบำรุงรักษาหรือไม่?
jinglesthula

21

การทำให้จาวาสคริปต์ภายนอกเป็นหนึ่งในกฎประสิทธิภาพของ yahoo: http://developer.yahoo.com/performance/rules.html#external

แม้ว่ากฎที่ยากและรวดเร็วที่คุณควรทำให้สคริปต์ภายนอกอยู่เสมอจะเป็นทางออกที่ดีในบางกรณีคุณอาจต้องการแทรกสคริปต์และสไตล์บางส่วนไว้ในบรรทัด อย่างไรก็ตามคุณควรรู้เฉพาะสิ่งที่คุณรู้เท่านั้นที่จะช่วยเพิ่มประสิทธิภาพ (เพราะคุณได้วัดสิ่งนี้)


1
ฉันคิดว่า Yahoo แนะนำให้เพิ่ม Javascript ทั้งหมดลงในการเรียก HTTP ด้วยเช่นกันซึ่งไม่ได้หมายความว่าสคริปต์ทั้งหมดควรอยู่ในไฟล์เดียวกันระหว่างการพัฒนา
Paul Shannon

นอกจากนี้ตามที่ระบุไว้ข้างต้น HTTP / 2 จะเปลี่ยนแนวปฏิบัติ "1 call" ด้วย
jinglesthula

19

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

เพื่อให้ได้ประสิทธิภาพสูงสุดคุณต้องคิดว่าเพจเป็นจรวดสองขั้นตอน ทั้งสองขั้นตอนประมาณสอดคล้องกับการ<head>และ<body>ขั้นตอน แต่คิดว่าพวกเขาแทนที่จะเป็นและ<static> <dynamic>ส่วนคงที่โดยพื้นฐานแล้วเป็นค่าคงที่ของสตริงที่คุณดันท่อตอบสนองให้เร็วที่สุดเท่าที่จะทำได้ อาจเป็นเรื่องยุ่งยากเล็กน้อยหากคุณใช้มิดเดิลแวร์จำนวนมากที่ตั้งค่าคุกกี้ (จำเป็นต้องตั้งค่าก่อนที่จะส่งเนื้อหา http) แต่โดยหลักการแล้วมันเป็นเพียงการล้างบัฟเฟอร์การตอบสนองหวังว่าก่อนที่จะกระโดดลงในโค้ดเทมเพลต (razor, php, ฯลฯ ) บนเซิร์ฟเวอร์ นี่อาจฟังดูยาก แต่ฉันแค่อธิบายผิดเพราะมันเป็นเรื่องเล็กน้อย ตามที่คุณอาจเดาได้ส่วนที่คงที่นี้ควรมี javascript ทั้งหมดที่อยู่ในบรรทัดและย่อขนาด มันจะดูเหมือน

<!DOCTYPE html>
     <html>
         <head>
             <script>/*...inlined jquery, angular, your code*/</script>
             <style>/* ditto css */</style>
         </head>
         <body>
             <!-- inline all your templates, if applicable -->
             <script type='template-mime' id='1'></script>
             <script type='template-mime' id='2'></script>
             <script type='template-mime' id='3'></script>

เนื่องจากคุณไม่มีค่าใช้จ่ายใด ๆ ในการส่งส่วนนี้ลงไปคุณสามารถคาดหวังได้ว่าไคลเอนต์จะเริ่มได้รับเวลาแฝงประมาณ 5ms + หลังจากเชื่อมต่อกับเซิร์ฟเวอร์ของคุณ สมมติว่าเซิร์ฟเวอร์ปิดพอสมควรเวลาแฝงนี้อาจอยู่ระหว่าง 20ms ถึง 60ms เบราว์เซอร์จะเริ่มประมวลผลส่วนนี้ทันทีที่ได้รับและเวลาในการประมวลผลโดยปกติจะมีผลเหนือเวลาในการถ่ายโอนตามแฟคเตอร์ 20 ขึ้นไปซึ่งตอนนี้เป็นช่วงเวลาตัดจำหน่ายของคุณสำหรับการประมวลผลในฝั่งเซิร์ฟเวอร์ของ<dynamic>ส่วนนั้น

เบราว์เซอร์ใช้เวลาประมาณ 50ms (chrome พักอาจช้ากว่า 20%) ในการประมวลผล jquery + signalr แบบอินไลน์ + angular + ng animate + ng touch + ng เส้นทาง + lodash มันน่าทึ่งมากในตัวของมันเอง เว็บแอปส่วนใหญ่มีโค้ดน้อยกว่าไลบรารียอดนิยมทั้งหมดที่รวมกัน แต่สมมติว่าคุณมีมากพอ ๆ กันดังนั้นเราจะชนะเวลาแฝง + 100 มิลลิวินาทีในการประมวลผลบนไคลเอนต์ (เวลาแฝงที่ชนะนี้มาจากส่วนการถ่ายโอนที่สอง) เมื่อถึงช่วงที่สองเราได้ประมวลผลโค้ด js และเทมเพลตทั้งหมดและเราสามารถเริ่มดำเนินการแปลง dom ได้

คุณอาจคัดค้านว่าวิธีนี้ตั้งฉากกับแนวคิดแบบอินไลน์ แต่ไม่ใช่ หากคุณแทนที่จะเชื่อมโยงไปยัง cdns หรือเซิร์ฟเวอร์ของคุณเองเบราว์เซอร์จะต้องเปิดการเชื่อมต่ออื่นและชะลอการดำเนินการ เนื่องจากการดำเนินการนี้โดยทั่วไปฟรี (เนื่องจากฝั่งเซิร์ฟเวอร์กำลังคุยกับฐานข้อมูล) จึงต้องชัดเจนว่าการกระโดดทั้งหมดนี้จะเสียค่าใช้จ่ายมากกว่าการไม่กระโดดเลย หากมีมุมมองเบราว์เซอร์ที่กล่าวว่า js ภายนอกทำงานได้เร็วขึ้นเราสามารถวัดได้ว่าปัจจัยใดครอบงำ การวัดของฉันระบุว่าคำขอพิเศษฆ่าประสิทธิภาพในขั้นตอนนี้

ฉันทำงานหนักมากกับการเพิ่มประสิทธิภาพของแอป SPA เป็นเรื่องปกติที่ผู้คนจะคิดว่าปริมาณข้อมูลเป็นเรื่องใหญ่ในขณะที่เวลาแฝงความจริงและการดำเนินการมักมีอิทธิพลเหนือกว่า ไลบรารีที่ย่อขนาดที่ฉันระบุไว้นั้นเพิ่มข้อมูลได้มากถึง 300kb และนั่นเป็นเพียง 68 kb gzipped หรือดาวน์โหลด 200ms บนโทรศัพท์ 2mbit 3g / 4g ซึ่งเป็นเวลาแฝงที่จะใช้ในโทรศัพท์เครื่องเดียวกันเพื่อตรวจสอบว่ามีข้อมูลเดียวกันหรือไม่ ในแคชอยู่แล้วแม้ว่าจะมีการแคชพร็อกซีก็ตามเนื่องจากยังคงมีการเรียกเก็บภาษีเวลาแฝงของอุปกรณ์เคลื่อนที่ (โทรศัพท์ถึงทาวเวอร์ - เวลาในการตอบสนอง) ในขณะเดียวกันการเชื่อมต่อเดสก์ท็อปที่มีเวลาแฝงในการแสดงครั้งแรกที่ต่ำกว่ามักจะมีแบนด์วิดท์ที่สูงกว่าอยู่ดี

ในระยะสั้นตอนนี้ (2014) ควรแทรกสคริปต์สไตล์และเทมเพลตทั้งหมดไว้ในบรรทัด

แก้ไข (พฤษภาคม 2016)

เนื่องจากแอปพลิเคชัน JS เติบโตขึ้นอย่างต่อเนื่องและตอนนี้ payload บางส่วนของฉันมีโค้ดย่อขนาดถึง 3+ เมกะไบต์จึงเห็นได้ชัดว่าอย่างน้อยที่สุดไลบรารีทั่วไปไม่ควรอยู่ในแนวอินไลน์อีกต่อไป


ฉันไม่ได้รับซึ่งตอนนี้เป็นหน้าต่างตัดจำหน่ายของคุณสำหรับการประมวลผลฝั่งเซิร์ฟเวอร์ของส่วน <dynamic> - เซิร์ฟเวอร์ประมวลผลสิ่งที่ต้องการจากนั้นให้บริการ html ที่แสดงผลทั้งหมด (head + body) สิ่งที่การประมวลผลเซิร์ฟเวอร์อื่น ๆ จำเป็นหลังจากนั้น?
BornToCode

@BornToCode แนวคิดคือให้ลูกค้าทำอะไรบางอย่างในเวลาเดียวกันฝั่งเซิร์ฟเวอร์มีสิ่งที่ต้องทำ เนื่องจากไลบรารีไคลเอ็นต์จำเป็นต้องได้รับการตีความจึงเป็นการดีกว่าที่จะเริ่มกระบวนการนั้นก่อนที่จะทำการคำนวณใด ๆบนเซิร์ฟเวอร์ หน้าต่างค่าตัดจำหน่ายคือเวลาที่ไคลเอ็นต์ใช้ในการประมวลผล JS คุณจะได้รับหน้าต่างนั้นฟรีหากคุณสร้างจรวด 2 ขั้นตอน
Gleno


9

จริงๆแล้วมีเคสที่ค่อนข้างแข็งที่จะใช้จาวาสคริปต์แบบอินไลน์ ถ้า js มีขนาดเล็กพอ (หนึ่งซับ) ฉันมักจะชอบ javascript แบบอินไลน์เนื่องจากปัจจัยสองประการ:

  • ท้องถิ่นท้องถิ่นไม่จำเป็นต้องไปที่ไฟล์ภายนอกเพื่อตรวจสอบพฤติกรรมของจาวาสคริปต์บางตัว
  • AJAX หากคุณกำลังรีเฟรชบางส่วนของหน้าผ่าน AJAX คุณอาจสูญเสียตัวจัดการ DOM ทั้งหมดของคุณ (onclick ฯลฯ ) สำหรับส่วนนั้นขึ้นอยู่กับว่าคุณผูกมันอย่างไร ตัวอย่างเช่นการใช้jQueryคุณสามารถใช้liveหรือdelegateวิธีการเพื่อหลีกเลี่ยงสิ่งนี้ แต่ฉันพบว่าถ้า js มีขนาดเล็กพอก็ควรใส่ไว้ในบรรทัด

5

อีกเหตุผลหนึ่งที่คุณควรใช้สคริปต์ภายนอกเสมอคือเพื่อให้เปลี่ยนไปใช้นโยบายความปลอดภัยของเนื้อหา (CSP)ได้ง่ายขึ้น ค่าเริ่มต้น CSP ห้ามสคริปต์แบบอินไลน์ทั้งหมดทำให้ไซต์ของคุณทนต่อการโจมตี XSS ได้ดีขึ้น


4

ฉันจะดูรหัสที่ต้องการและแบ่งออกเป็นไฟล์แยกกันมากเท่าที่จำเป็น ไฟล์ js ทุกไฟล์จะมี "ชุดตรรกะ" เพียงชุดเดียวเท่านั้นเช่น ไฟล์เดียวสำหรับฟังก์ชันที่เกี่ยวข้องกับการเข้าสู่ระบบทั้งหมด

จากนั้นในระหว่างการพัฒนาไซต์ในแต่ละหน้า html คุณจะรวมเฉพาะสิ่งที่จำเป็นเท่านั้น เมื่อคุณเริ่มใช้งานไซต์ของคุณคุณสามารถเพิ่มประสิทธิภาพโดยรวมไฟล์ js ทุกไฟล์ที่เพจต้องการไว้ในไฟล์เดียว


4

การป้องกันเดียวที่ฉันสามารถนำเสนอสำหรับ javascipt แบบอินไลน์คือเมื่อใช้มุมมองที่พิมพ์มากกับ. net MVC คุณสามารถอ้างถึงตัวแปร c # กลางจาวาสคริปต์ซึ่งฉันพบว่ามีประโยชน์


3

ข้อควรพิจารณาสามประการ:

  • คุณต้องการรหัสเท่าใด (บางครั้งไลบรารีเป็นผู้บริโภคชั้นหนึ่ง)
  • ความจำเพาะ: รหัสนี้ใช้ได้เฉพาะในบริบทของเอกสารหรือองค์ประกอบเฉพาะนี้หรือไม่?
  • ทุกรหัสในเอกสารมีแนวโน้มที่จะทำให้ยาวขึ้นและช้าลง นอกจากนั้นการพิจารณา SEO ทำให้เห็นได้ชัดว่าคุณลดการเขียนสคริปต์ภายใน ...

2

นอกจากนี้สคริปต์ภายนอกยังง่ายต่อการดีบักโดยใช้ Firebug ฉันชอบทดสอบหน่วย JavaScript ของฉันและมีความช่วยเหลือจากภายนอกทั้งหมด ฉันไม่ชอบที่จะเห็น JavaScript ในโค้ด PHP และ HTML ดูเหมือนว่าจะเป็นปัญหาใหญ่สำหรับฉัน


2

ในประเด็นของการเก็บ JavaScript ไว้ภายนอก:

ASP.NET 3.5SP1 เพิ่งเปิดตัวฟังก์ชันการสร้างทรัพยากรสคริปต์คอมโพสิต (รวมไฟล์ js จำนวนมากเป็นหนึ่งเดียว) ข้อดีอีกประการหนึ่งคือเมื่อเปิดการบีบอัดเว็บเซิร์ฟเวอร์การดาวน์โหลดไฟล์ที่มีขนาดใหญ่กว่าเล็กน้อยจะมีอัตราส่วนการบีบอัดที่ดีกว่าไฟล์ขนาดเล็กจำนวนมาก (เช่นค่าใช้จ่าย http น้อยกว่าไปกลับ ฯลฯ ... ) ฉันเดาว่าสิ่งนี้จะช่วยประหยัดในการโหลดหน้าเว็บครั้งแรกจากนั้นการแคชของเบราว์เซอร์จะเริ่มขึ้นตามที่กล่าวไว้ข้างต้น

นอกจาก ASP.NET แล้ว screencast นี้จะอธิบายถึงประโยชน์ในรายละเอียดเพิ่มเติม: http://www.asp.net/learn/3.5-SP1/video-296.aspx


2

อีกประโยชน์ที่ซ่อนของสคริปต์ภายนอกคือการที่คุณสามารถทำงานได้อย่างง่ายดายผ่านการตรวจสอบไวยากรณ์เช่นJSLint ซึ่งจะช่วยให้คุณประหยัดจากข้อบกพร่อง IE6 ที่หายากและหายากมากมาย


1

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


1

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

ฉันกล้าพูดด้วยซ้ำว่าหากคุณไม่สามารถวาง Javascript จากภายนอกได้ทั้งหมดแสดงว่าคุณมีการออกแบบที่ไม่ดีอยู่ในมือของคุณและคุณควรปรับโครงสร้างข้อมูลและสคริปต์ของคุณใหม่


1

Google ได้รวมเวลาในการโหลดไว้ในการวัดการจัดอันดับหน้าหากคุณอินไลน์มากจะใช้เวลานานกว่าที่สไปเดอร์จะรวบรวมข้อมูลผ่านหน้าเว็บของคุณซึ่งอาจส่งผลต่อการจัดอันดับหน้าของคุณหากคุณต้องรวมไว้มาก ไม่ว่าในกรณีใด ๆ กลยุทธ์ที่แตกต่างกันอาจมีผลต่อการจัดอันดับของคุณ


1

ฉันคิดว่าคุณควรใช้แบบอินไลน์เมื่อสร้างเว็บไซต์หน้าเดียวเนื่องจากสคริปต์ไม่จำเป็นต้องใช้ร่วมกันในหลาย ๆ หน้า


-3

พยายามใช้ Js ภายนอกเสมอเพราะ inline js นั้นดูแลรักษายากเสมอ

ยิ่งไปกว่านั้นจำเป็นอย่างยิ่งที่คุณต้องใช้ js ภายนอกเนื่องจากนักพัฒนาส่วนใหญ่แนะนำให้ใช้ js จากภายนอก

ตัวเองใช้ js ภายนอก


2
จำเป็นอย่างมืออาชีพ? ทำไม? ใครบอกว่า?
Siyah
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.