"একক পৃষ্ঠা" জেএস ওয়েবসাইট এবং এসইও


128

আজকাল শক্তিশালী "একক পৃষ্ঠা" জাভাস্ক্রিপ্ট ওয়েবসাইট তৈরির জন্য প্রচুর শীতল সরঞ্জাম রয়েছে। আমার মতে, সার্ভারটি একটি API হিসাবে কাজ করতে দেওয়া (এবং আরও কিছুই নয়) এবং ক্লায়েন্টকে এইচটিএমএল প্রজন্মের সমস্ত জিনিস হ্যান্ডেল করার মাধ্যমে এই কাজটি করা হয়েছে। এই "প্যাটার্ন" সংক্রান্ত সমস্যাটি অনুসন্ধান ইঞ্জিনের সহায়তার অভাব। আমি দুটি সমাধান সম্পর্কে চিন্তা করতে পারি:

  1. যখন ব্যবহারকারী ওয়েবসাইটে প্রবেশ করে, সার্ভারটি ক্লায়েন্টের নেভিগেশনের সময় ঠিক তেমন পৃষ্ঠাটি রেন্ডার করুক। সুতরাং আমি যদি http://example.com/my_pathসরাসরি সার্ভারে যাই তবে /my_pathক্লাশের মতো একই জিনিসটি রেন্ডার করতাম যদি আমি পুসস্টেটের মাধ্যমে যাই।
  2. সার্ভারকে কেবল অনুসন্ধান ইঞ্জিনের বটগুলির জন্য একটি বিশেষ ওয়েবসাইট সরবরাহ করতে দিন। যদি কোনও সাধারণ ব্যবহারকারী http://example.com/my_pathসার্ভারে যান তবে তাকে ওয়েবসাইটের একটি জাভাস্ক্রিপ্ট ভারী সংস্করণ দেওয়া উচিত। তবে গুগল বট যদি পরিদর্শন করে তবে সার্ভারের এমন সামগ্রীটি দিয়ে আমি গুগলকে সূচীকরণ করতে চাইলে এটি ন্যূনতম এইচটিএমএল দেওয়া উচিত।

প্রথম সমাধানটি এখানে আরও আলোচনা করা হয়েছে । আমি এটি করে একটি ওয়েবসাইটে কাজ করছি এবং এটি খুব সুন্দর অভিজ্ঞতা নয়। এটি DRY নয় এবং আমার ক্ষেত্রে আমাকে ক্লায়েন্ট এবং সার্ভারের জন্য দুটি পৃথক টেম্পলেট ইঞ্জিন ব্যবহার করতে হয়েছিল।

আমি মনে করি কিছু ভাল ওল 'ফ্ল্যাশ ওয়েবসাইটের জন্য আমি দ্বিতীয় সমাধানটি দেখেছি। আমি এই পদ্ধতিরটিকে প্রথমটির চেয়ে অনেক বেশি পছন্দ করি এবং সার্ভারে সঠিক সরঞ্জাম দিয়ে এটি বেশ বেদনা ছাড়াই করা যায়।

সুতরাং আমি যা ভাবছি তা হ'ল নিম্নলিখিতটি:

  • আপনি কি আরও ভাল সমাধান চিন্তা করতে পারেন?
  • দ্বিতীয় সমাধানের অসুবিধাগুলি কী কী? গুগল যদি কোনও উপায়ে জানতে পারে যে আমি একজন নিয়মিত ব্যবহারকারী হিসাবে গুগলের বট জন্য ঠিক একই বিষয়বস্তুটি পরিবেশন করছি না, তাহলে কি অনুসন্ধানের ফলাফলগুলিতে আমাকে শাস্তি দেওয়া হবে?

উত্তর:


44

যদিও বিকাশকারী হিসাবে আপনার পক্ষে # 2 "সহজ" হতে পারে তবে এটি কেবল অনুসন্ধান ইঞ্জিন ক্রলিং সরবরাহ করে। এবং হ্যাঁ, গুগল যদি আপনার বিভিন্ন সামগ্রী সরবরাহ করে তা খুঁজে বের করে, তবে আপনাকে শাস্তি দেওয়া হতে পারে (আমি এতে কোনও বিশেষজ্ঞ নই, তবে এটি ঘটতে শুনেছি)।

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

pushStateআমার অভিজ্ঞতায় এই বোঝাটি যুক্ত করে না। এটি কেবলমাত্র পরে ব্যবহৃত চিন্তাভাবনা এবং "আমাদের যদি সময় থাকে" ওয়েব বিকাশের অগ্রভাগে নিয়ে আসে।

আপনার বিকল্প # 1 এ যা বর্ণনা করা হয়েছে তা যাবার জন্য সর্বোত্তম উপায় - তবে অন্যান্য অ্যাক্সেসযোগ্যতা এবং এসইও ইস্যুগুলির মতো, pushStateজাভাস্ক্রিপ্ট-ভারী অ্যাপ্লিকেশন দিয়ে এটি করার জন্য আপ-ফ্রন্ট পরিকল্পনা প্রয়োজন বা এটি একটি গুরুত্বপূর্ণ বোঝা হয়ে উঠবে। এটি পৃষ্ঠায় এবং অ্যাপ্লিকেশন আর্কিটেকচারটি শুরু থেকেই বেক করা উচিত - retrofitting বেদনাদায়ক এবং প্রয়োজনের তুলনায় আরও বেশি সদৃশ সৃষ্টি করবে।

আমি pushStateসম্প্রতি বেশ কয়েকটি ভিন্ন অ্যাপ্লিকেশনের জন্য এবং এসইওয়ের সাথে কাজ করছি এবং আমি যা পেয়েছি তা একটি ভাল পদ্ধতির বলে মনে করি। এটি মূলত আপনার আইটেম # 1 অনুসরণ করে তবে এইচটিএমএল / টেমপ্লেটগুলি নকল না করার জন্য অ্যাকাউন্টগুলি।

এই দুটি ব্লগ পোস্টে বেশিরভাগ তথ্য পাওয়া যাবে:

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/

এর সংক্ষিপ্তসারটি হ'ল আমি আমার সার্ভার সাইড রেন্ডার এবং ব্যাকবোন যে ক্লায়েন্ট সাইড টেম্পলেটগুলি ব্যবহার করতে পারি তার পাশাপাশি আমার জেসমিন জাভাস্ক্রিপ্ট স্পেস্কগুলির জন্য ইআরবি বা এইচএএমএল টেমপ্লেটগুলি (রেলগুলি রুবেল, সিনট্রা ইত্যাদি) ব্যবহার করি। এটি সার্ভার সাইড এবং ক্লায়েন্ট পক্ষের মধ্যে মার্কআপের সদৃশটিকে কেটে দেয়।

সেখান থেকে, আপনার জাভাস্ক্রিপ্টটি এইচটিএমএল দিয়ে সার্ভারের দ্বারা রেন্ডার করা কাজের জন্য কিছু অতিরিক্ত পদক্ষেপ গ্রহণ করা দরকার - সত্য প্রগতিশীল বৃদ্ধি; অর্থেডিক মার্কআপটি গ্রহণ করা যা জাভাস্ক্রিপ্টের সাহায্যে বিতরণ করা হয়েছে।

উদাহরণস্বরূপ, আমি এর সাথে একটি চিত্র গ্যালারী অ্যাপ্লিকেশন তৈরি করছি pushState। আপনি যদি /images/1সার্ভার থেকে অনুরোধ করেন তবে এটি সার্ভারের পুরো চিত্র গ্যালারী রেন্ডার করবে এবং সমস্ত ব্রাউজারে এইচটিএমএল, সিএসএস এবং জাভাস্ক্রিপ্ট প্রেরণ করবে। আপনার যদি জাভাস্ক্রিপ্ট অক্ষম থাকে তবে এটি পুরোপুরি ঠিকঠাক কাজ করবে। আপনার করা প্রতিটি পদক্ষেপ সার্ভার থেকে একটি পৃথক URL অনুরোধ করবে এবং সার্ভারটি আপনার ব্রাউজারের জন্য সমস্ত মার্কআপ রেন্ডার করবে। আপনি যদি জাভাস্ক্রিপ্ট সক্ষম করে থাকেন তবে জাভা স্ক্রিপ্টটি সার্ভারের দ্বারা উত্পাদিত কয়েকটি ভেরিয়েবলের সাথে ইতিমধ্যে রেন্ডার করা এইচটিএমএলকে বেছে নেবে এবং সেখান থেকে গ্রহণ করবে।

এখানে একটি উদাহরণ:

<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আমার জন্য একটি উত্পন্ন করছে। ভিউটি শেষ হয়ে যাওয়ার পরে আমার কাছে রেন্ডার পদ্ধতি উপলব্ধ রয়েছে এবং পৃষ্ঠাটি সমস্ত জাভাস্ক্রিপ্ট। এটি আমার প্রয়োজন হলে পরে আমাকে পুনরায় রেন্ডার করতে দেয়।

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

সম্পাদন করা

আরও জটিল উদাহরণ বিবেচনা করুন, যেখানে আপনার একটি তালিকা রয়েছে যা সংযুক্ত করা দরকার (এটি নীচের মন্তব্যগুলি থেকে)

বলুন একটি <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বৈশিষ্ট্যটির ব্যবহারের সাথে আপনি প্রতিটি মডেলটি সহজেই যে মডেলটি আসেন তা আবিষ্কার করতে পারেন। তারপরে আপনার এই সংগ্রহের ভিউ এবং আইটেম ভিউ দরকার যা এইচটিএমএল এ নিজেকে সংযুক্ত করার জন্য যথেষ্ট স্মার্ট।

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>ট্যাগের মধ্য দিয়ে লুপ করবে এবং প্রতিটিটির জন্য সঠিক মডেলের সাথে একটি ভিউ অবজেক্ট সংযুক্ত করবে। এটি মডেলের নাম পরিবর্তন ইভেন্টের জন্য একটি ইভেন্ট হ্যান্ডলার সেট আপ করে এবং কোনও পরিবর্তন ঘটে যখন উপাদানটির প্রদর্শিত পাঠ্য আপডেট করে।


এই জাতীয় প্রক্রিয়া, এইচটিএমএলকে নিতে যে সার্ভারটি রেন্ডার করেছে এবং আমার জাভাস্ক্রিপ্টটি ধরে নিয়েছে এবং চালাতে পারে, তা এসইও, অ্যাক্সেসিবিলিটি এবং সমর্থনগুলির জন্য জিনিসগুলিকে ঘূর্ণায়মান করার দুর্দান্ত উপায় pushState

আশা করি এইটি কাজ করবে.


আমি আপনার বক্তব্যটি পেয়েছি তবে কী আকর্ষণীয় তা হল "আপনার জাভাস্ক্রিপ্টটি হাতে নেওয়ার পরে" রেন্ডারিং কীভাবে করা হয়। আরও জটিল উদাহরণে আপনাকে ক্লায়েন্টে একটি বিচ্ছিন্ন টেম্পলেট ব্যবহার করতে হতে পারে, একটি তালিকা তৈরির জন্য ব্যবহারকারীদের একটি অ্যারের মাধ্যমে লুপ করে। যখনই কোনও ব্যবহারকারীর মডেল পরিবর্তিত হয় ততবার ভিউটি পুনরায় রেন্ডার করে। আপনি কীভাবে টেমপ্লেটগুলি অনুলিপি না করে (এবং ক্লায়েন্টের জন্য ভিউ রেন্ডার করতে সার্ভারকে জিজ্ঞাসা করবেন না)?
ব্যবহারকারী544941

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

22

আমার মনে হয় আপনার এটির দরকার: http://code.google.com/web/ajaxcrawling/

আপনি একটি বিশেষ ব্যাকএন্ডও ইনস্টল করতে পারেন যা সার্ভারে জাভাস্ক্রিপ্ট চালিয়ে আপনার পৃষ্ঠাকে "রেন্ডার করে" এবং তারপরে এটি গুগলে পরিবেশন করে।

উভয় জিনিস একত্রিত করুন এবং আপনার কাছে দুটি বার প্রোগ্রামিং ছাড়াই একটি সমাধান রয়েছে। (যতক্ষণ না আপনার অ্যাপ্লিকেশনটি অ্যাঙ্কর টুকরোগুলির মাধ্যমে পুরোপুরি নিয়ন্ত্রণযোগ্য is


আসলে, আমি যা খুঁজছি তা নয়। এগুলি প্রথম সমাধানের কিছু রূপ এবং আমি উল্লেখ করেছি যে আমি সেই পদ্ধতির সাথে খুব খুশি নই।
ব্যবহারকারী544941

2
আপনি আমার পুরো উত্তরটি পড়েন নি। আপনি একটি বিশেষ ব্যাকএন্ডও ব্যবহার করেন যা জাভাস্ক্রিপ্ট আপনার জন্য রেন্ডার করে - আপনি দু'বার জিনিস লিখবেন না।
এরিয়েল

হ্যাঁ, আমি এটি পড়েছি। তবে যদি আমি আপনাকে সঠিকভাবে পেলাম তবে এটি একটি প্রোগ্রামের এক জাহান্নাম হবে, যেহেতু এটি পুশস্টেটকে ট্রিগার করে এমন প্রতিটি ক্রিয়া অনুকরণ করতে হবে। বিকল্পভাবে, আমি সরাসরি এটিতে ক্রিয়াগুলি দিতে পারি, তবে তারপরে আমরা আর শুকাই না।
ব্যবহারকারী544941

2
আমি মনে করি এটি মূলত সামনে ছাড়া একটি ব্রাউজার। তবে, হ্যাঁ, আপনাকে অ্যাঙ্কর টুকরা থেকে প্রোগ্রামটি সম্পূর্ণ নিয়ন্ত্রণযোগ্য করে তুলতে হবে। আপনারও নিশ্চিত করতে হবে যে সমস্ত লিঙ্কগুলিতে অনক্লিক্স সহ বা তার পরিবর্তে সেগুলিতে সঠিক খণ্ড রয়েছে।
এরিয়েল

17

সুতরাং, মনে হচ্ছে মূল উদ্বেগটি DRY হচ্ছে being

  • আপনি যদি পুশস্টেট ব্যবহার করছেন তবে আপনার সার্ভারে সমস্ত ইউআরএলগুলির জন্য একই সঠিক কোডটি প্রেরণ করুন (এতে চিত্র সরবরাহের জন্য কোনও ফাইল এক্সটেনশন নেই) "" / মাইডির / মাইফিল "," / মায়োথারডির / মাইদারফাইল "বা মূল" / "- সমস্ত অনুরোধগুলি একই সঠিক কোড পায়। আপনার কিছু ধরনের url পুনর্লিখন ইঞ্জিন থাকা দরকার। আপনি এইচটিএমএল এর একটি সামান্য বিট পরিবেশন করতে পারেন এবং বাকিগুলি আপনার সিডিএন থেকে আসতে পারে (নির্ভরতা পরিচালনা করতে প্রয়োজনীয়.js ব্যবহার করে - https://stackoverflow.com/a/13813102/1595913 দেখুন )।
  • (লিঙ্কটিকে আপনার ইউআরএল স্কিমে রূপান্তরিত করে এবং স্থির বা গতিশীল উত্সের অনুসন্ধানের মাধ্যমে সামগ্রীর অস্তিত্বের বিরুদ্ধে পরীক্ষা করে লিঙ্কটির বৈধতা পরীক্ষা করুন it's যদি এটি বৈধ না হয় তবে 404 টি প্রতিক্রিয়া প্রেরণ করুন))
  • যখন অনুরোধটি কোনও গুগল বট থেকে আসে না, আপনি কেবলমাত্র স্বাভাবিকভাবেই প্রক্রিয়া করেন।
  • যদি অনুরোধটি গুগল বট থেকে হয় তবে আপনি ফ্যান্টম.জেএস ব্যবহার করুন - হেডলেস ওয়েবকিট ব্রাউজার ( "শিরোনামহীন ব্রাউজারটি কেবল একটি ভিজ্যুয়াল ইন্টারফেস সহ একটি সম্পূর্ণ বৈশিষ্ট্যযুক্ত ওয়েব ব্রাউজার।" ) সার্ভারে এইচটিএমএল এবং জাভাস্ক্রিপ্ট রেন্ডার করতে এবং প্রেরণ করতে গুগল বট ফলাফল html। বটটি এইচটিএমএলকে বিশ্লেষণ করার সাথে সাথে এটি সার্ভারে আপনার অন্যান্য "পুশস্টেট" লিঙ্কগুলি / কোনও পৃষ্ঠায় আঘাত করতে পারে <a href="https://stackoverflow.com/someotherpage">mylink</a>, সার্ভারটি আপনার অ্যাপ্লিকেশন ফাইলটিতে url পুনর্লিখন করে, এটি ফ্যান্টম.জেজে লোড করে এবং ফলস্বরূপ এইচটিএমএল বটকে প্রেরণ করা হয়, ইত্যাদি। ..
  • আপনার এইচটিএমএল-এর জন্য আমি ধরে নিচ্ছি যে আপনি কোনওরকম হাইজ্যাকিংয়ের সাথে সাধারণ লিঙ্কগুলি ব্যবহার করছেন (যেমন ব্যাকবোন.জেএসএস ব্যবহার করে https://stackoverflow.com/a/9331734/1595913 )
  • কোনও লিঙ্কের সাথে বিভ্রান্তি এড়াতে আপনার এপিআই কোডটি পৃথক করুন যা জসনকে একটি পৃথক সাবডোমেইন হিসাবে পরিবেশন করে, যেমন api.mysite.com
  • কর্মক্ষমতা উন্নত করতে আপনি আপনার সাইট পৃষ্ঠাগুলি ফ্যান্টম.জেএস দিয়ে একই প্রক্রিয়া ব্যবহার করে পৃষ্ঠাগুলির স্থির সংস্করণ তৈরি করে বন্ধ সময়কালে সময়ের আগে সন্ধান ইঞ্জিনগুলির জন্য প্রাক প্রক্রিয়া করতে পারেন এবং ফলস্বরূপ স্থির পৃষ্ঠাগুলি গুগল বটে পরিবেশন করতে পারেন। প্রিপ্রসেসিং কিছু সহজ অ্যাপ্লিকেশন দিয়ে করা যেতে পারে যা <a>ট্যাগগুলি পার্স করতে পারে । এই ক্ষেত্রে 404 হ্যান্ডলিং করা সহজ, যেহেতু আপনি কেবলমাত্র একটি নামের সাথে স্থায়ী ফাইলটির অস্তিত্ব যাচাই করতে পারেন যা url পথ রয়েছে।
  • আপনি যদি # ব্যবহার করেন! আপনার সাইটের লিঙ্কটির জন্য হ্যাশ ব্যাং সিনট্যাক্স একই জাতীয় প্রযোজ্য লিঙ্কটি যুক্ত করে, ব্যতীত পুনর্লিখনের ইউআরএল সার্ভার ইঞ্জিনটি url এর _escaped_fraament_ এর সন্ধান করবে এবং আপনার url স্কিমটিতে url ফর্ম্যাট করবে।
  • গিথুব এ ফ্যান্টম.জেএস এর সাথে নোড.জেএস এর বেশ কয়েকটি সংহত রয়েছে এবং আপনি এইচটিএমএল আউটপুট তৈরি করতে ওয়েব সার্ভার হিসাবে নোড.জেএস ব্যবহার করতে পারেন।

সিইওর জন্য ফ্যান্টম.জেএস ব্যবহার করে এখানে বেশ কয়েকটি উদাহরণ দেওয়া হল:

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

কিছুটা আলাদা কোণ নিতে, আপনার দ্বিতীয় সমাধানটি অ্যাক্সেসযোগ্যতার দিক থেকে সঠিক সমাধান হবে ... আপনি জাভাস্ক্রিপ্ট ব্যবহার করতে পারবেন না এমন ব্যবহারকারীদের (স্ক্রিন পাঠকগণ ইত্যাদি) বিকল্প বিকল্প সরবরাহ করবেন।

এটি স্বয়ংক্রিয়ভাবে এসইওর সুবিধাগুলি যুক্ত করবে এবং আমার মতে গুগলের দ্বারা কোনও 'দুষ্টু' কৌশল হিসাবে দেখা হবে না।


এবং কেউ কি আপনাকে ভুল প্রমাণ করেছে? মন্তব্য পোস্ট হওয়ার পরে এটি বেশ কিছুক্ষণ হয়েছে
জুলাইকে জাকুলাক

1

মজাদার. আমি কার্যক্ষম সমাধানগুলির জন্য চারপাশে অনুসন্ধান করে যাচ্ছিলাম তবে এটি বেশ সমস্যাযুক্ত বলে মনে হচ্ছে।

আমি আসলে আপনার ২ য় পদ্ধতির দিকে আরও ঝুঁকছিলাম:

সার্ভারকে কেবল অনুসন্ধান ইঞ্জিনের বটগুলির জন্য একটি বিশেষ ওয়েবসাইট সরবরাহ করতে দিন। যদি কোনও সাধারণ ব্যবহারকারী http://example.com/my_path এ যান তবে সার্ভারের তাকে ওয়েবসাইটের একটি জাভাস্ক্রিপ্ট ভারী সংস্করণ দেওয়া উচিত। তবে গুগল বট যদি পরিদর্শন করে তবে সার্ভারের উচিত সেই সামগ্রীটি যা Googleকে সূচক করতে চায় তার সাথে কিছুটা ন্যূনতম এইচটিএমএল দেওয়া উচিত।

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

ধরে নিন আপনি একটি জেএস ফ্রেমওয়ার্ক ব্যবহার করছেন যা "পুশ স্টেট" কার্যকারিতা সমর্থন করে এবং আপনার ব্যাকএন্ড ফ্রেমওয়ার্কটি রেল অন রুবি। আপনার একটি সহজ ব্লগ সাইট রয়েছে এবং আপনি অনুসন্ধান ইঞ্জিনগুলি আপনার সমস্ত নিবন্ধ indexএবং showপৃষ্ঠাগুলি সূচী করতে চান ।

ধরা যাক আপনি আপনার রুটগুলি এভাবে সেট আপ করেছেন:

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

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

আমি যা বুঝতে পারি তা থেকে ব্রাউজারগুলির কাছে দৃশ্যমান নয় এমন সামগ্রী রেন্ডার করা একটি খারাপ ধারণা। সুতরাং গুগল যখন এটি সূচক করে, লোকেরা একটি প্রদত্ত পৃষ্ঠাটি দেখার জন্য গুগল জুড়ে যায় এবং কোনও সামগ্রী নেই, তবে সম্ভবত আপনাকে শাস্তি দেওয়া হবে। যা মনে আসে তা হ'ল আপনি সিএসএসে divনোডে সামগ্রী রেন্ডার display: noneকরেন।

যাইহোক, আমি নিশ্চিত যে আপনি কেবল এটি করে নিলে কিছু যায় আসে না:

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

এবং তারপরে জাভাস্ক্রিপ্ট ব্যবহার করে যা কোনও জাভাস্ক্রিপ্ট-অক্ষম ডিভাইস পৃষ্ঠাটি খুললে চালিত হয় না:

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

এইভাবে, গুগল এবং জাভাস্ক্রিপ্ট-অক্ষম ডিভাইস সহ যে কারও জন্য তারা কাঁচা / স্থির সামগ্রী দেখতে পাবে। সুতরাং বিষয়বস্তু হল শারীরিকভাবে আছে এবং জাভাস্ক্রিপ্ট-অক্ষমিত ডিভাইসের সাথে যে কেউ কাছে দৃশ্যমান।

কিন্তু, যখন একজন ব্যবহারকারী ভিজিট একই পৃষ্ঠায় এবং আসলে হয়েছে জাভাস্ক্রিপ্ট সক্রিয় করা হলে, #no-jsনোড সরানো হবে তাই এটি আপনার আবেদন আপ বিশৃঙ্খল নেই। তারপরে আপনার ক্লায়েন্ট-সাইড ফ্রেমওয়ার্কটি এর রাউটারের মাধ্যমে অনুরোধটি পরিচালনা করবে এবং জাভাস্ক্রিপ্ট সক্ষম হওয়ার পরে কোনও ব্যবহারকারীকে কী দেখতে হবে তা প্রদর্শন করবে।

আমি মনে করি এটি ব্যবহারের জন্য একটি বৈধ এবং মোটামুটি সহজ কৌশল হতে পারে। যদিও এটি আপনার ওয়েবসাইট / আবেদনের জটিলতার উপর নির্ভর করে।

যদিও, দয়া করে আমাকে সংশোধন করুন যদি তা না হয়। ভেবেছিলাম আমি আমার চিন্তাভাবনা ভাগ করে নিই।


1
ঠিক আছে, আপনি যদি প্রথমে সামগ্রীটি প্রদর্শন করেন এবং কিছুক্ষণ পরে এটি সরিয়ে ফেলেন, তবে সম্ভবত শেষ ব্যবহারকারীরা লক্ষ্য করতে পারেন যে সামগ্রীটি তার ব্রাউজারে জ্বলজ্বল / ঝাঁকুনি দেয় :) বিশেষত যদি এটি ধীর ব্রাউজার হয়, আপনি প্রদর্শন / অপসারণ করার চেষ্টা করছেন এমন বিশাল আকারের এইচটিএমএল সামগ্রী এবং কিছু আপনার জেএস কোড লোড এবং কার্যকর করার আগে বিলম্ব করুন। তুমি কি ভাব?
এভেরিক

1

সার্ভারসাইডে নোডজেএস ব্যবহার করুন, আপনার ক্লায়েন্টাইড কোডটি ব্রাউজ করুন এবং প্রতিটি 'পোস্ট-অনুরোধের (স্ট্যাটিক http সংস্থান ব্যতীত)' সার্ভারসাইড ক্লায়েন্টের মাধ্যমে প্রথম 'বুটসন্যাপ' সরবরাহ করার জন্য (এটির পৃষ্ঠার একটি স্ন্যাপশট) সরবরাহ করুন route সার্ভারে jquery dom-ops পরিচালনা করতে jsdom এর মতো কিছু ব্যবহার করুন। বুটস্নাপ ফিরে আসার পরে, ওয়েবসকেট সংযোগ সেটআপ করুন। ক্লায়েন্টসাইডে কোনও ধরণের মোড়কের সংযোগ তৈরি করে কোনও ওয়েবসকেট ক্লায়েন্ট এবং একটি সার্ভারসাইড ক্লায়েন্টের মধ্যে পার্থক্য করা ভাল (সার্ভারসাইড ক্লায়েন্ট সরাসরি সার্ভারের সাথে যোগাযোগ করতে পারে)। আমি এই জাতীয় কিছুতে কাজ করছি: https://github.com/jvanveen/rnet/


0

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.