问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

vue-amap引入高德JSAPI的原理

发布网友 发布时间:2024-10-22 07:48

我来回答

1个回答

热心网友 时间:2024-11-08 10:01

vue-amap是对高德地图JSAPI进行封装的、适用于vue项目的地图组件库。在笔者开发的很多项目中都有用到,相比直接使用高德地图JSAPI来说,vue-amap更加好用,符合vue开发者的编程习惯。本文通过vue-amap源码分析了vue-amap引入高德JSAPI的原理。

vue-amap使用

在使用vue-amap时,main.js文件往往有这样一段代码:

importVueAMapfrom'vue-amap'Vue.use(VueAMap)VueAMap.initAMapApiLoader({key:'82732XXXXXa5eXXXXb3face28c25',//你的高德keyplugin:['AMap.Autocomplete','AMap.PlaceSearch','AMap.Scale','AMap.OverView','AMap.ToolBar','AMap.MapType','AMap.PolyEditor','AMap.CircleEditor'],//默认高德sdk版本为1.4.4v:'1.4.14'})

这段代码的关键就是initAMapApiLoader方法。

vue-amap入口文件

看vue-amap源码,index.js文件有如下代码(部分代码):

//初始化接口import{initAMapApiLoader}from'./services/injected-amap-api-instance';export{AMapManager,initAMapApiLoader,createCustomComponent};

可见initAMapApiLoader方法是被vue-amap直接向使用者暴露的,我们研究其具体实现。

initAMapApiLoader方法

接着我们到对应目录查看initAMapApiLoader的定义:

letlazyAMapApiLoaderInstance=null;importAMapAPILoaderfrom'./lazy-amap-api-loader';importVuefrom'vue';exportconstinitAMapApiLoader=(config)=>{if(Vue.prototype.$isServer)return;//if(lazyAMapApiLoaderInstance)thrownewError('YouhasalreadyinitialyourlazyAMapApiLoaderInstance,justimportit');if(lazyAMapApiLoaderInstance)return;if(!lazyAMapApiLoaderInstance)lazyAMapApiLoaderInstance=newAMapAPILoader(config);lazyAMapApiLoaderInstance.load();};

initAMapApiLoader中使用到了lazy-amap-api-loader中定义的AMapAPILoader类,new了一个实例,并且调用了load()方法。

AMapAPILoader类

下面我们就看一下AMapAPILoader类的定义:

看长长的代码先折叠,了解大概

下面就看load()方法:

load(){//如果window上挂载了AMap,那么直接调用loadUIAMap()if(this._window.AMap&&this._window.AMap.Map){returnthis.loadUIAMap();}if(this._scriptLoadingPromise)returnthis._scriptLoadingPromise;//新建一个script标签constscript=this._document.createElement('script');script.type='text/javascript';//异步执行script.async=true;script.defer=true;script.src=this._getScriptSrc();constUIPromise=this._config.uiVersion?this.loadUIAMap():null;this._scriptLoadingPromise=newPromise((resolve,reject)=>{this._window['amapInitComponent']=()=>{while(this._queueEvents.length){this._queueEvents.pop().apply();}if(UIPromise){UIPromise.then(()=>{//initAMapUI这里调用initAMapUI初始化window.initAMapUI();setTimeout(resolve);});}else{returnresolve();}};script.onerror=error=>reject(error);});//script标签插入到head中this._document.head.appendChild(script);returnthis._scriptLoadingPromise;}

可以看到这段代码做了两件事情:(1)增加引入高德的script标签,script标签的src是通过_getScriptSrc生成的(2)引入AMapUI组件库,通过调用loadUIAMap实现

下面分别来看这两个方法:

_getScriptSrc方法_getScriptSrc(){//amappluginprefixreg//插件前缀constamap_prefix_reg=/^AMap./;constconfig=this._config;constparamKeys=['v','key','plugin','callback'];//check'AMap.'prefixif(config.plugin&&config.plugin.length>0){//pushdefaulttypesconfig.plugin.push('Autocomplete','PlaceSearch','PolyEditor','CircleEditor');constplugins=[];//fixedpluginnamecompatibility.//拼接插件config.plugin.forEach(item=>{constprefixName=(amap_prefix_reg.test(item))?item:'AMap.'+item;constpureName=prefixName.replace(amap_prefix_reg,'');plugins.push(prefixName,pureName);});config.plugin=plugins;}constparams=Object.keys(config).filter(k=>~paramKeys.indexOf(k)).filter(k=>config[k]!=null).filter(k=>{return!Array.isArray(config[k])||(Array.isArray(config[k])&&config[k].length>0);}).map(k=>{letv=config[k];if(Array.isArray(v))return{key:k,value:v.join(',')};return{key:k,value:v};}).map(entry=>`${entry.key}=${entry.value}`).join('&');return`${this._config.protocol}://${this._config.hostAndPath}?${params}`;}

这段代码的作用就是最终要生成如下的字符串:

"https://webapi.amap.com/maps?v=1.4.15&key=你的key&plugin=AMap.Scale&plugin=AMap.ToolBar&plugin=AMap.PolyEditor&plugin=AMap.Autocomplete,AMap.PlaceSearch&plugin=AMap.Geocoder"

从而可以在index.html中加入这样的script,这样就把高度地图的js-api引入了

<scripttype="text/javascript"src="https://webapi.amap.com/maps?v=1.4.15&key=你的key&plugin=AMap.Scale&plugin=AMap.ToolBar&plugin=AMap.PolyEditor&plugin=AMap.Autocomplete,AMap.PlaceSearch&plugin=AMap.Geocoder"></script>loadUIAMap方法

再来看loadUIAMap

loadUIAMap(){if(!this._config.uiVersion||window.AMapUI)returnPromise.resolve();returnnewPromise((resolve,reject)=>{constUIScript=document.createElement('script');const[versionMain,versionSub,versionDetail]=this._config.uiVersion.split('.');if(versionMain===undefined||versionSub===undefined){console.error('amapuiversionisnotcorrect,pleasecheck!version:',this._config.uiVersion);return;}letsrc=`${this._config.protocol}://webapi.amap.com/ui/${versionMain}.${versionSub}/main-async.js`;if(versionDetail)src+=`?v=${versionMain}.${versionSub}.${versionDetail}`;UIScript.src=src;UIScript.type='text/javascript';UIScript.async=true;this._document.head.appendChild(UIScript);UIScript.onload=()=>{setTimeout(resolve,0);};UIScript.onerror=()=>reject();});}

这段代码的作用是要在index.html文件中插入加载AMapUI的script标签,如下所示:

<scriptasyncsrc="//webapi.amap.com/ui/1.1/main-async.js"></script>总结

一句话总结vue-amap引入高德地图API的原理:vue-map之所以能够使用高德地图的JSAPI以及AMapUI是因为通过生成引入JSAPI和AMapUI的script标签,并将标签插入到项目的html文件。

原文:https://juejin.cn/post/7103733273573982245
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
山东沃尔德集团集团所辖公司介绍 齐鲁银行无忧贷和市民贷哪个好 什么叫补按揭 后按揭贷款什么意思 买房者续按揭有什么危害 加按揭是什么意思 八月中国最凉快的地方 八月份哪里最凉快,去哪旅游好?美丽的地方 乱字同韵字是什么意思 华硕笔记本电脑触摸板怎么开笔记本电脑触摸板怎么开启和关闭_百度知 ... 学游戏3d建模贴图的培训机构一般多少钱 学3d要多少钱 手游助手授权码是真的吗? 炒菜用放糖吗?有哪些作用? ...健身自行车品牌排行辐轮王FRW自行车,土拨鼠Marmot,泰勒TYRELL官网_百... 专辑名英语怎么说 高校引进人才签订多长时间合同 通过引进人才渠道签订用人协议还能报考公务员吗? 人才引进招用的人是未解除劳动合同的在职职工? 产检建卡需要空腹吗 妹妹结婚时我应该送什么礼物? 轨道交通:诚信国际大厦到6号线外高桥保税区北站有多远? 银杨大厦怎么样?好不好?值不值得买? 如何美白肌肤 中医为你揭示最全的中药美白配方 电话电路里的STPAR200如何用万能表测量? 番石榴不能和啥一起吃 为什么《鸟人》成为了这届奥斯卡最大的赢家 鸟人BIRDY怎么样 女人爱上男人的理由 女人为什么会爱上男人(女的请进) ...可以组成Today you look very beautiful ?? 英语theyfeelhappytoday什么意思 双持踏风武僧5.3 拿重生符文后DPS没有明显提升 求指导。 找一个踏风武僧大哥指导。。 “零落愁芳荃”的出处是哪里 芳荃意思和来源是什么 “解佩杂芳荃”的出处是哪里 寿游侍郎七十九作品原文 女友生日想送一套内内和丝哇给她,买什么颜色好,女生回答 女友生日想送一套内内和丝哇给她,买什么颜色好看,女生回答 女友生日想送她内内和丝哇怎么搭配才好看,女生回答 女友生日想送一套内内和丝哇给她,买什么颜色好看呢,怎么搭配好看。女生... 大光头阴线后市是什么 光头阴线后市是什么 股票期货交易中光头光脚阴线的形态和盘面意义 股票光头阴线代表什么 ...图片上的动漫人物 是出自哪个动漫 人物叫什么名字呢 仁寿县是不是天府新区 海湾安全技术有限公司北京分公司怎么样 老人手机如何打开按键音?