内容简介:今天主要讨论一下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模块化
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Web Data Mining
Bing Liu / Springer / 2006-12-28 / USD 59.95
Web mining aims to discover useful information and knowledge from the Web hyperlink structure, page contents, and usage data. Although Web mining uses many conventional data mining techniques, it is n......一起来看看 《Web Data Mining》 这本书的介绍吧!