0

私はインターネットのさまざまな記事で多くを見てきましたが、名前空間は古くて邪悪なものであると多く聞いてきました。私は、ネームスペースの代わりにモジュールローダーでモジュールを使うべきであることをたくさん聞いたことがありますが、それらを使うことの客観的な利点が何であるか分かりません。私は名前空間に対するさまざまな議論について読んだことがありますが、私はそれほど説得力がありません。私はいくつかの議論を挙げるでしょうし、皆さんは、それらがなぜ有効であるかの実例を私に説明してください:Typescript/JavaScriptのネームスペースの目的は何ですか?

  • 名前空間は少なくとも1つのグローバル変数を作成します。しかし、それには何が問題なのですか?私は角度と呼ばれるグローバル変数があるかどうか気にしません。それはどんな害を及ぼすでしょうか?
  • モジュールでは、消費者はインポートされた変数の名前を決定します。輸入品の名前付けが本当に私に何を与えるのでしょうか?角度という名前の2つの変数が存在する可能性はどれくらいありますか?そして、それらのまれにとき(私はこれをテストしていませんが、それは理論的には動作するはずです)重複する変数名は我々だけでこれを行うことはできませんが存在します:モジュールローダーと

    var someOtherName = angular; 
    
    var angular = function() { 
    }; 
    
  • モジュールを簡単に束ねる作ります彼らは正しい順序でスクリプトを置くからです。しかし、彼らはあなたが明示的に彼らに注文を伝えるとき、あなたの輸入品を各ファイルの上に加えて、それをなぜしませんか?同様に、Typescriptは、tsconfig.jsonの "outFile"オプションを使用してトリプルスラッシュ参照をファイルの上に置くと、正しい順序でJavaScriptをビルドします。輸入とはどのように違いますか?

  • モジュールローダーがパフォーマンスを向上させます。これは本当に私を混乱させています。 Typescriptまたは.NETフレームワークのバンドルツールを使用して1つの巨大なJavaScriptファイルを生成したとします。どちらの場合でも1つのファイルが存在するため、パフォーマンスは同じではありませんか? SystemJSは必要に応じてこれらのスクリプトを動的にロードします。これは理にかなっていますが、私が25kbのJavaScriptファイルを持ってしまうと、オンデマンドで各kbを読み込むと本当にどれだけのパフォーマンスが向上するのでしょうか?結局のところ、それはわずか25kbです。

  • モジュールとモジュールローダーが1つのファイルにバンドルしてhtmlで参照するよりも優れているとしても、ライブラリをビルドするためにモジュールローダーを使用すると、ライブラリを使用するすべての人がローダー依存関係をインストールする必要がありますあまりにも?

ありがとうございます。

+0

ようこそスタックオーバーフロー! [ツアー]を見て回り、[ヘルプ]、特に[*どのように良い質問をしますか?*](/助け/やり方)、[* (*/help/dont-ask)、* [ここで私はどんな話題を聞くことができますか?*](/ help/on-topic)閉じる理由:* "多くの良い質問は、この質問への回答は、事実、参考文献、または特定の専門知識ではなく、概ね意見に基づいている傾向があります」*および/または広すぎる(** **質問/質問をお願いする)。 –

答えて

3

JavaScriptでは、現在のところ名前空間を使用することは悪い考えです。 これはJavaScriptのスーパーセットなので、これらの理由はすべてTypeScriptに当てはまります。

あなたは自己回答していますが、その重要性はわかりません。 私はできるだけそれらに対処しようとします。

暗黙の依存関係のため

あなたのコードは、名前空間、 を通じていくつかのライブラリを使用するときは、暗黙のうちにあなたのコードと、使用しているライブラリ間の依存関係を作成します。

これは、正しくロードされるように依存関係を管理するか、またはロード順序を正しく整えるようにコンパイラ/バンドラに指示する必要があることを意味します。

これは、この情報を管理する帯域外の場所があり、エラーが発生しやすいことを意味します。 明日このライブラリの使用をやめたらどうなりますか?あなたはそれを忘れるでしょうか? あなたのツールに仕事をさせる方がずっと良いです。

名前空間競合

これは、グローバル名前空間を使用する一般的な理由のオブジェクトです。 これはまれに起こると思われるかもしれませんが、例の1つはlodashunderscoreです。

名前空間のバージョン管理は、これは、名前空間の競合の別の形態です。 あなたのコードとあなたのライブラリの1つが同じライブラリxを使用していますが、異なるバージョン(そしてxに公開するxが公開されています)の場合、どのバージョンがグローバル名前空間xにあるべきですか?

モジュールがこの問題を解決しました。

(免責事項:現在、TypeScriptタイピングシステムは複数のバージョンを正しく処理しないため、いくつかの問題があり、対処する必要があります)。

は、ESMと

振盪ツリーを禁止、例えばrollupwebpackとしてバンドラは、ツリー振とうを行うことができます。 ライブラリから名前空間を使用すると、コードを分析したり、必要のないビットをツリーシェイクしたりするために、バンドラに情報が与えられません。

名前空間を通して、あなたのライブラリーを公開剛性

は、あなたのライブラリーの内部構造が露出され、それはあなたがあなたの消費者に重大な変更を作成することなく、あなたのコードをリファクタリングすることはできませんを意味します。

はい、アダプターやエイリアスを慎重に作成することで、どうにかして回避できますが、コードを維持するのがずっと難しくなり、混乱を招く可能性が高くなります。

セキュリティ

これは議論の余地があるが、グローバル名前空間でコードがアクセスできるようにすると、一部の国が他のコードで簡単にアクセスし、修正することができ、あなたのコードと可能性を意味します。

私は確信していますが、もっと多くの理由がありますが、これは私が今考えていることです。

+0

私はあなたの答えを感謝しますが、理論上問題を引き起こす可能性のあるものを挙げました。例えば、私はロダッシュとアンダースコアの両方を一緒に使うとは思っていませんし、別のバージョンで同じライブラリを持つことも考えています。それでも、C#のような他の多くの言語でも存在する可能性のある問題はありますが、C#では名前空間を落とさずに他の手段を使って問題を処理しています。 – User555

+0

これらの問題は、アプリケーションだけでなく、ライブラリにも当てはまります。モジュールローダーの前には、C#のような他の言語の問題のいくつかを解決するLinkerとDLLという概念がJavaScriptにはありません。 JavaScriptではそうではありません。これはスクリプト言語です。基本的には、その柔軟性のために名前空間を使用し、それを非常に制限します。 – unional

+0

同じ名前空間とクラス名を持つ2つのオブジェクトを使用する場合は、C#でエイリアスする必要がありますが、これはまれなケースです。私の問題2のように、これらのオブジェクトに「エイリアシング」の問題があると思いますか? – User555

関連する問題