ในช่วงเริ่มต้นของยุคอินเทอร์เน็ต เว็บไซต์นั้นเรียบง่ายกว่ามากและไม่มีการโต้ตอบกันมากนัก ด้วยความก้าวหน้าของเทคโนโลยี อุปกรณ์ และภาษาโปรแกรม ทำให้มีความซับซ้อนและประกอบด้วยไฟล์หลายไฟล์ รวมถึงเนื้อหา เช่น รูปภาพและ CSS สไตล์ชีต
ยิ่งเว็บไซต์ของคุณมีการโต้ตอบมากเท่าใด คุณก็ยิ่งต้องใช้โค้ด JavaScript มากขึ้นเท่านั้น ในการใช้โค้ดดังกล่าว คุณต้องรวมไฟล์โค้ด HTML ทั้งหมดโดยใช้แท็กสคริปต์ วิธีการดังกล่าวมีแนวโน้มที่จะเกิดข้อผิดพลาดได้เนื่องจากคุณต้องไม่ลืมที่จะรวมทุกไฟล์เดียวและรักษาลำดับที่ถูกต้อง มิฉะนั้น รหัสของคุณอาจไม่ทำงาน ด้วยเครื่องมือ Webpack ปัญหาเหล่านี้จะหมดไป Webpacker เป็นสะพานเชื่อมระหว่าง Webpack และแอปพลิเคชัน Rails
บทความนี้เจาะลึกลงไปใน Webpacker และนำเสนอคำอธิบายโดยละเอียดที่จะช่วยให้คุณเข้าใจว่าเครื่องมือนี้ทำงานอย่างไรภายใต้ประทุน เพื่อให้เนื้อหามีค่ามากที่สุด ฉันจึงตัดสินใจแบ่งเนื้อหาออกเป็นส่วนๆ ต่อไปนี้:
- ภาพรวมระดับสูง — ก่อนที่เราจะเจาะลึก ฉันจะอธิบายภาพรวมระดับสูงของทั้ง Webpack และ Webpacker คุณสามารถถือว่ามันเป็นการเตรียมการสำหรับหัวข้อขั้นสูงเพิ่มเติม
- คำอธิบายโครงสร้าง — เนื่องจากเราจะสำรวจไฟล์หลายๆ ไฟล์ จึงเป็นการดีที่จะรู้ว่าเหตุใดจึงใช้โครงสร้างนั้นและตอบสนองต่อวัตถุประสงค์ทั่วไปอย่างไร
- คำอธิบายกายวิภาคศาสตร์ — ส่วนนี้ครอบคลุมการตรวจสอบไฟล์ที่สำคัญที่สุดของการตั้งค่า Webpack การรู้วิธีทำงานเป็นสิ่งสำคัญสำหรับกระบวนการพัฒนาที่มีประสิทธิภาพและไม่ยุ่งยาก
- การตั้งค่าเฉพาะสภาพแวดล้อม — ส่วนสุดท้ายจะอธิบายวิธีการทำงานของ Webpacker ในสภาพแวดล้อมการพัฒนาและการใช้งานจริง
หลังจากอ่านบทความนี้ คุณจะรู้ว่า Webpack และ Webpacker คืออะไร และเหตุใดเราจึงต้องการมันในแอปพลิเคชัน Rails ของเรา การเจาะลึกข้อมูลภายในของ Webpacker จะช่วยให้คุณเข้าใจว่าเครื่องมือเชื่อมต่อกับ Webpack อย่างไรและสื่อสารกับแอปพลิเคชัน Rails อย่างไร
ก่อนดำน้ำ
ก่อนลงน้ำลึกเราต้องเตรียมตัวก่อน ภาพรวมระดับสูงเป็นวิธีที่ดีในการเริ่มทำงานกับเทคโนโลยีใดๆ เนื่องจากช่วยให้เราเข้าใจจุดประสงค์ของเครื่องมือที่กำหนดและปัญหาที่เครื่องมือแก้ไขได้โดยไม่ต้องลงลึกถึงส่วนลึกของเครื่องมือ
เว็บแพ็ค
ฉันได้กล่าวไปแล้วว่า Webpack ช่วยให้เราจัดระเบียบโค้ดไฟล์ JavaScript ของเราเพื่อหลีกเลี่ยงข้อผิดพลาดและปรับปรุงประสิทธิภาพของเว็บไซต์ มันจัดระเบียบรหัสเป็นมัด
บันเดิลคือไฟล์ที่มีการวางโมดูลหลายโมดูลไว้อย่างชาญฉลาด โดยคำนึงถึงกราฟการพึ่งพาที่สร้างขึ้นครั้งแรก ด้วยกระบวนการนี้ เราจึงมั่นใจได้ว่าโค้ดของเราจะทำงานตามที่คาดไว้ และก่อนที่เราจะเรียกใช้โค้ดของไลบรารีที่กำหนด โค้ดจะถูกโหลดแล้ว
Webpack ไม่ใช่เครื่องมือเดียวที่ใช้โดยค่าเริ่มต้นใน Rails เวอร์ชันใหม่ล่าสุด เมื่อสร้างโปรเจ็กต์แล้ว ไฟล์คอนฟิกูเรชันสำหรับ Babel และ PostCSS ก็ถูกสร้างขึ้นเช่นกัน PostCSS เป็นเครื่องมือสำหรับเปลี่ยน CSS ด้วย JavaScript และ Babel เป็นคอมไพเลอร์ JavaScript ที่ช่วยให้เราสามารถเขียน JavaScript ที่ทันสมัยโดยไม่ต้องกังวลเกี่ยวกับการสนับสนุนเบราว์เซอร์
เว็บแพ็คเกอร์
Webpacker เป็นเครื่องมือที่รวม Webpack เข้ากับแอปพลิเคชัน Rails ทำให้ง่ายต่อการกำหนดค่าและพัฒนาแอปพลิเคชันที่เหมือน JavaScript และปรับให้เหมาะสมสำหรับสภาพแวดล้อมการผลิต
ซอร์สโค้ดพร้อมใช้งานเป็นอัญมณี และไลบรารี่มาพร้อมกับเซิร์ฟเวอร์การพัฒนาที่ทำให้การพัฒนาแอปรวดเร็วมาก เพราะคุณไม่จำเป็นต้องหยุดและเริ่มเซิร์ฟเวอร์เพื่อดูการเปลี่ยนแปลงที่แนะนำในไฟล์ JavaScript
ความลุ่มลึก
เมื่อคุณรู้แล้วว่าเหตุใด Webpack จึงถูกสร้างขึ้นและบทบาทของ Wepacker ในแอปพลิเคชัน Rails เราสามารถมุ่งเน้นไปที่ภายในของ Webpacker เพื่อดูว่ามันจัดระเบียบไฟล์อย่างไร เร่งกระบวนการพัฒนา และปรับไฟล์ให้เหมาะสมสำหรับสภาพแวดล้อมการใช้งานจริง
Webpacker พร้อมใช้งานทันทีใน Rails เวอร์ชันใหม่ล่าสุด ก่อนสร้างโปรเจ็กต์ใหม่ ตรวจสอบให้แน่ใจว่าเวอร์ชันโหนดมากกว่าหรือเท่ากับ 10.17.0 เป็น webpacker:install
คำสั่งจะถูกเรียกใช้โดยอัตโนมัติด้วยคำสั่งใหม่ของ rails
โครงสร้างไฟล์ของ Webpacker
หลังจากรันคำสั่ง install ไฟล์ต่อไปนี้จะถูกสร้างขึ้น:
config/webpacker.yml
— ไฟล์การกำหนดค่าหลักที่มีการกำหนดค่าเริ่มต้นและการกำหนดค่าสำหรับสภาพแวดล้อมเฉพาะconfig/webpacker/
— ไดเร็กทอรีที่สร้างไฟล์การกำหนดค่า JavaScript สำหรับสภาพแวดล้อมเฉพาะbin/webpack
— ไฟล์ปฏิบัติการที่เรียกใช้ webpack เพื่อสร้างบันเดิลbin/webpack-dev-server
— ไฟล์ปฏิบัติการที่เริ่มต้นเซิร์ฟเวอร์การพัฒนา ซึ่งจะโหลด webpack ใหม่ทุกครั้งที่คุณทำการเปลี่ยนแปลงภายในไฟล์ JavaScript ที่รวมอยู่ในบันเดิล
กายวิภาคของไฟล์กำหนดค่า
ไฟล์คอนฟิกูเรชันหลักสำหรับ Webpacker จะอยู่ใต้ไดเร็กทอรี config และชื่อ webpacker.yml
. ต่างจาก Webpacker การกำหนดค่าสำหรับ Webpack จะถูกจัดเก็บแยกต่างหากสำหรับแต่ละสภาพแวดล้อมภายใต้ config/webpack
ไดเรกทอรี
เว็บแพ็คเกอร์
โดยค่าเริ่มต้น ไฟล์การกำหนดค่าประกอบด้วยหลายรายการ — รายการเริ่มต้น และส่วนต่างๆ สำหรับแต่ละสภาพแวดล้อมที่คุณสามารถเขียนทับการตั้งค่าเฉพาะได้ มาดูการตั้งค่าที่สำคัญที่สุดกัน:
source_path
— แหล่งที่มาหลักของไฟล์จาวาสคริปต์ในแอปพลิเคชันของคุณ ตั้งค่าเป็นapp/javascript
โดยค่าเริ่มต้น และโดยปกติ ไม่จำเป็นต้องเปลี่ยนค่านี้source_entry_path
— ชื่อของไดเร็กทอรีภายใต้ source_path ที่คุณเก็บไฟล์แพ็คไว้ หรือที่เรียกว่าจุดเข้าใช้งาน โดยค่าเริ่มต้น การตั้งค่านี้ถูกกำหนดเป็นไดเรกทอรีของแพ็คpublic_root_path
— เส้นทางไปยังไดเร็กทอรีในแอปพลิเคชันของคุณที่สามารถเข้าถึงได้จากเบราว์เซอร์ ในแอปพลิเคชัน Rails ทั่วไป จะเป็นไดเรกทอรีสาธารณะpublic_output_path
— เมื่อ Webpacker คอมไพล์ไฟล์ของคุณ Webpacker จะวางไฟล์ที่คอมไพล์ทั้งหมดไว้ในไดเร็กทอรีนี้ภายใต้public_root_path
. โดยค่าเริ่มต้น ไดเร็กทอรีจะตั้งชื่อเป็นแพ็ค แต่คุณสามารถเรียกมันว่าอะไรก็ได้ที่คุณต้องการwebpack_compile_output
— หากตั้งค่าสถานะเป็น true ข้อความที่ส่งออกจะแสดงเมื่อรวบรวมไฟล์ มีประโยชน์เมื่อการคอมไพล์ล้มเหลว เนื่องจากคุณจะทราบและสามารถดำเนินการได้
เป็นมูลค่าการกล่าวขวัญว่าส่วนการพัฒนายังมีการกำหนดค่าสำหรับเซิร์ฟเวอร์ dev ที่ใช้ในการคอมไพล์ไฟล์ในสภาพแวดล้อมการพัฒนาโดยไม่ต้องรีสตาร์ทเซิร์ฟเวอร์
หากคุณต้องการเข้าถึงการกำหนดค่าจากคอนโซล rails หรือระดับโค้ด คุณสามารถเรียก Webpacker.manifest.config
ซึ่งจะคืนค่าอินสแตนซ์คลาสการกำหนดค่า
เว็บแพ็ค
แต่ละสภาพแวดล้อมมีไฟล์การกำหนดค่า แต่ในทุกไฟล์ ไฟล์สภาพแวดล้อมหลักจะถูกนำเข้า:config/webpack/environment.js
. ในไฟล์การกำหนดค่าสภาพแวดล้อม มีที่สำหรับโหลดปลั๊กอินแบบกำหนดเองที่จะแก้ไขการทำงานเริ่มต้นของ Webpack เรายังเพิ่มกฎที่กำหนดเองสำหรับการรวบรวมไฟล์ของเราได้อีกด้วย
กายวิภาคของไฟล์แพ็ค
แพ็กจะอยู่ใต้ app/javascript/packs
ไดเรกทอรี ไฟล์แพ็คแต่ละไฟล์ได้รับการปฏิบัติโดย Webpacker เป็นจุดเริ่มต้นเมื่อกระบวนการคอมไพล์เริ่มต้นขึ้น
ไฟล์แพ็คเริ่มต้น
เมื่อคุณสร้างโปรเจ็กต์ Rails ใหม่ ไฟล์แพ็คเริ่มต้นชื่อ application.js จะถูกสร้างขึ้นโดยมีเนื้อหาดังต่อไปนี้:
import Rails from "@rails/ujs";
import Turbolinks from "turbolinks";
import * as ActiveStorage from "@rails/activestorage";
import "channels";
Rails.start();
Turbolinks.start();
ActiveStorage.start();
อย่างที่คุณเห็น ขั้นตอนแรกคือการนำเข้าไลบรารีที่กำหนด จากนั้นเรียกใช้วิธีการเริ่มต้นเมื่อจำเป็น เมื่อคุณเรียกการอิมพอร์ต ระบบจะค้นหาโหนดโมดูลที่กำหนดหรือไลบรารีโลคัล ด้วยวิธีมาตรฐาน คุณไม่จำเป็นต้องเริ่มต้นไลบรารี่อย่างชัดแจ้ง เนื่องจากไลบรารีจะเริ่มต้นเมื่อคุณรวมไลบรารี่ในแหล่งที่มาของหน้าด้วยแท็กสคริปต์
แนวทางปฏิบัติที่ดีสำหรับไฟล์แพ็ค
แม้ว่าคุณจะสามารถใส่โค้ด JavaScript ปกติลงในไฟล์แพ็คและรันได้ แต่ก็ไม่แนะนำให้เก็บโค้ด JavaScript ไว้ในไฟล์แพ็ค วิธีที่ดีที่สุดคือการทำให้ไฟล์สะอาดอยู่เสมอ และนำเข้าและเริ่มต้นไลบรารีเท่านั้นที่นี่ และเก็บตรรกะอื่นๆ ไว้นอกไดเร็กทอรีแพ็ค
รวมไฟล์แพ็คในแอปพลิเคชัน
ไฟล์แพ็คจะไม่รวมอยู่ในแหล่งที่มาของเว็บไซต์โดยอัตโนมัติ เช่นเดียวกับกรณีไปป์ไลน์สินทรัพย์ เราต้องใช้แท็กพิเศษในมุมมองของเรา:
<%= javascript_packs_with_chunks_tag 'application' %>
วิธีการนี้ทำงานอย่างไร? ภายใต้ประทุน จะเรียกการกำหนดค่า Webpacker ที่เก็บข้อมูลที่คุณใส่ใน config/webpacker.yml
ไฟล์. ค้นหาไฟล์ application.js ภายในไดเรกทอรีจุดเข้าใช้งาน ซึ่งในกรณีของเราคือ app/javascript/packs
. คุณสามารถยืนยันได้โดยโทรไปที่รหัสต่อไปนี้:
Webpacker.manifest.config.source_entry_path
เมื่อพบรายการ Webpacker จะเรียก javascript_include_tag
เมธอด ตัวช่วยจาก ActionView
ห้องสมุดพร้อมใช้งานโดยค่าเริ่มต้นใน Rails เมธอดนี้ยอมรับแหล่งที่มาอย่างน้อยหนึ่งแหล่งและส่งคืนแท็กสคริปต์ที่คุณนำไปใช้กับมุมมองของคุณได้โดยตรง
เซิร์ฟเวอร์การพัฒนา
จุดเริ่มต้นเซิร์ฟเวอร์การพัฒนา Webpacker คือไฟล์ปฏิบัติการที่วางอยู่ภายใน bin
โฟลเดอร์และชื่อ webpack-dev-server
. กระบวนการรันเซิร์ฟเวอร์ประกอบด้วยห้าขั้นตอน:
- การตั้งค่าสภาพแวดล้อม — ตั้งชื่อสภาพแวดล้อมสำหรับ Node and Rails เมื่อไม่ได้ระบุสภาพแวดล้อม โปรแกรมจะถือว่าเซิร์ฟเวอร์ทำงานในสภาพแวดล้อมการพัฒนา
- กำลังโหลดการกำหนดค่า — ไฟล์
config/webpacker.yml
เต็มไปด้วยการตั้งค่าสำหรับสภาพแวดล้อมที่ตั้งไว้ในขั้นตอนก่อนหน้า - กำลังตรวจสอบตัวเลือกคำสั่ง — โปรแกรมจะตรวจสอบว่าเราส่งตัวเลือกที่เหมาะสมไปยังคำสั่งเซิร์ฟเวอร์หรือไม่ ตัวอย่างเช่น มันจะส่งข้อผิดพลาดเมื่อ
--https
มีให้ แต่เราไม่ได้ระบุไว้ในconfig/webpacker.yml
ไฟล์. - การตรวจสอบความพร้อมใช้งานของพอร์ต — โปรแกรมจะตรวจสอบว่าพอร์ตที่ระบุพร้อมใช้งานหรือไม่ หากโปรแกรมอื่นใช้งานอยู่แล้ว จะเกิดข้อผิดพลาดขึ้นเพื่อแจ้งให้คุณทราบว่าคุณต้องอัปเดตการกำหนดค่าเซิร์ฟเวอร์ webpack ภายใน
config/webpacker.yml
ไฟล์. - กำลังดำเนินการคำสั่งให้บริการ webpack — เมื่อมีไดเร็กทอรีโหนดโมดูลอยู่ โปรแกรมรันคำสั่งภายในไดเร็กทอรี มิฉะนั้น รันมันด้วยไหมพรม โปรแกรมส่งผ่านตัวเลือกการกำหนดค่าไปยังคำสั่งที่ชี้ไปยังไฟล์ใดไฟล์หนึ่งที่อยู่ใน
config/webpack/
ไดเรกทอรี
เซิร์ฟเวอร์กำลังทำงานอยู่และจะคอมไพล์โค้ดของคุณทันที คุณจึงไม่ต้องรีสตาร์ทเซิร์ฟเวอร์เพื่อดูการเปลี่ยนแปลงและตรวจสอบว่า webpack สามารถสร้างบันเดิลด้วยโค้ดใหม่ได้หรือไม่
รหัสของเซิร์ฟเวอร์การพัฒนานั้นค่อนข้างง่าย มันโหลดเฉพาะการกำหนดค่าจากไฟล์การกำหนดค่าในรูปแบบ YAML และส่งการกำหนดค่าที่เหมาะสมในรูปแบบ JavaScript โดยตรงไปยัง webpack serve
สั่งการ. คุณยังสามารถเรียกใช้ด้วยตนเองได้ แต่คุณไม่จำเป็นต้องดูแลอาร์กิวเมนต์คำสั่งที่เหมาะสมด้วยคำสั่งในตัว
การรวบรวมไฟล์สำหรับสภาพแวดล้อมการผลิต
สมมติว่าคุณต้องการปรับใช้แอปพลิเคชันที่ใช้ webpacker ในกรณีนั้น คุณสามารถเรียกใช้ assets:precompile
งานเป็น Webpacker เชื่อมโยงงานโดยอัตโนมัติ webpacker:compile
ไปเลย
webpacker:compile
. เป็นอย่างไร งานภายใต้ประทุน? ลองขุดลงไปดู มันทำสิ่งต่อไปนี้:
- มันห่อการโทรหลักออกเป็นสองช่วงตึกเพื่อให้แน่ใจว่า
NODE
มีการตั้งค่าสภาพแวดล้อมและบันทึก Webpacker จะถูกส่งออกไปยังมาตรฐาน - เรียก Webpack แล้วแยกวิเคราะห์บันทึกเพื่อพิจารณาว่าการดำเนินการสำเร็จหรือไม่
ตอนนี้คุณสามารถไปที่ public/packs/js
ไดเร็กทอรีเพื่อดูไฟล์ที่คอมไพล์ ควรปรับใช้กับเซิร์ฟเวอร์
สรุป
เราเพิ่งได้เรียนรู้ว่า Webpacker ทำงานอย่างไรภายใต้ประทุน คุณสามารถถือว่ามันเป็นสะพานเชื่อมระหว่างไลบรารี Webpack และแอปพลิเคชัน Rails ที่ให้คุณกำหนดค่า Webpack ด้วย Ruby และใช้โค้ดจาวาสคริปต์ภายในแอปพลิเคชันของคุณได้อย่างง่ายดาย
เพื่อสรุปบทความทั้งหมด เรามาทบทวนองค์ประกอบหลักของ Webpacker อีกครั้ง:
- การกำหนดค่า — วางไว้ใน
config/webpacker.yml
และอนุญาตให้คุณชี้ Webpacker ไปยังไดเร็กทอรีที่คุณเก็บไฟล์จาวาสคริปต์และแพ็คของคุณไว้ - Pack — เป็นจุดเริ่มต้นเดียวที่ Webpacker เริ่มรวบรวม แต่ละไลบรารีที่นำเข้าและเริ่มต้นในไฟล์นั้นจะถูกคอมไพล์โดยอัตโนมัติ
- เซิร์ฟเวอร์สำหรับการพัฒนา — สคริปต์ง่ายๆ ที่ให้คุณคอมไพล์ไฟล์ได้ทันที คุณจึงไม่ต้องรีสตาร์ทเซิร์ฟเวอร์ทุกครั้งที่แก้ไขไฟล์ JavaScript
- งานคอมไพล์ — งาน rake ธรรมดาที่เรียกใช้ Webpack และคอมไพล์ไฟล์ภายใต้ไดเร็กทอรีสาธารณะ เพื่อให้คุณสามารถปรับใช้กับเซิร์ฟเวอร์ที่ใช้งานจริงและทำให้พร้อมใช้งานสำหรับผู้ใช้ปลายทาง
- ตัวช่วยดู — ตัวช่วยที่ให้คุณรวมไฟล์ที่คอมไพล์แล้วในมุมมอง
สำหรับนักพัฒนาจำนวนมากที่ไม่มีประสบการณ์มากนัก Wepacker ดูเหมือนจะมีมนต์ขลังเล็กน้อย แต่จริงๆ แล้วมันเป็นไลบรารีที่เรียบง่ายที่ช่วยให้เราใช้ Webpack ในลักษณะ Ruby
ป.ล. หากคุณต้องการอ่านโพสต์ Ruby Magic ทันทีที่ออกจากสื่อ สมัครรับจดหมายข่าว Ruby Magic ของเราและไม่พลาดแม้แต่โพสต์เดียว!