หากการขึ้นต่อกันของแต่ละโมดูลในโปรเจ็กต์ถือเป็นแผนผัง รายการจะเป็นรากของแผนผังการขึ้นต่อกัน
โมดูลที่ต้องพึ่งพาเหล่านี้จะถูกห่อหุ้มเป็นชิ้นเมื่อบรรจุภัณฑ์ แล้วก้อนคืออะไร?
Chunk แท้จริงหมายถึงบล็อกโค้ด ซึ่งใน Webpack สามารถเข้าใจได้ว่าเป็นโมดูลบางตัวที่ได้รับการสรุปและจัดทำแพ็คเกจ มันเหมือนกับถุงไฟล์ที่บรรจุไฟล์จำนวนมาก ไฟล์ที่อยู่ภายในคือแต่ละโมดูลที่เพิ่มชั้นของบรรจุภัณฑ์ที่ด้านนอกเพื่อสร้างเป็นชิ้น:
ขึ้นอยู่กับการกำหนดค่าเฉพาะ ชิ้นหนึ่งหรือหลายชิ้นอาจถูกสร้างขึ้นเมื่อมีการบรรจุโครงการ
สามารถกำหนดได้หลายรายการในโปรเจ็กต์ และแต่ละรายการจะสร้างทรัพยากรผลลัพธ์
ตัวอย่างเช่น มีสองรายการในโปรเจ็กต์ของเรา src/index.js
และ src/lib.js
dist/index.js
ใต้สถานการณ์ปกติ และ dist/lib.js
ในบางกรณีพิเศษ รายการหนึ่งอาจสร้างหลายชิ้นและสุดท้ายหลาย
พารามิเตอร์:
module.exports = { entry:'./src/index.js', //ระบุไฟล์รายการ นั่นคือ เข้าสู่โครงการของเราจาก index.js};
①
ตัวอย่าง | ประเภทรายการ | หมายถึง |
---|---|---|
สตริง | './app/entry' | เส้นทางไฟล์ของรายการ module ซึ่งสามารถเป็น Relative path |
array | ['./app/entry1', './app/entry2'] | เส้นทางไฟล์ของโมดูลรายการ ซึ่งสามารถเป็น |
วัตถุ | เส้นทางสัมพันธ์{ a: './app/entry- a', b: ['./ app/entry-b1', './app/entry-b2']} | กำหนดค่าหลายรายการ แต่ละรายการจะสร้าง Chunk |
หากเป็นประเภทอาร์เรย์ เมื่อใช้กับเอาต์พุต รายการการกำหนดค่าไลบรารี เฉพาะรายการสุดท้ายในอาร์เรย์ โมดูลของไฟล์รายการจะถูกส่งออก
② ชื่อกลุ่ม
Webpack จะให้ชื่อแต่ละกลุ่มที่สร้างขึ้น ชื่อของกลุ่มที่เกี่ยวข้องกับการกำหนดค่าของรายการ:
3. ไดนามิกการกำหนดค่า
รายการหากมีหลายเพจในโครงการ คุณต้องกำหนดค่ารายการสำหรับแต่ละรายการ แต่จำนวนเพจเหล่านี้อาจเพิ่มขึ้นต่อไป ดังนั้นการกำหนดค่าของรายการ จะได้รับผลกระทบจากปัจจัยอื่นๆ และไม่สามารถเขียนเป็นค่าคงที่ได้ วิธีแก้ไขคือตั้งค่ารายการเป็นฟังก์ชันเพื่อส่งคืนการกำหนดค่าที่กล่าวถึงข้างต้นแบบไดนามิก รหัสมีดังนี้:
// รายการฟังก์ชันซิงโครนัส: () => { กลับ { ก:'./pages/a', ข:'./pages/b', - - // รายการฟังก์ชันอะซิงโครนัส: () => { คืนสัญญาใหม่ ((แก้ไข)=>{ แก้ไข ({ ก:'./pages/a', ข:'./pages/b', - - };
พารามิเตอร์: บริบท
Webpack จะใช้บริบทเป็นไดเรกทอรีรากเมื่อค้นหาไฟล์ที่มีเส้นทางสัมพัทธ์เป็น ค่าเริ่มต้นของบริบทไปยังไดเรกทอรีการทำงานปัจจุบันที่ Webpack เริ่มต้น หากคุณต้องการเปลี่ยนการกำหนดค่าเริ่มต้นของบริบท คุณสามารถตั้งค่าเช่นนี้ในไฟล์การกำหนดค่า:
module.exports = { บริบท: path.resolve(__dirname, 'app') }
โปรดทราบว่าบริบทจะต้องเป็นสตริงเส้นทางที่แน่นอน
นอกจากนี้ คุณยังสามารถตั้งค่าโดยนำพารามิเตอร์ webpack --context เมื่อเริ่มต้น Webpack
การใช้งาน: entry:string|Array<string>
1. ไวยากรณ์ย่อ
webpack.config.js
//เนื่องจากเป็นแบบเดี่ยวจึงสามารถย่อเป็น: โมดูล.ส่งออก = { รายการ: './main.js' };
จริงๆ แล้วการกำหนดค่ารายการข้างต้นเขียนเป็นคำย่อดังนี้
module.exports = { รายการ: { หลัก: './main.js' - };
2. ไวยากรณ์อาร์เรย์
module.exports = { รายการ: { หลัก:['./main.js','./main2.js'] - };
ฟังก์ชั่นการส่งผ่านในอาร์เรย์คือการรวมทรัพยากรหลายรายการไว้ล่วงหน้า เมื่อทำการบรรจุ Webpack จะใช้องค์ประกอบสุดท้ายในอาร์เรย์เป็นเส้นทางรายการจริง
เมื่อใช้สตริงหรืออาร์เรย์เพื่อกำหนดรายการเดียว way to change the chunk name. , can only be the default "main".
การใช้งาน: entry: {[entryChunkName: string]: string|Array}
ไวยากรณ์ของวัตถุ
module.exports = { รายการ: { แอป: './src/app.js', ผู้ขาย: './src/vendors.js' - };
นี่จะยุ่งยากกว่านี้ อย่างไรก็ตาม นี่เป็นวิธีที่ขยายได้มากที่สุดในการกำหนดจุดเริ่มต้นในแอปพลิเคชัน
"การกำหนดค่า webpack แบบขยายได้" : นำมาใช้ใหม่และสามารถใช้ร่วมกับการกำหนดค่าอื่น ๆ ได้ นี่เป็นเทคนิคยอดนิยมสำหรับการแยกข้อกังวลออกจากสภาพแวดล้อม เป้าหมายในการสร้าง และรันไทม์ จากนั้นจึงรวมเข้าด้วยกันโดยใช้เครื่องมือพิเศษ เช่น webpack-merge
1. แอปพลิเคชันหน้าเดียว
ไม่ว่าจะเป็นเฟรมเวิร์ก ไลบรารี หรือโมดูลในแต่ละหน้า จะถูกอ้างอิงโดยจุดเข้าเดียวของ app.js
ข้อดีของสิ่งนี้คือ จะมีการสร้างไฟล์ JS เพียงไฟล์เดียวและการขึ้นต่อกันจะชัดเจน
โมดูล.ส่งออก = { รายการ: './src/app.js' };
วิธีการนี้ก็มีข้อเสียเช่นกัน นั่นคือโมดูลทั้งหมดจะถูกรวมเข้าด้วยกัน เมื่อขนาดของแอปพลิเคชันเพิ่มขึ้นถึงระดับหนึ่ง ปริมาณทรัพยากรที่สร้างขึ้นจะมีขนาดใหญ่เกินไป ซึ่งจะทำให้ความเร็ว
ใน
การเรนเดอร์เพจของผู้ใช้ลดลงการกำหนดค่าของ Webpack เมื่อบันเดิลมีขนาดใหญ่กว่า ที่ 250kB (ก่อนการบีบอัด) บันเดิลจะถือว่ามีขนาดใหญ่เกินไป และจะมีคำเตือนเกิดขึ้นระหว่างการบรรจุ ดังแสดงในรูป:
2. แยกไลบรารีบุคคลที่สาม (ผู้ขาย)
เพื่อแก้ไขปัญหาข้างต้น คุณสามารถแยกไลบรารีบุคคลที่สาม (ผู้ขาย) ได้
ผู้ขายหมายถึง "ซัพพลายเออร์" โดยทั่วไปผู้ขายจะหมายถึงบุคคลที่สามเช่นห้องสมุด และกรอบงานที่ใช้โดยโครงการ Bundle
module.exports = { รายการ: { แอป: './src/app.js', ผู้ขาย: ['react','react-dom','react-router'], - };
ตามตัวอย่างของแอปพลิเคชัน เราได้เพิ่มทางเข้าใหม่ด้วยชื่อ chunk ของ vendor
และใส่โมดูลของบุคคลที่สามที่โปรเจ็กต์ขึ้นอยู่กับในรูปแบบของอาร์เรย์
เราไม่ได้กำหนดเส้นทางรายการสำหรับผู้ขาย . Webpack ควรทำอย่างไร?
ในเวลานี้ เราสามารถใช้ CommonsChunkPlugin (CommonsChunkPlugin ถูกยกเลิกหลังจาก Webpack 4 คุณสามารถใช้ allowance.splitChunks) เพื่อแยกโมดูลทั่วไปในสองส่วนของแอปและผู้ขาย
ด้วยการกำหนดค่านี้ บันเดิลที่สร้างโดย app.js จะเป็นเพียงเท่านั้น ประกอบด้วย โมดูลธุรกิจและโมดูลของบริษัทอื่นที่ขึ้นอยู่กับจะถูกแยกออกเพื่อสร้างบันเดิลใหม่ ซึ่งบรรลุเป้าหมายของเราในการแยกผู้ขายด้วย
เนื่องจากผู้จำหน่ายมีเพียงโมดูลของบริษัทอื่นเท่านั้น ส่วนนี้จะไม่เปลี่ยนแปลงบ่อยครั้ง ดังนั้น การแคชฝั่งไคลเอ็นต์จึงสามารถนำมาใช้ประโยชน์ได้อย่างมีประสิทธิภาพ ซึ่งจะเพิ่มความเร็วในการเรนเดอร์โดยรวมเมื่อผู้ใช้ร้องขอเพจในภายหลัง
CommonsChunkPlugin ส่วนใหญ่จะใช้เพื่อแยกไลบรารีของบุคคลที่สามและโมดูลสาธารณะเพื่อป้องกันไม่ให้ไฟล์บันเดิลที่โหลดบนหน้าจอแรกหรือไฟล์บันเดิลที่โหลดตามความต้องการมีขนาดใหญ่เกินไป ส่งผลให้ใช้เวลาในการโหลดนาน
3. แอปพลิเคชันแบบหลายหน้า
สำหรับสถานการณ์แอปพลิเคชันแบบหลายหน้า เพื่อลดขนาดของทรัพยากรให้มากที่สุด เราหวังว่าแต่ละหน้าจะโหลดเฉพาะตรรกะที่จำเป็นของตัวเองเท่านั้น แทนที่จะรวมหน้าทั้งหมดไว้ในชุดเดียวกัน ดังนั้น แต่ละเพจจึงต้องมีบันเดิลแยกกัน ในกรณีนี้ เราใช้หลายรายการเพื่อให้บรรลุเป้าหมายนี้ โปรดดูตัวอย่างต่อไปนี้:
module.exports = { รายการ: { เพจหนึ่ง: './src/pageOne/index.js', เพจสอง: './src/pageTwo/index.js', หน้าสาม: './src/pageThree/index.js' - };
การกำหนดค่าข้างต้นบอก webpack ว่าต้องการกราฟการพึ่งพา 3 อันแยกกัน ในขณะนี้ รายการและเพจอยู่ในการติดต่อแบบหนึ่งต่อหนึ่ง เพื่อให้แต่ละ HTML สามารถโหลดโมดูลที่ต้องการได้ตราบเท่าที่แนะนำ JS ของตัวเอง