การเพิ่มประสิทธิภาพ React: เชี่ยวชาญการลดขนาด Bundle | MLOG | MLOG

แต่ละ route ในตัวอย่างนี้จะโหลดคอมโพเนนต์ที่เกี่ยวข้องแบบ lazy ซึ่งช่วยปรับปรุงเวลาในการโหลดเริ่มต้นของแอปพลิเคชัน

2. Tree Shaking

Tree shaking เป็นเทคนิคที่กำจัดโค้ดที่ไม่ได้ใช้ (dead code) ออกจากแอปพลิเคชันของคุณ Dead code หมายถึงโค้ดที่ไม่เคยถูกใช้งานจริงในแอปพลิเคชันของคุณ แต่ยังคงรวมอยู่ใน bundle สิ่งนี้มักเกิดขึ้นเมื่อคุณ import ไลบรารีทั้งชุด แต่ใช้เพียงส่วนเล็กๆ ของฟังก์ชันการทำงานเท่านั้น

JavaScript bundler สมัยใหม่เช่น Webpack และ Rollup สามารถทำ tree shaking ได้โดยอัตโนมัติ เพื่อให้แน่ใจว่า tree shaking ทำงานได้อย่างมีประสิทธิภาพ สิ่งสำคัญคือต้องใช้ ES modules (ไวยากรณ์ import และ export) แทน CommonJS (ไวยากรณ์ require) ES modules ช่วยให้ bundler สามารถวิเคราะห์โค้ดของคุณแบบสแตติกและพิจารณาว่า export ใดถูกใช้งานจริง

ตัวอย่าง:

สมมติว่าคุณกำลังใช้ไลบรารี tiện ích ชื่อ lodash แทนที่จะ import ทั้งไลบรารี:

            import _ from 'lodash';

_.map([1, 2, 3], (n) => n * 2);
            

ให้ import เฉพาะฟังก์ชันที่คุณต้องการ:

            import map from 'lodash/map';

map([1, 2, 3], (n) => n * 2);
            

วิธีนี้จะทำให้แน่ใจได้ว่ามีเพียงฟังก์ชัน map เท่านั้นที่รวมอยู่ใน bundle ของคุณ ซึ่งช่วยลดขนาดลงได้อย่างมาก

3. Dynamic Imports

คล้ายกับ React.lazy(), dynamic imports (โดยใช้ไวยากรณ์ import()) ช่วยให้คุณโหลดโมดูลได้ตามต้องการ ซึ่งมีประโยชน์สำหรับการโหลดไลบรารีขนาดใหญ่หรือคอมโพเนนต์ที่จำเป็นในสถานการณ์เฉพาะเท่านั้น

ตัวอย่าง:

            async function handleClick() {
  const module = await import('./MyLargeComponent');
  const MyLargeComponent = module.default;
  // Use MyLargeComponent
}

            

ในตัวอย่างนี้ MyLargeComponent จะถูกโหลดเมื่อฟังก์ชัน handleClick ถูกเรียกใช้เท่านั้น ซึ่งโดยทั่วไปจะเป็นการตอบสนองต่อการกระทำของผู้ใช้

4. การย่อขนาด (Minification) และการบีบอัด (Compression)

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

เครื่องมือ build สมัยใหม่ส่วนใหญ่ เช่น Webpack, Parcel และ Rollup มีการรองรับ minification และ compression ในตัว ตัวอย่างเช่น Webpack ใช้ Terser สำหรับ minification และสามารถกำหนดค่าให้ใช้ Gzip หรือ Brotli สำหรับ compression ได้

ตัวอย่าง (การตั้งค่า Webpack):

            const TerserPlugin = require('terser-webpack-plugin');
const CompressionPlugin = require('compression-webpack-plugin');

module.exports = {
  // ...
  optimization: {
    minimize: true,
    minimizer: [new TerserPlugin()],
  },
  plugins: [
    new CompressionPlugin({
      algorithm: 'gzip',
      test: /\.(js|css)$/,
      threshold: 10240,
      minRatio: 0.8,
    }),
  ],
};

            

การตั้งค่านี้เปิดใช้งาน minification โดยใช้ Terser และ compression โดยใช้ Gzip ตัวเลือก threshold จะระบุขนาดขั้นต่ำ (เป็นไบต์) ที่ไฟล์จะถูกบีบอัด

5. การเพิ่มประสิทธิภาพรูปภาพ

รูปภาพมักเป็นส่วนสำคัญที่ทำให้ขนาด bundle ของแอปพลิเคชันของคุณใหญ่ขึ้น การเพิ่มประสิทธิภาพรูปภาพของคุณสามารถปรับปรุงประสิทธิภาพได้อย่างมาก

เทคนิคการเพิ่มประสิทธิภาพรูปภาพ:

6. เลือกไลบรารีอย่างชาญฉลาด

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

ตัวอย่าง:

แทนที่จะใช้ไลบรารีการจัดรูปแบบวันที่ขนาดใหญ่อย่าง Moment.js ลองพิจารณาใช้ทางเลือกที่เล็กกว่าเช่น date-fns หรือ Day.js ไลบรารีเหล่านี้มีขนาดเล็กกว่าอย่างเห็นได้ชัดและให้ฟังก์ชันการทำงานที่คล้ายกัน

เปรียบเทียบขนาด Bundle:

7. HTTP/2

HTTP/2 เป็นเวอร์ชันใหม่ของโปรโตคอล HTTP ที่มีการปรับปรุงประสิทธิภาพหลายอย่างเหนือกว่า HTTP/1.1 ได้แก่:

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

8. การแคชของเบราว์เซอร์ (Browser Caching)

Browser caching ช่วยให้เบราว์เซอร์สามารถจัดเก็บ static assets (เช่น รูปภาพ, ไฟล์ JavaScript และไฟล์ CSS) ไว้ในเครื่องได้ เมื่อผู้ใช้กลับมาที่แอปพลิเคชันของคุณอีกครั้ง เบราว์เซอร์สามารถดึง assets เหล่านี้จากแคชแทนที่จะดาวน์โหลดซ้ำ ซึ่งช่วยลดเวลาในการโหลดได้อย่างมาก

กำหนดค่าเซิร์ฟเวอร์ของคุณให้ตั้งค่า cache headers ที่เหมาะสมสำหรับ static assets ของคุณ header Cache-Control เป็นสิ่งที่สำคัญที่สุด มันช่วยให้คุณสามารถระบุระยะเวลาที่เบราว์เซอร์ควรแคช asset

ตัวอย่าง:

            Cache-Control: public, max-age=31536000
            

header นี้บอกให้เบราว์เซอร์แคช asset เป็นเวลาหนึ่งปี

9. Server-Side Rendering (SSR)

Server-side rendering (SSR) เกี่ยวข้องกับการเรนเดอร์คอมโพเนนต์ React ของคุณบนเซิร์ฟเวอร์และส่ง HTML เริ่มต้นไปยังไคลเอ็นต์ สิ่งนี้สามารถปรับปรุงเวลาในการโหลดเริ่มต้นและ SEO เนื่องจากเครื่องมือค้นหาสามารถรวบรวมข้อมูลเนื้อหา HTML ได้อย่างง่ายดาย

เฟรมเวิร์กอย่าง Next.js และ Gatsby ทำให้การใช้งาน SSR ในแอปพลิเคชัน React ของคุณเป็นเรื่องง่าย

ประโยชน์ของ SSR:

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

    Memoization เป็นเทคนิคในการแคชผลลัพธ์ของการเรียกใช้ฟังก์ชันที่มีค่าใช้จ่ายสูงและนำกลับมาใช้ใหม่เมื่อมีอินพุตเดียวกันเกิดขึ้นอีกครั้ง ใน React คุณสามารถใช้ React.memo() ซึ่งเป็น higher-order component เพื่อ memoize functional components สิ่งนี้จะช่วยป้องกันการ re-render ที่ไม่จำเป็นเมื่อ props ของคอมโพเนนต์ไม่มีการเปลี่ยนแปลง

    ตัวอย่าง:

                import React from 'react';
    
    const MyComponent = React.memo(function MyComponent(props) {
      // Render component
      return 
    {props.data}
    ; }); export default MyComponent;

    ในตัวอย่างนี้ MyComponent จะ re-render ก็ต่อเมื่อ prop props.data เปลี่ยนแปลงเท่านั้น คุณยังสามารถระบุฟังก์ชันเปรียบเทียบที่กำหนดเองให้กับ React.memo() ได้หากคุณต้องการควบคุมมากขึ้นว่าเมื่อใดที่คอมโพเนนต์ควร re-render

    ตัวอย่างในโลกแห่งความเป็นจริงและข้อควรพิจารณาในระดับสากล

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

    เครื่องมือและแหล่งข้อมูล

    นี่คือเครื่องมือและแหล่งข้อมูลที่เป็นประโยชน์สำหรับการลดขนาด bundle:

    สรุป

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

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