วิธีเพิ่มประสิทธิภาพเวลาในการสร้างของ webpack โดยใช้เครื่องมือ prefetchPlugin & วิเคราะห์?


96

การวิจัยก่อนหน้านี้:

ตามที่ wiki ของ webpack กล่าวไว้คุณสามารถใช้เครื่องมือวิเคราะห์เพื่อเพิ่มประสิทธิภาพการสร้าง:

จาก: https://github.com/webpack/docs/wiki/build-performance#hints-from-build-stats

คำแนะนำจากการสร้างสถิติ

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

คุณสามารถสร้างไฟล์ JSON ที่ต้องการได้โดยเรียกใช้ webpack --profile --json> stats.json


ฉันสร้างไฟล์สถิติ ( มีให้ที่นี่ ) อัปโหลดไปยังเครื่องมือวิเคราะห์ของ webpack
และภายใต้แท็บคำแนะนำฉันบอกให้ใช้ prefetchPlugin:

จาก: http://webpack.github.io/analyse/#hints

โมดูลยาวสร้างโซ่

ใช้การดึงข้อมูลล่วงหน้าเพื่อเพิ่มประสิทธิภาพการสร้าง prefetch โมดูลจากตรงกลางของห่วงโซ่


ฉันขุดเว็บจากภายนอกเพื่อค้นหาเอกสารที่มีอยู่ใน prefechPlugin คือ:

จาก: https://webpack.js.org/plugins/prefetch-plugin/

PrefetchPlugin

new webpack.PrefetchPlugin([context], request)

คำขอสำหรับโมดูลปกติซึ่งได้รับการแก้ไขและสร้างขึ้นก่อนที่ความต้องการจะเกิดขึ้น สิ่งนี้สามารถเพิ่มประสิทธิภาพได้ พยายามที่จะสร้างโปรไฟล์ก่อนเพื่อตรวจสอบจุด prefetching ฉลาด



คำถามของฉัน:

  • วิธีใช้ prefetchPlugin อย่างถูกต้อง?
  • ขั้นตอนการทำงานที่เหมาะสมที่จะใช้กับเครื่องมือวิเคราะห์คืออะไร
  • ฉันจะรู้ได้อย่างไรว่า prefetchPlugin ทำงานได้หรือไม่ ฉันจะวัดได้อย่างไร?
  • การดึงโมดูลจากตรงกลางของโซ่หมายความว่าอย่างไร

ฉันจะขอบคุณตัวอย่างบางส่วน

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


1
เราควรใช้เครื่องมือวิเคราะห์สถิติอย่างไร เมื่อฉันคลิกอัปโหลดไม่มีอะไรเกิดขึ้นและไม่มีปุ่มส่ง "ใช้ตัวอย่าง" เท่านั้น
TetraDev

เอาต์พุตคอนโซลแจ้งUncaught SyntaxError: Unexpected token r in JSON at position 0เมื่ออัปโหลด stats.json
TetraDev

1
@TetraDev ซึ่งหมายความว่าคุณมีข้อผิดพลาดในไฟล์ JSON ของคุณ ลองเปิดด้วยโปรแกรมแก้ไขข้อความและดูว่ามีบางอย่างที่ดูเหมือน JSON ไม่ถูกต้องหรือไม่ (ฉันมีปัญหาเดียวกันกับเอาต์พุตดีบักจาก Webpack ในบรรทัดแรก)
maufl

เอกสารมี> stats.jsonแต่เขียนบรรทัดพิเศษอีกสองสามบรรทัดที่ด้านบนซึ่งจะทำลายตัวแยกวิเคราะห์
Alex Riina

คำตอบ:


35

ใช่เอกสารประกอบปลั๊กอินก่อนการดึงข้อมูลค่อนข้างไม่มีอยู่จริง หลังจากหาข้อมูลด้วยตัวเองแล้วมันค่อนข้างใช้งานง่ายและไม่มีความยืดหยุ่นมากนัก โดยทั่วไปจะใช้สองอาร์กิวเมนต์บริบท (ทางเลือก) และเส้นทางโมดูล (สัมพันธ์กับบริบท) บริบทในกรณีของคุณจะได้รับการ/absolute/path/to/your/project/node_modules/react-transform-har/สมมติว่าตัวหนอนในภาพของคุณจะหมายถึงnode_modulesเป็นต่อ webpack ของความละเอียด node_module

โมดูลการดึงข้อมูลล่วงหน้าที่แท้จริงควรมีความลึกไม่เกินสามการอ้างอิงโมดูล ดังนั้นในกรณีของคุณisFunction.jsคือโมดูลที่มีห่วงโซ่การสร้างแบบยาวและควรดึงข้อมูลไว้ล่วงหน้าที่getNative.js

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

ป้อนคำอธิบายภาพที่นี่

ไม่ว่าคุณจะต้องการเพิ่มปลั๊กอินใหม่สำหรับคำเตือนแต่ละคำดังนี้:

plugins: [
    new webpack.PrefetchPlugin('/web/', 'app/modules/HeaderNav.jsx'),
    new webpack.PrefetchPlugin('/web/', 'app/pages/FrontPage.jsx')
];

อาร์กิวเมนต์ที่สองต้องเป็นสตริงไปยังตำแหน่งสัมพัทธ์ของโมดูล หวังว่านี่จะสมเหตุสมผล


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

ไม่ได้ใช้มาสักพักแล้ว แต่มันอาจจะยังเหมือนเดิม ปลั๊กอินควรมีเพียงสองอาร์กิวเมนต์เท่านั้น หนึ่งบริบทซึ่งเป็นบริบทของโมดูลดังนั้นสำหรับตัวอย่างเช่นapp/components/module.jsxจะเป็น'app'และฉันคิดว่าที่สองที่ควรจะเป็นที่ตั้งของญาติเช่น'components/module.jsx'
4m1r

1
โอเคมีบัตรอื่นที่มัน ฉันได้ลองจัดเตรียม PrefetchPlugin อย่างน้อยสองโหลและดูเหมือนจะไม่มีอะไรที่จะลบมันออกจากห่วงโซ่การสร้างที่ยาวนานของฉัน ฉันมีปัญหาเดียวกันกับโปสเตอร์พบว่าฉันมีโมดูลโหนดที่อยู่ในสายการสร้างแบบยาวของฉันและฉันกำลังพยายามดึงข้อมูลล่วงหน้า ฉันไม่รู้ว่า Webpack อาจไม่รู้ว่าจะจัดการกับสถานการณ์นี้อย่างไร
ThrowsException

ฉันใช้ปลั๊กอิน prefetch เพื่อเพิ่มประสิทธิภาพของโปรเจ็กต์ของฉันที่ใช้ handlebars.js อย่างมาก นี่คือไวยากรณ์ที่เหมาะกับฉัน:new webpack.PrefetchPlugin(__dirname + "/node_modules", "handlebars/runtime.js"),
Andre

นอกจากนี้หากสิ่งที่คุณต้องการดึงข้อมูลล่วงหน้าไม่ใช่แพ็กเกจ (เช่นไม่อยู่ในnode_modules) คุณสามารถส่งสตริงคำขอได้ โปรดทราบว่าอาร์กิวเมนต์แรกบริบทเป็นทางเลือก
natchiketa

2

ตรงกลางของโซ่ของคุณอาจreact-transform-hmr/index.jsเป็นเพราะมันเริ่มมาได้ครึ่งทาง คุณสามารถลองPrefetchPlugin('react-transform-hmr/index')เรียกใช้โปรไฟล์ของคุณใหม่เพื่อดูว่าจะช่วยเร่งเวลาในการสร้างได้เร็วขึ้นหรือไม่


แย่ลงเท่านั้น .. จาก 2351ms ถึง 2361ms มันยังส่งข้อผิดพลาดEntry module not found: Error: Cannot resolve module 'react-transform-hmr/index' in /Users/asafkatz/Development/my-react-builerplate
Asaf Katz

4
ความแตกต่าง 10 มิลลิวินาทีไม่ได้แย่ไปกว่านี้ความแตกต่างนั้นไม่มีนัยสำคัญทางสถิติ ฉันจะเล่นกับสิ่งที่แตกต่างreact-transform-hmrหรือreact-transform-hmr/index.jsอื่น ๆ
Aaron Jensen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.