Requirejs高级应用(二):消除requirejs的缓存模块

      在单页面应用里,被requirejs加载的模块会一直缓存在内存中,以后无论进行多少次加载都不会发送网络请求,并且模块也不会再进行初始化,测试代码User.js如下:

define([], function() {
   return {
       username : "yiifaa",
       age       : 25
   }
});

      在单页面应用里调用此User.js。

 //  配置成每次请求都从服务器拉取JS文件,避免浏览器缓存
require.config({
  urlArgs: "r=" + (new Date()).getTime()
});
//  修改User对象的username属性
require(["User"], function(yiifaa) {
    yiifaa.username = "new";
});
//  10秒后再次调用User.js
setTimeout(function() {
    //  同步请求
    var user = require("User");
    //  将会输出new
    alert(user.username)
}, 10 * 1000);

      在这里要搞清楚的是,浏览器缓存与requirejs缓存之间的差异,浏览器即使存在缓存,只要requirejs发出网络请求,即使不会从服务器下载js文件,但所请求的js文件依旧会进行解释与执行,而requirejs缓存里的文件则不会进行任何操作,只是返回已请求过的模块(里面的代码不会解释也不会执行)。需要强调的是,在本例中,虽然添加了预防浏览器缓存的措施,也只能保证第一次请求User.js文件时,User.js不是从浏览器本地缓存中获取的,绝不会发生每调用一次require函数,就发生一次网络请求。
      请务必记住,require引入的文件(模块),只会解释执行一次,所以引入的模块也可用作全局变量。
      在这返回的对象里,可能已存在修改,如上面的User.js,可能难以满足我们的要求,于是需要取消已加载的模块,取消的方法是undef,改进后示例代码如下:

setTimeout(function() {
    //  取消模块注册
    requirejs.undef("global")
    //  同步请求
    var user = require("User");
    //  将会输出yiifaa
    alert(user.username)
}, 10 * 1000);
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值