เอาท์พุต: การกำหนดค่าตัวเลือกเอาท์พุตสามารถควบคุมวิธีที่ webpack เขียนไฟล์ที่คอมไพล์ลงในฮาร์ดดิสก์ โปรดทราบว่าแม้ว่าจะมี จุดเข้าได้หลายจุด แต่มีการระบุ การกำหนดค่าเอาต์พุตเพียงรายการเดียว เท่านั้น
ขั้นแรกเราเริ่มต้นโปรเจ็กต์ npm init
ติดตั้ง webpack
และ webpack-cli
ในเครื่อง จากนั้นสร้างโฟลเดอร์ index.html
, webpack.config.js
และ src
ในไดเร็กทอรีราก และสร้าง main.js
ในโฟลเดอร์เป็นไฟล์รายการ
หลังจากงานเตรียมการเสร็จสิ้นจะเป็นดังภาพ
ฟังก์ชั่นmain.js
ส่วนประกอบ () { var div=document.createElement('div') div.innerHTML="มาเรียนรู้การกำหนดค่าการส่งออกด้วยกัน~" ส่งคืน div - document.body.appendChild(ส่วนประกอบ())
index.html
<body> <script src="./dist/bundle.js"></script> </body>
packag.json
"สคริปต์": { "test": "echo "ข้อผิดพลาด: ไม่ได้ระบุการทดสอบ" && ออก 1", "build": "webpack" //Add }
จากนั้นส่วนการกำหนดค่า webpack.config.js
การกำหนดค่าตัวเลือก output
สามารถควบคุมวิธีที่ webpack เขียนไฟล์ที่คอมไพล์ลงในฮาร์ดดิสก์
โปรดทราบว่าแม้ว่าจะมีจุด入口
หลายจุด แต่การกำหนดค่า输出
เดียวเท่านั้นที่ถูกระบุ
ต่อไปนี้เป็นแนวคิดหลายประการของการกำหนดค่าเอาต์พุต:
1.
เส้นทางพาธระบุตำแหน่งของเอาต์พุตทรัพยากร และค่าที่ต้องการจะต้องเป็นเส้นทางสัมบูรณ์ เช่น :
const path=require(' เส้นทาง') โมดูล.ส่งออก={ รายการ:'./src/main.js', เอาท์พุท:{ ชื่อไฟล์:'bundle.js', //ตั้งค่าตำแหน่งเอาต์พุตทรัพยากรเป็นเส้นทางไดเรกทอรี dist ของโครงการ: path.resolve(__dirname, 'dist') - }
หลังจาก Webpack 4 แล้ว output.path ได้ตั้งค่าเริ่มต้นเป็นไดเร็กทอรี dist เว้นแต่เราจำเป็นต้องเปลี่ยนแปลง ไม่จำเป็นต้องกำหนดค่าแยกต่างหาก ดังนั้นหากเป็น webpack4 หรือสูงกว่า คุณสามารถเขียน:
module.exports={ รายการ:'./src/main.js', เอาท์พุท:{ ชื่อไฟล์:'bundle.js', - }
2. ชื่อไฟล์ ฟัง
ก์ชั่นของชื่อไฟล์คือ การควบคุมชื่อไฟล์ของทรัพยากรเอาต์พุต ซึ่งอยู่ในรูปแบบของสตริง ในที่นี้ฉันตั้งชื่อมันว่า bundle.js
ซึ่งหมายความว่าฉันต้องการให้ทรัพยากรถูกส่งออกในไฟล์ชื่อ Bundle.js:
module.exports={ รายการ:'./src/main.js', เอาท์พุท:{ ชื่อไฟล์:'bundle.js', - }
หลังจากทำแพ็กเกจแล้ว ดังแสดงในรูป โฟลเดอร์ dist
จะถูกสร้างขึ้นโดยอัตโนมัติโดยมีไฟล์ bundle.js
อยู่ในนั้น
ชื่อไฟล์สามารถเป็นได้ไม่เพียงแต่ชื่อของบันเดิลเท่านั้น แต่ยังเป็นพาธแบบสัมพันธ์ด้วย
ไม่สำคัญว่าไดเร็กทอรีในพาธจะไม่มีอยู่จริง Webpack จะสร้างไดเร็กทอรีเมื่อส่งออกทรัพยากร เช่น:
module.exports = { เอาท์พุท: { ชื่อไฟล์: './js/bundle.js', - };
ดังแสดงในภาพหลังบรรจุภัณฑ์:
ในสถานการณ์ที่มีหลายรายการ เราจำเป็นต้องระบุชื่อที่แตกต่างกันสำหรับแต่ละบันเดิลที่สร้างขึ้น Webpack รองรับการใช้แบบฟอร์มที่เหมือนภาษาเทมเพลตเพื่อสร้างชื่อไฟล์แบบไดนามิก
ก่อนหน้านั้น เราสร้างไฟล์รายการใหม่ใน src
:
ฟังก์ชั่นส่วนประกอบ () { var div=document.createElement('div') div.innerHTML="ฉันเป็นไฟล์รายการที่สอง" ส่งคืน div - document.body.appendChild (ส่วนประกอบ ())
webpack.config.js:
module.exports = { รายการ:{ หลัก:'./src/main.js', ผู้จำหน่าย:'./src/vender.js' - เอาท์พุท: { ชื่อไฟล์: '[ชื่อ].js', - };
ดังแสดงในภาพหลังบรรจุภัณฑ์:
[name]
ในชื่อไฟล์จะถูกแทนที่ด้วยชื่อกลุ่ม ได้แก่ ชื่อหลักและผู้ขาย ดังนั้น vendor.js
และ main.js
จะถูกสร้างขึ้นในตอนท้าย
หากคุณต้องการดูเนื้อหา คุณต้องเปลี่ยนเนื้อหาใน index.html
และจับคู่พาธกับบันเดิลแพ็กเกจสุดท้าย
<body> <script src="./dist/main.js"></script> <script src="./dist/vender.js"></script> </body>
[คำถาม] จะมีความจำเป็นในเวลานี้ เราจะทำให้
index.html
เพิ่มบันเดิลที่สร้างลงใน html ให้เราโดยอัตโนมัติได้อย่างไร สามารถใช้ปลั๊กอิน HtmlWebpackPlugin ได้ที่นี่ สำหรับรายละเอียดด้านล่าง
3.
นอกจาก [name]
ซึ่งสามารถอ้างถึงชื่อ chunk แล้ว ยังมีตัวแปรเทมเพลตอื่นๆ อีกหลายตัวที่สามารถใช้ในการกำหนดค่าชื่อไฟล์ได้:
พวกเขาสามารถ: ควบคุมแคชไคลเอนต์
[hash]
และ [chunkhash]
เกี่ยวข้องโดยตรงกับเนื้อหากลุ่ม หากใช้ในชื่อไฟล์ เมื่อเนื้อหากลุ่มเปลี่ยนแปลง ก็อาจทำให้ชื่อไฟล์ทรัพยากรเปลี่ยนแปลงได้เช่นกัน ว่าผู้ใช้จะดาวน์โหลดเวอร์ชันใหม่ทันทีในครั้งถัดไปที่เขาร้องขอไฟล์ทรัพยากรโดยไม่ต้องใช้แคชในเครื่อง
[query]
ก็สามารถให้เอฟเฟกต์ที่คล้ายกันได้ แต่ไม่เกี่ยวข้องกับเนื้อหาที่เป็นก้อน และนักพัฒนาจะต้องระบุด้วยตนเอง
4. publicPath
publicPath เป็นรายการการกำหนดค่าที่สำคัญมาก ซึ่งใช้ในการระบุตำแหน่งคำขอของทรัพยากร
ถ่ายภาพเป็น
ตัวอย่าง ส่วนประกอบฟังก์ชัน () { - var img = รูปภาพใหม่ (); myyebo.src = Img // URL คำขอ - }
{ - แบบสอบถาม: { ชื่อ: '[ชื่อ].[ต่อ]', เส้นทางขาออก: 'static/img/', เส้นทางสาธารณะ: './dist/static/img/' - }
ดังที่แสดงในตัวอย่างข้างต้น ที่อยู่คำขอรูปภาพต้นฉบับคือ ./img.jpg
แต่หลังจากเพิ่ม publicPath
ให้กับการกำหนดค่า พาธจริงจะกลายเป็น ./dist/static/img/img.jpg
ดังนั้นจึงสามารถรับรูปภาพได้จาก publicPath
มี 3 รูปแบบ:
เกี่ยวข้องกับ HTML
เราสามารถระบุ publicPath เป็นเส้นทางสัมพันธ์ของ HTML ได้ เมื่อร้องขอทรัพยากรเหล่านี้ เส้นทางของ HTML ของหน้าปัจจุบันจะถูกเพิ่มไปยังเส้นทางสัมพันธ์เพื่อสร้าง URL ที่แท้จริง
//สมมติว่าที่อยู่ html ปัจจุบันคือ: https://www.example.com/app/index.html //ทรัพยากรที่โหลดแบบอะซิงโครนัสมีชื่อว่า 1.chunk.js เส้นทางสาธารณะ:"" //-->https://www.example.com/app/1.chunk.js pubilicPath:"./js" //-->https://www.example.com/app/js/1.chunk.js publicPath:"../assets/" //-->https://www.example.com/assets/1.chunk.js
Host related
หากค่าของ publicPath ขึ้นต้นด้วย "/" หมายความว่า publicPath ที่ คราวนี้เริ่มต้นด้วย The host name of the current page is the base path
// สมมติว่าที่อยู่ html ปัจจุบันคือ: https://www.example.com/app/index.html //ทรัพยากรที่โหลดแบบอะซิงโครนัสมีชื่อว่า 1.chunk.js เส้นทางสาธารณะ:"/" //-->https://www.example.com/1.chunk.js pubilicPath:"/js/" //-->https://www.example.com/js/1.chunk.js
เกี่ยวข้องกับ CDN
สองเส้นทางข้างต้นเป็นเส้นทางสัมพัทธ์ เรายังสามารถใช้เส้นทางสัมบูรณ์เพื่อกำหนดค่า publicPath
นี้ สถานการณ์โดยทั่วไปเกิดขึ้นเมื่อวางทรัพยากรแบบคงที่บน CDN เนื่องจากชื่อโดเมนไม่สอดคล้องกับชื่อโดเมนของเพจปัจจุบัน จึงจำเป็นต้องระบุในรูปแบบของเส้นทางสัมบูรณ์
เมื่อ publicPath เริ่มต้นในรูปแบบของส่วนหัวของโปรโตคอลหรือแบบสัมพันธ์ โปรโตคอล หมายความว่าเส้นทางปัจจุบันเกี่ยวข้องกับ CDN
/ /สมมติว่าที่อยู่ html ปัจจุบันคือ: https://www.example.com/app/index.html //ทรัพยากรที่โหลดแบบอะซิงโครนัสมีชื่อว่า 1.chunk.js เส้นทางสาธารณะ:"http://cdn.com/" //-->http://cdn.com/1.chunk.js เส้นทางสาธารณะ:"https://cdn.com/" //-->https://cdn.com/1.chunk.js pubilicPath:"//cdn.com/assets" //-->//cdn.com/assets/1.chunk.js
1. ทางเข้าเดียว
ข้อกำหนดขั้นต่ำสำหรับการกำหนดค่าแอตทริบิวต์ output
ใน webpack คือการตั้งค่าให้กับออบเจ็กต์ รวมถึงสองจุดต่อไปนี้:
filename
คือชื่อไฟล์ของไฟล์เอาต์พุตpath
ไดเร็กทอรีเอาต์พุตเป้าหมายmodule.exports={ รายการ:'./src/main.js', เอาท์พุท:{ ชื่อไฟล์:'bundle.js', - - //หลังจาก webpack 4 dist จะถูกสร้างขึ้นตามค่าเริ่มต้น ดังนั้นจึงละเว้นพาธที่นี่
2.
หากการกำหนดค่าสร้าง "chunks" หลายรายการแยกกัน คุณควรใช้ตัวยึดตำแหน่งเพื่อให้แน่ใจว่าแต่ละไฟล์มีชื่อที่ไม่ซ้ำ
กัน ถูกใช้ที่นี่ [name]
ของชื่อไฟล์ที่กล่าวถึง
นอกจากนี้ หากคุณต้องการใส่ทรัพยากรเหล่านี้ลงในโฟลเดอร์ที่ระบุ คุณสามารถเพิ่มการกำหนด path
module.exports={ รายการ: { หลัก: './src/main.js', ผู้จำหน่าย: './src/vender.js' - เอาท์พุท: { ชื่อไฟล์: '[ชื่อ].js', เส้นทาง: __dirname + '/dist/assets' //ระบุว่าชุดแพ็กเกจถูกวางไว้ในไดเร็กทอรี /dist/assets} - // สร้างหลังจากการบรรจุภัณฑ์: ./dist/assets/main.js, ./dist/assets/vender.js
ปัญหาที่เหลืออยู่ข้างต้นในบทนี้สามารถแก้ไขได้โดยใช้ปลั๊กอิน HtmlWebpackPlugin
ติดตั้งปลั๊กอิน
npm install --save-dev html-webpack-plugin
กำหนดค่าปลั๊กอิน
const HtmlWebpackPlugin=require('html-webpack-plugin') //Load module module.exports = { รายการ:{ หลัก:'./src/main.js', ผู้จำหน่าย:'./src/vender.js' - //เพิ่มปลั๊กอินปลั๊กอิน:[ ใหม่ HtmlWebpackPlugin({ หัวเรื่อง: 'การจัดการผลผลิต' - - เอาท์พุท: { ชื่อไฟล์: '[ชื่อ].js', - };หลังจากที่
บรรจุภัณฑ์
เสร็จสมบูรณ์ คุณจะพบว่า index.html
ใหม่ปรากฏขึ้นใน dist ซึ่งจะเพิ่มทรัพยากรที่สร้างขึ้นให้เราโดยอัตโนมัติ หลังจากเปิด คุณจะพบว่าเบราว์เซอร์จะแสดงเนื้อหา
ซึ่งหมายความว่าคุณไม่จำเป็นต้องเขียน index.html
เมื่อเริ่มต้นโครงการในอนาคต
สามารถรับซอร์สโค้ดได้ที่นี่:
https://sanhuamao1.coding.net/public/webpack-test/webpack-test/git/ ไฟล์