在单页面应用里,被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);