2

私は最近、Webpack の調査を開始しました。これは、真の CSS モジュールの記述を可能にする優れた機能と、スマートなバンドルなどと、HMR があるためです。それが私がここにいる理由です。ブラウザーをリロードせずに JavaScript コードを更新できる React Redux プロジェクトの例を見てきました。うわー、私はそれは不可能だと思いました。

Vanilla JS である私の現在のプロジェクトで動作させるために、特にフードの下でどのように機能するかをもっと知りたいと思っていました。

その間、関数型プログラミング言語への関心から Emacs にたどり着きました。javascript と HTML を更新する emacs エディターで利用可能な串刺しモードがあることがわかりました! ブラウザを再ロードせずにリアルタイムで。

どちらもローカルサーバーを使用して変更をブラウザにプッシュし、何らかの形でコードを更新するクライアント上のスクリプトを使用していることを知っています。しかし、アプリケーションの状態をどのように保持するのでしょうか。React プロジェクトに関しては、アプリのコンポーネント ベースの性質により、コンポーネントを新しいものに置き換えることができますが、変数を検索して新しい値を再割り当てする方法がわかりません。たぶん、彼らはいくつかの評価魔法を使っています。しかし、よくわかりません。

  1. では、それらはどのように正確に機能するのでしょうか? 視点が間違っているのかもしれませんが、はっきりとしたイメージがありません。

  2. EmacsにはHTMLのライブアップデートもあります.webpack HMRはそれを行うことができますか?
    (私はJSでやっているので、HTMLについてはあまり気にしません。しかし、これら2つの違いを説明できると思います。)

  3. そうすることでどちらが良いですか?
    それぞれの長所と短所は何ですか? それとも、それらは単に世界の異なる部分であり、統合してさらに優れたものにすることができますか?

  4. ローカル Web サーバーのようなミドルウェアを必要とせず、ブラウザー拡張機能と通信するエディター プラグインだけで、さらに優れたオプションがあるのではないでしょうか?

PS: 仕事を最適化できる学習ツールは気にしません。

4

1 に答える 1

2

では、それらはどのように正確に機能するのでしょうか?

Webpack HMR ドキュメントから、

一般に、モジュール開発者は、このモジュールの依存関係が更新されたときに呼び出されるハンドラーを作成します。彼は、このモジュールが更新されたときに呼び出されるハンドラーを作成することもできます。

各モジュール タイプには、それ用に記述された更新ロジックが必要です。

串刺しモードリポジトリから、

Emacs が Lisp モードで下位の Lisp プロセスを処理するのと同じように、式は編集バッファーからオンザフライで送信され、ブラウザーで評価されます。

コードは文字列としてブラウザーに送信され、 global を介して実行されevalます。

そうすることでどちらが良いですか?それぞれの長所と短所は何ですか?

HMR プラグインが作成されたライブラリを使用する場合は、この機能を使用する価値があります。HMR フックのないライブラリは、それを利用できません。Webpack の HMR は非常に複雑なようで、そのドキュメントとそのプラグインは HMR の「実験的」状態について警告しています。したがって、おそらく信頼性が低く、開発に逆効果になる可能性があります。たとえば、リロードするモジュールは、リロードしないモジュールを正しくクリーンアップする必要があります。windowスクリプトがorにリスナーを追加documentし、それらを削除する方法を提供しない場合はどうなりますか?

テキスト エディターをブラウザーの追加の REPL として機能させたい場合は、skewer-mode. アプリケーションに変更を加えるには、その一部をグローバル変数で公開する必要があります。window.APP = {}APP.Dialog、 ... など、多数のサブモジュールが関連付けられた 1 つのグローバル オブジェクトをエクスポートするAPP.Formか、何百もの暗黙的なグローバル変数と関数を環境にリリースするだけかもしれません。これらのモジュール/関数/変数の定義を評価し、それらを使用するコードを評価することで、アプリケーションの変更を確認できます。たとえばAPP.initialize()、アプリをブートストラップする関数を呼び出したり、使用するビュー ライブラリで再描画をトリガーしたりします (通常は、要素をクリックするなどのユーザー アクションを実行します)。

アプリケーションがブラウザ コンソールで変更できるように作成されていない場合 (たとえば、コードを 1 つの大きなクロージャでラップする Browserify や Webpack などのモジュール コンパイラを使用している場合)、次のことはできません。skewer-mode. また、手動でコード スニペット/ファイルを評価して初期化コードを再実行する (そして、デバッグに時間を浪費する不可能なアプリケーション状態を作成する可能性がある) 方が速いか、ページを更新して以前の状態を再作成する方が速いかを検討てください。

これらのツールから得られるメリットは、アプリケーションの構造に大きく依存します。まさに適切な条件 (上記で説明したもの) の下で、彼らが快適な開発ワークフローを作成しているのを見ることができます。そうでなければ、それらは価値のある害を及ぼす可能性が高すぎるように思われます.

于 2016-05-06T01:25:17.867 に答える