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

また、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 に答える