2016-07-14 4 views
2

この質問Javascriptを交換することは(たとえSO上で)インターネット上で何度も何度もポップアップしますが、私は、この問題に対する満足のいく解決策を見つけていない:はオンザフライ

どのように我々は置き換える/変更することができます実行中のWebアプリケーションのJavascriptコードで、ページをリロードしないでください。

多くの人が「不可能ではありません」と答えています。 IntelliJ IDEAライブ編集プラグインのいくつかの実験では、それが可能であることが証明されています。しかし、私はこの機能のIDEに縛られたくありません。 (ボーナス:ブラウザに依存しない)

Here is what I tried:

  1. アドオン//#sourceURLに= whatever.js私の動的にロードされたスクリプト
  2. にクロムがどんなローカルのマッピングwhatever.js
  3. を含むにフォルダを追加します。 jsをネットワークwhatever.js
  4. のいずれかに変更するコードは、Webページにまったく影響しません。実際、ネットワーク側のファイルを編集すると、開発ツールの奇妙な「点滅」が発生します。

私はそれを変更したら、変更JSは魔法のウェブページに適用するために期待していないことを理解し、私は実行ポイントが再び渡されたとき、それは新しいコードを使用することを期待してください。

例:トリガーボタン考える

  1. '警告(1);'
  2. 'alert(2);に変更してください。
  3. 私はボタンが 'alert(2);'

多くの依存関係があり、ワークフローでかなり遅れて起動される巨大なスクリプトは、ページを更新するのが本当に大きな問題です。そのため、オンザフライで動作するソリューションを見つける必要があります。

+0

質問に関連するコードを追加してください:[mcve] –

+0

intellijは、クライアント側のjavascriptだけでなく、プラグインからブラウザへのユーザースクリプトを実行している可能性があります。 – Iceman

+0

@NinaScholz私はしたいですが、私は本当にできません。多くの依存関係を持つ大規模なWebアプリケーションです。私の質問の目標は、2016年にJSを置き換えることは明らかに可能なので、このトピックを中心に議論を始めることでした。すべてのブラウザや外部ツールを使ってこのような機能を実現するのはすばらしいことです。 – bytespirit

答えて

1

まず第一に、あなたが求めているのは本当に扱いにくいアプリケーションでこれを許可すれば、セキュリティ上の問題を見つけることができます。とにかくそれは不可能ではありません。


しかしあなたはあなたの例では、これが手順に従って達成したい場合:「警告(1をトリガーボタン考える

var message = "1"; // this must be a global variable!!!! 

function showMessage() { 
    alert(message); 
} 

は、このようなコードスニペットを作ります); '

メイクボタン機能、すなわち呼び出し:onclick='showMessage()'

変更に '警告(2);' 私はボタンが 'alert(2);'

message = "2"; 

すべてです:あなたはちょうどmessage値を変更する必要が2にアラートメッセージを変更するには意味のイベントを検知すると

は、今では、簡単です。

1

オプション1:Livereload

私は限り、あなたはあなたのサーバー上で使用することができますlivereloadの理由を開発するために、それはだと言うでしょう。

サーバーの種類によって異なります。私はapach、glassfish、そして他のjavaの世界のものの大きな専門家ですが、JS(nodejs)の世界でこれはより短い方法です。

は(npm-livereloadのリンク)

ハック:あなたはこのようなJS、ビルトインlivereloadを持つ単純なのNode.jsサーバとCSSなどの静的・ファイルを扱うことができます。

オプション2:jRebel

私はJRebeljsについておそらく、この問題を扱うことができるかわかりません。とにかく、それは開発プロセスに良い加えてだ - 少なくとも、それはJavaの「ホットリロードするだろう:。あなたのために

オプション3:jsファイル内の各機能:あなたはmonkey-patching技術を使用することができる猿パッチング

それはあなたがstring変えることができ、単なる文字列です - new Function()で>function

同じように:。

var foo = { 
    sum: function (a, b) {return a+b;} 
} 

//... 

obj.sum = new Function(....) //Now you're replaced the original code 

チェックthis article猿のパッチを当てるための優雅な方法について

そしてサルのパッチ適用のための私のlibの小さな広告:monkey-punch

オプション4:新しいタグを取り付け

あなたはとのjsファイルを添付することができます

var s = document.createElement("script"); 
s.type = "text/javascript"; 
s.src = "http://somedomain.com/somescript"; 
$("head").append(s); 

ます」 DOM要素(スクリプト、スタイル)を削除し、いつでも新しい要素を追加することもできます。

+0

あなたはhttp://livereload.com/について話していますか?私は私の研究中にこれを見つけましたが、javascriptについての言葉はありません。ここではgrailsを使用しています。 – bytespirit

+0

私は実際には、livereloadに基づいて、gulpとgruntプラグイン(antに似ています)だけで作業しています。通常はlivereloadはjs、cssなどのすべてのものをリロードする必要があります.JSの単語ではwebserverのようなbundlerを使っていますが、browsersync(check it、btw)やlivereloadのシンプルなサーバーなどです。 –

+0

@bytespiritあなたはJrebelを試していますか? –

関連する問題