সিএসএস অসিনক্রোনলি লোড করবেন কীভাবে


92

আমি 2 টি সিএসএস ফাইলগুলি অপসারণের চেষ্টা করছি যা আমার সাইটে ব্লক করা রোধ করে - সেগুলি গুগল পৃষ্ঠা স্পিড ইনসাইটে উপস্থিত হয়। আমি বিভিন্ন পদ্ধতি অনুসরণ করেছি, যার মধ্যে কোনওটিই সফল হয়নি। তবে, সম্প্রতি, আমি থিংক অ্যাসিঙ্ক সম্পর্কে একটি পোস্ট পেয়েছি এবং যখন আমি এই কোডটি প্রয়োগ করেছি: <script async src="https://third-party.com/resource.js"></script>এটি সমস্যাটি দূর করেছিল।

তবে প্রকাশের পরে পৃষ্ঠাটি স্টাইলিংটি হারিয়েছে। কী চলছে তা সম্পর্কে আমি খুব বেশি নিশ্চিত নই কারণ কোডটি কাজ করে তবে এটি আপলোডের পরে স্টাইলিংয়ের কাজ করে না। এটি দিয়ে আপনার সাহায্যের প্রশংসা করি। ধন্যবাদ


4
আপনি কি স্টাইল বা স্ক্রিপ্টগুলিতে অ্যাসিঙ্ক প্রয়োগ করছেন? আপনি পৃষ্ঠাটি লোড করার পরে শৈলীটি লোড হয় বা এটি কখনই প্রদর্শিত হয় না?
কামুস

আমি শৈলীতে অ্যাসিঙ্ক বৈশিষ্ট্য প্রয়োগ করেছি এবং সেগুলি শিরোনামে রেখেছি।
Paulina994

4
শৈলীর সাথে জিনিসটি হ'ল আপনি যদি দেরীতে (যেমন শরীরে) লোড করেন তবে পুনরায় রেন্ডারিং ট্রিগার হবে এবং মানকগুলিতে অনুমোদিত নয় (তবে যেহেতু ব্রাউজারগুলি খুব ক্ষমা করছে তবে যেভাবে এটি কার্যকর হবে)। যদি কোনও তৃতীয় পক্ষের সার্ভার থেকে সমস্যাটি ধীরে ধীরে প্রতিক্রিয়া হয় তবে সম্ভবত আপনি তার পরিবর্তে আপনার সার্ভারে এটিকে হোস্ট করতে পারেন?
জোসেফ এঙ্গেলফ্রস্ট

উত্তর:


129

একটি অ্যাসিনক্রোনাস স্টাইলশিট ডাউনলোডটি ট্রিগার করার কৌশলটি একটি <link>উপাদান ব্যবহার করা এবং মিডিয়া বৈশিষ্ট্যের জন্য একটি অবৈধ মান সেট করা (আমি মিডিয়া = "কিছুই না" ব্যবহার করি তবে কোনও মানই তা করবে)। যখন কোনও মিডিয়া ক্যোয়ারী মিথ্যাতে মূল্যায়ন করে, ব্রাউজারটি এখনও স্টাইলশিটটি ডাউনলোড করবে, তবে পৃষ্ঠাটি রেন্ডার করার আগে সামগ্রীটি উপলব্ধ হওয়ার অপেক্ষা রাখে না।

<link rel="stylesheet" href="css.css" media="none">

স্টাইলশীটটি ডাউনলোড শেষ করার পরে মিডিয়া অ্যাট্রিবিউটকে একটি বৈধ মান হিসাবে সেট করতে হবে তাই শৈলীর বিধি নথিতে প্রয়োগ করা হবে। মিডিয়া সম্পত্তি সবার কাছে স্যুইচ করার জন্য অনলোড ইভেন্টটি ব্যবহৃত হয়:

<link rel="stylesheet" href="css.css" media="none" onload="if(media!='all')media='all'">

সিএসএস লোড করার এই পদ্ধতিটি দর্শকদের কাছে স্ট্যান্ডার্ড পদ্ধতির চেয়ে দ্রুত ব্যবহারযোগ্য সামগ্রী সরবরাহ করবে content ক্রিটিকাল সিএসএস এখনও সাধারণ ব্লকিং পদ্ধতির সাথে পরিবেশন করা যেতে পারে (বা আপনি চূড়ান্ত পারফরম্যান্সের জন্য এটি ইনলাইন করতে পারেন) এবং অ-সমালোচনামূলক স্টাইলগুলি পার্সিং / রেন্ডারিং প্রক্রিয়ায় পরবর্তী সময়ে ডাউনলোড এবং প্রয়োগ করা যেতে পারে।

এই কৌশলটি জাভাস্ক্রিপ্ট ব্যবহার করে তবে জাভাস্ক্রিপ্টহীন ব্রাউজারগুলির জন্য <link>আপনি কোনও উপাদানের সমতুল্য ব্লকিং উপাদানগুলিকে <noscript>গুটিয়ে রাখতে পারবেন:

<link rel="stylesheet" href="css.css" media="none" onload="if(media!='all')media='all'"><noscript><link rel="stylesheet" href="css.css"></noscript>

আপনি www.itcha.edu.sv এ অপারেশনটি দেখতে পাবেন

এখানে চিত্র বর্ণনা লিখুন

Http://keithclark.co.uk/ এ উত্স


ঠিক আছে .. আমি জানতাম না যে আপনি অন-হ্যান্ডলারে কেবল তাদের নাম উল্লেখ করে উপাদানগুলির বৈশিষ্ট্যগুলি উল্লেখ করতে পারেন। আমি সবসময় ভেবেছিলাম 'ইভেন্ট' একমাত্র ব্যতিক্রম।
তিমোহ

4
সুতরাং আপনি কীভাবে আপনার পৃষ্ঠাটিকে ঝলকানি থেকে বাঁচিয়ে রাখছেন কারণ এটি সবকিছুকে পুনরায় সরবরাহ করে? এছাড়াও আপনি কী লিনেক্সের গর্বিত হতে পারে এমন কিছু উপস্থাপনের পরিবর্তে আপনার পৃষ্ঠার কিছু প্রাথমিক বিন্যাস রয়েছে তাই মূল অ্যাপ শেল স্টাইলগুলি ইনলাইন করেন?
ক্রিস লাভ

4
এখনও আমার জন্য কাজ মনে হচ্ছে। এটি করার পরে আমি এই ফাইলটির জন্য পেজস্পিড ইনসাইটগুলিতে আর একটি সতর্কতা পেতে জানি।
অ্যান্ডি ওয়ারেন

4
এটি আমার পক্ষে কাজ করছে (08-জুলাই -2018)। এবং এটি পেজস্পিড অন্তর্দৃষ্টি ভাল স্কোর দেয়
অবিলাশ

4
আইএমএইচও, জবাচেটের নতুন উত্তর "প্রিলোড" ব্যবহার করে , সম্ভবত এটি এখন পছন্দসই সমাধান। কারও কাছে যদি এই উত্তরটি আরও ভাল বলে মনে করার কারণ থাকে তবে দয়া করে কেন তা ব্যাখ্যা করে একটি মন্তব্য যুক্ত করুন। আদর্শভাবে এমন একটি সংস্থার সাথে লিঙ্ক করা যা কেন / কখন এই পদ্ধতিটি পছন্দনীয় হতে পারে তা নিশ্চিত করে। [ধরে নিচ্ছেন যে আপনি preloadফায়ারফক্স এবং পুরানো ব্রাউজারগুলিতে সমর্থন করার জন্য পলিফিল ব্যবহার করেছেন - সেই উত্তরের প্রথম মন্তব্যে লিংকটি দেখুন]।
টুলমেকারস্টেভ

109

2020 আপডেট


সহজ উত্তর (সম্পূর্ণ ব্রাউজার সমর্থন):

<link rel="stylesheet" href="style.css" media="print" onload="this.media='all'">

নথিভুক্ত উত্তর (preচ্ছিক প্রিলোডিং এবং স্ক্রিপ্ট-অক্ষম ফ্যালব্যাক সহ):

 <!-- Optional, if we want the stylesheet to get preloaded. Note that this line causes stylesheet to get downloaded, but not applied to the page. Use strategically — while preloading will push this resource up the priority list, it may cause more important resources to be pushed down the priority list. This may not be the desired effect for non-critical CSS, depending on other resources your app needs. -->
 <link rel="preload" href="style.css" as="style">

 <!-- Media type (print) doesn't match the current environment, so browser decides it's not that important and loads the stylesheet asynchronously (without delaying page rendering). On load, we change media type so that the stylesheet gets applied to screens. -->
 <link rel="stylesheet" href="style.css" media="print" onload="this.media='all'">

 <!-- Fallback that only gets inserted when JavaScript is disabled, in which case we can't load CSS asynchronously. -->
 <noscript><link rel="stylesheet" href="style.css"></noscript>

প্রিলোডিং এবং অ্যাসিঙ্ক মিলিত:

আপনার যদি প্রিললোডড এবং অ্যাসিঙ্ক সিএসএসের প্রয়োজন হয় তবে এই সমাধানটি উপরের নথিভুক্ত উত্তর থেকে কেবল দুটি লাইন একত্রিত করে এটিকে সামান্য পরিষ্কার করে তোলে। তবে ফায়ারফক্সে তারা কাজ করবে না যতক্ষণ না তারা প্রিললোড কীওয়ার্ডটি সমর্থন করে । এবং আবারও, উপরের নথিভুক্ত উত্তরে যেমন বর্ণনা করা হয়েছে, প্রিলোডিং আসলে উপকারী হতে পারে না।

<link href="style.css" rel="preload" as="style" onload="this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="style.css"></noscript>

অতিরিক্ত বিবেচনা:

নোট করুন, সাধারণভাবে, আপনি যদি সিএসএসকে তাত্পর্যপূর্ণভাবে লোড করতে চলেছেন তবে সাধারণত সমালোচনামূলক সিএসএস ইনলাইন করার পরামর্শ দেওয়া হয় , কারণ সিএসএস কোনও কারণে রেন্ডার-ব্লকিং রিসোর্স ।

তাদের অনেক অ্যাসিঙ্ক সিএসএস সমাধানের জন্য ফিলামেন্ট গ্রুপকে ক্রেডিট


4
লোডসিএসএস ব্যবহার করার দরকার নেই, পলিফিল যথেষ্ট: github.com/filamentgroup/loadCSS/blob/master/src/…
নাথান

4
প্রিলোডের নির্দিষ্ট স্থিতি অবশেষে [ ডাব্লু 3 সি প্রার্থী প্রস্তাবনা] (( w3.org/TR/preload/… ) ফায়ারফক্স এটিকে সমর্থন করে তবে ডিফল্টরূপে অক্ষম করা হয়; এটি নিয়ন্ত্রণ করে ফায়ারফক্স পতাকাটির "আমি কী ব্যবহার করতে পারি" এর বিবরণের জন্য উত্তরের "বিস্তৃত সমর্থিত" লিঙ্কটিতে ক্লিক করুন।
টুলমেকারস্টেভ

4
অতিরিক্ত ব্যাখ্যা সহ পুরো ব্রাউজার সহায়তার জন্য সমাধান সরবরাহ করতে উত্তর আপডেট হয়েছে।
জাবাচেটে

4
@ জাজাচেত্তা ২০২০ আপডেটটি অনেক প্রশংসা করেছে, আপনাকে ধন্যবাদ আমি বিশেষত সাম্প্রতিক সময়ে লিখিত নির্দেশাবলীর সন্ধান করছি যেখানে ব্রাউজার সমর্থনটি সাধারণত ভাল better ওয়েবে 3 বছরেরও বেশি পরিবর্তন হয়েছে!
ব্র্যান্ডিতো

স্পষ্টতই, এটি ভাল onload="this.rel='stylesheet'; this.onload = null"। কিছু ব্রাউজারে দৃশ্যত, দু'বার কল করা এড়াতে এটি সেট this.onloadকরা প্রয়োজন null
Flimm

9

ব্যবহার media="print"এবংonload

ফিলামেন্ট গ্রুপটি সম্প্রতি (জুলাই 2019) সিএসএসকে কীভাবে সংবিধানে লোড করতে হবে সে সম্পর্কে তাদের সর্বশেষ সুপারিশ দিয়ে একটি নিবন্ধ প্রকাশ করেছে । যদিও তারা জনপ্রিয় জাভাস্ক্রিপ্ট লাইব্রেরি লোডসিএসএসের বিকাশকারী , তারা আসলে এই সমাধানটির প্রস্তাব দেয় যার জন্য জাভাস্ক্রিপ্ট লাইব্রেরির প্রয়োজন নেই:

<link
  rel="stylesheet"
  href="/path/to/my.css"
  media="print"
  onload="this.media='all'; this.onload = null"
>

ব্যবহার media="print"ব্রাউজারকে এই স্টাইলশীটটি স্ক্রিনে ব্যবহার না করার জন্য, তবে মুদ্রণকে নির্দেশ করবে। ব্রাউজারগুলি প্রকৃতপক্ষে এই প্রিন্টের স্টাইলশিটগুলি ডাউনলোড করে তবে অ্যাসিনক্রোনাক্যালি যা আমরা চাই। আমরা একবারও স্টাইলশিটটি ডাউনলোড হয়ে গেলে এটি ব্যবহার করা উচিত এবং এর জন্য আমরা সেট করি onload="this.media='all'; this.onload = null"। (কিছু ব্রাউজার onloadদু'বার কল করবে , তার চারপাশে কাজ করার জন্য, আমাদের সেট করা দরকার this.onload = null)) আপনি যদি চান, আপনি <noscript>জাভাস্ক্রিপ্ট সক্ষম না করে এমন বিরল ব্যবহারকারীদের জন্য একটি ফ্যালব্যাক যোগ করতে পারেন ।

মূল নিবন্ধ যেমন আরো বিস্তারিত মধ্যে যায় চেয়ে আমি এখানে, একটি পঠিত মূল্য। Csswizardry.com এ এই নিবন্ধটিও পঠনযোগ্য।


5

আপনি এটি অনেক উপায়ে পাওয়ার চেষ্টা করতে পারেন:

1. ব্যবহার media="bogus"এবং একটি <link>পাদদেশে

<head>
    <!-- unimportant nonsense -->
    <link rel="stylesheet" href="style.css" media="bogus">
</head>
<body>
    <!-- other unimportant nonsense, such as content -->
    <link rel="stylesheet" href="style.css">
</body>

2. পুরানো উপায়ে ডোম প্রবেশ করানো

<script type="text/javascript">
(function(){
  var bsa = document.createElement('script');
     bsa.type = 'text/javascript';
     bsa.async = true;
     bsa.src = 'https://s3.buysellads.com/ac/bsa.js';
  (document.getElementsByTagName('head')[0]||document.getElementsByTagName('body')[0]).appendChild(bsa);
})();
</script>

3. যদি আপনি প্লাগইন চেষ্টা করতে পারেন তবে আপনি লোডসিএসএস চেষ্টা করতে পারেন

<script>
  // include loadCSS here...
  function loadCSS( href, before, media ){ ... }
  // load a file
  loadCSS( "path/to/mystylesheet.css" );
</script>

4
উদাহরণ 2 জাভাস্ক্রিপ্ট লোড করে, তবে প্রশ্নটি সিএসএস লোড করার বিষয়ে। তুমি কি জানো যদি উদাহরণস্বরূপ 2 CSS এর জন্য আরো কাজ করে, যদি আপনি পরিবর্তিত <script>করতে <style rel=stylesheet>? (জাস্ট জানতে আগ্রহী আমি ব্যবহারের যাচ্ছি। loadCSS(অর্থাত আপনার উদাহরণ 3) পরিবর্তে, যদি আমি পরে লোড সিএসএস প্রয়োজন।)
KajMagnus

5

নীচের ফাংশনটি আপনি যে স্টাইলশীটগুলি অবিচ্ছিন্নভাবে লোড করতে চান তা নথিতে তৈরি এবং যুক্ত করবে। (তবে, আপনাকে ধন্যবাদ Event Listener, উইন্ডোর সমস্ত অন্যান্য সংস্থানগুলি লোড হওয়ার পরে এটি কেবল তখনই ঘটবে))

নিম্নলিখিত দেখুন:

function loadAsyncStyleSheets() {

    var asyncStyleSheets = [
    '/stylesheets/async-stylesheet-1.css',
    '/stylesheets/async-stylesheet-2.css'
    ];

    for (var i = 0; i < asyncStyleSheets.length; i++) {
        var link = document.createElement('link');
        link.setAttribute('rel', 'stylesheet');
        link.setAttribute('href', asyncStyleSheets[i]);
        document.head.appendChild(link);
    }
}

window.addEventListener('load', loadAsyncStyleSheets, false);

4
আমরা যদি লোডসিএসএস পদ্ধতির সাথে এটির তুলনা করি তবে এই পদ্ধতির কোনও ত্রুটি আছে কি? দেখে মনে হচ্ছে, পৃষ্ঠার বডিতে ট্যাগের var newStyle = document.createElement("link"); newStyle.rel = "stylesheet"; newStyle.href = "stylesheet.css"; document.getElementsByTagName("head")[0].appendChild(newStyle);অভ্যন্তরীণ শাস্ত্রীয় কোডটি দুর্দান্তভাবে <script>তার কাজ করে - এমনকি এমএসআইই 8 এর মতো পুরানো ব্রাউজারগুলিতেও।
টেকম্যান

4
@ টেকম্যান হ্যাঁ আছে। আপনি দেখতে পাচ্ছেন, এই ফাংশনটি এটি window.loadইভেন্টে কাজ করে । সুতরাং, সবকিছু ডাউনলোড হয়ে গেলে ডাউনলোড শুরু হয়। ভাগ্য নেই সেখানে। যত তাড়াতাড়ি আপনি শুরু করতে অ ব্লক লোডিং প্রয়োজন।
মিলো একাকোভিও

5

অ্যাসিঙ্ক সিএসএস লোডিং পদ্ধতির

সিএসএসকে তাত্পর্যপূর্ণভাবে লোড করার বিভিন্ন উপায় রয়েছে, তবে আপনার প্রত্যাশার তুলনায় কোনওটি এতটা সহজ নয়।

<link rel="preload" href="mystyles.css" as="style" onload="this.rel='stylesheet'">

1

আপনার যদি প্রোগ্রামগতভাবে এবং অবিচ্ছিন্নভাবে একটি সিএসএস লিঙ্ক লোড করতে হয়:

// https://www.filamentgroup.com/lab/load-css-simpler/
function loadCSS(href, position) {
  const link = document.createElement('link');
  link.media = 'print';
  link.rel = 'stylesheet';
  link.href = href;
  link.onload = () => { link.media = 'all'; };
  position.parentNode.insertBefore(link, position);
}

0

আপনি যদি একটি কঠোর বিষয়বস্তু নিরাপত্তা নীতি যে অনুমতি দেয় না থাকে তাহলে @ ভ্লাদিমির-salguero এর উত্তর , আপনি (অনুগ্রহ করে স্ক্রিপ্ট নোট করা এই ব্যবহার করতে পারেন nonce):

<script nonce="(your nonce)" async>
$(document).ready(function() {
    $('link[media="none"]').each(function(a, t) {
        var n = $(this).attr("data-async"),
            i = $(this);
        void 0 !== n && !1 !== n && ("true" == n || n) && i.attr("media", "all")
    })
});
</script>

শুধু আপনার স্টাইলশীট রেফারেন্স নিচের টি যোগ করুন: media="none" data-async="true"। এখানে একটি উদাহরণ:

<link rel="stylesheet" href="../path/script.js" media="none" data-async="true" />

JQuery জন্য উদাহরণ:

<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css" type="text/css" media="none" data-async="true" crossorigin="anonymous" /><noscript><link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css" type="text/css" /></noscript>

আমি মনে করি যে asyncবৈশিষ্ট্যটি উপেক্ষা করা হয়েছে, কারণ স্ক্রিপ্ট ট্যাগটিতে তাত্পর্যপূর্ণভাবে srcলোড করার কোনও ব্যবস্থা নেই ... বা এটি এখানে সত্যিই কার্যকর? এছাড়াও কোন মানটি হিসাবে ব্যবহার করতে হবে তার উপর আপনি আরও কিছুটা ব্যাখ্যা করতে পারেন nonce?
ফিলিপ

0

উপরের সমস্তগুলি এখনই গুগল পেজস্পিড অন্তর্দৃষ্টিগুলিকে ইমপ্রেস করতে ব্যর্থ হওয়ায় দয়া করে উত্তরটি আপডেট করার যত্ন নিন।

গুগলের মতে আপনারা কীভাবে CSS এর অ্যাসিঙ্ক লোডিং বাস্তবায়ন করবেন

 < noscript id="deferred-styles" >
        < link rel="stylesheet" type="text/css" href="small.css"/ >
    < /noscript >

<script>
  var loadDeferredStyles = function() {
    var addStylesNode = document.getElementById("deferred-styles");
    var replacement = document.createElement("div");
    replacement.innerHTML = addStylesNode.textContent;
    document.body.appendChild(replacement)
    addStylesNode.parentElement.removeChild(addStylesNode);
  };
  var raf = window.requestAnimationFrame || window.mozRequestAnimationFrame ||
      window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;
  if (raf) raf(function() { window.setTimeout(loadDeferredStyles, 0); });
  else window.addEventListener('load', loadDeferredStyles);
</script>

4
যদি আপনি উল্লিখিত প্রিলোড কীওয়ার্ড পদ্ধতির ব্যবহার করেন তবে সম্ভবত একটি মিথ্যা পজিটিভ (পেজস্পাইড বাগ)। github.com/filamentgroup/loadCSS/issues/53
jabacchetta

4
আপডেট: গুগল হ্রাস পেয়েছে, এবং তারপরে এই সমস্যাযুক্ত পেজস্পিড সংস্করণ 4 বন্ধ করে দিয়েছে - এটি সেই সংস্করণ ছিল যার জন্য এই অ্যাসিঙ্ক কোডটি সুপারিশ করা হয়েছিল। যদিও আমি এখন পেজস্পিড 5 তে পরীক্ষা করিনি : তারা কীভাবে এখন পরীক্ষা করে তার বিবরণ দেওয়া এবং "লিঙ্ক" এর " প্রিললোড " ট্যাগের জন্য তাদের সমর্থন, যাবাচেটের উত্তর সম্ভবত এখন গুগলের পক্ষে আরও ভাল উত্তর।
টুলমেকারস্টেভ

4
@ টুলমেকারস্টেভ হ্যাঁ এই উত্তরটি প্রায়শই মাঝারি করা দরকার। তবে এই কোডটি পৃষ্ঠা গতিতে আপনাকে 100 পাওয়ার পক্ষে কাজ করে।
কৌশিক গান্ধী

0

আমি ব্যবহার করার চেষ্টা করেছি:

<link rel="preload stylesheet" href="mystyles.css" as="style">

এটি জরিমানা কাজ করে, তবে এটি ক্রমবর্ধমান লেআউট শিফটও উত্থাপন করে কারণ যখন আমরা rel = "প্রিললোড" ব্যবহার করি তখন এটি কেবল CSS ডাউনলোড করে, তাত্ক্ষণিকভাবে প্রয়োগ হয় না।

উদাহরণস্বরূপ যখন ডোম লোড একটি তালিকায় উল, লি ট্যাগ থাকে, ডিফল্ট হিসাবে লি ট্যাগের আগে একটি বুলেট থাকে, তখন সিএসএস প্রয়োগ করে আমি তালিকাভুক্তির জন্য কাস্টম শৈলীতে এই বুলেটগুলি সরিয়ে ফেলি। সুতরাং, এখানে ক্রমবর্ধমান লেআউট শিফট ঘটছে।

এর কোন সমাধান আছে কি?


0

rel="preload"এটি স্বাধীনভাবে ডাউনলোড করার জন্য ব্যবহার করুন , তারপরে onload="this.rel='stylesheet'"এটি স্টাইলশীটে প্রয়োগ করতে ব্যবহার করুন (স্টাইলশীটে as="style"এটি প্রয়োগ করা প্রয়োজন অন্যথায় এটি onloadকাজ করবে না)

<link rel="preload" as="style" type="text/css" href="mystyles.css" onload="this.rel='stylesheet'">
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.