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 相关文章推荐
Track Image Loading效果代码分析
Aug 13 Javascript
File, FileReader 和 Ajax 文件上传实例分析(php)
Apr 27 Javascript
通过js简单实现将一个文本内容转译成加密文本
Oct 22 Javascript
Javascript动态创建表格及删除行列的方法
May 15 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
Jan 23 Javascript
好好了解一下Cookie(强烈推荐)
Jun 14 Javascript
String字符串截取的四种方式总结
Nov 28 Javascript
vue.js事件处理器是什么
Mar 20 Javascript
JavaScript实现前端实时搜索功能
Mar 26 Javascript
详细AngularJs4的图片剪裁组件的实例
Jul 12 Javascript
微信小程序遍历Echarts图表实现多个饼图
Apr 25 Javascript
前端框架ECharts dataset对数据可视化的高级管理
Dec 24 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
生成缩略图
2006/10/09 PHP
php中常用的预定义变量小结
2012/05/09 PHP
Zend Framework 2.0事件管理器(The EventManager)入门教程
2014/08/11 PHP
深入分析PHP引用(&)
2014/09/04 PHP
PHP设计模式之适配器模式代码实例
2015/05/11 PHP
删除PHP数组中的重复元素的实现代码
2017/04/10 PHP
PHP编程实现脚本异步执行的方法
2017/08/09 PHP
基于jquery的监控数据是否发生改变
2011/04/11 Javascript
Json2Template.js 基于jquery的插件 绑定JavaScript对象到Html模板中
2011/10/29 Javascript
jquery 实现checkbox全选,反选,全不选等功能代码(奇数)
2012/10/24 Javascript
jquery的flexigrid无法显示数据提示获取到数据
2013/07/19 Javascript
使用js实现的简单拖拽效果
2015/03/18 Javascript
使用get方式提交表单在地址栏里面不显示提交信息
2017/02/21 Javascript
js实现多图和单图上传显示
2019/12/18 Javascript
Javascript实现关闭广告效果
2021/01/29 Javascript
python 字典(dict)按键和值排序
2016/06/28 Python
Python3编程实现获取阿里云ECS实例及监控的方法
2017/08/18 Python
解决python3 安装完Pycurl在import pycurl时报错的问题
2018/10/15 Python
Python+OpenCV采集本地摄像头的视频
2019/04/25 Python
对django2.0 关联表的必填on_delete参数的含义解析
2019/08/09 Python
Windows上安装tensorflow  详细教程(图文详解)
2020/02/04 Python
Python中实现输入一个整数的案例
2020/05/03 Python
HTML5 Canvas绘制圆点虚线实例
2015/01/01 HTML / CSS
英国领先的奢侈品零售商之一:CRUISE
2016/12/02 全球购物
办公室前台的岗位职责
2013/12/20 职场文书
实习单位接收函模板
2014/01/10 职场文书
广告学专业求职信
2014/06/19 职场文书
水污染治理工程专业自荐信
2014/06/21 职场文书
简单通用的简历自我评价
2014/09/21 职场文书
2014年个人业务工作总结
2014/11/17 职场文书
2014年个人工作总结模板
2014/12/15 职场文书
工程技术负责人岗位职责
2015/04/13 职场文书
2015年平安创建工作总结
2015/04/29 职场文书
2019最新版股权转让及委托持股协议书范本
2019/08/07 职场文书
JS ES6异步解决方案
2021/04/29 Javascript
python自动化之如何利用allure生成测试报告
2021/05/02 Python