RequireJSでGoogle Maps APIを使う

RequireJSでGoogle Maps APIを使う

今日はマーヴィン・ゲイの命日だそうですね。素晴らしい名曲の数々をありがとう!minamiです。
JavaScriptをモジュール化して読み込みの制御をできるRequireJS、便利ですが、Google Maps APIを使うときちょっとつまづいたので解決法を調べてみました。

今回のファイル構成は以下です。

├── index.html
└── js
       ├── main.js
       ├── jquery-1.9.1.min.js
       ├── google.js
       ├── async.js
       └── require.js

index.html

<script type="text/javascript" data-main="js/main" src="js/require.js" /></script>

div#map 内にGoogle Mapsを表示させたい、Google Mapsを表示させる処理はファイルを分割して持ちたい、とします。JSの読み込み制御はRequireJSで行うため、scriptタグでの読み込みはrequire.jsのみにし、data-main属性でmain.jsを指定します。

main.js

requirejs.config({
  paths: {
    jquery: "lib/jquery-1.9.1.min",
    async: "lib/async",
    google: "google"
  }
});

require(["jquery","google"],function($,google) {
  var map = $('#map').get(0);
  google.addMapToCanvas(map);
});

メインの処理です。Google Mapsに関する処理をgoogle.jsに分割してモジュール化しています。

google.js

define(
  [ "async!http://maps.google.com/maps/api/js?sensor=true!callback" ],
  function() {
    return {
      addMapToCanvas: function( mapCanvas ) {
        var myOptions = {
          center: new google.maps.LatLng( 35.447068, 139.634437 ),
          zoom: 18,
          mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        var map = new google.maps.Map( mapCanvas, myOptions );
      }
    };
  }
);

Google Mapsを追加する処理をモジュール化しています。ポイントはAPIの読み込み部分で、ただGoogle MapsのAPIを読み込みしても動作しません。Google Maps API自体が非同期で通信を行うため、単純に読み込みをしただけでは依存する処理が動かないようです。その問題を解消するプラグインが以下の中にあるasync.jsです。

上記のように、async.jsを読み込みつつコールバックにGoogle Maps APIのURLを指定します。

"async!http://maps.google.com/maps/api/js?sensor=true!callback"

結果

動いた!

まとめ

モジュール化しておくと再利用もしやすくて便利ですね。

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ