当前位置: 首页 > news >正文

在vue中优雅地异步引入(懒加载)腾讯地图API

背景

接到一个需求需要在网站首页显示使用腾讯地图展示公司所在地。一开始我直接全局引入了腾讯地图js,结果发现在用户打开登陆页面的时候首页比较缓慢,为了提高用户登陆的加载效率,需要优化为异步引入。

思路

根据官网的示例,通过dom追加script的方式来加载js,并且在加载完成时会回调window下的callback方法。
截图官网示例
但是这么使用的话,每次都需要在当前组件中写一个全局的函数,A组件中写的回调函数可能覆盖B组件写的回调函数,或者每个人用的都不相同导致window下多了冗余函数,因此在参考了高德vue组件库:vue-amap中懒加载的实现后,想要在组件中通过Promise的方式异步引入腾讯地图API。

代码实现

TMapInit.js中的lazyTMapApiLoaderInstance实现(代码已上传gitee):

let lazyTMapApiLoaderInstance = null;
/*** 修改下列ak即可使用自己的授权码* 腾讯地图组件初始化, 要用到天气和地图控件必须引入当前js,* 通过lazyTMapApiLoaderInstance.then()能在地图载入完成时触发事件*/
export function initTMap() {loadTMapScript({// TODO:开发者申请的腾讯地图keyak: "XXXX-XXXX-XXXX",// 需要用到的插件libraries: ['service']})
}/*** 载入腾讯地图js文件* @param config*/
function loadTMapScript(config) {let concatStr = '';for (let lib of config.libraries) {concatStr += lib + ',';}// 引入腾讯地图js,当引入完成时会调用window.customVueTMap.loadCallBack方法const TMap_URL = "https://map.qq.com/api/gljs?v=1.exp&libraries=" + concatStr.substring(0, concatStr.length - 1) + "&key=" + config.ak + "&callback=customVueTMap.loadCallBack";// 插入script脚本let scriptNode = document.createElement("script");scriptNode.setAttribute("src", TMap_URL);document.body.appendChild(scriptNode);
}/*** 懒加载腾讯地图方法* @returns {Promise<unknown>}*/
lazyTMapApiLoaderInstance = new Promise((resolve, reject) => {initTMap();// 地图异步加载完成回调处理,避免每个组件都要在自己的功能写个window下的函数造成冲突window.customVueTMap = {loadCallBack() {resolve();}}
})
export {lazyTMapApiLoaderInstance};

TMapInit.js的使用示例

<template><div id="app"><div style="width: 90%; height: 500px;" id="myMap"></div></div>
</template><script>import {lazyTMapApiLoaderInstance} from './components/MyMap/util/TMapInit'lazyTMapApiLoaderInstance.then(() => {new TMap.Map('myMap', {center: new TMap.LatLng(39.909, 116.397),zoom: 11,pitch: 0})})
</script>

总结

通过这种方式,后续也能引入多个不同地图供应商的jsApi,而不用担心没用上的另外一个API耽误了我们页面的加载效率。

参考连接

官网异步加载API示例
高德地图Vue组件:gyy/vue-amap
懒加载腾讯地图API示例

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • tinyxml2的入门教程
  • 【进阶篇-Day12:JAVA中stream流、File类的介绍】
  • python每日学习:numpy库的用法(上)
  • .net 连接达梦数据库开发环境部署
  • 线性代数重要知识点和理论(下)
  • SpringBoot-21 SpringBoot微服务的发布与部署(3种方式)
  • photoshop学习笔记——移动工具
  • ROS参数服务器增删改查实操Python
  • 网络安全常见错误及解决办法(更新中)
  • 数据结构——单链表OJ题(下)
  • Golang | Leetcode Golang题解之第279题完全平方数
  • UE5 C++跑酷练习(Part2)
  • paraFoam 运行 报错 usr/lib/x86_64-linux-gnu/libQt5Core.so 已解决
  • 将git默认的编辑器设置为vin
  • springboot3-web-questions-分析
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 4个实用的微服务测试策略
  • AHK 中 = 和 == 等比较运算符的用法
  • Angular 响应式表单 基础例子
  • Fundebug计费标准解释:事件数是如何定义的?
  • PHP 7 修改了什么呢 -- 2
  • Promise初体验
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • ReactNative开发常用的三方模块
  • Yii源码解读-服务定位器(Service Locator)
  • 阿里云应用高可用服务公测发布
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 浅谈Golang中select的用法
  • 数组的操作
  • 学习JavaScript数据结构与算法 — 树
  • 智能合约Solidity教程-事件和日志(一)
  • 终端用户监控:真实用户监控还是模拟监控?
  • Nginx实现动静分离
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • ​什么是bug?bug的源头在哪里?
  • ‌‌雅诗兰黛、‌‌兰蔻等美妆大品牌的营销策略是什么?
  • #include<初见C语言之指针(5)>
  • #Java第九次作业--输入输出流和文件操作
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (含笔试题)深度解析数据在内存中的存储
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (七)理解angular中的module和injector,即依赖注入
  • (三)SvelteKit教程:layout 文件
  • (十一)手动添加用户和文件的特殊权限
  • (一)u-boot-nand.bin的下载
  • (一)WLAN定义和基本架构转
  • .form文件_一篇文章学会文件上传
  • .NET C# 使用GDAL读取FileGDB要素类
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .net core Swagger 过滤部分Api