Τρόπος μετάβασης στο Manifest V3 για επεκτάσεις Chrome

Τρόπος μετάβασης στο Manifest V3 για επεκτάσεις Chrome

Τρόπος μετάβασης στο Manifest V3 για Επεκτάσεις Chrome PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Αν και δεν είμαι κανονικός προγραμματιστής επεκτάσεων του Chrome, σίγουρα έχω κωδικοποιήσει αρκετές επεκτάσεις και έχω ένα αρκετά ευρύ χαρτοφυλάκιο ανάπτυξης ιστού ώστε να γνωρίζω τον τρόπο με τον οποίο μπορώ να ξεπεράσω την εργασία. Ωστόσο, μόλις πρόσφατα, έβαλα έναν πελάτη να απέρριψε μία από τις επεκτάσεις μου καθώς έλαβα σχόλια ότι η επέκτασή μου ήταν "παλαιωμένη".

Καθώς προσπαθούσα να καταλάβω τι έφταιξε, σκούπισα την αμηχανία μου κάτω από το χαλί και αμέσως ξεκίνησα τη βαθιά μου βουτιά πίσω στον κόσμο των επεκτάσεων Chrome. Δυστυχώς, οι πληροφορίες για το Manifest V3 ήταν σπάνιες και ήταν δύσκολο για μένα να καταλάβω γρήγορα τι ήταν αυτή η μετάβαση.

Περιττό να πω ότι με μια δουλειά σε εκκρεμότητα, έπρεπε να περιηγηθώ με κόπο Τεκμηρίωση προγραμματιστή Chrome της Google και να καταλάβω τα πράγματα μόνος μου. Ενώ τελείωσα τη δουλειά, δεν ήθελα οι γνώσεις και η έρευνά μου σε αυτόν τον τομέα να πάνε χαμένες και αποφάσισα να μοιραστώ αυτό που θα ήθελα να είχα εύκολη πρόσβαση στο μαθησιακό μου ταξίδι.

Γιατί είναι σημαντική η μετάβαση στο Manifest 3

Το Manifest V3 είναι ένα API που θα χρησιμοποιήσει η Google στο πρόγραμμα περιήγησης Chrome. Είναι ο διάδοχος του τρέχοντος API, Manifest V2, και διέπει τον τρόπο αλληλεπίδρασης των επεκτάσεων Chrome με το πρόγραμμα περιήγησης. Το Manifest V3 εισάγει σημαντικές αλλαγές στους κανόνες για τις επεκτάσεις, μερικές από τις οποίες θα είναι το νέο στήριγμα από το V2 που είχαμε συνηθίσει.

Η μετάβαση στο Manifest V3 μπορούν να συνοψιστούν ως εξής:

  1. Η μετάβαση συνεχίζεται από το 2018.
  2. Το Manifest V3 θα ξεκινήσει επίσημα να κυκλοφορεί τον Ιανουάριο του 2023.
  3. Μέχρι τον Ιούνιο του 2023, οι επεκτάσεις που εκτελούν το Manifest V2 δεν θα είναι πλέον διαθέσιμες στο Chrome Web Store.
  4. Οι επεκτάσεις που δεν συμμορφώνονται με τους νέους κανόνες που εισήχθησαν στο Manifest V3 θα καταργηθούν τελικά από το Chrome Web Store.

Ένας από τους κύριους στόχους του Manifest V3 είναι να κάνει τους χρήστες ασφαλέστερους και να βελτιώσει τη συνολική εμπειρία του προγράμματος περιήγησης. Προηγουμένως, πολλές επεκτάσεις προγράμματος περιήγησης βασίζονταν σε κώδικα στο cloud, πράγμα που σημαίνει ότι θα ήταν δύσκολο αξιολογήσει εάν μια παράταση ήταν επικίνδυνη. Το Manifest V3 στοχεύει να το αντιμετωπίσει απαιτώντας από τις επεκτάσεις να περιέχουν όλο τον κώδικα που θα εκτελέσουν, επιτρέποντας στην Google να τις σαρώσει και να εντοπίσει πιθανούς κινδύνους. Αναγκάζει επίσης τις επεκτάσεις να ζητούν άδεια από την Google για τις αλλαγές που μπορούν να εφαρμόσουν στο πρόγραμμα περιήγησης.

Η ενημέρωση σχετικά με τη μετάβαση της Google στο Manifest V3 είναι σημαντική επειδή εισάγει νέους κανόνες για επεκτάσεις που στοχεύουν στη βελτίωση της ασφάλειας των χρηστών και της συνολικής εμπειρίας του προγράμματος περιήγησης, ενώ οι επεκτάσεις που δεν συμμορφώνονται με αυτούς τους κανόνες θα αφαιρεθούν τελικά από τον Ιστό του Chrome Κατάστημα.

Εν ολίγοις, όλη η σκληρή δουλειά σας για τη δημιουργία επεκτάσεων που χρησιμοποιούσαν το Manifest V2 θα μπορούσε να είναι μηδαμινή εάν δεν κάνετε αυτήν τη μετάβαση τους επόμενους μήνες.

Ιανουάριος 2023 Ιούνιος 2023 Ιανουάριος 2024
Η υποστήριξη για επεκτάσεις Manifest V2 θα απενεργοποιηθεί στα κανάλια Canary, Dev και Beta του Chrome. Το Chrome Web Store δεν θα επιτρέπει πλέον τη δημοσίευση επεκτάσεων Manifest V2 με ορατότητα σε Δημόσιο. Το Chrome Web Store θα καταργήσει όλες τις εναπομείνασες επεκτάσεις Manifest V2.
Το Manifest V3 θα απαιτείται για το σήμα Επιλεγμένα στο Chrome Web Store. Οι υπάρχουσες επεκτάσεις Manifest V2 που είναι δημοσιευμένες και ορατές στο κοινό θα καταστούν εκτός λίστας. Η υποστήριξη για το Manifest 2 θα τερματιστεί για όλα τα κανάλια του Chrome, συμπεριλαμβανομένου του Σταθερού καναλιού, εκτός εάν επεκταθεί το κανάλι Enterprise.

Οι βασικές διαφορές μεταξύ Manifest V2 και V3

Υπάρχουν πολλές διαφορές μεταξύ των δύο, και παρόλο που σας συνιστώ ανεπιφύλακτα να διαβάσετε παρακάτω Οδηγός "Μετάβαση στο Manifest V3" του Chrome, εδώ είναι μια σύντομη και γλυκιά περίληψη των βασικών σημείων:

  1. Υπάλληλοι υπηρεσιών αντικαταστήστε τις σελίδες φόντου στο Manifest V3.
  2. Η τροποποίηση αιτήματος δικτύου αντιμετωπίζεται με το νέο declarativeNetRequest API στο Manifest V3.
  3. Στο Manifest V3, οι επεκτάσεις μπορούν να εκτελέσουν μόνο JavaScript που περιλαμβάνεται στο πακέτο τους και δεν μπορούν να χρησιμοποιήσουν απομακρυσμένο κώδικα.
  4. Παρουσιάζει το Manifest V3 promise υποστήριξη σε πολλές μεθόδους, αν και οι επανακλήσεις εξακολουθούν να υποστηρίζονται ως εναλλακτική λύση.
  5. Τα δικαιώματα κεντρικού υπολογιστή στο Manifest V3 είναι ξεχωριστό στοιχείο και πρέπει να προσδιορίζονται στο "host_permissions" τομέα.
  6. Η πολιτική ασφάλειας περιεχομένου στο Manifest V3 είναι ένα αντικείμενο με μέλη που αντιπροσωπεύουν εναλλακτικά περιβάλλοντα πολιτικής ασφάλειας περιεχομένου (CSP), αντί για μια συμβολοσειρά όπως ήταν στο Manifest V2.

Σε ένα απλό μανιφέστο του Chrome Extension που αλλάζει το φόντο μιας ιστοσελίδας, μπορεί να μοιάζει με αυτό:

// Manifest V2
{ "manifest_version": 2, "name": "Shane's Extension", "version": "1.0", "description": "A simple extension that changes the background of a webpage to Shane's face.", "background": { "scripts": ["background.js"], "persistent": true }, "browser_action": { "default_popup": "popup.html" }, "permissions": [ "activeTab", ], "optional_permissions": ["<all_urls>"]
}
// Manifest V3
{ "manifest_version": 3, "name": "Shane's Extension", "version": "1.0", "description": "A simple extension that changes the background of a webpage to Shane's face.", "background": { "service_worker": "background.js" }, "action": { "default_popup": "popup.html" }, "permissions": [ "activeTab", ], "host_permissions": [ "<all_urls>" ]
}

Αν διαπιστώσετε ότι ορισμένες από τις παραπάνω ετικέτες σας φαίνονται ξένες, συνεχίστε να διαβάζετε για να μάθετε ακριβώς τι πρέπει να γνωρίζετε.

Πώς να κάνετε ομαλή μετάβαση στο Manifest V3

Έχω συνοψίσει τη μετάβαση στο Manifest V3 σε τέσσερις βασικούς τομείς. Φυσικά, ενώ υπάρχουν πολλά καμπανάκια και σφυρίχτρες στο νέο Manifest V3 που πρέπει να εφαρμοστούν από το παλιό Manifest V2, η εφαρμογή αλλαγών σε αυτούς τους τέσσερις τομείς θα φέρει την επέκταση Chrome στον σωστό δρόμο για την τελική μετάβαση.

Οι τέσσερις βασικοί τομείς είναι:

  1. Ενημέρωση της βασικής δομής του Manifest.
  2. Τροποποιήστε τα δικαιώματα κεντρικού υπολογιστή σας.
  3. Ενημερώστε την πολιτική ασφάλειας περιεχομένου.
  4. Τροποποιήστε τον χειρισμό των αιτημάτων δικτύου σας.

Με αυτές τις τέσσερις περιοχές, τα βασικά στοιχεία του Manifest σας θα είναι έτοιμα για τη μετάβαση στο Manifest V3. Ας εξετάσουμε λεπτομερώς καθεμία από αυτές τις βασικές πτυχές και ας δούμε πώς μπορούμε να εργαστούμε για τη μελλοντική προστασία της Επέκτασης Chrome από αυτήν τη μετάβαση.

Ενημέρωση της βασικής δομής του Manifest

Η ενημέρωση της βασικής δομής του μανιφέστου σας είναι το πρώτο βήμα για τη μετάβαση στο Manifest V3. Η πιο σημαντική αλλαγή που θα χρειαστεί να κάνετε είναι να αλλάξετε την αξία του "manifest_version" στοιχείο προς 3, το οποίο καθορίζει ότι χρησιμοποιείτε το σύνολο δυνατοτήτων Manifest V3.

Μία από τις σημαντικότερες διαφορές μεταξύ του Manifest V2 και του V3 είναι η αντικατάσταση των σελίδων παρασκηνίου με έναν μόνο εργαζόμενο υπηρεσίας επέκτασης στο Manifest V3. Θα χρειαστεί να εγγράψετε τον εργαζόμενο σέρβις κάτω από το "background" πεδίο, χρησιμοποιώντας το "service_worker" πληκτρολογήστε και καθορίστε ένα μεμονωμένο αρχείο JavaScript. Παρόλο που το Manifest V3 δεν υποστηρίζει πολλαπλά σενάρια φόντου, μπορείτε προαιρετικά να δηλώσετε το service worker ως ES Module προσδιορίζοντας "type": "module", το οποίο σας επιτρέπει να εισάγετε περαιτέρω κώδικα.

Στο Manifest V3, το "browser_action" και "page_action" οι ιδιότητες ενοποιούνται σε ένα ενιαίο "action" ιδιοκτησία. Θα χρειαστεί να αντικαταστήσετε αυτές τις ιδιότητες με "action" στο μανιφέστο σου. Ομοίως, το "chrome.browserAction" και "chrome.pageAction" Τα API ενοποιούνται σε ένα ενιαίο API "Action" στο Manifest V3 και θα πρέπει να κάνετε μετεγκατάσταση σε αυτό το API.

// Manifest V2 "background": { "scripts": ["background.js"], "persistent": false
}, "browser_action": { "default_popup": "popup.html"
},
// Manifest V3 "background": { "service_worker": "background.js"
}, "action": { "default_popup": "popup.html"
}

Συνολικά, η ενημέρωση της βασικής δομής του μανιφέστου σας είναι ένα κρίσιμο βήμα στη διαδικασία μετάβασης στο Manifest V3, καθώς σας επιτρέπει να επωφεληθείτε από τις νέες δυνατότητες και τις αλλαγές που εισάγονται σε αυτήν την έκδοση του API.

Τροποποιήστε τα δικαιώματα κεντρικού υπολογιστή σας

Το δεύτερο βήμα για τη μετάβαση στο Manifest V3 είναι η τροποποίηση των αδειών κεντρικού υπολογιστή σας. Στο Manifest V2, καθορίζετε δικαιώματα κεντρικού υπολογιστή στο "permissions" πεδίο στο αρχείο δήλωσης. Στο Manifest V3, τα δικαιώματα κεντρικού υπολογιστή είναι ένα ξεχωριστό στοιχείο και θα πρέπει να τα καθορίσετε στο "host_permissions" πεδίο στο αρχείο δήλωσης.

Ακολουθεί ένα παράδειγμα του τρόπου τροποποίησης των αδειών κεντρικού υπολογιστή σας:

// Manifest V2 "permissions": [ "activeTab", "storage", "http://www.css-tricks.com/", ":///*" ]
// Manifest V3 "permissions": [ "activeTab", "scripting", "storage"
], "host_permissions": [ "http://www.css-tricks.com/" ], "optional_host_permissions": [ ":///*" ]

Ενημερώστε την πολιτική ασφάλειας περιεχομένου

Για να ενημερώσετε το CSP της επέκτασης Manifest V2 ώστε να είναι συμβατό με το Manifest V3, θα χρειαστεί να κάνετε κάποιες αλλαγές στο αρχείο μανιφέστου σας. Στο Manifest V2, το CSP καθορίστηκε ως συμβολοσειρά στο "content_security_policy" πεδίο της δήλωσης.

Στο Manifest V3, το CSP είναι πλέον ένα αντικείμενο με διαφορετικά μέλη που αντιπροσωπεύουν εναλλακτικά περιβάλλοντα CSP. Αντί για ενιαίο "content_security_policy" πεδίο, θα πρέπει τώρα να καθορίσετε ξεχωριστά πεδία για "content_security_policy.extension_pages" και "content_security_policy.sandbox", ανάλογα με τον τύπο των σελίδων επέκτασης που χρησιμοποιείτε.

Θα πρέπει επίσης να καταργήσετε τυχόν αναφορές σε εξωτερικούς τομείς στο "script-src", "worker-src", "object-src", να "style-src" οδηγίες εάν υπάρχουν. Είναι σημαντικό να κάνετε αυτές τις ενημερώσεις στο CSP σας, προκειμένου να διασφαλίσετε την ασφάλεια και τη σταθερότητα της επέκτασής σας στο Manifest V3.

// Manifest V2 "content_security_policy": "script-src 'self' https://css-tricks.com; object-src 'self'"
// Manfiest V3 "content_security_policy.extension_pages": "script-src 'self' https://example.com; object-src 'self'", "content_security_policy.sandbox": "script-src 'self' https://css-tricks.com; object-src 'self'"

Τροποποιήστε τον χειρισμό των αιτημάτων δικτύου σας

Το τελευταίο βήμα για τη μετάβαση στο Manifest V3 είναι η τροποποίηση του χειρισμού των αιτημάτων δικτύου σας. Στο Manifest V2, θα είχατε χρησιμοποιήσει το chrome.webRequest API για την τροποποίηση αιτημάτων δικτύου. Ωστόσο, αυτό το API αντικαθίσταται στο Manifest V3 από το declarativeNetRequest API.

Για να χρησιμοποιήσετε αυτό το νέο API, θα πρέπει να καθορίσετε το declarativeNetRequest άδεια στο μανιφέστο σας και ενημερώστε τον κώδικά σας για να χρησιμοποιήσετε το νέο API. Μια βασική διαφορά μεταξύ των δύο API είναι ότι το declarativeNetRequest Το API απαιτεί να καθορίσετε μια λίστα με προκαθορισμένες διευθύνσεις για αποκλεισμό, αντί να μπορείτε να αποκλείσετε ολόκληρες κατηγορίες αιτημάτων HTTP όπως θα μπορούσατε με το chrome.webRequest API.

Είναι σημαντικό να κάνετε αυτές τις αλλαγές στον κώδικά σας για να διασφαλίσετε ότι η επέκτασή σας θα συνεχίσει να λειτουργεί σωστά στο Manifest V3. Ακολουθεί ένα παράδειγμα του τρόπου με τον οποίο θα τροποποιούσατε το μανιφέστο σας για να χρησιμοποιήσετε το declarativeNetRequest API στο Manifest V3:

// Manifest V2 "permissions": [ "webRequest", "webRequestBlocking"
]
// Manifest V3 "permissions": [ "declarativeNetRequest"
]

Θα χρειαστεί επίσης να ενημερώσετε τον κωδικό επέκτασης για να το χρησιμοποιήσετε declarativeNetRequest API αντί για το chrome.webRequest API.

Άλλες πτυχές που πρέπει να ελέγξετε

Αυτό που έχω καλύψει είναι μόνο η κορυφή του παγόβουνου. Φυσικά, αν ήθελα να καλύψω τα πάντα, θα μπορούσα να είμαι εδώ για μέρες και δεν θα είχε νόημα να έχω τους οδηγούς Chrome Developers της Google. Παρόλο που αυτό που κάλυψα θα σας κάνει να οπλίσετε τις επεκτάσεις σας στο Chrome σε αυτήν τη μετάβαση, εδώ είναι μερικά άλλα πράγματα που ίσως θέλετε να εξετάσετε για να βεβαιωθείτε ότι οι επεκτάσεις σας λειτουργούν στην κορυφή του παιχνιδιού τους.

  • Μετεγκατάσταση σεναρίων παρασκηνίου στο περιβάλλον εκτέλεσης του υπαλλήλου υπηρεσιών: Όπως αναφέρθηκε προηγουμένως, το Manifest V3 αντικαθιστά τις σελίδες παρασκηνίου με έναν εργαζόμενο υπηρεσίας επέκτασης, επομένως μπορεί να είναι απαραίτητο να ενημερώσετε τα σενάρια παρασκηνίου για να προσαρμοστούν στο περιβάλλον εκτέλεσης του εργαζομένου υπηρεσίας.
  • Ενοποιώντας το **chrome.browserAction** και **chrome.pageAction** APIs: Αυτά τα δύο ισοδύναμα API ενοποιούνται σε ένα μόνο API στο Manifest V3, επομένως μπορεί να είναι απαραίτητο να γίνει μετεγκατάσταση στο API Action.
  • Μετεγκατάσταση συναρτήσεων που αναμένουν ένα περιβάλλον φόντου Manifest V2: Η υιοθέτηση υπαλλήλων υπηρεσιών στο Manifest V3 δεν είναι συμβατή με μεθόδους όπως chrome.runtime.getBackgroundPage(), chrome.extension.getBackgroundPage(), chrome.extension.getExtensionTabs(), να chrome.extension.getViews(). Ενδέχεται να είναι απαραίτητη η μετεγκατάσταση σε ένα σχέδιο που μεταβιβάζει μηνύματα μεταξύ άλλων πλαισίων και του υπαλλήλου της υπηρεσίας παρασκηνίου.
  • Μετακίνηση αιτημάτων CORS σε σενάρια περιεχομένου στον υπάλληλο υπηρεσίας παρασκηνίου: Ενδέχεται να είναι απαραίτητο να μετακινήσετε αιτήματα CORS σε σενάρια περιεχομένου στον υπάλληλο υπηρεσίας παρασκηνίου προκειμένου να συμμορφωθείτε με το Manifest V3.
  • Μετεγκατάσταση από την εκτέλεση εξωτερικού κώδικα ή αυθαίρετων συμβολοσειρών: Το Manifest V3 δεν επιτρέπει πλέον την εκτέλεση εξωτερικής λογικής χρησιμοποιώντας chrome.scripting.executeScript({code: '...'}), eval(), να new Function(). Μπορεί να χρειαστεί να μετακινήσετε όλο τον εξωτερικό κώδικα (JavaScript, WebAssembly, CSS) στο πακέτο επέκτασης, να ενημερώσετε τις αναφορές σεναρίου και στυλ για να φορτώσετε πόρους από το πακέτο επέκτασης και να χρησιμοποιήσετε chrome.runtime.getURL() για τη δημιουργία διευθύνσεων URL πόρων κατά το χρόνο εκτέλεσης.
  • Ενημέρωση ορισμένων μεθόδων δέσμης ενεργειών και CSS στο Tabs API: Όπως αναφέρθηκε προηγουμένως, αρκετές μέθοδοι μετακινούνται από το Tabs API στο Scripting API στο Manifest V3. Μπορεί να χρειαστεί να ενημερώσετε τυχόν κλήσεις σε αυτές τις μεθόδους για να χρησιμοποιήσετε το σωστό Manifest V3 API.

Και πολλά άλλα!

Μη διστάσετε να αφιερώσετε λίγο χρόνο για να ενημερωθείτε για όλες τις αλλαγές. Άλλωστε, αυτή η αλλαγή είναι αναπόφευκτη και αν δεν θέλετε να χαθούν οι επεκτάσεις Manifest V2 λόγω αποφυγής αυτής της μετάβασης, τότε αφιερώστε λίγο χρόνο οπλίζοντας τον εαυτό σας με τις απαραίτητες γνώσεις.

Από την άλλη πλευρά, αν είστε νέος στον προγραμματισμό επεκτάσεων του Chrome και θέλετε να ξεκινήσετε, ένας πολύ καλός τρόπος για να το κάνετε είναι να βουτήξετε στον κόσμο των εργαλείων προγραμματιστή Ιστού του Chrome. Το έκανα μέσα από ένα μάθημα για Linkedin Μάθηση, που με ανέβασε αρκετά γρήγορα. Μόλις αποκτήσετε αυτή τη βασική γνώση, επιστρέψτε σε αυτό το άρθρο και μεταφράστε όσα γνωρίζετε στο Manifest V3!

Λοιπόν, πώς θα χρησιμοποιώ τις δυνατότητες στο νέο Manifest V3 στο μέλλον;

Λοιπόν, για μένα, η μετάβαση στο Manifest V3 και η αφαίρεση του chrome.webRequest Το API φαίνεται να μετατοπίζει τις επεκτάσεις μακριά από περιπτώσεις χρήσης που επικεντρώνονται στα δεδομένα (όπως προγράμματα αποκλεισμού διαφημίσεων) σε πιο λειτουργικές και βασισμένες σε εφαρμογές χρήσεις. Έχω μείνει μακριά από την ανάπτυξη εφαρμογών τον τελευταίο καιρό καθώς μπορεί να γίνει αρκετά ένταση πόρων ώρες ώρες. Ωστόσο, αυτή η αλλαγή μπορεί να είναι που με φέρνει πίσω!

Η άνοδος των εργαλείων τεχνητής νοημοσύνης τον τελευταίο καιρό, πολλά με διαθέσιμα προς χρήση API, έχει πυροδοτήσει τόνους νέων και φρέσκων εφαρμογών SaaS. Προσωπικά, πιστεύω ότι έρχεται σε μια τέλεια στιγμή με τη στροφή σε περισσότερες επεκτάσεις Chrome που βασίζονται σε εφαρμογές! Ενώ πολλές από τις παλαιότερες επεκτάσεις μπορεί να εξαλειφθούν από αυτήν τη μετάβαση, πολλές νέες που έχουν δημιουργηθεί γύρω από νέες ιδέες SaaS θα έρθουν να πάρουν τη θέση τους.

Ως εκ τούτου, αυτή είναι μια συναρπαστική ενημέρωση για να μεταβείτε και να ανανεώσετε παλιές επεκτάσεις ή να δημιουργήσετε νέες! Προσωπικά, βλέπω πολλές δυνατότητες στη χρήση API που περιλαμβάνουν τη χρήση AI σε επεκτάσεις για τη βελτίωση της εμπειρίας περιήγησης ενός χρήστη. Αλλά αυτή είναι στην πραγματικότητα μόνο η κορυφή του παγόβουνου. Αν θέλετε να ασχοληθείτε πραγματικά με τα πράγματα με τις δικές σας επαγγελματικές επεκτάσεις ή να απευθυνθείτε σε εταιρείες για να δημιουργήσετε/ενημερώσετε επεκτάσεις για αυτές, θα συνιστούσα αναβάθμιση του λογαριασμού σας στο Gmail για τα οφέλη που προσφέρει στη συνεργασία, την ανάπτυξη και τη δημοσίευση επεκτάσεων στο Chrome Web Store.

Ωστόσο, να θυμάστε ότι οι απαιτήσεις κάθε προγραμματιστή είναι διαφορετικές, επομένως μάθετε τι χρειάζεστε για να διατηρήσετε τις τρέχουσες επεκτάσεις σας ή τις νέες σας!

Σφραγίδα ώρας:

Περισσότερα από Κόλπα CSS