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 相关文章推荐
直接生成打开窗口代码,不必下载
May 14 Javascript
JavaScript栏目列表隐藏/显示简单实现
Apr 03 Javascript
Flexigrid在IE下不显示数据的处理的解决方法
Oct 24 Javascript
jQuery中innerHeight()方法用法实例
Jan 19 Javascript
基于JS代码实现图片在页面中旋转效果
Jun 16 Javascript
jQuery UI Bootstrap是什么?
Jun 17 Javascript
js Canvas实现的日历时钟案例分享
Dec 25 Javascript
jQuery操作之效果详解
May 19 jQuery
node.js中grunt和gulp的区别详解
Jul 17 Javascript
JS实现头条新闻的经典轮播图效果示例
Jan 30 Javascript
vue2.0基于vue-cli+element-ui制作树形treeTable
Apr 30 Javascript
vue组件讲解(is属性的用法)模板标签替换操作
Sep 04 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 构造函数construct的前下划线是双的_
2009/12/08 PHP
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
2013/06/25 PHP
关于JSON以及JSON在PHP中的应用技巧
2013/11/27 PHP
php 处理png图片白色背景色改为透明色的实例代码
2018/12/10 PHP
js不是基础的基础
2006/12/24 Javascript
轻松创建nodejs服务器(1):一个简单nodejs服务器例子
2014/12/18 NodeJs
javascript使用prototype完成单继承
2014/12/24 Javascript
纯Javascript实现ping功能的方法
2015/03/20 Javascript
JS实现生成会变大变小的圆环实例
2015/08/05 Javascript
JavaScript调用传递变量参数的相关问题及解决办法
2015/11/01 Javascript
jQuery设置单选按钮radio选中/不可用的实例代码
2016/06/24 Javascript
JSON格式的时间/Date(2367828670431)/格式转为正常的年-月-日 格式的代码
2016/07/27 Javascript
jQuery中 bind的用法简单介绍
2017/02/13 Javascript
babel基本使用详解
2017/02/17 Javascript
JS中type="button"和type="submit"的区别
2017/07/04 Javascript
vue前后分离调起微信支付
2019/07/29 Javascript
解决vue-router 切换tab标签关闭时缓存问题
2020/07/22 Javascript
[01:14]DOTA2 7.22版本新增神杖效果展示(智力英雄篇)
2019/05/29 DOTA
Mac OS X10.9安装的Python2.7升级Python3.3步骤详解
2013/12/04 Python
Python实现基本线性数据结构
2016/08/22 Python
解决PyCharm不运行脚本,而是运行单元测试的问题
2019/01/17 Python
python网络应用开发知识点浅析
2019/05/28 Python
python并发编程多进程 互斥锁原理解析
2019/08/20 Python
Python循环实现n的全排列功能
2019/09/16 Python
torch 中各种图像格式转换的实现方法
2019/12/26 Python
TFRecord文件查看包含的所有Features代码
2020/02/17 Python
学习Python列表的基础知识汇总
2020/03/10 Python
英国天然保健品网站:Simply Supplements
2017/03/22 全球购物
施华洛世奇日本官网:SWAROVSKI日本
2018/05/04 全球购物
极简鞋类,赤脚的感觉:Lems Shoes
2019/08/06 全球购物
大二自我鉴定范文
2013/10/05 职场文书
信息管理员岗位职责
2013/12/01 职场文书
学校三节实施方案
2014/06/09 职场文书
幼儿园大班区域活动总结
2014/07/09 职场文书
2015人事行政工作总结范文
2015/05/21 职场文书
2016年“6.26”禁毒宣传月系列活动总结
2016/04/05 职场文书