loader.js
/**
* @preserve Tiny-Loader: A small loader that load CSS/JS in best way for page performanceIs.
*
* @version 1.0.1
* @copyright The Youzan Limited [All Rights Reserved]
* @license MIT License (see LICENSE.txt)
*/
(function(window, document) {
'use strict';
// cssExpr 用于判断资源是否是css
var cssExpr = new RegExp('\\.css');
var nHead = document.head || document.getElementsByTagName('head')[0];
// `onload` 在WebKit < 535.23, Firefox < 9.0 不被支持
var isOldWebKit = +navigator.userAgent
.replace(/.*(?:AppleWebKit|AndroidWebKit)\/?(\d+).*/i, '$1') < 536;
// 判断对应的node节点是否已经载入完成
function isReady(node) {
return node.readyState === 'complete' || node.readyState === 'loaded';
}
// loadCss 用于载入css资源
function loadCss(url, setting, callback) {
var node = document.createElement('link');
node.rel = 'stylesheet';
addOnload(node, callback, 'css');
node.async = true;
node.href = url;
nHead.appendChild(node);
}
// loadJs 用于载入js资源
function loadJs(url, setting, callback) {
var node = document.createElement('script');
node.charset = 'utf-8';
addOnload(node, callback, 'js');
node.async = !setting.sync;
node.src = url;
nHead.appendChild(node);
}
// 在老的webkit中,因不支持load事件,这里用轮询sheet来保证
function pollCss(node, callback) {
var isLoaded;
if (node.sheet) {
isLoaded = true;
}
setTimeout(function() {
if (isLoaded) {
// 在这里callback 是为了让样式有足够的时间渲染
callback();
} else {
pollCss(node, callback);
}
}, 20);
}
// 用于给指定的节点绑定onload回调
// 监听元素载入完成事件
function addOnload(node, callback, type) {
var supportOnload = 'onload' in node;
var isCSS = type === 'css';
// 对老的webkit和老的firefox的兼容
if (isCSS && (isOldWebKit || !supportOnload)) {
setTimeout(function() {
pollCss(node, callback);
}, 1);
return;
}
if (supportOnload) {
node.onload = onload;
node.onerror = function() {
node.onerror = null;
window._cdnFallback(node);
};
} else {
node.onreadystatechange = function() {
if (isReady(node)) {
onload();
}
};
}
function onload() {
// 执行一次后清除,防止重复执行
node.onload = node.onreadystatechange = null;
node = null;
callback();
}
}
// 资源下载入口,根绝文件类型的不同,调用loadCss或者loadJs
function loadItem(url, list, setting, callback) {
// 如果加载的url为空,就直接成功返回
if (!url) {
setTimeout(function() {
onFinishLoading();
});
return;
}
if (cssExpr.test(url)) {
loadCss(url, setting, onFinishLoading);
} else {
loadJs(url, setting, onFinishLoading);
}
// 每次资源下载完成后,检验是否结束整个list下载过程
// 若已经完成所有下载,执行回调函数
function onFinishLoading() {
var urlIndex = list.indexOf(url);
if (urlIndex > -1) {
list.splice(urlIndex, 1);
}
if (list.length === 0) {
callback();
}
}
}
function doInit(list, setting, callback) {
var cb = function() {
callback && callback();
};
list = Array.prototype.slice.call(list || []);
if (list.length === 0) {
cb();
return;
}
for (var i = 0, len = list.length; i < len; i++) {
loadItem(list[i], list, setting, cb);
}
}
// 判断当前页面是否加载完
// 加载完,立刻执行下载
// 未加载完,等待页面load事件以后再进行下载
function ready(node, callback) {
if (isReady(node)) {
callback();
} else {
// 1500ms 以后,直接开始下载资源文件,不再等待load事件
var timeLeft = 1500;
var isExecute = false;
window.addEventListener('load', function() {
if (!isExecute) {
callback();
isExecute = true;
}
});
setTimeout(function() {
if (!isExecute) {
callback();
isExecute = true;
}
}, timeLeft);
}
}
// 暴露出去的Loader
// 提供async, sync两个函数
// async 用作异步下载执行用,不阻塞页面渲染
// sync 用作异步下载,顺序执行,保证下载的js按照数组顺序执行
var Loader = {
async: function(list, callback) {
ready(document, function() {
doInit(list, {}, callback);
});
},
sync: function(list, callback) {
ready(document, function() {
doInit(list, {
sync: true
}, callback);
});
}
};
window.Loader = Loader;
return Loader;
})(window, document);
例如:
var list = ["../../static/common/js/util/jquery-1.9.1.min.js","../../static/common/js/util/template.js"]
Loader.async(list,function(){
alert("111");
});
loader.js的更多相关文章
- 简单实用的进度条加载组件loader.js
本文提供一个简单的方法实现一个流程的进度条加载效果,以便在页面中可以通过它来更好地反馈耗时任务的完成进度.要实现这个功能,首先要考虑怎样实现一个静态的进度条效果,类似下面这样的: 这个倒是比较简单,两 ...
- vue解决启动报错cjs loader.js Error: Cannot find module '../config'问题
vue解决启动报错cjs loader.js Error: Cannot find module '../config'问题 今天下载了一个开源项目一直运行不了,折腾了半天才找到问题所在,config ...
- 解决internal/modules/cjs/loader.js:638 throw err; ^ Error: Cannot find module 'resolve'
internal/modules/cjs/loader.js:638 throw err; ^ Error: Cannot find module 'resolve' 根据提示可以知道有依赖没有安装完 ...
- 成功解决internal/modules/cjs/loader.js:596 throw err; ^ Error: Cannot find module 'minimatch'
成功解决internal/modules/cjs/loader.js:596 throw err; ^ Error: Cannot find module 'minimatch' 解决办法 npm i ...
- 高德打车对接loader.js文件的实现
const u = navigator.userAgent;const isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > ...
- 成功解决internal/modules/cjs/loader.js:596 throw err; ^ Error: Cannot find module 'express'
^ Error: Cannot find module 'express'根据提示我们就可以知道,没有找到express这个模块,解决办法就是:npm install express
- node 报错:Uncaught Error: Cannot find module "!!../../../node_modules/extract-webpack-plugin/loader.js
问题出在缺少less和less-loader 因为以上模块使用了less解析. 解决方法在dependencies添加 "less": "^2.7.1", & ...
- 在 node.js 的 express web 框架中自动注册路由
该方法主要是动态注册自己写的 router . 注册器 router 文件名为 loader.js . var express = require('express'); var fs = requ ...
- html5游戏引擎-Pharse.js学习笔记(一)
1.前言 前几天随着flappy bird这样的小游戏的火爆,使我这种也曾了解过html5技术的js业余爱好者也开始关注游戏开发.研究过两个个比较成熟的html5游戏引擎,感觉用引擎还是要方便一些.所 ...
随机推荐
- 动画库tween.js
动画库tween.js var Tween = { Linear:function (start,alter,curTime,dur) {return start+curTime/dur*alter; ...
- 杭电acm5698-瞬间移动(2016"百度之星" - 初赛(Astar Round2B))
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=5698 Problem Description 有一个无限大的矩形,初始时你在左上角(即第一行第一列), ...
- 5950 Recursive sequence (矩阵快速幂)
题意:递推公式 Fn = Fn-1 + 2 * Fn-2 + n*n,让求 Fn; 析:很明显的矩阵快速幂,因为这个很像Fibonacci数列,所以我们考虑是矩阵,然后我们进行推公式,因为这样我们是无 ...
- python 面向对象九 定制类
一.定制类,实质就是我们自己重写特殊函数 看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的. __slots__我们已经知道怎么用了,__l ...
- poj 1149 PIGS【最大流】
建图:s向所有猪圈的第一个顾客连流量为这个猪圈里住的数量,然后对于之后每个来这个猪圈的顾客,由他前一个顾客向他连边权为无穷的边,然后每个顾客向t连流量为这个顾客购买上限的边.然后跑最大流 #inclu ...
- 洛谷P3295 [SCOI2016]萌萌哒(倍增+并查集)
传送门 思路太妙了啊…… 容易才怪想到暴力,把区间内的每一个数字用并查集维护相等,然后设最后总共有$k$个并查集,那么答案就是$9*10^{k-1}$(因为第一位不能为0) 考虑倍增.我们设$f[i] ...
- java多线程模拟龟兔赛跑
让乌龟和兔子在同一个赛道从1开始跑到100,看看谁更快. public class Racer implements Runnable{ private static String winner;// ...
- 原生JavaScript实战之搜索框筛选功能
成品图如下所示: 先搭建HTML结构: <div class="wrapper"> <div class="sWrapper"> < ...
- VS2010编译错: #error : This file requires _WIN32_WINNT to be #defined at least to 0x0403...的解决方法
最近拿到一个别人的工程,是使用VS.net创建的,而我的机器上只有vs2010,于是用自带的转换工具将它转换成vs2010的工程,转换之前我就很担心,怕转换完后会出问题,但是没有办法,我实在是 ...
- 积分图像的应用(一):局部标准差 分类: 图像处理 Matlab 2015-06-06 13:31 137人阅读 评论(0) 收藏
局部标准差在图像处理邻域具有广泛的应用,但是直接计算非常耗时,本文利用积分图像对局部标准差的计算进行加速. 局部标准差: 标准差定义如下(采用统计学中的定义,分母为): 其中. 为了计算图像的局部标准 ...