it-swarm.asia

كيف تتعامل محركات البحث مع تطبيقات AngularJS؟

أرى مشكلتين مع تطبيق AngularJS فيما يتعلق بمحركات البحث وكبار المسئولين الاقتصاديين:

1) ماذا يحدث مع العلامات المخصصة؟ هل تتجاهل محركات البحث المحتوى بالكامل ضمن هذه العلامات؟ أي افترض أن لدي

<custom>
  <h1>Hey, this title is important</h1>
</custom>

هل ستتم فهرسة <h1> على الرغم من كونها داخل العلامات المخصصة؟


2) هل هناك طريقة لتجنب محركات البحث للفهرسة {{}} الربط حرفيًا؟ أي.

<h2>{{title}}</h2>

وأنا أعلم أنني يمكن أن تفعل شيئا مثل

<h2 ng-bind="title"></h2>

ولكن ماذا لو أردت بالفعل السماح للزاحف "برؤية" العنوان؟ هل يمثل جانب الخادم الحل الوحيد؟

692
luisfarzati

تحديث مايو 2014

تقوم برامج زحف Google بتنفيذ جافا سكريبت الآن - يمكنك استخدام أدوات مشرفي المواقع من Google لفهم كيفية تقديم Google لمواقعك بشكل أفضل.

الإجابة الأصلية
إذا كنت ترغب في تحسين تطبيقك لمحركات البحث ، فلسوء الحظ ، لا توجد طريقة للتغلب على تقديم نسخة مقدمة مسبقًا إلى الزاحف. يمكنك قراءة المزيد حول توصيات Google لمواقع أياكس ومواقع جافا سكريبت الثقيلة هنا .

إذا كان هذا خيارًا ، فأنا أوصي بقراءة هذه المقالة حول كيفية القيام بـ SEO لـ Angular مع العرض من جانب الخادم.

لست متأكدًا مما يفعل الزاحف عندما يواجه علامات مخصصة.

402
joakimbl

استخدام PushState و Precomposition

الطريقة الحالية (2015) للقيام بذلك هي استخدام طريقة JavaScript pushState.

يقوم PushState بتغيير عنوان URL في شريط المتصفح العلوي دون إعادة تحميل الصفحة. لنفترض أن لديك صفحة تحتوي على علامات تبويب. تقوم علامات التبويب بإخفاء المحتوى وإظهاره ، ويتم إدراج المحتوى بشكل حيوي ، إما باستخدام AJAX أو ببساطة عن طريق إعداد العرض: بلا وعرض: حظر إخفاء وإظهار محتوى علامة التبويب الصحيح.

عند النقر فوق علامات التبويب ، استخدم pushState لتحديث عنوان url في شريط العناوين. عند تقديم الصفحة ، استخدم القيمة في شريط العناوين لتحديد علامة التبويب التي سيتم عرضها. Angular سيقوم التوجيه بذلك نيابة عنك تلقائيًا.

Precomposition

هناك طريقتان للوصول إلى تطبيق PushState Single Page (SPA)

  1. عبر PushState ، حيث يقوم المستخدم بالنقر فوق ارتباط PushState والمحتوى AJAXed فيه.
  2. عن طريق ضرب URL مباشرة.

ستتضمن الضربة المبدئية على الموقع ضرب عنوان URL مباشرةً. سيتم عرض النتائج اللاحقة بكل بساطة AJAX في المحتوى حيث يقوم PushState بتحديث عنوان URL.

يقوم الزواحف بجمع الروابط من الصفحة ثم إضافتها إلى قائمة انتظار للمعالجة اللاحقة. هذا يعني أنه بالنسبة إلى الزاحف ، فإن كل إصابة على الخادم هي ضربة مباشرة ، ولا يتنقلون عبر Pushstate.

يقوم Precomposition بتجميع الحمولة الأولية في الاستجابة الأولى من الخادم ، ربما ككائن JSON. يسمح هذا لمحرك البحث بعرض الصفحة دون تنفيذ المكالمة AJAX.

هناك بعض الأدلة التي تشير إلى أن Google قد لا تنفذ طلبات AJAX. المزيد عن هذا هنا:

https://web.archive.org/web/20160318211223/http://www.analog-ni.co/precomposing-a-spa-may-become-the-holy-grail-to-seo

يمكن لمحركات البحث قراءة جافا سكريبت وتنفيذه

تمكنت Google من تحليل جافا سكريبت لبعض الوقت الآن ، ولهذا السبب قاموا في الأصل بتطوير Chrome ، ليكون بمثابة متصفح كامل مقطوع الرأس للعنكبوت من Google. إذا كان للرابط سمة href صالحة ، فيمكن فهرسة عنوان URL الجديد. لا يوجد شيء أكثر للقيام به.

إذا أدى النقر فوق أحد الارتباطات إلى تشغيل مكالمة pushState ، فيمكن للمستخدم التنقل عبر الموقع عبر PushState.

دعم محرك البحث لعناوين PushState

PushState مدعوم حاليًا بواسطة Google و Bing.

جوجل

وهنا مات Cutts ردا على سؤال بول الايرلندي حول PushState لكبار المسئولين الاقتصاديين:

http://youtu.be/yiAF9VdvRPw

هنا تعلن Google عن دعم JavaScript الكامل للعنكبوت:

http://googlewebmastercentral.blogspot.de/2014/05/understanding-web-pages-better.html

والنتيجة النهائية هي أن Google تدعم PushState وستقوم بفهرسة عناوين URL لـ PushState.

راجع أيضًا جلب أدوات مشرفي المواقع من Google كـ Googlebot. سترى يتم تنفيذ JavaScript الخاص بك (بما في ذلك الزاوي).

بنج

إليك إعلان Bing عن دعم عناوين URL لـ PushState الجميلة بتاريخ مارس 2013:

http://blogs.bing.com/webmaster/2013/03/21/search-engine-optimization-best-practices-for-ajax-urls/

لا تستخدم HashBangs #!

كانت عناوين url Hashbang عبارة عن إطار مؤقت قبيح يتطلب من المطور تقديم نسخة مسبقة من الموقع في موقع خاص. ما زالوا يعملون ، لكنك لست بحاجة إلى استخدامها.

تبدو عناوين URL لـ Hashbang بالشكل التالي:

domain.com/#!path/to/resource

سيتم إقران هذا مع علامة وصفية مثل هذا:

<meta name="fragment" content="!">

لن تقوم Google بفهرستها في هذا النموذج ، ولكنها ستسحب بدلاً من ذلك إصدارًا ثابتًا من الموقع من عنوان URL _escaped_fragments_ والفهرس.

تبدو عناوين URL لـ Pushstate مثل أي عنوان URL عادي:

domain.com/path/to/resource

الفرق هو أن Angular تتعامل معهم نيابة عنك عن طريق اعتراض التغيير على document.location الذي يتعامل معه في JavaScript.

إذا كنت ترغب في استخدام عناوين URL لـ PushState (وربما تفعل ذلك) ، فقم بإخراج جميع عناوين URL وعلامات التعريف الخاصة بنمط التجزئة القديمة وتمكين وضع HTML5 في كتلة التكوين الخاصة بك.

اختبار موقعك

تحتوي أدوات مشرفي المواقع من Google الآن على أداة تسمح لك بإحضار عنوان URL كـ google ، وتقديم JavaScript كما يعرضه Google.

https://www.google.com/webmasters/tools/googlebot-fetch

توليد عناوين PushState في الزاوي

لإنشاء عناوين URL حقيقية في الزاوي ، بدلاً من # بادئة ، قم بتعيين وضع HTML5 على كائن $ locationProvider الخاص بك.

$locationProvider.html5Mode(true);

جانب الخادم

ونظرًا لأنك تستخدم عناوين URL الحقيقية ، فستحتاج إلى ضمان وصول القالب نفسه (بالإضافة إلى بعض المحتوى المقدم مسبقًا) من قِبل الخادم لجميع عناوين URL الصالحة. كيف يمكنك القيام بذلك سوف تختلف اعتمادا على بنية الخادم الخاص بك.

خريطة الموقع

قد يستخدم التطبيق أشكالًا غير عادية من التنقل ، مثل التمرير أو التمرير. لضمان قدرة Google على تشغيل تطبيقك ، ربما اقترح إنشاء خريطة موقع ، وهي قائمة بسيطة بجميع عناوين url التي يستجيب لها التطبيق. يمكنك وضع هذا في الموقع الافتراضي (/ sitemap أو/sitemap.xml) ، أو إخبار Google به باستخدام أدوات مشرفي المواقع.

إنها فكرة جيدة أن يكون لديك خريطة موقع على أي حال.

دعم المتصفح

يعمل Pushstate في IE10. في المتصفحات القديمة ، Angular ستعود تلقائيًا إلى عناوين URL الخاصة بنمط التجزئة

صفحة تجريبية

يتم تقديم المحتوى التالي باستخدام عنوان URL لـ pushstate مع حرف احتياطي:

http://html5.gingerhost.com/london

كما يمكن التحقق ، في هذا الرابط ، يتم فهرسة المحتوى ويظهر في Google.

خدمة رموز حالة 404 و 301 رأس

نظرًا لأن محرك البحث سيصل دائمًا إلى الخادم الخاص بك لكل طلب ، فيمكنك تقديم رموز حالة الرأس من الخادم الخاص بك وتوقع من Google رؤيتها.

470
superluminary

دعنا نحصل على معلومات حول AngularJS و SEO

تقوم Google و Yahoo و Bing ومحركات البحث الأخرى بالزحف إلى الويب بطرق تقليدية باستخدام برامج الزحف التقليدية. إنها تعمل على {robots الذي يزحف إلى HTML على صفحات الويب ، ويجمع المعلومات على طول الطريق. يحتفظون بكلمات شيقة ويبحثون عن روابط أخرى لصفحات أخرى (هذه الروابط ، ومقدارها وعددهم يلعبون مع كبار المسئولين الاقتصاديين).

فلماذا لا تتعامل محركات البحث مع مواقع جافا سكريبت؟

تتعلق الإجابة بحقيقة أن روبوتات محرك البحث تعمل من خلال متصفحات مقطوعة الرأس وغالبًا ما تعمل لا لديها محرك عرض javascript لعرض جافا سكريبت الصفحة. يعمل هذا مع معظم الصفحات لأن معظم الصفحات الثابتة لا تهتم بعرض جافا سكريبت لصفحتها ، حيث أن محتواها متاح بالفعل.

ما الذي يمكن عمله حيال ذلك؟

لحسن الحظ ، بدأت برامج الزحف للمواقع الكبيرة في تنفيذ آلية تسمح لنا بجعل مواقع جافا سكريبت الخاصة بنا قابلة للزحف ، ولكنها تتطلب منا تنفيذ تغيير على موقعنا .

إذا غيرنا hashPrefix ليصبح #! بدلاً من # ببساطة ، فسوف تغير محركات البحث الحديثة طلب استخدام _escaped_fragment_ بدلاً من #!. (مع وضع HTML5 ، أي حيث لدينا روابط دون بادئة التجزئة ، يمكننا تنفيذ هذه الميزة نفسها من خلال النظر في رأس User Agent في الواجهة الخلفية لدينا).

وهذا يعني ، بدلاً من طلب من مستعرض عادي يبدو:

http://www.ng-newsletter.com/#!/signup/page

سيقوم محرك البحث بالبحث في الصفحة باستخدام:

http://www.ng-newsletter.com/?_escaped_fragment_=/signup/page

يمكننا ضبط بادئة التجزئة لتطبيقات Angular الخاصة بنا باستخدام أسلوب مضمن من ngRoute:

angular.module('myApp', [])
.config(['$location', function($location) {
  $location.hashPrefix('!');
}]);

وإذا كنا نستخدم html5Mode ، فسنحتاج إلى تنفيذ ذلك باستخدام العلامة الوصفية:

<meta name="fragment" content="!">

تذكير ، يمكننا ضبط html5Mode() مع $location service:

angular.module('myApp', [])
.config(['$location', 
function($location) {
  $location.html5Mode(true);
}]);

التعامل مع محرك البحث

لدينا الكثير من الفرص لتحديد كيفية تعاملنا مع تقديم المحتوى فعليًا إلى محركات البحث كـ HTML ثابت. يمكننا استضافة خلفية لأنفسنا ، يمكننا استخدام خدمة لاستضافة خلفية لنا ، يمكننا استخدام وكيل لتقديم المحتوى ، وما إلى ذلك. دعونا ننظر في بعض الخيارات:

الذاتي استضافت

يمكننا كتابة خدمة للتعامل مع التعامل مع الزحف إلى موقعنا باستخدام متصفح مقطوع الرأس ، مثل phantomjs أو zombiejs ، مع أخذ لقطة من الصفحة مع البيانات المقدمة وتخزينها بتنسيق HTML. عندما نرى سلسلة الاستعلام ?_escaped_fragment_ في طلب البحث ، يمكننا تقديم لقطة HTML الثابتة التي أخذناها من الصفحة بدلاً من الصفحة التي تم تقديمها مسبقًا من خلال JS فقط. هذا يتطلب منا أن يكون لدينا الخلفية التي توفر صفحاتنا مع المنطق الشرطي في الوسط. يمكننا استخدام شيء مثل prerender.io's backend كنقطة انطلاق لتشغيل هذا بأنفسنا. بالطبع ، ما زلنا بحاجة إلى التعامل مع البروكسي والتعامل مع المقتطف ، لكنها بداية جيدة.

مع الخدمة المدفوعة

أسهل وأسرع طريقة للحصول على محتوى في محرك البحث هي استخدام خدمة Brombone ، seo.js ، seo4ajax و و/- prerender.io أمثلة جيدة على هذه التي ستستضيف محتوى أعلاه تقديم لك. هذا خيار جيد للأوقات التي لا نريد فيها التعامل مع تشغيل خادم/وكيل. أيضا ، عادة ما يكون بسرعة فائقة.

لمزيد من المعلومات حول Angular وكبار المسئولين الاقتصاديين ، كتبنا تعليميًا مكثفًا عليه على http://www.ng-newsletter.com/posts/serious-angular-seo.html و قمنا بتفصيلها أكثر في كتابنا ng-book: The Complete Book on AngularJS . التحقق من ذلك في ng-book.com .

106
auser

يجب عليك التحقق من البرنامج التعليمي حول إنشاء موقع AngularJS صديق لكبار المسئولين الاقتصاديين في عام مدونة moo. يرشدك عبر كل الخطوات الموضحة في وثائق Angular. http://www.yearofmoo.com/2012/11/angularjs-and-seo.html

باستخدام هذه التقنية ، يرى محرك البحث HTML الموسّع بدلاً من العلامات المخصصة.

56
Brad Green

لقد تغير هذا بشكل كبير.

http://searchengineland.com/bing-offers-recommendations-for-seo-friendly-ajax-suggests-html5-pushstate-152946

إذا كنت تستخدم: $ locationProvider.html5Mode (صواب) ؛ يتم تعيين لك.

لا مزيد من تقديم الصفحات.

41
user3330270

لقد تغيرت الأمور قليلاً منذ طرح هذا السؤال. هناك الآن خيارات للسماح لـ Google بفهرسة موقع AngularJS الخاص بك. كان الخيار الأسهل الذي وجدته هو استخدامhttp://prerender.ioخدمة مجانية ستنشئ الصفحات القابلة للترقية لك وتخدمها في محركات البحث. إنه مدعوم على جميع المنصات الإلكترونية من جانب الخادم تقريبًا. لقد بدأت استخدامها مؤخرًا والدعم ممتاز جدًا.

ليس لدي أي انتماء معهم ، وهذا يأتي من مستخدم سعيد.

17
Ketan

يقدم موقع Angular الخاص محتوى مبسطًا لمحركات البحث: http://docs.angularjs.org/؟_escaped_fragment_=/tutorial/step_09

قل أن تطبيق Angular يستهلك واجهة برمجة تطبيقات JSON لـ Node.js/Express ، مثل /api/path/to/resource. ربما يمكنك إعادة توجيه أي طلبات باستخدام ?_escaped_fragment_ إلى /api/path/to/resource.html ، واستخدام التفاوض على المحتوى لتقديم قالب HTML للمحتوى ، بدلاً من إرجاع بيانات JSON.

الشيء الوحيد هو أن المسارات Angular ستحتاج إلى مطابقة 1: 1 مع API REST.

EDIT: أدرك أن هذا له القدرة على تشويش واجهة REST الخاصة بك ولا أوصي بالقيام بها خارج حالات الاستخدام البسيطة للغاية حيث قد يكون نوبة طبيعية.

بدلاً من ذلك ، يمكنك استخدام مجموعة مختلفة تمامًا من الطرق ووحدات التحكم في المحتوى الصديق للروبوت. ولكن بعد ذلك تقوم بتكرار جميع طرقك وأدوات التحكم AngularJS في Node/Express.

لقد استقرت على إنشاء لقطات باستخدام متصفح مقطوع الرأس ، على الرغم من أنني أشعر أن هذا أقل من مثالي قليلاً.

9
Kevin C.
8
pixparker

اعتبارا من الآن ، قامت Google بتغيير اقتراح الزحف AJAX.

لقد تغير الزمن. اليوم ، طالما أنك لا تمنع Googlebot من الزحف إلى ملفات JavaScript أو CSS ، فنحن قادرون عمومًا على عرض صفحات الويب الخاصة بك وفهمها مثل المتصفحات الحديثة.

tl؛ dr: [Google] لم يعد يوصي AJAX اقتراح الزحف [Google] الذي تم تقديمه عام 2009.

7
Thor

إن مواصفات Google القابلة للتصفح Ajax ، كما هو مشار إليه في الإجابات الأخرى هنا ، هي في الأساس هي الإجابة.

إذا كنت مهتمًا بكيفية تعامل محركات البحث والروبوتات الاجتماعية الأخرى مع نفس المشكلات ، فقد كتبت عن الحالة الفنية هنا: http://blog.ajaxsnapshots.com 2013/11/googles-crawlable-ajax-specification .html

أعمل من أجل https://ajaxsnapshots.com ، وهي شركة تنفذ مواصفات الزحف القابلة للاكتشاف كخدمة - تعتمد المعلومات الواردة في هذا التقرير على ملاحظات من سجلاتنا.

6
Robert AJS

لقد وجدت حلاً أنيقًا يغطي معظم قواعدك. لقد كتبت عن ذلك في البداية هنا وأجبت عن سؤال StackOverflow مماثل هنا والذي يشير إليه.

يتضمن FYI هذا الحل أيضًا علامات رجعية مضغوطة في حالة عدم قيام جافا سكريبت بالتقاط Javascript. لم أوضح ذلك بشكل صريح ، لكن تجدر الإشارة إلى أنه يجب عليك تنشيط وضع HTML5 لدعم URL الصحيح.

لاحظ أيضًا: هذه ليست الملفات كاملة ، بل الأجزاء المهمة فقط من تلك ذات الصلة. إذا كنت بحاجة إلى مساعدة في كتابة ملف تعريف التعليمات والتوجيهات ، وما إلى ذلك ، والتي يمكن العثور عليها في أي مكان آخر. على أي حال ، هنا يذهب ...

app.js

هذا هو المكان الذي تقدم فيه البيانات الوصفية المخصصة لكل مسار من مساراتك (العنوان والوصف وما إلى ذلك)

$routeProvider
   .when('/', {
       templateUrl: 'views/homepage.html',
       controller: 'HomepageCtrl',
       metadata: {
           title: 'The Base Page Title',
           description: 'The Base Page Description' }
   })
   .when('/about', {
       templateUrl: 'views/about.html',
       controller: 'AboutCtrl',
       metadata: {
           title: 'The About Page Title',
           description: 'The About Page Description' }
   })

بيانات التعريف - service.js (الخدمة)

قم بتعيين خيارات البيانات الأولية المخصصة أو استخدم الإعدادات الافتراضية على هيئة نسخ احتياطية.

var self = this;

// Set custom options or use provided fallback (default) options
self.loadMetadata = function(metadata) {
  self.title = document.title = metadata.title || 'Fallback Title';
  self.description = metadata.description || 'Fallback Description';
  self.url = metadata.url || $location.absUrl();
  self.image = metadata.image || 'fallbackimage.jpg';
  self.ogpType = metadata.ogpType || 'website';
  self.twitterCard = metadata.twitterCard || 'summary_large_image';
  self.twitterSite = metadata.twitterSite || '@fallback_handle';
};

// Route change handler, sets the route's defined metadata
$rootScope.$on('$routeChangeSuccess', function (event, newRoute) {
  self.loadMetadata(newRoute.metadata);
});

metaproperty.js (التوجيه)

حزم نتائج خدمة بيانات التعريف للعرض.

return {
  restrict: 'A',
  scope: {
    metaproperty: '@'
  },
  link: function postLink(scope, element, attrs) {
    scope.default = element.attr('content');
    scope.metadata = metadataService;

    // Watch for metadata changes and set content
    scope.$watch('metadata', function (newVal, oldVal) {
      setContent(newVal);
    }, true);

    // Set the content attribute with new metadataService value or back to the default
    function setContent(metadata) {
      var content = metadata[scope.metaproperty] || scope.default;
      element.attr('content', content);
    }

    setContent(scope.metadata);
  }
};

index.html

مع استكمال العلامات الاحتياطية hardcoded المذكورة سابقا ، لالزواحف التي لا يمكن التقاط أي جافا سكريبت.

<head>
  <title>Fallback Title</title>
  <meta name="description" metaproperty="description" content="Fallback Description">

  <!-- Open Graph Protocol Tags -->
  <meta property="og:url" content="fallbackurl.com" metaproperty="url">
  <meta property="og:title" content="Fallback Title" metaproperty="title">
  <meta property="og:description" content="Fallback Description" metaproperty="description">
  <meta property="og:type" content="website" metaproperty="ogpType">
  <meta property="og:image" content="fallbackimage.jpg" metaproperty="image">

  <!-- Twitter Card Tags -->
  <meta name="Twitter:card" content="summary_large_image" metaproperty="twitterCard">
  <meta name="Twitter:title" content="Fallback Title" metaproperty="title">
  <meta name="Twitter:description" content="Fallback Description" metaproperty="description">
  <meta name="Twitter:site" content="@fallback_handle" metaproperty="twitterSite">
  <meta name="Twitter:image:src" content="fallbackimage.jpg" metaproperty="image">
</head>

هذا يجب أن يساعد بشكل كبير مع معظم حالات استخدام محرك البحث. إذا كنت تريد عرض ديناميكي بالكامل لبرامج زحف الشبكات الاجتماعية (والتي تكون غير دقيقة على دعم Javascript) ، فستظل مضطرًا إلى استخدام إحدى خدمات العرض المسبق المذكورة في بعض الإجابات الأخرى.

أتمنى أن يساعدك هذا!

4
Andrew

باستخدام Angular Universal ، يمكنك إنشاء صفحات مقصودة للتطبيق تشبه التطبيق الكامل ثم تحميل Angular التطبيق الذي يقف خلفه.
يقوم Angular Universal بإنشاء HTML خالص يعني عدم وجود صفحات جافا سكريبت في جانب الخادم وتقديمها للمستخدمين دون تأخير. حتى تتمكن من التعامل مع أي زاحف وروبوت ومستخدم (الذي لديه بالفعل انخفاض في وحدة المعالجة المركزية وسرعة الشبكة). ثم يمكنك إعادة توجيهها عن طريق الروابط/الأزرار إلى التطبيق الزاوي الفعلي الذي تم تحميله بالفعل وراء ذلك. ينصح بهذا الحل من قبل الموقع الرسمي. -مزيد من المعلومات حول SEO و Angular Universal-

2
erginduran

استخدم شيئًا مثل PreRender ، فهو يصنع صفحات ثابتة من موقعك حتى تتمكن محركات البحث من فهرستها.

هنا يمكنك معرفة ما هي المنصات المتاحة: https://prerender.io/documentation/install-middleware#asp-net

2
NicoJuicy

تم تصميم برامج الزحف (أو برامج الروبوت) لتتبع ارتباطات محتوى HTML لصفحات الويب ، ولكن بسبب عمليات AJAX لجلب البيانات غير المتزامنة ، أصبحت هذه مشكلة لأنها تستغرق وقتًا ما لعرض الصفحة وإظهار المحتوى الديناميكي عليها. وبالمثل ، يستخدم AngularJS أيضًا نموذجًا غير متزامن ، مما يخلق مشكلة لبرامج زحف Google.

ينشئ بعض المطورين صفحات html أساسية ببيانات حقيقية ويقدمون هذه الصفحات من جانب الخادم وقت الزحف. يمكننا عرض الصفحات نفسها مع PhantomJS من جانب العرض الذي يحتوي على _escaped_fragment_ (لأن Google تبحث عن #! في عناوين url لموقعنا ، ثم تأخذ كل شيء بعد #! وتضيفه في معلمة طلب _escaped_fragment_). لمزيد من التفاصيل يرجى قراءة هذا بلوق .

1
Rubi saini

لا تحتاج برامج الزحف إلى واجهة المستخدم الرسومية المميزة والمميزة الغنية ، فهم يريدون فقط رؤية المحتوى لذلك ، لا تحتاج إلى منحهم لقطة من صفحة تم تصميمها للبشر.

الحل الخاص بي: إلى إعطاء الزاحف ما يريد الزاحف :

يجب عليك التفكير فيما يريده الزاحف ، ومنحه ذلك فقط.

نصيحة لا تعبث مع الظهر. أضف مجرد واجهة أمامية صغيرة للخادم باستخدام واجهة برمجة التطبيقات نفسها

0
pykiss