在vue項(xiàng)目中異步使用高德地圖AMap

今天在重構(gòu)公司項(xiàng)目的時(shí)候遇到一個(gè)需求,之前的項(xiàng)目使用的是angularjs,里面有用到高德地圖插件,解決方案非常傳統(tǒng):將高德地圖通過cdn的形式引入到項(xiàng)目的index.html文件中,然后即可全局調(diào)用AMap。

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>xxxxx系統(tǒng)</title>
  <meta name="renderer" content="webkit"/>
  <meta name="robots" content="noindex">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <script async  src="http://webapi.amap.com/maps?v=1.3&key=ourappkey" defer
          type="text/javascript"></script>
</head>
<body>
<app-root>Loading...</app-root>
</body>
</html>

現(xiàn)在遷移到vue,有幾個(gè)問題不得不考慮:

  • 項(xiàng)目中其實(shí)只有幾處需要用到地圖,并不需要全局引入
  • 在index文件中引入js會明顯拖慢首屏加載速度,雖然可以使用異步加載script的方式解決,但是始終覺得不夠優(yōu)雅。

于是開始各尋找解決方案。
最先找到的是餓了么前端團(tuán)隊(duì)封裝的vue-amap,剛開始還是挺滿意的,文檔也非常漂亮,直到。。。直到我發(fā)現(xiàn)這個(gè)封裝其實(shí)還是比較簡單的,并沒有覆蓋到我的需求,比如高德地圖的mouseTool等插件等,導(dǎo)致我不得不忍痛放棄,尋找新的解決方案。而且,除了高德官方文檔之外,你不得不再次查找vue-amap文檔,看是不是你的語法哪里出了問題。orz =3
然后繼續(xù)找,突然在segmentfault上看到一篇文章: vue.js 高德地圖,受作者的啟發(fā),在他的代碼上做了一次封裝,解決異步加載高德地圖的問題。ps: 這種方法其實(shí)也可以用來在vue中加載任何第三方插件。原作者寫于2016年,代碼實(shí)現(xiàn)比較復(fù)雜,而且在開啟了eslint的情況下,會報(bào)錯(cuò)。

開始表演:

1. 創(chuàng)建一個(gè)AMap.js,路徑'src/assets/js/AMap.js'

內(nèi)容如下:

// src/assets/js/AMap.js

export default function MapLoader () {   // <-- 原作者這里使用的是module.exports
  return new Promise((resolve, reject) => {
    if (window.AMap) {
      resolve(window.AMap)
    } else {
      var script = document.createElement('script')
      script.type = 'text/javascript'
      script.async = true
      script.src = 'http://webapi.amap.com/maps?v=1.3&callback=initAMap&key=yourkey'
      script.onerror = reject
      document.head.appendChild(script)
    }
    window.initAMap = () => {
      resolve(window.AMap)
    }
  })
}

2. 在任何.vue文件中使用
// test.vue
<template>
  <div class="test">
    <div id="container" class="h300 w300"></div>
  </div>
</template>
<script>
import MapLoader from '@/assets/js/AMap.js'
export default {
  name: 'test',
  data () {
    return {
      map: null
    }
  },
  mounted () {
    let that = this
    MapLoader().then(AMap => {
      console.log('地圖加載成功')
      that.map = new AMap.Map('container', {
        center: [117.000923, 36.675807],
        zoom: 11
      })
    }, e => {
      console.log('地圖加載失敗' ,e)
    })
  }
}
</script>

3. 完美解決

這樣,我們得到了一個(gè)異步加載的高德地圖插件,不需要在全局引入,也不用擔(dān)心功能不齊全,其他的東西,完全參照高德地圖官方文檔來設(shè)置即可。

結(jié)語: 這種方法其實(shí)可以用來加載任何第三方插件,本文只是以高德地圖為例來說明,而且相對來說更加可控,不受制于封裝,一些舊版本的經(jīng)典js插件在es6項(xiàng)目中使用的過渡更加平滑。

歡迎轉(zhuǎn)載,請注明作者及出處:簡書-simon。個(gè)人水平有限,如有錯(cuò)誤的地方,歡迎大家在評論指出。

相關(guān)資料:

都看到這個(gè)地方了,順手給個(gè)喜歡可好?

tags: vue-amap amap vue 高德地圖 js es6

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容