require時、exportとmodule.exportsの違いは本当に分かりますか?
3339 ワード
面接会で聞きます
requireの運行メカニズムとキャッシュポリシーはご存知ですか?
requireロードモジュールの同期ですか?それとも非同期ですか?あなたの理解を話してください
exportsとmodule.exportsの違いは何ですか?
requireモジュールをロードする時にロードされたのは一体何ですか?
require
exportsとmodule.exportsについてはrequireキーワードに言及しなければなりません.Node.jsはCommunJS規格に従い、requireキーワードを使ってモジュールをロードすることを知っています.
requireは繰り返し問題を導入します.
問題:子供たちはrequireを使ってモジュールを導入する時に関連がありますか?複数のコードファイルの中で何度も同じモジュールを導入したら重複しますか?
C++においては、一般的には鞬铉IFNDEFなどのキーワードを使用して、ファイルの重複導入を回避しているが、Node.jsにおいてはこの点に関心が必要ではない.Node.jsはデフォルトでは先にキャッシュからモジュールをロードし、モジュールを一度ローディングした後、キャッシュにコピーを維持し、重複ローディングされたモジュールが直接キャッシュのコピーを抽出するので、つまり、いつでも各モジュールはキャッシュに一例しかないということです.
requireモジュールをロードする時は同期ですか?それとも非同期ですか?
まず質問に答えて、同期します.しかし面接官がなぜ同期なのか?それとも非同期なのか?この答えは決まっているわけではないですが、仲間たちはこれらの面を通して面接官に説明してくれます.は、共通の依存性のあるモジュールとして、もちろん一回にロードしたいです.同期がもっといいです. モジュールの個数は多くの場合限られています.また、Node.jsはrequireの時にロードされたモジュールを自動的にキャッシュします.また、訪問したのはローカルファイルです.発生したIOオーバーヘッドはほとんど無視できます. require()のキャッシュポリシー
Node.jsはrequireを介して導入されたファイルを自動的にキャッシュします.今度はファイルシステムを経由せずにキャッシュから直接読み込むようにします.ただし、このようなキャッシュ方式は、ファイルパスを介して位置しており、2つの完全に同じファイルであっても、異なる経路に位置している場合は、キャッシュにおいて2つの部分を維持している.通過できます
exportsとmodule.exportsの違い
jsファイル起動時
nodeでファイルを実行すると、このファイルにexportsとmoduleオブジェクトを作成します.moduleにはまたexports属性があります.彼らの関係は下の図のように、メモリエリアを指しています.
require()ロードモジュール
require()モジュールをロードする時、私達はいくつかのインスタンスコードを見にきます.
requireで導出された内容はmodule.exportsの指し示すメモリブロックの内容であり、exportsのものではない.
簡単に言えば、彼らの違いはexportsがmodule.exportsの引用にすぎず、後者を補助してコンテンツを追加するためのものです.メモリで指す方が分かりやすいです.
公式サイトの一例
公式文書の中のexportsの応用を見てください.
私たちはよくこのような書き方を見ます.
使用の一つの提案
提案:使う時にmodule.exportsを使うことをオススメします.
Node.jsは、各ファイルは独立したモジュールであると考えています.もしあなたのカバンが二つのファイルがあるなら、「a.js」と「b.js」を仮定して、「b.js」は「a.js」の機能を使うべきです.「a.js」はexportオブジェクトに属性を追加することによってこれらの機能を暴露しなければなりません.
一緒に勉強しましょう.
node学習交流グループ
交流グループが100人以上集まって、自動的にグループに入ることができません.グループアシスタントのマイク信号を追加してください.
requireの運行メカニズムとキャッシュポリシーはご存知ですか?
requireロードモジュールの同期ですか?それとも非同期ですか?あなたの理解を話してください
exportsとmodule.exportsの違いは何ですか?
requireモジュールをロードする時にロードされたのは一体何ですか?
require
exportsとmodule.exportsについてはrequireキーワードに言及しなければなりません.Node.jsはCommunJS規格に従い、requireキーワードを使ってモジュールをロードすることを知っています.
requireは繰り返し問題を導入します.
問題:子供たちはrequireを使ってモジュールを導入する時に関連がありますか?複数のコードファイルの中で何度も同じモジュールを導入したら重複しますか?
C++においては、一般的には鞬铉IFNDEFなどのキーワードを使用して、ファイルの重複導入を回避しているが、Node.jsにおいてはこの点に関心が必要ではない.Node.jsはデフォルトでは先にキャッシュからモジュールをロードし、モジュールを一度ローディングした後、キャッシュにコピーを維持し、重複ローディングされたモジュールが直接キャッシュのコピーを抽出するので、つまり、いつでも各モジュールはキャッシュに一例しかないということです.
requireモジュールをロードする時は同期ですか?それとも非同期ですか?
まず質問に答えて、同期します.しかし面接官がなぜ同期なのか?それとも非同期なのか?この答えは決まっているわけではないですが、仲間たちはこれらの面を通して面接官に説明してくれます.
Node.jsはrequireを介して導入されたファイルを自動的にキャッシュします.今度はファイルシステムを経由せずにキャッシュから直接読み込むようにします.ただし、このようなキャッシュ方式は、ファイルパスを介して位置しており、2つの完全に同じファイルであっても、異なる経路に位置している場合は、キャッシュにおいて2つの部分を維持している.通過できます
console.log(require.cache)
現在キャッシュ中のすべてのファイルを取得します.exportsとmodule.exportsの違い
jsファイル起動時
nodeでファイルを実行すると、このファイルにexportsとmoduleオブジェクトを作成します.moduleにはまたexports属性があります.彼らの関係は下の図のように、メモリエリアを指しています.
exports = module.exports = {};
一枚の図を見て、ここがもっと分かります.require()ロードモジュール
require()モジュールをロードする時、私達はいくつかのインスタンスコードを見にきます.
//koala.js
let a = ' ';
console.log(module.exports); // :{}
console.log(exports); // :{}
exports.a = ' '; // module.exports {a : ' '}
exports = ' '; // exports
//test.js
const a = require('/koala');
console.log(a) // {a : ' '}
上記のコードの印刷結果を見て、このような結論が得られるはずです.requireで導出された内容はmodule.exportsの指し示すメモリブロックの内容であり、exportsのものではない.
簡単に言えば、彼らの違いはexportsがmodule.exportsの引用にすぎず、後者を補助してコンテンツを追加するためのものです.メモリで指す方が分かりやすいです.
公式サイトの一例
公式文書の中のexportsの応用を見てください.
私たちはよくこのような書き方を見ます.
exports = module.exports = somethings
上のコードは以下の通りです.module.exports = somethings
exports = module.exports
原理は簡単で、つまりmodule.exportsが新しい対象を指す時、exportsはmodule.exportsとの引用を切断しました.exports=module.exportsを通じてexportsにmodule.exportsを改めて指し示してもいいです.使用の一つの提案
提案:使う時にmodule.exportsを使うことをオススメします.
Node.jsは、各ファイルは独立したモジュールであると考えています.もしあなたのカバンが二つのファイルがあるなら、「a.js」と「b.js」を仮定して、「b.js」は「a.js」の機能を使うべきです.「a.js」はexportオブジェクトに属性を追加することによってこれらの機能を暴露しなければなりません.
// a.js
exports.verifyPassword = function(user, password, done) { ... }
このステップを完了すると、「a.js」が必要なすべてのオブジェクトが「verifyPassword」という関数の属性を持つオブジェクトを獲得します.// b.js
require(‘a.js’) // { verifyPassword: function(user, password, done) { ... } }
しかし、もし私たちが直接にこの関数を暴露したいなら、それを特定のオブジェクトの属性として使うのではないですか?私たちはexportを書いて目的を達成することができますが、絶対にそれをグローバル変数としてはいけません.// a.js
module.exports = function(user, password, done) { ... }
私たちは「exports」をmoduleオブジェクトの一つの属性として認識しています.「module.exports」と「exports」の違いはとても重要です.そして、Node.js初心者にピットを踏ませることもよくあります.一緒に勉強しましょう.
node学習交流グループ
交流グループが100人以上集まって、自動的にグループに入ることができません.グループアシスタントのマイク信号を追加してください.