SiamHTML
Published in

SiamHTML

Webpack คืออะไร ? + สอนวิธีใช้ร่วมกับ React

webpack

บทความนี้ผมจะพาเพื่อนๆ ไปทำความรู้จักกับ Webpack ซึ่งเป็น tool ที่กำลังได้รับความนิยมมากอีกตัวหนึ่งในการทำเว็บสมัยนี้ครับ ถึงแม้ว่าหน้าที่หลักๆ ของ Webpack จะเป็นการรวมโมดูลของ JavaScript ต่างๆ ให้อยู่ในรูปที่สามารถใช้กับ web browser ได้ ซึ่งจะคล้ายๆ กับการใช้ Grunt หรือ Gulp ร่วมกับ Browserify แต่รับรองว่าฟีเจอร์ที่ Webpack ให้มานั้นน่าสนใจสุดๆ จนหลายคนถึงกับเปลี่ยนมาใช้เจ้านี่แทนเลยล่ะครับ เรามาดูกันซิว่า Webpack นี่มันมีดีอะไร ?

อย่างที่ผมได้เกริ่นไปก่อนหน้านี้แล้วนะครับว่า Webpack นั้นเป็น tool ที่เอาไว้แปลงโมดูลของ JavaScript ให้อยู่ในรูปที่เว็บสามารถนำไปใช้ได้ หรือพูดง่ายๆ ก็คือ มันเอาไว้แปลง JavaScript Module แบบต่างๆ ไม่ว่าจะเป็น CommonJS, AMD หรือแม้แต่ ES6 Module ให้กลายเป็นโค้ด JavaScript ธรรมดาๆ ที่สามารถรันบน web browser ทั่วไปได้นั่นเอง คุ้นๆ มั้ยครับ ? นี่มันฟีเจอร์ของ Browserify ชัดๆ

ในเมื่อสิ่งที่ Webpack ทำนั้น Browserify ก็ทำได้ แล้วเราจะเปลี่ยนมาใช้ Webpack ทำไม ? เหตุผลง่ายๆ คืออย่างนี้ครับ

  • เร็ว Webpack อ้างว่าเค้าใช้ async I/O บวกกับการทำ cache หลายชั้น ทำให้ขั้นตอนในการ compile นั้นเร็วสุดๆ ครับ ซึ่งหลังจากที่ผมได้ลองใช้ดูแล้ว ก็ต้องยอมรับว่ามันเร็วจริงๆ
  • ครบ ผมว่าคนทำ Webpack นี่เค้ารู้ใจ web developer อย่างเราจริงๆ ครับ ฟีเจอร์อะไรที่ควรจะมีอยู่ใน workflow นั้น พี่แกเตรียมมาให้หมดเลย สิ่งที่เราต้องทำก็แค่ config นิดๆ หน่อยๆ เท่านั้นเองครับ

ทีนี้มาดูกันครับว่า ไอ้ที่ว่าเตรียมมาให้หมดนั้น มันมีอะไรบ้าง ?

  • Loaders สมัยนี้เราคงไม่ได้เขียนโมดูลด้วย JavaScript แบบเดิมๆ กันแล้วถูกมั้ยครับ บางคนอาจจะเขียนด้วย ECMAScript 6, JSX หรือ TypeScript แต่สุดท้ายแล้ว เราก็ต้องแปลงโค้ดเหล่านี้ให้กลับมาเป็น JavaScript อยู่ดี ซึ่ง Webpack เค้าก็เตรียมช่องทางมาให้แล้ว ผ่านสิ่งที่เรียกว่า Loader ครับ สมมติว่าเราเขียนโมดูลด้วย ECMAScript 6 เราก็จะต้องกำหนด Loader ให้เป็น Babel ซึ่งเป็น tool ที่มีความสามารถในการแปลง ECMAScript 6 ให้กลายเป็น JavaScript ได้ อะไรทำนองนี้ครับ หรือสรุปสั้นๆ ก็คือ Loader มันเหมือนกับ transform ของ Browserify นั่นแหละครับ
  • Dev Server เราสามารถใช้ Webpack เป็น web server สำหรับ dev ได้ด้วยนะครับ แล้วเจ้า dev server ที่ว่านี่ความสามารถมันก็ไม่ใช่เล่นๆ เลย เราสามารถกำหนดให้มันช่วยรีเฟรชหน้าเว็บโดยอัตโนมัติได้เวลาที่มีไฟล์ไหนถูกแก้ไข และหากไฟล์นั้นเป็น css มันก็จะใช้วิธี inject สไตล์เข้าไปให้เลย ทำให้เราไม่ต้องมาเสียเวลาโหลดหน้าเว็บใหม่ทั้งหน้าครับ เรียกว่าเหมือนกับการใช้ BrowserSync ยังไงยังงั้นเลย ส่วนใครที่เขียน React อยู่นี่ ยิ่งพลาดไม่ได้เลยครับ เพราะเวลาที่เรามีการแก้โค้ดอะไร dev server ของ Webpack มันสามารถสั่งให้ render เฉพาะ component ที่ถูกอัพเดทได้ด้วย แถมมันยังรักษา state เดิมของ component ในขณะนั้นๆ เอาไว้ให้อีก ฟีเจอร์นี้ผมว่ามีประโยชน์สุดๆ ครับ
  • Code Splitting นี่ถือเป็นฟีเจอร์ที่ผมชอบมากที่สุดเลยครับ คือ Webpack มันจะสามารถแบ่งโค้ดของเราออกเป็นส่วนย่อยๆ ได้ด้วย ซึ่งจะช่วยให้เว็บเราไม่จำเป็นต้องมาโหลดไฟล์ JavaScript ใหญ่ๆ ไฟล์เดียวอีกแล้ว คำถามที่ตามมาแน่ๆ ก็คือ แล้ว Webpack มันใช้เกณฑ์อะไรในการแบ่ง ? คำตอบคือเราเป็นคนกำหนดเองครับ เราสามารถกำหนดได้ว่า โค้ดส่วนนี้เป็นโค้ดหลักนะ ให้โหลดมาตั้งแต่แรกเลย ส่วนโค้ดตรงนี้เป็นโค้ดที่นานๆ จะใช้ทีนะ ให้โหลดแบบ asynchronous มาเฉพาะตอนที่จะต้องใช้งานดีกว่า ฟีเจอร์นี้ผมมองว่าคล้ายๆ กับการใช้ RequireJS ครับ

คาดว่าเพื่อนๆ คงจะอยากเห็นตัวอย่างโค้ดของการเรียกใช้ Webpack แล้ว งั้นเรามาดูวิธีการใช้งานกันเลยครับ

เริ่มด้วยการติดตั้ง webpack แบบ global ครับ เราจะได้ใช้ webpack ผ่าน command-line ได้

ต่อด้วยการติดตั้ง webpack ที่ตัวโปรเจคของเราครับ

จากนั้นเราก็จะต้องสร้างไฟล์ config ขึ้นมาก่อนฮะ ให้เราตั้งชื่อไฟล์ว่า webpack.config.js แล้ววางไว้ที่ root ของเว็บแอปเรา จากนั้นก็ใส่โค้ดด้านล่างนี้ลงไป

  • -d เพิ่มฟีเจอร์สำหรับ debug และ source maps เข้ามาด้วย เรามักจะใช้ option นี้ ตอนที่กำลัง dev อยู่ครับ
  • -p ช่วยบีบอัดไฟล์ให้เล็กลงด้วย อันนี้เหมาะสำหรับตอนจะเอาขึ้น production ครับ
  • — watch คอย watch ไฟล์ให้ด้วย หากมีการแก้ไขใดๆ ก็จะรัน Webpack ใหม่ให้โดยอัตโนมัติ

--

--

The collection of articles for front-end developers

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store