vue如何实现动态加载脚本


Posted in Javascript onFebruary 05, 2020

这篇文章主要介绍了vue如何实现动态加载脚本,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

今天在研究,tinymce富文本编辑器怎样在vue中使用,然后看到其它框架上的使用方法,它是动态加载tinymce脚本的,若果在本地引入静态文件或者,npm安装都会导致vue项目打包体积过大,这种动态脚本引入方式,是一个不错的实践,下面上的代码块叫 dynamicLoadScript 顾名思义,动态加载脚本,这个js只对加载tinymce有效,不过要想加载其它脚本,稍微做一下改动即可

我们可以建立一个dynamicLoadScript.js文件

上代码:dynamicLoadScript.js

let callbacks = [];//放一个数组放置回调函数

function loadedTinymce() {//检测脚本是否加载好的方法 如果tinymce加载好了,window对象上会有tinymce属性 若要加载其它脚本只需要将此判断改一下即可
 // to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2144
 // check is successfully downloaded script
 return window.tinymce
}

const dynamicLoadScript = (src, callback) => {
 const existingScript = document.getElementById(src);//获取script标签元素
 const cb = callback || function() {};//拿到回调函数

 if (!existingScript) {//若没有这个脚本的script标签
  const script = document.createElement('script');//创建一个script标签
  script.src = src // src url for the third-party library being loaded.
  script.id = src
  document.body.appendChild(script)
  callbacks.push(cb);//将回调函数加到callbacks数组中
  const onEnd = 'onload' in script ? stdOnEnd : ieOnEnd;//若是标准浏览器 有onload属性 若是ie浏览器 没有onload属性
  onEnd(script)
 }

 if (existingScript && cb) {//若此script标签存在 并且有回调函数
  if (loadedTinymce()) {//检测是否有tinymce属性
   cb(null, existingScript);//若有tinymce对象,则执行回调函数
  } else {
   callbacks.push(cb);//若没有tinymce对象,则将回调函数加到回调函数数组内
  }
 }

 function stdOnEnd(script) {//标准浏览器加载好脚本后
  script.onload = function() {//脚本加载成功后
   // this.onload = null here is necessary
   // because even IE9 works not like others
   this.onerror = this.onload = null;//将script标签的onload和onerror属性置空
   for (const cb of callbacks) {//执行回调函数 之所以用数组放置回调函数是应对 我仍然事件的发生
    cb(null, script)
   }
   callbacks = null;//将callbacks置空
  }
  script.onerror = function() {//脚本加载失败后
   this.onerror = this.onload = null;//将script标签的onload和onerror置空 覆盖原生的onload事件和nerror事件
   cb(new Error('Failed to load ' + src), script);//脚本加载错误后执行回调函数,返回报错信息
  }
 }

 function ieOnEnd(script) {//若是ie浏览器 
  script.onreadystatechange = function() {//脚本加载成功后
   if (this.readyState !== 'complete' && this.readyState !== 'loaded') return;//脚本没加载好则不执行回调函数 ie浏览器会自动报错
   this.onreadystatechange = null;//若 加载成功
   for (const cb of callbacks) {//执行回调函数
    cb(null, script) // there is no way to catch loading errors in IE8
   }
   callbacks = null;//置空callbacks
  }
 }
}

export default dynamicLoadScript;//暴露出动态加载脚本的方法

怎么使用呢?

在组件中引入上述代码块(其实就是引入那个方法)

import load from './dynamicLoadScript'

上诉路径可以根据实际情况引入

load(tinymceCDN, (err) => {//tinymceCDN代表tinymce的CDN地址,下一个参数是回调方法
    if (err) {//若脚本加载错误,这弹出错误提示
     this.$message.error(err.message)
     return
    }
    this.initTinymce();//否则执行初始化tinymce方法
   })

以上这种动态加载脚本在vue中,个人认为是个不错的实践,可以缩小vue项目体积。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS对外部文件的加载及对IFRMAME的加载的实现,当加载完成后,指定指向方法(方法回调)
Jul 04 Javascript
SyntaxHighlighter语法高亮插件使用说明
Aug 14 Javascript
Jquery的hover方法让鼠标经过li时背景变色
Sep 06 Javascript
jquery复选框全选/取消示例
Dec 30 Javascript
js 针对html DOM元素操作等经验累积
Mar 11 Javascript
JavaScript访问CSS属性的几种方式介绍
Jul 21 Javascript
JavaScript事件委托技术实例分析
Feb 06 Javascript
JS实现将链接生成二维码并转为图片的方法
Mar 17 Javascript
VUE 全局变量的几种实现方式
Aug 22 Javascript
vue基于element的区间选择组件
Sep 07 Javascript
vue基于element-ui的三级CheckBox复选框功能的实现代码
Oct 15 Javascript
浅谈webpack和webpack-cli模块源码分析
Jan 19 Javascript
vue实现图片懒加载的方法分析
Feb 05 #Javascript
Vue组件基础用法详解
Feb 05 #Javascript
vue组件传值的实现方式小结【三种方式】
Feb 05 #Javascript
vue路由传参的基本实现方式小结【三种方式】
Feb 05 #Javascript
Vuex的API文档说明详解
Feb 05 #Javascript
如何实现iframe父子传参通信
Feb 05 #Javascript
JavaScript对象原型链原理详解
Feb 05 #Javascript
You might like
PHP 获取文件权限函数介绍
2013/07/11 PHP
WordPress中获取所使用的模板的页面ID的简单方法
2015/12/31 PHP
php mysql procedure实现获取多个结果集的方法【基于thinkPHP】
2016/11/09 PHP
Prototype使用指南之string.js
2007/01/10 Javascript
jquery 循环显示div的示例代码
2013/10/18 Javascript
JavaScript获取网页、浏览器、屏幕高度和宽度汇总
2014/12/18 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形网络(1)
2015/11/30 Javascript
jquery简单倒计时实现方法
2015/12/18 Javascript
JavaScript  cookie 跨域访问之广告推广
2016/04/20 Javascript
less简单入门(CSS 预处理语言)
2017/03/08 Javascript
解决easyui日期时间框ie的兼容的问题
2018/03/01 Javascript
微信小程序实现换肤功能
2018/03/14 Javascript
jQuery+Cookie实现切换皮肤功能【附源码下载】
2018/03/25 jQuery
Vue插件打包与发布的方法示例
2018/08/20 Javascript
Vue父子组件之间的通信实例详解
2018/09/28 Javascript
JavaScript中的函数式编程详解
2020/08/22 Javascript
Openlayers+EasyUI Tree动态实现图层控制
2020/09/28 Javascript
Python正则表达式教程之一:基础篇
2017/03/02 Python
python写入文件自动换行问题的方法
2019/07/05 Python
Django之提交表单与前后端交互的方法
2019/07/19 Python
解决Django连接db遇到的问题
2019/08/29 Python
Python对象的属性访问过程详解
2020/03/05 Python
Python如何给你的程序做性能测试
2020/07/29 Python
HTTP状态码详解
2021/03/18 杂记
Canvas实现贝赛尔曲线轨迹动画的示例代码
2019/04/25 HTML / CSS
美国益智玩具购物网站:Fat Brain Toys
2017/11/03 全球购物
英国灯具和灯泡网上商店:Lights.co.uk
2018/02/02 全球购物
学生实习自我鉴定
2013/10/11 职场文书
机电专业毕业生推荐信
2013/11/10 职场文书
运动会闭幕式解说词
2014/02/21 职场文书
聘用意向书范本
2014/04/01 职场文书
初中优秀教师事迹材料
2014/08/18 职场文书
2014年大学生预备党员思想汇报1000字
2014/09/13 职场文书
《灰雀》教学反思
2016/02/19 职场文书
用JS创建一个录屏功能
2021/11/11 Javascript
java版 简单三子棋游戏
2022/05/04 Java/Android