使用seajs模块化,因为浏览器缓存及seasj本身的缓存,调试代码时需要不停的刷新页面,不方便调试,可按如下方法在开发阶段让 浏览器缓存及seajs缓存失效,提高开发调试的效率。
我使用的版本为 seajs-debug.js 3.0.0
(1)修改 seasj-debug.js , 在seajs.use 上方添加 seajs.fetchedList变量、 seajs.removeCache 方法。
//add seajs.fetchedList by cccyb
seajs.fetchedList = fetchedList;
//add by cccyb remove Cache
seajs.removeCache = function(ids,require){
if(S.Debug){
if(isArray(ids)){
for(var i = 0;i<ids.length;i++){
// require时使用 require.resolve
var url = require ? require.resolve(ids[i]) : seajs.resolve(ids[i]);
delete seajs.cache[url];
delete seajs.fetchedList[url];
}
}else{
// require时使用 require.resolve
var url = require ? require.resolve(ids) : seajs.resolve(ids);
delete seajs.cache[url];
delete seajs.fetchedList[url];
}
}
}
(2) sea.use 方法中调用seajs.removeCache()方法
seajs.use = function(ids, callback) {
// cccyb 移除缓存
seajs.removeCache(ids);
Module.use(ids, callback, data.cwd + "_use_" + cid())
return seajs
}
(3)require(id)方法中调用seajs.removeCache()方法
//cccyb
function require(id) {
// cccyb.删除缓存
seajs.removeCache(id,require);
var m = mod.deps[id] || Module.get(require.resolve(id))
if (m.status == STATUS.ERROR) {
throw new Error('module was broken: ' + m.uri);
}
return m.exec()
}
(4) require.async()方法中调用seajs.removeCache()方法
require.async = function(ids, callback) {
// cccyb.删除缓存
seajs.removeCache(ids,require);
Module.use(ids, callback, uri + "_async_" + cid())
return require
}
(5) 请求js的url地址添加时间戳,此时IE8经测试会无法正常使用,如需要兼容IE8,可忽略该步骤,采用第6步
addOnload(node, callback, url)
node.async = true
//node.src = url
node.src = url + '?_' + new Date().getTime();
(6)服务端设置页面缓存失效,以java为例,添加一个过滤器设置response响应头
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse resp = (HttpServletResponse)response;
if(PropSsfast.isDevMode()){
resp.setHeader("Cache-Control","no-cache");
resp.setHeader("Pragma","no-cache");
resp.setDateHeader("Expires",0);
}
chain.doFilter(request, response);
}
效果:
可以看到重复的js文件每次都是重新请求加载。