วิธีสร้างองค์ประกอบที่กำหนดเองของเว็บคอมโพเนนต์เพื่อทำงานกับทั้งรายละเอียด


9

ฉันต้องการสร้างส่วนประกอบที่ควรทำงานกับสเป็คทั้งสองcustom elements spec v0ซึ่งได้เลิกใช้แล้วและcustom elements spec v1เป็นเวอร์ชันที่เสถียรล่าสุด

ถ้าฉันสร้างส่วนประกอบที่มีcustom elements v0แอพบางตัวจะประสบปัญหาเนื่องจากกำลังใช้งานpolymer 2และสูงกว่าและปัญหาเดียวกันกับpolymer 1แอปพลิเคชันที่ใช้งานไม่ได้กับcustom elements v1สเปค

ฉันไม่สามารถควบคุมแอปพลิเคชันเพื่อเปลี่ยนโพลีฟิลบางแอพพลิเคชั่นต้องใช้โพลีฟิลรองรับสเป็คเก่าและบางอันใช้โพลีฟิลล์ใหม่

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

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

connectedCallback(){
    this.attachedCallback();
}

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

โปรดแนะนำทางเลือกที่ใช้การได้และวิธีแก้ปัญหาที่เป็นไปได้สำหรับสถานการณ์ดังกล่าวข้างต้น

คำตอบ:


1

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

วิธีที่ดีกว่าในความคิดของฉันคือการใช้functionเช่น

function getWebComponentsVersion() {
    //Return v1 if it's v1 and v0 if it's v0
}

ฉันไม่แน่ใจว่าจะใช้งานได้functionอย่างไร แต่หากมีตัวใดตัวหนึ่งfunctionที่ให้เวอร์ชั่นที่เหมาะสมหรือมีความแตกต่างที่เห็นได้ชัดระหว่างฟังก์ชันการทำงานคุณสามารถใช้ฟังก์ชันข้างต้นได้ จากนั้นเรียกใช้รหัสนี้:

if (getWebComponentsVersion() === "v1") {
    //code for v1
} else {
    //code for v0
}

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

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

-1

Custom Elements v0 is deprecated at M70, and will be removed in M80, by February, 2020.ฉันสงสัยว่าคุณจะทราบว่า

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

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

หากคุณไม่พอใจกับการใช้ไลบรารี่ภายนอกลองBowserเพื่อตรวจสอบเวอร์ชั่นแพลตฟอร์มและอื่น ๆ

navigator.browserSpecs = (function(){
    var ua = navigator.userAgent, tem, 
        M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
    if(/trident/i.test(M[1])){
        tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
        return {name:'IE',version:(tem[1] || '')};
    }
    if(M[1]=== 'Chrome'){
        tem = ua.match(/\b(OPR|Edge)\/(\d+)/);
        if(tem != null) return {name:tem[1].replace('OPR', 'Opera'),version:tem[2]};
    }
    M = M[2]? [M[1], M[2]]: [navigator.appName, navigator.appVersion, '-?'];
    if((tem = ua.match(/version\/(\d+)/i))!= null)
        M.splice(1, 1, tem[1]);
    return {name:M[0], version:M[1]};
})();

console.log(navigator.browserSpecs); //Object { name: "Firefox", version: "42" }

if (navigator.browserSpecs.name == 'Chrome') {
    // Do something for Chrome.
    if (navigator.browserSpecs.version > 76) {
        // Do something for Chrome versions greater than 76 like load v1.
    }
}
else {
    // Do something for all other browsers.
}


ก่อนอื่นขอขอบคุณสำหรับคำตอบของคุณ ปัญหาที่แท้จริงอยู่ที่การสร้างส่วนประกอบเมื่อคุณตรวจพบเวอร์ชันของเบราว์เซอร์ การเพิ่มการตรวจสอบเพื่อตรวจสอบเวอร์ชันของเบราว์เซอร์จะเป็นขั้นตอนพิเศษ
Konga Raju

ดูเหมือนว่าฉันไปไกลในสมมติฐาน - ความคิดของฉันข้างต้นคือการสร้าง 2 องค์ประกอบที่แยกต่างหากและโหลดในเบราว์เซอร์ที่เหมาะสม
Mac_W
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.