การตั้งงบประมาณด้านประสิทธิภาพด้วย Webpack

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

หากต้องการดูการทำงานจริง นี่คือแอปที่นับจำนวนวันที่เหลือจนกว่าจะถึงวันขึ้นปีใหม่ ซึ่งสร้างขึ้นด้วย React และ moment.js (เช่นเดียวกับแอปในชีวิตจริงที่อาศัยเฟรมเวิร์กและไลบรารีมากขึ้นเรื่อยๆ 😉)

แอปนับจำนวนวันที่เหลือจนถึงวันปีใหม่

วัดระยะทาง

โค้ดแล็บนี้มีแอปที่รวมอยู่ใน webpack อยู่แล้ว

  1. คลิกรีมิกซ์เพื่อแก้ไขเพื่อทำให้โปรเจ็กต์แก้ไขได้
  2. คลิก Terminal (หมายเหตุ: หากปุ่ม Terminal ไม่แสดง คุณอาจต้องใช้ตัวเลือก "เต็มหน้าจอ")
  3. หากต้องการดูรายการชิ้นงานและขนาดของชิ้นงานที่มีรหัสสี ให้พิมพ์ webpack ในคอนโซล
webpack

แพ็กเกจหลักจะไฮไลต์เป็นสีเหลืองเนื่องจากมีขนาดใหญ่กว่า 244 KiB (250 KB)

เอาต์พุต Webpack ที่แสดงขนาด Bundle 323 KiB
Webpack เตือนคุณเกี่ยวกับแพ็กเกจ JS ที่ใหญ่ ⚠️

ระบบจะเปิดใช้คำเตือนเหล่านี้โดยค่าเริ่มต้นในโหมดเวอร์ชันที่ใช้งานจริง และเกณฑ์เริ่มต้นคือ 244 KiB ที่ไม่ได้บีบอัดสำหรับทั้งชิ้นงานและจุดแรกเข้า (ชุดค่าผสมของชิ้นงานทั้งหมดที่ใช้ระหว่างการโหลดหน้าเว็บครั้งแรก)

คําเตือนของ Webpack ว่าชิ้นงานมีขนาดเกินขีดจํากัดที่แนะนํา
Webpack เตือนคุณเกี่ยวกับแพ็กเกจ JS ที่ใหญ่ ⚠️

Webpack จะไม่เพียงเตือนคุณ แต่ยังให้คำแนะนำเกี่ยวกับวิธีลดขนาดแพ็กเกจด้วย ดูข้อมูลเพิ่มเติมเกี่ยวกับเทคนิคที่แนะนําได้ในพื้นฐานของเว็บ

คําแนะนําในการเพิ่มประสิทธิภาพ Webpack
คําแนะนําในการเพิ่มประสิทธิภาพ Webpack 💁

กําหนดงบประมาณด้านประสิทธิภาพที่กําหนดเอง

งบประมาณประสิทธิภาพที่เหมาะสมจะขึ้นอยู่กับลักษณะของโปรเจ็กต์ คุณควรทำการค้นคว้าด้วยตัวเองเสมอ หลักการทั่วไปคือการส่งทรัพยากรเส้นทางที่สำคัญที่บีบอัด/ย่อขนาดไว้ให้มีขนาดไม่เกิน 170 KB

สําหรับการสาธิตแบบง่ายนี้ ให้ลองใช้งบประมาณอย่างระมัดระวังมากขึ้นโดยตั้งเป็น 100 KB (97.7 KiB) ใน webpack.config.js ให้เพิ่มข้อมูลต่อไปนี้

module.exports = {
  //...
  performance: {
    maxAssetSize: 100000,
    maxEntrypointSize: 100000,
    hints: "warning"
  }
};

งบประมาณประสิทธิภาพใหม่จะตั้งค่าเป็น ไบต์

  • 100,000 ไบต์สําหรับเนื้อหาแต่ละรายการ (maxAssetSize)
  • 100000 ไบต์สำหรับจุดแรกเข้า (maxEntrypointSize)

ในกรณีนี้ มีเพียงกลุ่มเดียวที่ทำหน้าที่เป็นจุดแรกเข้าด้วย

ค่าที่เป็นไปได้สำหรับ คำใบ้ มีดังนี้

  1. warning (ค่าเริ่มต้น): แสดงข้อความเตือนสีเหลือง แต่บิลด์จะผ่าน คุณควรใช้ตัวเลือกนี้ในสภาพแวดล้อมการพัฒนา
  2. error: แสดงข้อความแสดงข้อผิดพลาดสีแดง แต่บิลด์ยังผ่าน เราขอแนะนำให้ใช้การตั้งค่านี้กับบิลด์เวอร์ชันที่ใช้งานจริง
  3. false: จะไม่แสดงคำเตือนหรือข้อผิดพลาด
ข้อผิดพลาดด้านประสิทธิภาพของ Webpack ในแบบอักษรสีแดง
คำแนะนำ "ข้อผิดพลาด" เกี่ยวกับประสิทธิภาพของ Webpack 🚨

เพิ่มประสิทธิภาพ

วัตถุประสงค์ของงบประมาณด้านประสิทธิภาพคือการเตือนคุณเกี่ยวกับปัญหาด้านประสิทธิภาพก่อนที่จะแก้ไขได้ยากเกินไป การสร้างแอปมีหลายวิธีเสมอ และเทคนิคบางอย่างจะช่วยให้โหลดได้เร็วขึ้น (โดยส่วนใหญ่จะระบุอยู่ในการเพิ่มประสิทธิภาพ JavaScript ที่นี่ 🤓)

เฟรมเวิร์กและไลบรารีทำให้นักพัฒนาซอฟต์แวร์ใช้ชีวิตได้ง่ายขึ้น แต่ผู้ใช้ปลายทางไม่ได้สนใจวิธีสร้างแอป ขอเพียงว่าแอปทำงานได้และทำงานรวดเร็ว หากพบว่าใช้จ่ายงบประมาณด้านประสิทธิภาพเกินเกณฑ์แล้ว ก็ถึงเวลาที่ต้องพิจารณาการเพิ่มประสิทธิภาพที่เป็นไปได้

ในชีวิตจริง เฟรมเวิร์กฝั่งไคลเอ็นต์ขนาดใหญ่มักจะเปลี่ยนออกได้ยาก จึงต้องใช้อย่างชาญฉลาด เมื่อทำการวิจัยเพียงเล็กน้อย คุณมักจะพบทางเลือกที่เล็กกว่าสำหรับไลบรารียอดนิยมที่ทำงานได้ดีพอๆ กัน (date-fns เป็นทางเลือกที่ดีสำหรับ moment.js) บางครั้งการไม่ใช้เฟรมเวิร์กหรือไลบรารีเลยอาจให้ผลลัพธ์ที่เป็นประโยชน์อย่างมาก

การนําโค้ดที่ไม่ได้ใช้ออกเป็นวิธีที่ดีในการเพิ่มประสิทธิภาพแอปที่มีไลบรารีขนาดใหญ่ของบุคคลที่สาม คำแนะนำในการนำโค้ดที่ไม่ได้ใช้ออกจะอธิบายกระบวนการนี้โดยละเอียด และนี่คือวิธีสั้นๆ ในการเขียนโค้ดนับถอยหลังอีกครั้งโดยไม่ใช้ moment.js

ใน app/components/Countdown.jsx ให้นำออกดังนี้

const today = moment();
const yearEnd = moment().endOf('year');
const daysLeft = yearEnd.diff(today, 'days');

และลบบรรทัดนี้:

const moment = require('moment');

ต้องใช้การคำนวณเล็กน้อย แต่คุณใช้การนับถอยหลังแบบเดียวกันกับ JavaScript ธรรมดาได้ ดังนี้

const today = new Date();
const year = today.getFullYear();
const yearEnd = new Date(year,11,31); //months are zero indexed in JS
const timeDiff = Math.abs(yearEnd.getTime() - today.getTime());
const daysLeft = Math.ceil(timeDiff / (1000 * 3600 * 24));

จากนั้นนำ moment.js ออกจาก package.json แล้วเรียกใช้ Webpack ในคอนโซลอีกครั้งเพื่อสร้างแพ็กเกจที่เพิ่มประสิทธิภาพ

นี่ไง! คุณได้ตัดโค้ดออกไป 223 KiB (230 KB) และแอปยังมีงบประมาณไม่เพียงพอ🎉

เอาต์พุตขนาดกลุ่มของ Webpack หลังจากการเพิ่มประสิทธิภาพคือ 97.7 KiB

ติดตามดู

การตั้งค่างบประมาณด้านประสิทธิภาพใน webpack ใช้เวลาเพียง 2-3 บรรทัดโค้ด และระบบจะเตือนคุณหากเพิ่มการพึ่งพาขนาดใหญ่ (โดยไม่ตั้งใจ) อย่างที่คนโบราณว่า "ไม่เห็นก็เหมือนไม่มี" แต่ webpack จะช่วยให้คุณทราบถึงผลกระทบด้านประสิทธิภาพได้ตลอดเวลา