"एकल पृष्ठ" जेएस वेबसाइटों और एसईओ


128

आजकल शक्तिशाली "सिंगल-पेज" जावास्क्रिप्ट वेबसाइट बनाने के लिए बहुत सारे शांत उपकरण हैं। मेरी राय में, यह सर्वर को एपीआई (और अधिक कुछ नहीं) के रूप में कार्य करने और क्लाइंट को सभी HTML पीढ़ी के सामान को संभालने की अनुमति देकर किया जाता है। इस "पैटर्न" की समस्या खोज इंजन समर्थन की कमी है। मैं दो समाधानों के बारे में सोच सकता हूं:

  1. जब उपयोगकर्ता वेबसाइट में प्रवेश करता है, तो सर्वर को पृष्ठ ठीक उसी तरह प्रस्तुत करना चाहिए, जैसे क्लाइंट नेविगेशन पर होगा। इसलिए अगर मैं http://example.com/my_pathसीधे सर्वर पर जाता हूं तो क्लाइंट उसी चीज को रेंडर करेगा, अगर मैं /my_pathपुशस्टेट से गुजरता हूं ।
  2. सर्वर को केवल खोज इंजन बॉट के लिए एक विशेष वेबसाइट प्रदान करने दें। यदि कोई सामान्य उपयोगकर्ता http://example.com/my_pathसर्वर पर जाता है तो उसे वेबसाइट का जावास्क्रिप्ट भारी संस्करण देना चाहिए। लेकिन अगर Google bot विज़िट करता है, तो सर्वर को उस सामग्री के साथ कुछ न्यूनतम HTML देना चाहिए जिसे मैं Google को अनुक्रमणित करना चाहता हूं।

पहले समाधान पर यहां आगे चर्चा की गई है । मैं ऐसा करने वाली वेबसाइट पर काम कर रहा हूं और यह बहुत अच्छा अनुभव नहीं है। यह DRY नहीं है और मेरे मामले में मुझे क्लाइंट और सर्वर के लिए दो अलग-अलग टेम्पलेट इंजन का उपयोग करना पड़ा।

मुझे लगता है कि मैंने कुछ अच्छी ol 'फ़्लैश वेबसाइटों के लिए दूसरा समाधान देखा है। मुझे यह पहले वाले से बहुत अधिक पसंद है और सर्वर पर सही टूल के साथ यह काफी दर्द रहित तरीके से किया जा सकता है।

तो मैं वास्तव में क्या सोच रहा हूँ निम्नलिखित है:

  • क्या आप कोई बेहतर उपाय सोच सकते हैं?
  • दूसरे समाधान के साथ नुकसान क्या हैं? अगर Google को किसी तरह पता चलता है कि मैं नियमित रूप से उपयोगकर्ता के रूप में Google bot के लिए ठीक उसी सामग्री की सेवा नहीं दे रहा हूं, तो क्या मुझे खोज परिणामों में दंडित किया जाएगा?

जवाबों:


44

जबकि # 2 एक डेवलपर के रूप में आपके लिए "आसान" हो सकता है, यह केवल खोज इंजन क्रॉलिंग प्रदान करता है। और हां, यदि Google को आपकी सेवा अलग-अलग सामग्री के बारे में पता चलती है, तो आपको दंडित किया जा सकता है (मैं उस पर विशेषज्ञ नहीं हूं, लेकिन मैंने ऐसा होने के बारे में सुना है)।

दोनों एसईओ और पहुंच क्षमता (केवल विकलांग व्यक्ति के लिए नहीं, बल्कि मोबाइल उपकरणों, टच स्क्रीन उपकरणों और अन्य गैर-मानक कंप्यूटिंग / इंटरनेट सक्षम प्लेटफार्मों के माध्यम से पहुंच) दोनों में एक समान अंतर्निहित दर्शन है: शब्दार्थ रूप से समृद्ध मार्कअप जो "सुलभ" है (यानी कर सकते हैं) इन सभी विभिन्न ब्राउज़रों तक पहुँचा, देखा, पढ़ा, संसाधित या अन्यथा उपयोग किया जा सकता है। एक स्क्रीन रीडर, एक खोज इंजन क्रॉलर या जावास्क्रिप्ट सक्षम वाला उपयोगकर्ता, सभी को इस मुद्दे के साथ अपनी साइट की मुख्य कार्यक्षमता का उपयोग / इंडेक्स / समझने में सक्षम होना चाहिए।

pushStateमेरे अनुभव में, इस बोझ को नहीं जोड़ता। यह केवल वही लाता है जो वेब विकास के मामले में सबसे आगे और "यदि हमारे पास समय है" हुआ करता था।

विकल्प # 1 में आपका वर्णन आमतौर पर जाने का सबसे अच्छा तरीका है - लेकिन, अन्य पहुंच और एसईओ मुद्दों की तरह, pushStateजावास्क्रिप्ट-भारी ऐप में ऐसा करने के लिए अप-फ्रंट प्लानिंग की आवश्यकता होती है या यह एक महत्वपूर्ण बोझ बन जाएगा। इसे शुरू से ही पृष्ठ और एप्लिकेशन आर्किटेक्चर पर बेक किया जाना चाहिए - रेट्रोफिटिंग दर्दनाक है और आवश्यकता से अधिक दोहराव का कारण होगा।

मैं pushStateहाल ही में कुछ अनुप्रयोगों के लिए एसईओ के साथ काम कर रहा हूं, और मैंने पाया कि मुझे लगता है कि एक अच्छा तरीका है। यह मूल रूप से आपके आइटम # 1 का अनुसरण करता है, लेकिन html / टेम्पलेट की नकल नहीं करने के लिए खाता है।

जानकारी के अधिकांश इन दो ब्लॉग पोस्ट में पाया जा सकता है:

http://lostechies.com/derickbailey/2011/09/06/test-driving-backbone-views-with-jquery-templates-the-jasmine-gem-and-jasmine-jquery/

तथा

http://lostechies.com/derickbailey/2011/06/22/rendering-a-rails-partial-as-a-jquery-template/

इसका सार यह है कि मैं अपने सर्वर साइड रेंडर के लिए ईआरबी या एचएएमएल टेम्प्लेट (रूबी ऑन रेल्स, रूनट रनिंग आदि) का उपयोग करता हूं और क्लाइंट साइड टेम्प्लेट बनाने के लिए जो बैकबोन का उपयोग कर सकते हैं, साथ ही अपने जैस्मीन जावास्क्रिप्ट स्पेक्स के लिए भी। यह सर्वर साइड और क्लाइंट साइड के बीच मार्कअप के डुप्लिकेट को काट देता है।

वहां से, आपको अपने जावास्क्रिप्ट काम को HTML के साथ करने के लिए कुछ अतिरिक्त कदम उठाने की आवश्यकता है जो सर्वर द्वारा प्रदान की जाती है - सच्ची प्रगतिशील वृद्धि; जो शब्दार्थ मार्कअप दिया गया है, उसे डिलीवर करना और उसे जावास्क्रिप्ट के साथ बढ़ाना।

उदाहरण के लिए, मैं एक छवि गैलरी एप्लिकेशन का निर्माण कर रहा हूं pushState। यदि आप /images/1सर्वर से अनुरोध करते हैं, तो यह सर्वर पर संपूर्ण छवि गैलरी को प्रस्तुत करेगा और सभी HTML, सीएसएस और जावास्क्रिप्ट को आपके ब्राउज़र में भेज देगा। यदि आपके पास जावास्क्रिप्ट अक्षम है, तो यह पूरी तरह से ठीक काम करेगा। आपके द्वारा की जाने वाली प्रत्येक क्रिया सर्वर से एक भिन्न URL का अनुरोध करेगी और सर्वर आपके ब्राउज़र के लिए सभी मार्कअप को प्रस्तुत करेगा। यदि आपके पास जावास्क्रिप्ट सक्षम है, हालांकि, जावास्क्रिप्ट सर्वर द्वारा उत्पन्न कुछ चर के साथ पहले से ही प्रदान किए गए HTML को उठाएगा और वहां से ले जाएगा।

यहाँ एक उदाहरण है:

<form id="foo">
  Name: <input id="name"><button id="say">Say My Name!</button>
</form>

सर्वर इसे प्रस्तुत करने के बाद, जावास्क्रिप्ट इसे उठाएगा (इस उदाहरण में एक बैकबोन.जेएस दृश्य का उपयोग करके)

FooView = Backbone.View.extend({
  events: {
    "change #name": "setName",
    "click #say": "sayName"
  },

  setName: function(e){
    var name = $(e.currentTarget).val();
    this.model.set({name: name});
  },

  sayName: function(e){
    e.preventDefault();
    var name = this.model.get("name");
    alert("Hello " + name);
  },

  render: function(){
    // do some rendering here, for when this is just running JavaScript
  }
});

$(function(){
  var model = new MyModel();
  var view = new FooView({
    model: model,
    el: $("#foo")
  });
});

यह एक बहुत ही सरल उदाहरण है, लेकिन मुझे लगता है कि यह इस बिंदु को पार करता है।

जब मैं पृष्ठ लोड होने के बाद दृश्य को इंस्टेंट करता हूं, तो मैं उस फॉर्म की मौजूदा सामग्री प्रदान कर रहा हूं जो सर्वर द्वारा प्रदान की गई थी, दृश्य उदाहरण के लिए दृश्य उदाहरण के elलिए। मैं रेंडर कॉल नहीं कर रहा हूं या elमेरे लिए व्यू जेनरेट नहीं कर रहा है, जब पहला व्यू लोड होता है। मेरे पास देखने और चलाने के बाद एक रेंडर तरीका उपलब्ध है और पेज सभी जावास्क्रिप्ट है। इससे मुझे बाद में दृश्य को फिर से प्रस्तुत करने की अनुमति मिलती है अगर मुझे आवश्यकता है।

जावास्क्रिप्ट सक्षम के साथ "Say My Name" बटन पर क्लिक करने से अलर्ट बॉक्स बन जाएगा। जावास्क्रिप्ट के बिना, यह सर्वर पर वापस पोस्ट कर देगा और सर्वर एक HTML तत्व को कहीं भी नाम दे सकता है।

संपादित करें

अधिक जटिल उदाहरण पर विचार करें, जहां आपके पास एक सूची है जिसे संलग्न करने की आवश्यकता है (नीचे दी गई टिप्पणियों से)

मान लें कि आपके पास <ul>टैग में उपयोगकर्ताओं की सूची है । यह सूची सर्वर द्वारा प्रदान की गई थी जब ब्राउज़र ने अनुरोध किया था, और परिणाम कुछ ऐसा दिखता है:

<ul id="user-list">
  <li data-id="1">Bob
  <li data-id="2">Mary
  <li data-id="3">Frank
  <li data-id="4">Jane
</ul>

अब आपको इस सूची के माध्यम से लूप करने की आवश्यकता है और प्रत्येक <li>आइटम पर बैकबोन व्यू और मॉडल संलग्न करें । data-idविशेषता के उपयोग के साथ , आप उस मॉडल को पा सकते हैं जिसे प्रत्येक टैग आसानी से आता है। फिर आपको एक संग्रह दृश्य और आइटम दृश्य की आवश्यकता होगी जो इस html में खुद को संलग्न करने के लिए पर्याप्त स्मार्ट है।

UserListView = Backbone.View.extend({
  attach: function(){
    this.el = $("#user-list");
    this.$("li").each(function(index){
      var userEl = $(this);
      var id = userEl.attr("data-id");
      var user = this.collection.get(id);
      new UserView({
        model: user,
        el: userEl
      });
    });
  }
});

UserView = Backbone.View.extend({
  initialize: function(){
    this.model.bind("change:name", this.updateName, this);
  },

  updateName: function(model, val){
    this.el.text(val);
  }
});

var userData = {...};
var userList = new UserCollection(userData);
var userListView = new UserListView({collection: userList});
userListView.attach();

इस उदाहरण में, UserListViewवसीयत सभी <li>टैग के माध्यम से लूप करता है और प्रत्येक के लिए सही मॉडल के साथ एक व्यू ऑब्जेक्ट संलग्न करता है। यह मॉडल के नाम परिवर्तन की घटना के लिए एक घटना हैंडलर सेट करता है और परिवर्तन होने पर तत्व के प्रदर्शित पाठ को अपडेट करता है।


इस तरह की प्रक्रिया, HTML लेने के लिए कि सर्वर ने प्रतिपादन किया और मेरे जावास्क्रिप्ट को संभाला और इसे चलाया, एसईओ, एक्सेसिबिलिटी और pushStateसमर्थन के लिए चीजों को रोल करने का एक शानदार तरीका है ।

उम्मीद है की वो मदद करदे।


मुझे आपकी बात सही लगी, लेकिन यह दिलचस्प है कि "आपके जावास्क्रिप्ट के खत्म होने के बाद" रेंडर कैसे किया जाता है। अधिक जटिल उदाहरण में आपको सूची बनाने के लिए उपयोगकर्ताओं की एक सरणी के माध्यम से लूपिंग, क्लाइंट पर एक असंबद्ध टेम्पलेट का उपयोग करना पड़ सकता है। उपयोगकर्ता का मॉडल बदलने पर हर बार दृश्य पुनः प्रस्तुत होता है। आप ऐसा कैसे करेंगे कि टेम्पलेट्स को दोहराए बिना (और क्लाइंट के लिए दृश्य को प्रस्तुत करने के लिए सर्वर से नहीं पूछें)?
user544941

मेरे द्वारा लिंक किए गए 2 ब्लॉग पोस्ट सामूहिक रूप से आपको दिखाएंगे कि कैसे टेम्पलेट हैं जो क्लाइंट और सर्वर पर उपयोग किए जा सकते हैं - कोई दोहराव की आवश्यकता नहीं है। सर्वर को पूरे पृष्ठ को रेंडर करने की आवश्यकता होगी यदि आप चाहते हैं कि यह सुलभ और एसईओ अनुकूल हो। मैंने सर्वर द्वारा प्रदान की गई उपयोगकर्ता सूची में संलग्न करने के अधिक जटिल उदाहरण को शामिल करने के लिए अपना उत्तर अपडेट किया है
Derick Bailey

22

मुझे लगता है कि आपको इसकी आवश्यकता है: http://code.google.com/web/ajaxcrawling/

आप एक विशेष बैकएंड भी स्थापित कर सकते हैं जो सर्वर पर जावास्क्रिप्ट चलाकर आपके पृष्ठ को "रेंडर" करता है, और फिर उसको Google परोसता है।

दोनों चीजों को मिलाएं और आपके पास दो बार प्रोग्रामिंग चीजों के बिना एक समाधान है। (जब तक आपका ऐप एंकर टुकड़ों के माध्यम से पूरी तरह से चलाया जा सकता है।)


दरअसल, यह वह नहीं है जिसकी मुझे तलाश है। वे पहले समाधान के कुछ रूप हैं और जैसा कि मैंने उल्लेख किया है कि मैं उस दृष्टिकोण से बहुत खुश नहीं हूँ।
user544941

2
आपने मेरा पूरा उत्तर नहीं पढ़ा। आप एक विशेष बैकएंड का भी उपयोग करते हैं जो आपके लिए जावास्क्रिप्ट को प्रस्तुत करता है - आप दो बार चीजें नहीं लिखते हैं।
एरियल

हां, मैंने वह पढ़ा। लेकिन अगर मैंने आपको सही पाया कि यह एक कार्यक्रम का एक नरक होगा, क्योंकि इसमें हर उस कार्रवाई का अनुकरण करना होगा जो पुशस्टेट को ट्रिगर करती है। वैकल्पिक रूप से, मैं इसे सीधे कार्रवाई दे सकता था, लेकिन फिर हम अब और इतने कम नहीं हैं।
user544941

2
मुझे लगता है कि यह मूल रूप से सामने वाला ब्राउज़र है। लेकिन, हां, आपको एंकर के टुकड़ों से कार्यक्रम को पूरी तरह से नियंत्रित करना होगा। आपको यह भी सुनिश्चित करने की आवश्यकता है कि सभी लिंक में, या इसके बजाय, ऑनक्लेक्स के साथ उचित टुकड़ा है।
एरियल

17

तो, ऐसा लगता है कि मुख्य चिंता DRY है

  • यदि आप पुशस्टैट का उपयोग कर रहे हैं, तो आपके सर्वर के पास सभी यूआरएल के लिए एक ही सटीक कोड है (जिसमें छवियों की सेवा के लिए फ़ाइल एक्सटेंशन नहीं है, आदि) "/ mydir / myfile", "/ myotherdir / myotherfile" या root "/" "- सभी अनुरोध समान कोड प्राप्त करते हैं। आपको किसी तरह का url rewrite इंजन लगाने की आवश्यकता है। आप html का एक छोटा सा हिस्सा भी दे सकते हैं और बाकी आपके CDN (निर्भरता को प्रबंधित करने के लिए आवश्यकता का उपयोग करके - देख सकते हैं - https://stackoverflow.com/a/13813102/1595913 ) पर आ सकते हैं।
  • (लिंक की वैधता का परीक्षण अपनी url योजना के लिंक को परिवर्तित करके और स्थिर, एक गतिशील स्रोत को क्वेरी करके सामग्री के अस्तित्व के खिलाफ परीक्षण करना। यदि यह वैध नहीं है तो 404 प्रतिक्रिया भेजें।)
  • जब अनुरोध Google bot से नहीं होता है, तो आप सामान्य रूप से प्रक्रिया करते हैं।
  • यदि अनुरोध एक Google बॉट से है, तो आप सर्वर पर HTML और जावास्क्रिप्ट को रेंडर करने और भेजने के लिए phantom.js - हेडलेस वेबकिट ब्राउज़र ( "एक हेडलेस ब्राउजर बिना किसी दृश्य इंटरफ़ेस के पूर्ण रूप से चित्रित वेब ब्राउज़र का उपयोग करते हैं" ) का उपयोग करते हैं। परिणामी HTML जैसा कि बॉट html को पार्स करता है, यह आपके अन्य "पुशस्टेट" लिंक / सर्वर पर किसी पेज को हिट कर सकता है <a href="https://stackoverflow.com/someotherpage">mylink</a>, सर्वर आपकी एप्लिकेशन फाइल के लिए url को फिर से लिखता है, इसे phantom.js में लोड करता है और परिणामस्वरूप html को बॉट में भेजा जाता है, और इसी तरह। ..
  • आपके html के लिए मैं मान रहा हूँ कि आप कुछ प्रकार के अपहरण के साथ सामान्य लिंक का उपयोग कर रहे हैं (जैसे backbone.js https://stackoverflow.com/a/9331734/1595913 के साथ उपयोग करना )
  • किसी भी लिंक के साथ भ्रम से बचने के लिए अपने एपीआई कोड को अलग करें जो एक अलग उपडोमेन में json परोसता है, जैसे api.mysite.com
  • प्रदर्शन में सुधार के लिए आप अपने इंजन पृष्ठों को खोज इंजन के लिए समय से पहले बंद कर सकते हैं और घंटों के दौरान उसी तंत्र का उपयोग करके पृष्ठों का स्थैतिक संस्करण बना सकते हैं। प्रीप्रोसेपिंग कुछ सरल ऐप के साथ किया जा सकता है जो <a>टैग को पार्स कर सकते हैं । इस मामले में 404 को हैंडल करना आसान है क्योंकि आप केवल स्थैतिक फ़ाइल के अस्तित्व के लिए एक नाम के साथ जांच कर सकते हैं जिसमें url पाथ होता है।
  • यदि तुम प्रयोग करते हो #! आपकी साइट के लिए हैश बैंग सिंटैक्स एक समान परिदृश्य लिंक करता है, सिवाय इसके कि url में relite url सर्वर इंजन _escaped_fragment_ के लिए दिखेगा और url को आपकी url योजना में प्रारूपित करेगा।
  • वहाँ github पर phantom.js के साथ node.js के एकीकरण के एक जोड़े हैं और आप HTML आउटपुट का उत्पादन करने के लिए वेब सर्वर के रूप में नोड .js का उपयोग कर सकते हैं।

यहाँ seo के लिए phantom.js का उपयोग करते हुए कुछ उदाहरण दिए गए हैं:

http://backbonetutorials.com/seo-for-single-page-apps/

http://thedigitalself.com/blog/seo-and-javascript-with-phantomjs-server-side-rendering


4

यदि आप रेल का उपयोग कर रहे हैं, तो पॉयरोट की कोशिश करें । यह एक ऐसा रत्न है जो मूंछ या हैंडलबार्स टेम्प्लेट क्लाइंट और सर्वर साइड को पुन: उपयोग करने के लिए सरल बनाता है ।

अपने विचारों की तरह एक फ़ाइल बनाएँ _some_thingy.html.mustache

रेंडर सर्वर साइड:

<%= render :partial => 'some_thingy', object: my_model %>

क्लाइंट साइड उपयोग के लिए टेम्पलेट को अपने सिर पर रखें:

<%= template_include_tag 'some_thingy' %>

रेंड्रे ग्राहक पक्ष:

html = poirot.someThingy(my_model)

3

थोड़ा अलग कोण लेने के लिए, आपका दूसरा समाधान पहुंच के मामले में सही होगा ... आप उन उपयोगकर्ताओं को वैकल्पिक सामग्री प्रदान करेंगे जो जावास्क्रिप्ट (स्क्रीन रीडर, आदि के साथ) का उपयोग नहीं कर सकते हैं।

यह स्वचालित रूप से एसईओ के लाभों को जोड़ देगा और, मेरी राय में, Google द्वारा 'शरारती' तकनीक के रूप में नहीं देखा जाएगा।


और क्या किसी ने आपको गलत साबित किया? टिप्पणी पोस्ट किए जाने के बाद कुछ समय हो गया है
jkulak

1

दिलचस्प। मैं व्यवहार्य समाधान के लिए चारों ओर खोज रहा हूं लेकिन यह काफी समस्याग्रस्त है।

मैं वास्तव में आपके 2 दृष्टिकोण की ओर अधिक झुक रहा था:

सर्वर को केवल खोज इंजन बॉट के लिए एक विशेष वेबसाइट प्रदान करने दें। यदि एक सामान्य उपयोगकर्ता http://example.com/my_path पर जाता है , तो सर्वर को उसे वेबसाइट का जावास्क्रिप्ट भारी संस्करण देना चाहिए। लेकिन अगर Google bot विज़िट करता है, तो सर्वर को उस सामग्री के साथ कुछ न्यूनतम HTML देना चाहिए जिसे मैं Google को अनुक्रमणित करना चाहता हूं।

यहाँ मेरी समस्या को हल करने पर है। यद्यपि यह काम करने की पुष्टि नहीं करता है, यह अन्य डेवलपर्स के लिए कुछ अंतर्दृष्टि या विचार प्रदान कर सकता है।

मान लें कि आप एक जेएस फ्रेमवर्क का उपयोग कर रहे हैं जो "पुश स्टेट" कार्यक्षमता का समर्थन करता है, और आपका बैकएंड फ्रेम रूबी ऑन रेल्स है। आपके पास एक सरल ब्लॉग साइट है और आप अपने सभी लेखों indexऔर showपृष्ठों को अनुक्रमित करने के लिए खोज इंजन चाहेंगे ।

मान लीजिए कि आपके मार्ग ऐसे हैं:

resources :articles
match "*path", "main#index"

सुनिश्चित करें कि हर सर्वर-साइड कंट्रोलर उसी टेम्पलेट को प्रस्तुत करता है जिसे आपके क्लाइंट-साइड फ्रेमवर्क को चलाने की आवश्यकता होती है (html / css / javascript / etc)। यदि अनुरोधों में से कोई भी नियंत्रक मेल नहीं खाता है (इस उदाहरण में हमारे पास केवल कार्यों के लिए एक निर्धारित सेट है ArticlesController), तो बस कुछ और से मेल खाते हैं और बस टेम्पलेट को रेंडर करते हैं और क्लाइंट-साइड फ्रेमवर्क को रूटिंग को संभालने देते हैं। नियंत्रक को हिट करने और वाइल्डकार्ड मिलान करने वाले के बीच एकमात्र अंतर URL-अक्षम उपकरणों के लिए अनुरोध किए गए URL के आधार पर सामग्री को प्रस्तुत करने की क्षमता होगी।

जो मैं समझता हूं कि यह सामग्री को रेंडर करने के लिए एक बुरा विचार है जो ब्राउज़र को दिखाई नहीं देता है। इसलिए जब Google इसे अनुक्रमित करता है, तो लोग दिए गए पृष्ठ पर जाने के लिए Google के माध्यम से जाते हैं और कोई सामग्री नहीं होती है, तो आप शायद दंडित होने जा रहे हैं। क्या दिमाग में आता है कि आप एक में सामग्री प्रस्तुत करनाdivdisplay: none सीएसएस नोड करते हैं ।

हालांकि, मुझे पूरा यकीन है कि अगर आप बस ऐसा करते हैं तो कोई फर्क नहीं पड़ता:

<div id="no-js">
  <h1><%= @article.title %></h1>
  <p><%= @article.description %></p>
  <p><%= @article.content %></p>
</div>

और फिर जावास्क्रिप्ट का उपयोग करते हुए, जो जावास्क्रिप्ट-अक्षम डिवाइस को पेज खोलने पर नहीं चलता है:

$("#no-js").remove() # jQuery

इस तरह, Google के लिए और जावास्क्रिप्ट-अक्षम उपकरणों वाले किसी के लिए, वे कच्चे / स्थिर सामग्री देखेंगे। तो सामग्री है शारीरिक रूप से वहाँ और जावास्क्रिप्ट अक्षम उपकरणों के साथ किसी को भी दिखाई है।

लेकिन, जब कोई उपयोगकर्ता एक ही पृष्ठ पर जाता है और वास्तव में जावास्क्रिप्ट सक्षम होता है, तो#no-js नोड हटा दिया जाएगा ताकि यह आपके आवेदन को अव्यवस्थित न करे। फिर आपका क्लाइंट-साइड फ्रेमवर्क इसके राउटर के माध्यम से अनुरोध को संभाल लेगा और प्रदर्शित करेगा कि जावास्क्रिप्ट सक्षम होने पर उपयोगकर्ता को क्या देखना चाहिए।

मुझे लगता है कि यह उपयोग करने के लिए एक वैध और काफी आसान तकनीक हो सकती है। यद्यपि यह आपकी वेबसाइट / एप्लिकेशन की जटिलता पर निर्भर हो सकता है।

हालाँकि, अगर यह नहीं है तो कृपया मुझे सुधारें। बस सोचा था कि मैं अपने विचार साझा करूंगा।


1
ठीक है, यदि आप पहले सामग्री प्रदर्शित करते हैं और थोड़ा बाद में इसे हटाते हैं, तो सबसे अधिक संभवतया अंत उपयोगकर्ता यह देख सकता है कि सामग्री उसके ब्राउज़र में ब्लिंक / फ़्लिकर करती है :) विशेषकर यदि यह धीमा ब्राउज़र है, तो HTML सामग्री का विशाल आकार जिसे आप प्रदर्शित / हटाने और कुछ करने की कोशिश करते हैं जेएस कोड लोड होने और निष्पादित होने से पहले देरी। आपको क्या लगता है?
एवरेक

1

सर्वर पर NodeJS का उपयोग करें, अपने क्लाइंटसाइड कोड को ब्राउज़ करें और पहले 'बूट्सनाप' (पृष्ठ का एक स्नैपशॉट जो राज्य है) प्रदान करने के लिए सर्वराइड क्लाइंट के माध्यम से प्रत्येक HTTP-रिक्वेस्ट (स्थैतिक http संसाधनों को छोड़कर) को रूट करें। सर्वर पर jquery डोम-ऑप्स को संभालने के लिए jsdom जैसी किसी चीज़ का उपयोग करें। बूब्सैप के वापस आने के बाद, वेबसोकेट कनेक्शन को सेटअप करें। क्लाइंटसाइड पर किसी प्रकार का आवरण कनेक्शन बनाकर वेबसोकेट क्लाइंट और सर्वरसाइड क्लाइंट के बीच अंतर करने के लिए संभवतः सबसे अच्छा है (सर्वरसाइड क्लाइंट सीधे सर्वर के साथ संवाद कर सकता है)। मैं कुछ इस तरह से काम कर रहा हूं: https://github.com/jvanveen/rnet/


0

पृष्ठों को प्रस्तुत करने के लिए Google क्लोजर टेम्पलेट का उपयोग करें । यह जावास्क्रिप्ट या जावा को संकलित करता है, इसलिए पृष्ठ को क्लाइंट या सर्वर साइड पर रेंडर करना आसान है। हर क्लाइंट के साथ पहली मुठभेड़ पर, html रेंडर करें और हेडर में लिंक के रूप में जावास्क्रिप्ट जोड़ें। क्रॉलर केवल HTML पढ़ेगा लेकिन ब्राउज़र आपकी स्क्रिप्ट निष्पादित करेगा। ब्राउज़र के सभी बाद के अनुरोधों को यातायात को कम करने के लिए एपीआई के खिलाफ किया जा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.