เมื่อเรากำลังสร้างแอปพลิเคชัน Ember ไม่ช้าก็เร็ว เราจะต้องปรับใช้แอปพลิเคชันดังกล่าวกับการใช้งานจริง ปัญหาหนึ่งที่อาจเกิดขึ้นจะเกี่ยวข้องกับสินทรัพย์

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

Ember-cli ต้องขอบคุณ broccoli-asset-rev ที่มีวิธีแก้ปัญหาที่ดี — เพียงเปิดใช้งานการพิมพ์ลายนิ้วมือในการกำหนดค่า:

ดังที่คุณคงสังเกตเห็นแล้วว่า เราได้เพิ่ม GenerateAssetMap: true ซึ่งสั่งให้ broccoli-asset-rev สร้าง AssetMap.json ในไดเรกทอรี Assets/

ไฟล์นี้จะมีชื่อไฟล์เนื้อหาต้นฉบับและลายนิ้วมือที่เทียบเท่ากัน บางอย่างเช่น:

ทุกอย่างดูดี - มีปัญหาตรงไหน?

ปัญหาจะเกิดขึ้นเร็วๆ นี้ เนื่องจากเราจะสร้างชื่อของเนื้อหาแบบไดนามิก Broccoli กำลังจับคู่สิ่งที่เรามีใน AssetMap ทางด้านซ้ายและแทนที่ด้วยสิ่งที่อยู่ทางด้านขวา ตัวอย่างเช่น เราได้สร้างรูปภาพเป็นคุณสมบัติที่คำนวณได้:

ตอนนี้ เราไม่สามารถจับคู่มันเป็นชื่อคงที่ได้ เนื่องจาก `skin` สามารถมีค่าใดๆ ก็ได้ จะทำอย่างไร? เรามีหลายทางเลือก:

โซลูชัน # 1 (วิธีที่ง่ายที่สุด)

นี่เป็นวิธีแก้ปัญหาที่ตรงไปตรงมาและเรียบง่ายที่สุดที่คุณอาจได้รับ และฉันขอแนะนำให้ดำเนินการหากเป็นไปได้ และคุณมีเนื้อหาแบบไดนามิกไม่มากนัก

ง่ายๆ เท่าที่จะทำได้ — สร้างเส้นทางไปยังสินทรัพย์ของคุณให้คงที่

หากคุณคิดว่าโซลูชันนี้อาจไม่เหมาะกับคุณ เรามาดำเนินการต่อกัน

โซลูชัน # 2 (ไม่ใช่กระสุนเงิน)

หากคุณมีเนื้อหาจำนวนมาก คุณจะมีธงของประเทศต่างๆ และคุณต้องจับคู่ธงเหล่านั้นแบบไดนามิก ก่อนอื่น ถ้าคุณไม่ขี้เกียจพอ ให้ลองใช้โซลูชัน #1 ถ้าไม่เช่นนั้น ให้กลับไปที่ไฟล์ AssetMap.json ที่เราเคยเห็นกันก่อนดีกว่า

เมื่อทราบว่า AssetMap.json แก้ไขไฟล์คงที่ทั้งหมดให้เทียบเท่ากับลายนิ้วมือ เราจึงสามารถลองโหลดก่อนที่แอปพลิเคชันจะเริ่มทำงานและสร้างบริการที่กำหนดเองเพื่อแก้ไข เพื่อสิ่งนั้น เราควรสร้าง Initializers/asset-map.js และ services/asset-map.js

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

ข้อควรทราบประการหนึ่งสำหรับโซลูชันนี้ — AssetMap.json จะถูก แคช ในเบราว์เซอร์ไคลเอ็นต์ หากคุณสามารถหลีกเลี่ยงการจัดเก็บไฟล์นั้นใน CDN และ/หรือตั้งค่าให้หลีกเลี่ยงการแคชได้ (เช่น ส่งส่วนหัวโดยไม่มีแคช) วิธีแก้ปัญหานี้อาจเหมาะกับคุณ ถ้าไม่เรามาดูกันว่าเราจะทำอะไรได้อีก

โซลูชัน # 3

ลายนิ้วมือ AssetMap.json และแทรกลงในแอปของคุณ

หากเรารวมโซลูชันก่อนหน้านี้ทั้งหมดและการพิมพ์ลายนิ้วมือของ AssetMap.json เราจะได้ผลลัพธ์ที่น่าหวัง วิธีแก้ปัญหาที่เสร็จสิ้นแล้วจบลงในส่วนเสริมของ ember — RuslanZavacky/ember-cli-ifa

Addon ให้การแทรก AssetMap-HASH.json ลงในแอปพลิเคชันของคุณโดยอัตโนมัติ นอกจากนี้ยังมีตัวเริ่มต้น บริการ และผู้ช่วยเหลือเพื่อรับการอ้างอิงในแอปของคุณไปยังเนื้อหาลายนิ้วมือ

เพียงเปิดใช้งานใน environment.js ของคุณเป็น

ifa: { enabled: true }

และกำหนดค่าบล็อกลายนิ้วมือใน ember-cli-build.js ของคุณ

fingerprint: {
  enabled: EmberApp.env() === 'production',
  prepend: '', // can be a link to your CDN
  generateAssetMap: true,
  fingerprintAssetMap: true
},

ฉันหวังว่ามันจะช่วยได้ และยินดีรับข้อเสนอแนะทั้งหมดอย่างอบอุ่น!