内容简介:今天主要讨论一下cmd和amd中运用loadjs等方式动态加载资源遇到的问题。当然,amd和cmd是比较老的前端模块化技术了。类似我之前文章提到的requirejs,这种方式下运用loadjs中遇到的问题。我这里列举一下我平时用的比较多的loadjs和css等的函数吧上面是我常用的一些动态加载和删除资源的一些方式。但是这种方式在RequireJS等中运用有时候会有问题,例如加载swiper
前言
今天主要讨论一下cmd和amd中运用loadjs等方式动态加载资源遇到的问题。当然,amd和cmd是比较老的前端模块化技术了。类似我之前文章提到的requirejs,这种方式下运用loadjs中遇到的问题。
前端动态加载资源
我这里列举一下我平时用的比较多的loadjs和css等的函数吧
/* desc:加载资源类库 auth:haorooms 博客 */ // 加载CSS export function LoadCss (id, content) { var newStyle = document.createElement('style') newStyle.type = 'text/css' newStyle.id = id if (typeof newStyle.styleSheet != 'undefined') { newStyle.styleSheet.cssText = content } else { newStyle.innerHTML = content } document.getElementsByTagName('head')[0].appendChild(newStyle) } // 加载JS export function LoadJS (url, callback, errcallback) { var documentHeader = document.head || document.getElementsByTagName('head')[0] // 防止单页应用加载多次 var addSign = true var scripts = document.getElementsByTagName('script') for (var i = 0; i < scripts.length; i++) { if (scripts[i] && scripts[i].src && scripts[i].src.indexOf(url) != -1) { addSign = false } } if (addSign) { var script = document.createElement('script') script.type = 'text/javascript' script.charset = 'utf-8' script.async = true script.src = url documentHeader.appendChild(script) script.onload = function () { callback && callback() } script.onerror = function () { errcallback && errcallback() documentHeader.removeChild(script) } } else { callback && callback() } } // 加载CSS引用 export function LoadLink (url) { // 防止单页应用加载多条 var addSign = true var links = document.getElementsByTagName('link') for (var i = 0; i < links.length; i++) { if (links[i] && links[i].href && links[i].href.indexOf(url) != -1) { addSign = false } } if (addSign) { var link = document.createElement('link') link.type = 'text/css' link.rel = 'stylesheet' link.href = url document.getElementsByTagName('head')[0].appendChild(link) } } // js删除script export function removeScript(src) { var scripts = document.getElementsByTagName('script') for (var i = 0; i < scripts.length; i++) { if (scripts[i] && scripts[i].src && scripts[i].src.indexOf(src) != -1) { scripts[i].parentNode.removeChild(scripts[i]) } } } // js删除link文件 export function removelink(href) { var links = document.getElementsByTagName('link') for (var i = 0; i < links.length; i++) { if (links[i] && links[i].href && links[i].href.indexOf(href) != -1) { links[i].parentNode.removeChild(links[i]) } } }
上面是我常用的一些动态加载和删除资源的一些方式。但是这种方式在RequireJS等中运用有时候会有问题,例如加载swiper
例如如下:
require(["js/student", "js/class"], function(student, clz) { LoadJS('./haorooms/swiper.min.js',function(){ console.log(swiper) }) });
这个时候会爆出swiper is not defined错误。
原因是因为
require是封闭的引用,loadjs是在头部添加标签,而swiper是umd及es的方式打包的。因此,在封闭的作用域下面获取不到值。
因此,loadjs方式引用的js必须是iife方式打包,或者是暴露全局作用域才可以。
解决方案:
下载swiper源码,用rollup重新打包,打包成iife的方式就可以了。
将swiper源码 script/build-js.js中的打包方式替换成iife,例如如下:
then(bundle => bundle.write({ format: 'iife', name: 'Swiper', strict: true, sourcemap: env === 'development', sourcemapFile: `./${env === 'development' ? 'build' : 'dist'}/js/swiper.js.map`, banner, file: `./${env === 'development' ? 'build' : 'dist'}/js/swiper.js`, })).then(() => { if (env === 'development') { if (cb) cb(); return; }
这样打包好了的swiper就可以用loadjs在amd和cmd等方式中引用了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Android模块化改造以及模块化通信框架
- Laravel 模块化开发模块 – Caffienate
- 前端模块化架构设计与实现(二|模块接口设计)
- 模块化编程的实践者 disconver 更新了用户模块
- ASP.NET Core模块化前后端分离快速开发框架介绍之4、模块化实现思路
- JavaScript模块化
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Unity游戏设计与实现
[日]加藤政树 / 罗水东 / 人民邮电出版社 / 2015-2 / 79.00元
本书出自日本知名游戏公司万代南梦宫的资深开发人员之手,面向初级游戏开发人员,通过10个不同类型的游戏实例,展示了真正的游戏设计和实现过程。本书的重点并不在于讲解Unity的各种功能细节,而在于核心玩法的设计和实现思路。每个实例都从一个idea 开始,不断丰富,自然而然地推出各种概念,引导读者思考必要的数据结构和编程方法。掌握了这些思路,即便换成另外一种引擎,也可以轻松地开发出同类型的游戏。 ......一起来看看 《Unity游戏设计与实现》 这本书的介绍吧!