要求js删除定义以强制重新加载

时间:2012-08-10 10:39:56

标签: requirejs js-amd

出于测试目的,我试图删除一些amd模块并从服务器重新加载更新版本 - 目的是不刷新浏览器。

我目前正在执行以下操作,但浏览器仍然无法从网络重新加载项目。

var scripts = document.getElementsByTagName('script');
var context = require.s.contexts['_'];
for (var key in context.defined) {
  if(key.indexOf("tests")>-1){
  requirejs.undef(key);
  for (var i = scripts.length - 1; i >= 0; i--) {
  var script = scripts[i];
  var attr = script.getAttribute('data-requiremodule')
    if (attr === key){
    script.parentNode.removeChild(script);
    }
  }}

它从上下文中删除引用并成功删除脚本标记。 但是唉...

有没有人知道清除requirejs的所有引用的机制?

任何帮助非常感谢

2 个答案:

答案 0 :(得分:8)

我们目前正在尝试此实施:

require.onResourceLoad = function(context, map)
{
    require.undef(map.name);
};

目前尚未出现任何问题。

编辑:IE并不关心此修复程序。 Chrome和FF很好。

此外,您应该在PhpStorm中尝试实时编辑。奇迹般有效。可以看到一个演示here。仅限Chrome。

答案 1 :(得分:1)

这个答案类似于user1903890,但我认为很容易遵循其他实现。

基本上我们必须在init函数中封装index.html中指定的main.js requirejs控制器。一旦定义了,那么我们通常会调用init函数初始化requirejs

function init_requirejs(){
    console.log("--------------------------- INIT requirejs:");
    require([ "helpers/util"], function(util) {
        var count=0;
        $('#content').empty();

        $('#content').append("<input type='button' id='increment_button' value='click to increment the counter'>");
        $('#content').append("<h1 id='the_counter'>0</h1>");

        $('#content').append("<br><br><input type='button' id='init_button' value='click to initialize requirejs files'>");

        $('#increment_button').on('click', function(){
            count++;
            $('#the_counter').text(count);
        });
        $('#init_button').on('click', function(){
            end();
            init_requirejs();
        });

        util();

    });
};
init_requirejs();

我们还需要并使用require.onResourceLoad函数来存储参与requirejs应用程序的所有文件

var all=[];
require.onResourceLoad = function (context, map, depArray) {
    all.push(map.name);    
};

我们需要一个reset requirejs配置函数来删除requirejs的实际实例,我们将使用require.undef函数来实现:

function end(){
    console.log("--------------------------- END requirejs:");
    all.map(function(item){
        require.undef(item);
    });
};

这就是全部!

稍后从我们的代码中我们可以强制重新加载应用程序,而无需重新加载浏览器,只调用end()函数和init_rquirejs()函数。例如,在jquery click事件中:

$('#init_button').on('click', function(){
    end();
    init_requirejs();
});

演示代码在 https://github.com/juanantonioruz/requirejs-force-reload

在线版 https://dl.dropboxusercontent.com/u/8688858/requirejs-force-reload/project.html

我希望这个解决方案适合你!