需要JS删除定义强制重装(require js remove definition to force

2019-07-30 21:37发布

出于测试目的,我想删除一些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所有引用?

任何帮助非常赞赏

Answer 1:

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

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

没有问题,迄今已浮出水面。

编辑:IE不会在意此修复程序。 Chrome和FF是好的但是。

此外,你应该尝试在PhpStorm实时编辑。 奇迹般有效。 一个演示可以看到在这里 。 铬只虽然。



Answer 2:

这个答案是类似user1903890但我认为它容易跟随作出其他的实现。

基本上,我们在main.js requirejs控制器在我们的index.html指定的初始化函数来封装。 一旦它的定义,那么我们称这个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

我希望这个解决方案为你工作!

胡安



文章来源: require js remove definition to force reload