2012-08-10 22 views
4

出於測試目的,我試圖刪除一些amd模塊並從服務器重新加載更新的版本 - 目標是不刷新瀏覽器。要求js刪除定義以強制重新加載

我目前正在執行以下操作,但瀏覽器仍然不會從網絡重新加載項目。

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引用的機制?

任何幫助非常讚賞

+0

嗨,秦,你檢查我的迴應?我認爲它解決了你的問題,不是嗎? – tangrammer 2013-10-21 12:11:49

回答

6

目前,我們正在嘗試這樣實現:到目前爲止

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

沒有問題也浮出水面。

編輯:IE不關心這個修復。 Chrome和FF很好。

此外,您應該嘗試在PhpStorm中進行實時編輯。奇蹟般有效。演示可見here。只有Chrome瀏覽器。

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);  
}; 

文件我們需要一個復位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

我希望這個解決方案爲你工作!

胡安