6

出于测试目的,我正在尝试删除一些 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中清除所有引用的机制?

非常感谢任何帮助

4

2 回答 2

8

我们目前正在尝试这种实现:

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

到目前为止还没有任何问题浮出水面。

编辑:IE 不太关心这个修复。不过 Chrome 和 FF 都很好。

此外,您应该尝试在 PhpStorm 中进行实时编辑。奇迹般有效。可以在这里看到一个演示。不过只有Chrome。

于 2012-12-14T11:39:31.747 回答
1

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

基本上,我们必须将 index.html 中指定的 main.js requirejs 控制器封装在一个 init 函数中。一旦定义好了,我们就调用这个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 点击事件中:

$('#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

我希望这个解决方案对你有用!

胡安

于 2013-08-29T21:55:06.673 回答