تحميل Maps JavaScript API

يوضّح لك هذا الدليل كيفية تحميل واجهة برمجة التطبيقات Maps JavaScript API. هناك ثلاث طرق لإجراء ذلك:

استخدام ميزة "استيراد المكتبة الديناميكية"

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

حمِّل واجهة برمجة التطبيقات JavaScript API لتطبيق "خرائط Google" عن طريق إضافة أداة تحميل bootstrap المضمّنة إلى رمز تطبيقك، كما هو موضّح في المقتطف التالي:

<script>
  (g=>{var h,a,k,p="The Google Maps JavaScript API",c="google",l="importLibrary",q="__ib__",m=document,b=window;b=b[c]||(b[c]={});var d=b.maps||(b.maps={}),r=new Set,e=new URLSearchParams,u=()=>h||(h=new Promise(async(f,n)=>{await (a=m.createElement("script"));e.set("libraries",[...r]+"");for(k in g)e.set(k.replace(/[A-Z]/g,t=>"_"+t[0].toLowerCase()),g[k]);e.set("callback",c+".maps."+q);a.src=`https://maps.${c}apis.com/maps/api/js?`+e;d[q]=f;a.onerror=()=>h=n(Error(p+" could not load."));a.nonce=m.querySelector("script[nonce]")?.nonce||"";m.head.append(a)}));d[l]?console.warn(p+" only loads once. Ignoring:",g):d[l]=(f,...n)=>r.add(f)&&u().then(()=>d[l](f,...n))})({
    key: "YOUR_API_KEY",
    v: "weekly",
    // Use the 'v' parameter to indicate the version to use (weekly, beta, alpha, etc.).
    // Add other bootstrap parameters as needed, using camel case.
  });
</script>

يمكنك أيضًا إضافة رمز أداة تحميل Bootstrap مباشرةً إلى رمز JavaScript.

لتحميل المكتبات أثناء التشغيل، استخدِم عامل التشغيل await لاستدعاء importLibrary() من داخل دالة async. يتيح لك تحديد متغيّرات للفئات المطلوبة تخطّي استخدام مسار مؤهَّل (مثل google.maps.Map)، كما هو موضّح في المثال التالي على الرمز البرمجي:

TypeScript

let map: google.maps.Map;
async function initMap(): Promise<void> {
  const { Map } = await google.maps.importLibrary("maps") as google.maps.MapsLibrary;
  map = new Map(document.getElementById("map") as HTMLElement, {
    center: { lat: -34.397, lng: 150.644 },
    zoom: 8,
  });
}

initMap();

JavaScript

let map;

async function initMap() {
  const { Map } = await google.maps.importLibrary("maps");

  map = new Map(document.getElementById("map"), {
    center: { lat: -34.397, lng: 150.644 },
    zoom: 8,
  });
}

initMap();

يمكن أن تحمِّل الدالة أيضًا المكتبات بدون تحديد متغيّر للفئات المطلوبة، ما يكون مفيدًا بشكل خاص إذا أضفت خريطة باستخدام العنصر gmp-map:

async function initMap() {
  google.maps.importLibrary("maps");
  google.maps.importLibrary("marker");
}

initMap();

بدلاً من ذلك، يمكنك تحميل المكتبات مباشرةً في HTML كما هو موضّح هنا:

<script>
google.maps.importLibrary("maps");
google.maps.importLibrary("marker");
</script>

تعرَّف على كيفية نقل البيانات إلى واجهة برمجة التطبيقات Dynamic Library Loading API.

المعلمات المطلوبة

المعلمات الاختيارية

  • v: الإصدار من واجهة برمجة التطبيقات Maps JavaScript API المطلوب تحميله

  • libraries: قائمة مفصولة بفواصل ببليوتكات إضافية لواجهة برمجة التطبيقات Maps JavaScript API المطلوب تحميلها لا يُنصح عمومًا بتحديد مجموعة ثابتة من المكتبات، ولكنّها متاحة للمطوّرين الذين يريدون ضبط سلوك التخزين المؤقت بدقة على موقعهم الإلكتروني.

  • language: اللغة التي تريد استخدامها ويؤثر ذلك في أسماء عناصر التحكّم وإشعارات حقوق الطبع والنشر واتجاهات القيادة وتصنيفات عناصر التحكّم والردود على طلبات الخدمة. اطّلِع على قائمة اللغات المتاحة.

  • region: رمز المنطقة المطلوب استخدامه. يؤدي ذلك إلى تغيير سلوك الخريطة استنادًا إلى بلد معيّن أو منطقة معيّنة.

  • authReferrerPolicy: يمكن لعملاء "خرائط Google" المستندة إلى JavaScript ضبط قيود مُحيل HTTP في Cloud Console للحد من عناوين URL المسموح لها باستخدام مفاتيح واجهة برمجة التطبيقات المعينة. يمكن ضبط هذه القيود تلقائيًا للسماح باستخدام مفتاح واجهة برمجة التطبيقات في مسارات معيّنة فقط. إذا كان أي عنوان URL على النطاق أو المصدر نفسه قد يستخدم مفتاح واجهة برمجة التطبيقات، يمكنك ضبط authReferrerPolicy: "origin" للحد من كمية البيانات المُرسَلة عند تفويض الطلبات الواردة من Maps JavaScript API. عند تحديد هذه المَعلمة وتفعيل قيود مُحيلي HTTP في Cloud Console، لن تتمكّن واجهة برمجة التطبيقات JavaScript لـ "خرائط Google" من التحميل إلا إذا كان هناك قيد مُحيل HTTP يتطابق مع نطاق الموقع الإلكتروني الحالي بدون مسار محدّد.

  • mapIds: صفيف أرقام تعريف الخرائط يؤدي ذلك إلى تحميل الإعدادات لمعرّفات الخرائط المحدّدة مسبقًا.

  • channel: اطّلِع على تتبُّع الاستخدام لكل قناة.

  • solutionChannel: توفّر "منصّة خرائط Google" العديد من أنواع نماذج الرموز البرمجية لمساعدتك في البدء والتشغيل بسرعة. لتتبُّع استخدام مزيد من رمزنا البرمجي المعقد وتحسين جودة الحلّ، تُدرِج Google مَعلمة طلب البحث solutionChannel في طلبات بيانات واجهة برمجة التطبيقات في رمزنا البرمجي النموذجي.

استخدام علامة تحميل النص البرمجي مباشرةً

يوضّح هذا القسم كيفية استخدام علامة تحميل النص البرمجي مباشرةً. ولأنّ الرمز البرمجي المباشر يحمّل المكتبات عند تحميل الخريطة، يمكن أن يبسط ذلك عمل الخرائط التي تم إنشاؤها باستخدام عنصر gmp-map من خلال إزالة الحاجة إلى طلب المكتبات صراحةً أثناء وقت التشغيل. بما أنّ علامة تحميل النص البرمجي المباشر تحمّل جميع المكتبات المطلوبة في آنٍ واحد عند تحميل النص البرمجي، قد يتأثّر الأداء في بعض التطبيقات. يجب تضمين علامة تحميل النص البرمجي المباشر مرة واحدة فقط لكل عملية تحميل صفحة.

إضافة علامة نص برمجي

لتحميل Google Maps JavaScript API بشكل مضمّن في ملف HTML، أضِف علامة script كما هو موضّح أدناه.

<script async
    src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&loading=async&callback=initMap">
</script>

مَعلمات عناوين URL لتحميل النصوص البرمجية مباشرةً

يتناول هذا القسم جميع المَعلمات التي يمكنك تحديدها في سلسلة الطلب لعنوان URL لتحميل النص البرمجي عند تحميل واجهة برمجة التطبيقات JavaScript لـ "خرائط Google". تكون بعض المَعلمات مطلوبة، في حين تكون بعضها الآخر اختيارية. كما هو معتاد في عناوين URL، يتم فصل جميع المَعلمات باستخدام رمز العطف اللاتيني (&).

يحتوي مثال عنوان URL التالي على عناصر نائبة لجميع المَعلمات المحتمَلة:

https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY
&loading=async
&callback=FUNCTION_NAME
&v=VERSION
&libraries="LIBRARIES"
&language="LANGUAGE"
&region="REGION"
&auth_referrer_policy="AUTH_REFERRER_POLICY"
&map_ids="MAP_IDS"
&channel="CHANNEL"
&solution_channel="SOLUTION_IDENTIFIER"

يُحمِّل عنوان URL في المثال التالي لعلامة script واجهة برمجة التطبيقات JavaScript لخرائط Google:

<script async
    src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&loading=async&callback=initMap">
</script>

المَعلمات المطلوبة (مباشرة)

تكون المَعلمات التالية مطلوبة عند تحميل واجهة برمجة التطبيقات JavaScript لخرائط Google.

المَعلمات الاختيارية (مباشرة)

استخدِم هذه المَعلمات لطلب إصدار معيّن من واجهة برمجة التطبيقات Maps JavaScript API، أو لتحميل مكتبات إضافية، أو لتقسيم خريطتك حسب اللغة، أو لتحديد سياسة التحقّق من المُحيل في HTTP.

  • loading: استراتيجية تحميل الرموز البرمجية التي يمكن أن تستخدمها Maps JavaScript API اضبط القيمة على async للإشارة إلى أنّه لم يتم تحميل واجهة برمجة تطبيقات JavaScript لخرائط Google بشكل متزامن وأنّه لم يتم بدء أي رمز JavaScript من خلال الحدث load للنص البرمجي. ننصح بشدة بضبط هذا الخيار على async كلما أمكن ذلك، وذلك لتحسين الأداء. (استخدِم المَعلمة callback بدلاً من ذلك لتنفيذ الإجراءات عندما تكون واجهة برمجة التطبيقات Maps JavaScript API متاحة). تتوفّر هذه الميزة بدءًا من الإصدار 3.55.

  • callback: اسم دالة عامة سيتمّ استدعاؤها بعد تحميل واجهة برمجة تطبيقات Maps JavaScript API بالكامل.

  • v: الإصدار من Maps JavaScript API الذي تريد استخدامه

  • libraries: قائمة مفصولة بفواصل ببليوتكات إضافية لواجهة برمجة التطبيقات Maps JavaScript API المطلوب تحميلها

  • language: اللغة التي تريد استخدامها ويؤثر ذلك في أسماء عناصر التحكّم وإشعارات حقوق الطبع والنشر واتجاهات القيادة وتصنيفات عناصر التحكّم، بالإضافة إلى الردود على طلبات الخدمة. اطّلِع على قائمة اللغات المتاحة.

  • region: رمز المنطقة المطلوب استخدامه. يؤدي ذلك إلى تغيير سلوك الخريطة استنادًا إلى بلد معيّن أو منطقة معيّنة.

  • auth_referrer_policy: يمكن للعملاء ضبط قيود مُحيل HTTP في Cloud Console لتقييد عناوين URL المسموح لها باستخدام مفتاح واجهة برمجة التطبيقات معيّن. يمكن ضبط هذه القيود تلقائيًا للسماح باستخدام مفتاح واجهة برمجة التطبيقات في مسارات معيّنة فقط. إذا كان أي عنوان URL على النطاق أو المصدر نفسه قد يستخدم مفتاح واجهة برمجة التطبيقات، يمكنك ضبط auth_referrer_policy=origin للحد من كمية البيانات المُرسَلة عند تفويض الطلبات الواردة من Maps JavaScript API. تتوفّر هذه الميزة بدءًا من الإصدار 3.46. عند تحديد هذه المَعلمة وتفعيل قيود مُحيل HTTP في Cloud Console، لن تتمكّن واجهة برمجة التطبيقات JavaScript لـ "خرائط Google" من التحميل إلا إذا كان هناك قيد مُحيل HTTP يتطابق مع نطاق الموقع الإلكتروني الحالي بدون مسار محدّد.

  • mapIds: قائمة مفصولة بفواصل بمعرّفات الخرائط يؤدي ذلك إلى تحميل الإعدادات لمعرّفات الخرائط المحدّدة مسبقًا.

  • channel: اطّلِع على تتبُّع الاستخدام لكل قناة.

  • solution_channel: توفّر "منصّة خرائط Google" العديد من أنواع نماذج الرموز البرمجية لمساعدتك في البدء والتشغيل بسرعة. لتتبُّع استخدام مزيد من رمزنا البرمجي المعقد وتحسين جودة الحلّ، تُدرِج Google مَعلمة طلب البحث solution_channel في طلبات بيانات واجهة برمجة التطبيقات في رمزنا البرمجي النموذجي.

استخدام حزمة js-api-loader من NPM

تتوفّر حزمة @googlemaps/js-api-loader لتحميلها من خلال مدير حِزم NPM. ثبِّت البرنامج باستخدام الأمر التالي:

npm install @googlemaps/js-api-loader

يمكن استيراد هذه الحزمة إلى التطبيق باستخدام:

import { Loader } from "@googlemaps/js-api-loader"

يعرِض أداة التحميل واجهة Promise وواجهة callback. يوضّح ما يلي استخدام طريقة Promise التلقائية load().

TypeScript

const loader = new Loader({
  apiKey: "YOUR_API_KEY",
  version: "weekly",
  ...additionalOptions,
});

loader.load().then(async () => {
  const { Map } = await google.maps.importLibrary("maps") as google.maps.MapsLibrary;
  map = new Map(document.getElementById("map") as HTMLElement, {
    center: { lat: -34.397, lng: 150.644 },
    zoom: 8,
  });
});

JavaScript

const loader = new Loader({
  apiKey: "YOUR_API_KEY",
  version: "weekly",
  ...additionalOptions,
});

loader.load().then(async () => {
  const { Map } = await google.maps.importLibrary("maps");

  map = new Map(document.getElementById("map"), {
    center: { lat: -34.397, lng: 150.644 },
    zoom: 8,
  });
});

الاطّلاع على نموذج يعرض js-api-loader

يوضّح المثال التالي استخدام loader.importLibrary() لتحميل المكتبات:

const loader = new Loader({
  apiKey: "YOUR_API_KEY",
  version: "weekly",
  ...additionalOptions,
});

loader
  .importLibrary('maps')
  .then(({Map}) => {
    new Map(document.getElementById("map"), mapOptions);
  })
  .catch((e) => {
    // do something
});

نقل البيانات إلى واجهة برمجة التطبيقات Dynamic Library Import API

يتناول هذا القسم الخطوات المطلوبة لنقل عملية الدمج لاستخدام Dynamic Library Import API.

خطوات نقل البيانات

أولاً، استبدِل علامة تحميل النص البرمجي المباشر بعلامة أداة تحميل التمهيد المضمّنة.

قبل

<script async
    src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&loading=async&libraries=maps&callback=initMap">
</script>

بعد

<script>
  (g=>{var h,a,k,p="The Google Maps JavaScript API",c="google",l="importLibrary",q="__ib__",m=document,b=window;b=b[c]||(b[c]={});var d=b.maps||(b.maps={}),r=new Set,e=new URLSearchParams,u=()=>h||(h=new Promise(async(f,n)=>{await (a=m.createElement("script"));e.set("libraries",[...r]+"");for(k in g)e.set(k.replace(/[A-Z]/g,t=>"_"+t[0].toLowerCase()),g[k]);e.set("callback",c+".maps."+q);a.src=`https://maps.${c}apis.com/maps/api/js?`+e;d[q]=f;a.onerror=()=>h=n(Error(p+" could not load."));a.nonce=m.querySelector("script[nonce]")?.nonce||"";m.head.append(a)}));d[l]?console.warn(p+" only loads once. Ignoring:",g):d[l]=(f,...n)=>r.add(f)&&u().then(()=>d[l](f,...n))})({
    key: "YOUR_API_KEY",
    v: "weekly",
    // Use the 'v' parameter to indicate the version to use (weekly, beta, alpha, etc.).
    // Add other bootstrap parameters as needed, using camel case.
  });
</script>

بعد ذلك، عدِّل رمز تطبيقك:

  • غيِّر دالة initMap() لتكون غير متزامنة.
  • يُرجى الاتصال بـ importLibrary() لتحميل المكتبات التي تحتاج إليها والوصول إليها.

قبل

let map;

function initMap() {
  map = new google.maps.Map(document.getElementById("map"), {
    center: { lat: -34.397, lng: 150.644 },
    zoom: 8,
  });
}

window.initMap = initMap;

بعد

let map;
// initMap is now async
async function initMap() {
    // Request libraries when needed, not in the script tag.
    const { Map } = await google.maps.importLibrary("maps");
    // Short namespaces can be used.
    map = new Map(document.getElementById("map"), {
        center: { lat: -34.397, lng: 150.644 },
        zoom: 8,
    });
}

initMap();