Vue2 组件局部引用静态js、css文件

引言:我遇见的问题是vue2,需要在组件中引入外部的静态js、css,可指定加载顺序,其实网上有很多文章,很多方法解决引入静态文件方法,但是都没有解决我的问题,我也是东拼西凑,站在众人的肩膀上,解决了我的问题,特此记录下来,希望能帮助到大家!!!
一、首先我们将加载js、css的公共方法写入一个叫importJs的js文件中

/**
 * 动态加载js
 * @param url
 * @param callback
 * @returns {Promise<any>}
 */
export function loadingJs(url, callback) {
  return new Promise((resolve, reject) => {
    let fn = callback || function () {};
    let script = document.createElement('script');
    script.src = url;
    script.type = 'text/javascript';
    document.head.appendChild(script);
    if (script.addEventListener) {
      script.addEventListener('load', function () {
        console.log("加载完成",url);
        fn();
        resolve();
      }, false);
    } else if (script.attachEvent) {
      script.attachEvent('onreadystatechange', function () {
        let target = window.event.srcElement;
        if (target.readyState == 'loaded') {
          console.log("加载完成",url);
          fn();
          resolve();
        }
      });
    }
  })
}

/**
 * 动态加载css
 * @param href
 * @param callback
 * @returns {Promise<any>}
 */
export function loadingCss(href, callback) {
  return new Promise((resolve, reject) => {
    let fn = callback || function () {};
    let link = document.createElement('link');
    link.href = href;
    link.rel = 'stylesheet';
    document.head.appendChild(link);
    superviseCssLinkLoad(link, () => {  fn();resolve();console.log("加载完成",href); })
  })
}

/**
 * 通过轮询link标签的sheet. cssRules来判断是否加载好css资源
 * @param link
 * @param onload
 */
function superviseCssLinkLoad(link, onload) {
  requestIdleCallback(() => {
    if (link.sheet) {
      if (link.sheet.cssRules?.length) {
        typeof onload === 'function' && onload()
      } else {
        superviseCssLinkLoad(link, onload)
      }
    } else {
      superviseCssLinkLoad(link, onload)
    }
  })
}

二、接着我们将importJs文件引入到我们Vue组件中

import {loadingJs,loadingCss} from '../../utils/importJs.js';

三、加载静态js、css文件
注意:由于vue的版本不同,配置的根目录不同,引入路径也有所不同
我的是vue2,静态文件放在public下:/static/demo/assets/xx.js,/static/demo/css/xxx.css;就拿这两个文件举例:
我是写在mounted这个钩子函数下的

mounted() {
      loadingCss('/static/demo/css/xxx.css');
      function callback(){
          loadingJs('/static/assets/xx1.js');
          loadingJs('/static/assets/xx2.js');
      }
      loadingJs('/static/demo/assets/xx.js',callback).then(()=>{
        //你的初始化代码
      });
    },

难点在于加载js的先后顺序,一定要搞清楚先加载哪个再加载哪个,否则会出问题!!!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值