动态script标签同步加载 ps:无打包编译,静态实现静态资源入口动态配置,无编译打包静态资源添加版本号

/**功能:创建动态标签加载css ,js文件,重点是js文件,利用onloading加递归实现动态标签的同步加载用法:在html文件body底部script内部声明并调用下列函数,obj中写要加载的文件信息注意,由于css是后来加载的,所以页面会存在无样式的页面骨架闪烁问题,可以在头部head标签里加个body{opacity:0},在css文件中再改为body{opacity:1}

*/
function noAsyncScriptTag() {

            var obj = {
                pubPath: "./static",  // 入口配置
                version: "v-0.0.0.1",  // 版本信息
                js: [{
                        type: ‘js‘,
                        filepath: ‘/js/jquery-3.4.1.min.js‘
                    },
                    {
                        type: ‘js‘,
                        filepath: "/laydate/laydate.js"
                    },
                    {
                        type: ‘js‘,
                        filepath: "/js/main.js"
                    }
                ],
                css: [{
                        type: ‘css‘,
                        filepath: "/css/jquery.mCustomScrollbar.min.css"
                    },
                    {
                        type: ‘css‘,
                        filepath: "/font/iconfont.css"
                    },
                    {
                        type: ‘css‘,
                        filepath: "/css/base.css"
                    }
                ]
            }
            //页面中静态引入的图片 (ps:去除资源目录后的地址写在data-src属性上)
            Array.prototype.forEach.call(
                document.querySelectorAll(‘img‘),
                function (item) {
                    item.src = obj.pubPath + item.dataset.src
                })
            //  动态加载css文件     //数组顺序决定文件顺序,既css层叠关系
            obj.css.forEach(function(item){
                var link = document.createElement(‘link‘)
                    link.rel="stylesheet"
                    link.href = obj.pubPath + item.filepath + ‘?version=‘ + obj.version
                    document.querySelector(‘head‘).appendChild(link)
            })

            /**
             *
             * 动态加载js文件,因为js文件有依赖关系所以不许保证解析顺序,
             * 这里用onload事件及递归,使js文件的加载变为同步,数组顺序既为加载顺序
             *
             * 静态script标签为异步加载,同步解析,所以可以异步
             * 动态script标签无法做到同步解析(ps:真的无法做到吗?),所以处理成同步加载
             *
             * */
            var index = 0;
            var len = obj.js.len
            createdScript(obj.js)
            function createdScript() {
                if (obj.js[index]) {
                    var script = document.createElement(‘script‘)
                    script.src = obj.pubPath + obj.js[index].filepath + ‘?version=‘ + obj.version
                    document.querySelector(‘body‘).appendChild(script)
                    script.onload = function (e) {
                        index++
                        createdScript()
                    }
                }
            }
        }

缺点:

js资源加载变成同步加载,性能上不如静态javascript,如下图:

原文地址:https://www.cnblogs.com/superjsman/p/11563453.html

时间: 2024-11-04 15:05:05

动态script标签同步加载 ps:无打包编译,静态实现静态资源入口动态配置,无编译打包静态资源添加版本号的相关文章

<script>标签的加载解析执行

转自原文 <script>标签的加载解析执行 看了很多网上的文章,都是大同小异.总结一下.内部原理还没有搞清楚,有机会再学习. 一.<script>标签的加载解析执行顺序 html页面中的<script>标签中的内容(直接写入或者引用外部文件都一样)是以顺序加载执行的,每个<script>标记内容可以当成一个独立的块,同步的情况下一个块加载解析然后执行完后才加载下一块.当然这时也会阻塞其他页面元素的加载.所以网上说的变量调用: <script type

重操JS旧业第一弹:Script与JS加载

不管js被包装成什么样子,最终交给浏览器执行的js都是原生的,都离不开原生js的原理. Script标签纸html中用来加载js的标签,我们知道js可以是来自外部,本地,或者内部一段代码,在这里只讨论来自外部的加载,对于一个随时进行网络数据交换的浏览器而言,网络请求必然是异步执行的,自然的js文件一般来说异步执行比较好,不容易造成UI卡顿,但是Script标签默认加载js是同步,阻塞式的,也就是说默认情况下浏览器按照从上至下,从左自右的方式解释执行脚本,对于同步请求js文件会造成js文件下载完成

Javascript 文件的同步加载与异步加载

HTML 4.01 的script属性 charset: 可选.指定src引入代码的字符集,大多数浏览器忽略该值.defer: boolean, 可选.延迟脚本执行,相当于将script标签放入页面body标签的底部,js脚本会在document的DOMContentLoaded之前执行.除IE和较新版本的Firefox外,其他浏览器并未支持.language: 已废弃.大部分浏览器会忽略该值.src: 可选.指定引入的外部代码文件,不限制后缀名.type: 必选.指定脚本的内容类型(MIME类

同步加载、异步加载、延迟加载

一.同步加载 平常默认用的都是同步加载.如:<script src="http://yourdomain.com/script.js"></script>  同步模式又称阻塞模式,会阻止浏览器的后续处理,停止了后续的文件的解析,执行,如图像的渲染.流览器之所以会采用同步模式,是因为加载的js文件中有对dom的操作,重定向,输出document等默认行为,所以同步才是最安全的.通常会把要加载的js放到body结束标签之前,使得js可在页面最后加载,尽量减少阻塞页面

介绍同步加载、异步加载、延迟加载

同步加载 同步模式又称阻塞模式,会阻止浏览器的后续处理,停止了后续的文件的解析,执行,如图像的渲染.流览器之所以会采用同步模式,是因为加载的js文件中有对dom的操作,重定向,输出document等默认行为,所以同步才是最安全的.通常会把要加载的js放到body结束标签之前,使得js可在页面最后加载,尽量减少阻塞页面的渲染.这样可以先让页面显示出来 简单的说 js在网页中加载会阻塞到未加载的css,html的加载跟渲染 •异步加载也叫非阻塞模式加载,浏览器在下载js的同时,同时还会执行后续的页面

New UI-&lt;ViewStub&gt;标签延时加载布局

New UI-<ViewStub>标签延时加载布局  --转载请注明出处:coder-pig,欢迎转载,请勿用于商业用途! 小猪Android开发交流群已建立,欢迎大家加入,无论是新手,菜鸟,大神都可以,小猪一个人的 力量毕竟是有限的,写出来的东西肯定会有很多纰漏不足,欢迎大家指出,集思广益,让小猪的博文 更加的详尽,帮到更多的人,O(∩_∩)O谢谢! 小猪Android开发交流群:小猪Android开发交流群群号:421858269 新Android UI实例大全目录:http://blog

AngularJs 通过 ocLazyLoad 实现动态(懒)加载模块和依赖

好了,现进入正题,在 AngularJs 实现动态(懒)加载主要是依赖于3个主JS文件和一段依赖的脚本. 实现的过程主要是引用3个主要的JS文件 <script src="angular/1.4.8/angular/angular.min.js"></script> <script src="angular/ui-router/release/angular-ui-router.min.js"></script> &l

Unity3d 同步加载 Assetbundle 方法 AssetBundle.CreateFromFile

今天在群里问朋友有没有 同步加载 Assetbundle 的方法,同事给我指点 Unity3d 不知道在哪一个版本新增了一个 AssetBundle.CreateFromFile 的接口,这个接口是同步读取Assetbundle的.于是到帮助文档查询相关资料. http://docs.unity3d.com/ScriptReference/AssetBundle.CreateFromFile.html 文章转自http://blog.csdn.net/huutu 星环游戏 http://www.

android 队列模仿listview同步加载图片

我们今天在listview加载图片都是异步的,如果有个需求要求listview同步加载图片,同步加载图片是什么意思呢?就是第一张图片下载好了,然后接着第二张图片下载,依次类推,今天就简单的模仿写个简单的,而且下载的图片还要缓存到SD卡中 思路: 队列是用LinkedList集合模拟, 缓存:当图片下载成功了把当前图片对应的url经过md5加密存到sd卡中的某个子文件夹下,当用户再次进来的时候,可以adapter中判断这个url是否存在,如果存在就加载这个url对应的图片,就达到了缓存的目的 代码