按需加载的那些事儿

前言:最近很多地方都出现了按需加载这个东西,第一次接触是在使用element-ui的时候,后面在用easyui做管理信息系统的时候也发现了这个东西。想着还是来总结一下,因为这的确是一个非常有用的东西,极大了减少了引入文件的大小,也减轻了服务器的压力。笔者认为在未来这个一定会成为一种趋势
1、动态样式

在说按需加载之前,我们先来聊聊动态样式。动态样式是什么呢?其实就是根据需要进行动态加载样式。下面我们进行一个简单的实现。
首先我们定义好一个btn.css文件

.btn {
    width: 120px;
    height: 40px;
    border: none;
    background-color: orange;
    color: white;
    cursor: pointer;
    outline: none;
}
.btn:hover {
    background-color: #EE7600;
}

然后在我们页面进行样式的动态添加

<button class="btn">我是按钮</button>
<script>
    window.onload = function() {
        var cssLink = document.createElement("link");
        cssLink .rel = "stylesheet";
        cssLink .type = "text/css";
        cssLink .href = "btn.css";
        var head = document.getElementsByTagName("head")[0];
        head.appendChild(cssLink );
    }
</script>

通过动态样式,我们大概就知道了按需加载是怎么实现的了,我们下面来简单实现一个按需加载的例子。
loader.js(核心文件)

//模块文件
var modules = {
    btn: {
        css: "btn",
        js: "btn"
    },
    circleBtn: {
        css: 'circle-btn',
        dependencies: ['btn']
    },
    menu: {
        class: 'menu',
    }
}
//加载CSS文件
function loadCss(url) {
    var link = document.createElement("link");
    link.rel = "stylesheet";
    link.type = "text/css";
    link.href = "css/"+url+".css";
    var head = document.getElementsByTagName("head")[0];
    head.appendChild(link);
}
//加载JavaScript文件
function loadJs(url) {
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.language = 'javascript';
    script.src = "js/"+url+".js";
    var head = document.getElementsByTagName("head")[0];
    head.appendChild(script);
}
//去除数组中重复的内容
function removeRepeat(args) {
    var result = [];
    for(var i=0; i<args.length; i++) {
        if(result.indexOf(args[i]) < 0) {
            result.push(args[i]);
        }
    }
    return result;
}
//需要引入的css
var cssArray = [];
//需要引入的JavaScript
var jsArray = [];
//遍历模块
for(module in modules) {
    var cssName = modules[module]['css'];
    var jsName = modules[module]['js'];
    var objects = document.querySelectorAll("."+cssName);
    if(objects.length){
        cssArray.push(cssName);
        if(jsName) {
            jsArray.push(jsName);
        }
    }
    var dependencies = modules[module]['dependencies'];
    if(dependencies) {
        for(var i=0; i<dependencies.length; i++) {
            var dependenciesCSS = modules[dependencies[i]]['css'];
            var dependenciesJS = modules[dependencies[i]]['js'];
            for(var j=0; j<objects.length; j++) {
                objects[j].classList.add(dependenciesCSS);
            }
            cssArray.push(dependenciesCSS);
            jsArray.push(dependenciesJS);
        }
    }
}
cssArray = removeRepeat(cssArray);
jsArray = removeRepeat(jsArray);
//加载css
for(var i=0; i<cssArray.length; i++) {
    loadCss(cssArray[i]);
}
//加载JavaScript
for(var i=0; i<jsArray.length; i++) {
    loadJs(jsArray[i]);
}

如果想要源码,可以在我的github上获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值