ภาพเปล่า สิ่งที่ต้องใช้: ภาพ JPEG Base64 เทียบกับ 1x1


11

ฉันกำลังสร้างเว็บไซต์และฉันต้องการสร้างข้อความค้นหา HTTP ให้น้อยที่สุดเท่าที่จะทำได้เพื่อให้เว็บไซต์มีความเร็วและ SEO ที่ดีขึ้น หน้าที่ฉันเพิ่งสร้างคือการแสดงภาพบนหน้าจอเลื่อน (ภาพมีคุณลักษณะ data-scr ซึ่งถูกแปลงเป็น src เมื่อผู้ใช้เลื่อนลงที่ภาพตามลำดับ

เนื่องจากรูปภาพทั้งหมดมีdata-srcแอตทริบิวต์แทนsrcW3C จึงแสดงข้อผิดพลาดให้ฉัน

ในขณะนี้ฉันพบสองตัวเลือกเพื่อแก้ปัญหานี้:

  1. src เริ่มต้นของภาพทั้งหมดเป็น URL ของภาพขนาด 1x1 ที่ว่างเปล่า
  2. src เริ่มต้นของภาพทั้งหมดที่จะเป็นฐานข้อมูล 64 ภาพเปล่า

เมื่อฉันใช้ URL ของภาพ 1x1 เปล่าแล้ว (ทดสอบด้วย tools.pingdom.com) จะแสดงคำขอ HTTP 1 รายการ เมื่อฉันใช้ data base64 ภาพเปล่าแล้วมันจะแสดงคำขอมากเท่าจำนวนภาพในหน้า

วิธีใดที่มีประสิทธิภาพมากขึ้นสำหรับเว็บไซต์ที่เร็วขึ้นและทำให้การร้องขอ HTTP น้อยลง (สมมติว่าผู้ใช้โหลดหน้าเว็บด้วยความเร็วอินเทอร์เน็ต 14.4kbps - ความเร็วอินเทอร์เน็ตครั้งแรก)

แต่สำหรับ SEO

มีตัวเลือกอื่น ๆ อีกไหม?


8
"เมื่อฉันใช้ดาต้าฐาน 64 อิมเมจเปล่าแล้วมันจะแสดงคำขอมากเท่าจำนวนภาพในหน้า" - มีบางอย่างผิดปกติใช่ไหม? จุดทั้งหมดของการใช้ data-URI คือไม่มีการร้องขอ HTTP ภายนอก (เฉพาะตัวแทนผู้ใช้ที่ไม่เข้าใจ data-URIs อาจเริ่มคำขอ HTTP)
MrWhite

หากภาพที่ว่างจะมีขนาดใหญ่กว่า 1x1 พิกเซล (ผมคิดว่ามันเป็น) ผมจะแนะนำภาพพื้นหลังที่มีขนาดใหญ่ (10x10 พิกเซล, 100x100 พิกเซล) เพราะการแสดงผลจะเร็วขึ้น
totymedli

3
ใช้ไม่ได้เหรอ? คุณสามารถสร้างแท็ก img แบบไดนามิกในเวลาเดียวกันกับที่คุณแปลง data-src เป็น src แทนที่จะมีภาพว่างด้วย data-src คุณสามารถจัดเก็บรายการภาพและสร้างแท็กเมื่อต้องการ
the_lotus

@Phap ที่ไม่ทำงานเพราะเบราว์เซอร์จะดาวน์โหลดรูปภาพแม้ว่าจะซ่อนอยู่ก็ตาม
DisgruntledGoat

ไม่ว่าคุณจะเลือกส่งเนื้อหาใดการเข้ารหัสเป็น png8 อาจจะเร็วกว่า JPEG
symcbean

คำตอบ:


12

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

ตัวอย่างเช่นภาพนี้จะมีขนาดประมาณ 95 ไบต์ ( https://commons.wikimedia.org/wiki/File:1x1.png ) สำหรับสตริงรูปภาพที่เข้ารหัส base64 คุณจะพบว่าขนาดจะอยู่ในขนาดเดียวกับภาพนี้ ขนาดไฟล์ แต่จะถูกทำซ้ำสำหรับทุก ๆ ภาพที่คุณเพิ่มเข้าไป

สำหรับรูปภาพ 2-5 ขนาดและความเร็วจะไม่สำคัญและจะลดทราฟฟิกเซิร์ฟเวอร์โดยกำจัดการดึงข้อมูลทั้งหมด แต่ยิ่งกว่านั้นขนาดหน้าจะเริ่มมีขนาดใหญ่เกินไปซึ่งจะมีผลต่อเวลาในการโหลดและการจัดอันดับ SEO


6
ภาพ base64 ว่างเปล่าอาจมี 55 data:image/gif;base64,R0lGODlhAQABAAAAACwAAAAAAQABAAA=ไบต์: หาก URL ของภาพนั้นยาวขึ้นอีกเล็กน้อย (เช่น: example.com/templates/template-name/files/1x1.png ) รูปภาพ base64 จะถูกแนะนำเนื่องจากคุณไม่ทำการสืบค้น HTTP และมีขนาดเล็กลงในหน่วยไบต์ กว่า URL ภาพ (ซ้ำสำหรับแต่ละภาพในหน้า) + ขนาดภาพภายนอก
NETCreator Hosting

@ NETCreatorHosting-WebDesign ขอบคุณสำหรับความคิดเห็นของคุณ ฉันเปรียบเทียบขนาดของเว็บไซต์เมื่อใช้ภาพ base64 และภาพภายนอกและขนาดเล็กลงเมื่อใช้ภาพ base64 ฉันใช้ภาพประมาณ 40 ภาพต่อหน้า
MM PP

หรือคุณสามารถอัพโหลดภาพบนรูทเว็บไซต์ของคุณและใช้ url ที่เกี่ยวข้องดังนั้นเว็บไซต์จะเล็กลงมาก
NETCreator การโฮสต์

3
gzip จะดูแลการทำซ้ำดังนั้นการมี 400-64 รูปภาพที่เข้ารหัสในหน้าของคุณจะไม่เสียค่าใช้จ่ายแบนด์วิดท์มากกว่า 400 URL ของภาพ
user2428118

3
@Aron หากหน้าของคุณมีขนาดใหญ่ 25.6 MB (URI ข้อมูลยาว 400 82 ไบต์ที่มี 64kB ระหว่างนั้น = 25,568,800 ไบต์) แสดงว่าคุณมีปัญหาใหญ่กว่าที่กังวลเกี่ยวกับภาพที่เข้ารหัสด้วยเบส 64 ฐานที่ 32.8 กิโลไบต์
2428118

5

ไปกับ data URI อย่างแน่นอนเว้นแต่คุณต้องการการสนับสนุนสำหรับ IE <8 ( รองรับเบราว์เซอร์ )

ฝังจำนวนมากของภาพเล็ก ๆ โดยตรงในรูปแบบ HTML อาจจะดูว่ามันจะใช้เวลาถึงแบนด์วิดท์มากกว่าการเชื่อมโยงกับพวกเขาโดยตรง แต่เพิ่มขึ้นจะลดลงโดยgzip ; ความแตกต่างเพียงอย่างเดียวในขนาดของหน้าจะมาจากความแตกต่างของความยาวระหว่างURI ข้อมูลเดียวของภาพเปล่าและURL หนึ่งภาพบนเซิร์ฟเวอร์ของคุณ GIF ว่างเปล่าสามารถมีขนาดเล็กเป็น 43 ไบต์ เข้ารหัส 64 ฐานนั่นคือ 82 ไบต์ ไม่มีวิธีใดที่จะทำงานได้แย่กว่าคำขอ HTTP 500- ไบต์การตอบสนองที่มีขนาดใกล้เคียงกันจากนั้นฉันจะไม่ใช้ขนาดแพ็คเก็ต TCP และค่าใช้จ่ายอื่น ๆ

นี่คืออิมเมจ GIF 43 43 บิตที่เข้ารหัส 64 ฐาน

data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==

สำหรับ SEO ลองดูที่ซอร์สโค้ดของเว็บไซต์Googleเช่นGoogle Newsและค้นหาdata:image/gif,base64...


ภาพของคุณมีขนาดใหญ่ ตรวจสอบความคิดเห็นด้านบนสำหรับรุ่น 55 ไบต์
Joshua

1
คำตอบใน StackOverflow ด้วยการทดสอบที่รายงาน (พฤษภาคม 2014)ดูเหมือนจะแสดงว่าการฝังจำนวนมาก (~ 1800) ของภาพ 1px นั้นช้ากว่าการเชื่อมโยงไปยังภาพภายนอกเดียวกันซ้ำ ๆ รูปภาพภายนอกถูกร้องขอหนึ่งครั้งและถูกแคชในขณะที่เบราว์เซอร์จะต้องถอดรหัสข้อมูล -URI ทุกอันแยกกันเป็นส่วนหนึ่งของกระบวนการแยกวิเคราะห์ HTML - นี่จะดูเหมือนเป็นคอขวด สิ่งนี้ดูเหมือนจะแนะนำว่า data-URIs ควรถูก จำกัด ไว้ที่รูปภาพ (เล็ก) จำนวนน้อย
DocRoot

@Joshua แม้ว่าภาพนั้นจะแสดงอย่างถูกต้องในเบราว์เซอร์ของฉัน (Firefox) แต่โปรแกรมอื่นไม่สามารถเปิดได้ (เช่นโปรแกรมระบายสี) ดังนั้นฉันจึงไม่ควรใช้
2428118

2

ในขณะนี้ฉันพบสองตัวเลือกเพื่อแก้ปัญหานี้: src เริ่มต้นของภาพทั้งหมดเป็นฐานข้อมูล 64 ภาพเปล่า

ตัวเลือกนี้ไม่เพียง แต่ต้องใช้เบราว์เซอร์ที่ทันสมัย ​​แต่มันอาจช้าลงในฝั่งไคลเอ็นต์เนื่องจากเบราว์เซอร์จะต้องถอดรหัส 64 ฐานข้อมูลภาพเพื่อสร้างภาพ

src เริ่มต้นของภาพทั้งหมดเป็น URL ของภาพขนาด 1x1 ที่ว่างเปล่า

เป็นการย้ายที่ตกลงโดยมีเงื่อนไขว่า URL รูปภาพเปล่าสำหรับช่องภาพทั้งหมดนั้นเป็น URL เดียวกันทั้งหมดและมีอายุการใช้งานแคชที่ยาวนานซึ่งกำหนดไว้ในส่วนหัว HTTP "การควบคุมแคช" ปัญหานี้คือเมื่อไฟล์ภาพใหม่โหลดสี่เหลี่ยมภาพจะข้ามไปที่ขนาดใหม่ซึ่งอาจทำให้ประสบการณ์การใช้งานของผู้ใช้ไม่น่าอัศจรรย์

แนวคิดที่เกือบสมบูรณ์แบบคือสิ่งนี้ ...

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

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

นี่คือเทมเพลต HTML ที่จะใช้หากคุณต้องการใช้เส้นทางที่รวดเร็ว มีการร้องขอเพียงสองครั้ง รหัส HTML และภาพเดียว ในรหัสนี้ฉันถือว่าภาพแต่ละภาพจากชีตคือความกว้าง 100 พิกเซลและความสูง 200 พิกเซลและภาพแต่ละภาพนั้นอยู่ชิดกันอย่างสมบูรณ์โดยไม่มีช่องว่าง

<html>
<head>
<style type="text/css">
#imagegrid {background-color: black; background-image:url('http://example.com/url/to/imagesheet.jpg');}
A {display:block;width:100px;height:200px;margin:10px;float:left;}
#image1{background-position: 0px 0px}
#image2{background-position: 100px 0px}
#image3{background-position: 200px 0px}
...
#imageN{background-position: XXXpx 0px}
</style>
</head>
<body>
<div id="imagegrid">
<a href="image_one.htm" id="image1"></a>
<a href="image_two.htm" id="image2"></a>
<a href="image_three.htm" id="image3"></a>
...
<a href="image_N.htm" id="imageN"></a>
</div>
</body>
</html>

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


2
หากภาพของคุณมีขนาดไม่ถึงครึ่งกิกะไบต์ก็ไม่มีวิธีใดที่การถอดรหัส 64 ภาพจะมีผลกระทบต่อประสิทธิภาพการทำงานที่วัดได้
user2428118

นอกจากนี้ยังขึ้นอยู่กับระบบคอมพิวเตอร์ด้วย หากลูกค้ายังคงมีคอมพิวเตอร์ที่ล้าสมัยเช่น Pentium 1 แสดงว่าอาจมีประสิทธิภาพ
Mike

1

ภาพเพราะการบำรุงรักษา

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

มันจะง่ายมากในการรักษารหัสถ้าคุณใช้ภาพโปรขั้นต่ำสุดของไม่หนักถึงนี้


หลายคนใช้สคริปต์เพื่อสร้างค่าพื้นฐาน -64 ดังนั้นความต้องการที่จะจดจำค่าดังกล่าวอยู่นอกหน้าต่างยกเว้นกรณีที่ OP เกิดขึ้นเพื่อใช้เฉพาะชุดไฟล์ HTML เพื่อแสดงรหัสของเว็บไซต์ของเขา
Mike

1

วิธีการเกี่ยวกับเพียง ~ 3 ไบต์พิเศษ 0 ร้องขอ http พิเศษ 0 และ 0 ความยาว img src เพิ่มเติม (หรือ 0 ตัวยึดภาพข้อมูลที่ไม่ว่าง 0) คุณสามารถใช้ src เปล่าสำหรับภาพได้ไหม?

<img src data-src="banannanannas.jpg" />

และหากพวกเขามีaltแท็กคุณสามารถซ่อนพวกเขาจากข้อผิดพลาด / ภาพล้มเหลว:

<img src data-src="banannanannas.jpg" onerror="this.alt=''" alt="some desc" />

แสดงผล: ไม่มีอะไร การแฮ็กนอกแท็ก alt มีความล่าช้าเล็กน้อยเล็กน้อยจากขอบตัวยึดภาพ บางทีก็สามารถล้างออกได้เช่นกัน


2
แม้ว่าsrcแอตทริบิวต์ที่ว่างเปล่าจะยังคงส่งข้อผิดพลาดในตัวตรวจสอบความถูกต้อง W3C (ซึ่งน่าจะเป็นข้อกังวล)
MrWhite

@ w3dk ใช่นั่นแย่มาก แต่แล้วความทันสมัยก็น้อยมาก
dhaupin

หากคุณต้องการส่งผ่านกฎ W3C จำเป็นต้องระบุบางสิ่งสำหรับ src แม้ว่าจะเป็น URL ที่ส่งกลับข้อผิดพลาด 404 ฉันขอแนะนำให้ระบุค่าของคุณลักษณะความกว้างและความสูงสำหรับรูปภาพเพื่อให้ผู้ใช้เห็นตัวยึดตำแหน่งจริงในตอนแรกแทนที่จะเป็นกล่องเล็ก ๆ ที่ขยายขึ้นครึ่งทางผ่านกระบวนการโหลด
Mike
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.