215

ここで質問しました: Node.js には継承が必要ですか?

そして、変数を省略することで変数をグローバルスコープに設定できると言われました。

これは私にはうまくいきません。

つまり、次の_場合、必要なファイルで が使用可能になりません。

_ = require('underscore');

Express.js で設定しapp.setて、他の場所で使用できるようにすることもできます。

それは、これがどのように機能するはずですか?

4

6 に答える 6

242

global次のように使用できます。

global._ = require('underscore')
于 2011-03-27T20:10:01.433 に答える
221

Node.jsでは、「global」または「GLOBAL」オブジェクトを介してグローバル変数を設定できます。

GLOBAL._ = require('underscore'); // But you "shouldn't" do this! (see note below)

またはもっと便利に...

GLOBAL.window = GLOBAL;  // Like in the browser

Node.jsソースから、これらが相互にエイリアス化されていることがわかります。

node-v0.6.6/src/node.js:
28:     global = this;
128:    global.GLOBAL = global;

上記のコードでは、「this」はグローバルコンテキストです。CommonJSモジュールシステム(Node.jsが使用)では、モジュール内の「this」オブジェクト(つまり「yourcode」)はグローバルコンテキストではありません。これを証明するために、以下の「this」オブジェクトを吐き出し、次に巨大な「GLOBAL」オブジェクトを吐き出すところを参照してください。

console.log("\nTHIS:");
console.log(this);
console.log("\nGLOBAL:");
console.log(global);

/* Outputs ...

THIS:
{}

GLOBAL:
{ ArrayBuffer: [Function: ArrayBuffer],
  Int8Array: { [Function] BYTES_PER_ELEMENT: 1 },
  Uint8Array: { [Function] BYTES_PER_ELEMENT: 1 },
  Int16Array: { [Function] BYTES_PER_ELEMENT: 2 },
  Uint16Array: { [Function] BYTES_PER_ELEMENT: 2 },
  Int32Array: { [Function] BYTES_PER_ELEMENT: 4 },
  Uint32Array: { [Function] BYTES_PER_ELEMENT: 4 },
  Float32Array: { [Function] BYTES_PER_ELEMENT: 4 },
  Float64Array: { [Function] BYTES_PER_ELEMENT: 8 },
  DataView: [Function: DataView],
  global: [Circular],
  process:
   { EventEmitter: [Function: EventEmitter],
     title: 'node',
     assert: [Function],
     version: 'v0.6.5',
     _tickCallback: [Function],
     moduleLoadList:
      [ 'Binding evals',
        'Binding natives',
        'NativeModule events',
        'NativeModule buffer',
        'Binding buffer',
        'NativeModule assert',
        'NativeModule util',
        'NativeModule path',
        'NativeModule module',
        'NativeModule fs',
        'Binding fs',
        'Binding constants',
        'NativeModule stream',
        'NativeModule console',
        'Binding tty_wrap',
        'NativeModule tty',
        'NativeModule net',
        'NativeModule timers',
        'Binding timer_wrap',
        'NativeModule _linklist' ],
     versions:
      { node: '0.6.5',
        v8: '3.6.6.11',
        ares: '1.7.5-DEV',
        uv: '0.6',
        openssl: '0.9.8n' },
     nextTick: [Function],
     stdout: [Getter],
     arch: 'x64',
     stderr: [Getter],
     platform: 'darwin',
     argv: [ 'node', '/workspace/zd/zgap/darwin-js/index.js' ],
     stdin: [Getter],
     env:
      { TERM_PROGRAM: 'iTerm.app',
        'COM_GOOGLE_CHROME_FRAMEWORK_SERVICE_PROCESS/USERS/DDOPSON/LIBRARY/APPLICATION_SUPPORT/GOOGLE/CHROME_SOCKET': '/tmp/launch-nNl1vo/ServiceProcessSocket',
        TERM: 'xterm',
        SHELL: '/bin/bash',
        TMPDIR: '/var/folders/2h/2hQmtmXlFT4yVGtr5DBpdl9LAiQ/-Tmp-/',
        Apple_PubSub_Socket_Render: '/tmp/launch-9Ga0PT/Render',
        USER: 'ddopson',
        COMMAND_MODE: 'unix2003',
        SSH_AUTH_SOCK: '/tmp/launch-sD905b/Listeners',
        __CF_USER_TEXT_ENCODING: '0x12D732E7:0:0',
        PATH: '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:~/bin:/usr/X11/bin',
        PWD: '/workspace/zd/zgap/darwin-js',
        LANG: 'en_US.UTF-8',
        ITERM_PROFILE: 'Default',
        SHLVL: '1',
        COLORFGBG: '7;0',
        HOME: '/Users/ddopson',
        ITERM_SESSION_ID: 'w0t0p0',
        LOGNAME: 'ddopson',
        DISPLAY: '/tmp/launch-l9RQXI/org.x:0',
        OLDPWD: '/workspace/zd/zgap/darwin-js/external',
        _: './index.js' },
     openStdin: [Function],
     exit: [Function],
     pid: 10321,
     features:
      { debug: false,
        uv: true,
        ipv6: true,
        tls_npn: false,
        tls_sni: true,
        tls: true },
     kill: [Function],
     execPath: '/usr/local/bin/node',
     addListener: [Function],
     _needTickCallback: [Function],
     on: [Function],
     removeListener: [Function],
     reallyExit: [Function],
     chdir: [Function],
     debug: [Function],
     error: [Function],
     cwd: [Function],
     watchFile: [Function],
     umask: [Function],
     getuid: [Function],
     unwatchFile: [Function],
     mixin: [Function],
     setuid: [Function],
     setgid: [Function],
     createChildProcess: [Function],
     getgid: [Function],
     inherits: [Function],
     _kill: [Function],
     _byteLength: [Function],
     mainModule:
      { id: '.',
        exports: {},
        parent: null,
        filename: '/workspace/zd/zgap/darwin-js/index.js',
        loaded: false,
        exited: false,
        children: [],
        paths: [Object] },
     _debugProcess: [Function],
     dlopen: [Function],
     uptime: [Function],
     memoryUsage: [Function],
     uvCounters: [Function],
     binding: [Function] },
  GLOBAL: [Circular],
  root: [Circular],
  Buffer:
   { [Function: Buffer]
     poolSize: 8192,
     isBuffer: [Function: isBuffer],
     byteLength: [Function],
     _charsWritten: 8 },
  setTimeout: [Function],
  setInterval: [Function],
  clearTimeout: [Function],
  clearInterval: [Function],
  console: [Getter],
  window: [Circular],
  navigator: {} }
*/

**注:「GLOBAL._」の設定に関しては、通常は。を実行する必要がありますvar _ = require('underscore');。はい、Javaの場合と同じように、Underscore.jsを使用するすべてのファイルでこれを行いますimport com.foo.bar;。これにより、ファイル間のリンクが「明示的」であるため、コードが何をしているのかを簡単に把握できます。少し迷惑ですが、良いことです。....それが説教です。

すべてのルールには例外があります。「 GLOBAL._ 」を設定する必要があるインスタンスが1つだけあります。基本的にJSONであるが、もう少し柔軟性を持たせるために「JavaScriptで記述された」「構成」ファイルを定義するためのシステムを作成していました。このような構成ファイルには「require」ステートメントはありませんでしたが、Underscore.jsにアクセスできるようにしたかったので(システム全体がUnderscore.jsおよびUnderscore.jsテンプレートに基づいていました)、「構成」を評価する前に「グローバル。_"。そうですね、すべてのルールについて、どこかに例外があります。しかし、「「require」と入力するのに飽きたので、慣例を破りたい」というだけでなく、正当な理由がある方がよいでしょう。

于 2012-03-06T19:15:04.823 に答える
80

GLOBAL キーワードを使用する他のソリューションは、プロジェクトが大きくなると、維持/可読性 (+ 名前空間の汚染とバグ) にとって悪夢です。私はこの間違いを何度も見て、それを修正するのに苦労しました。

JavaScript ファイルを使用してから、モジュールのエクスポートを使用します。

例:

ファイルglobals.js

var Globals = {
    'domain':'www.MrGlobal.com';
}

module.exports = Globals;

次に、これらを使用する場合は、requireを使用します。

var globals = require('globals'); // << globals.js path
globals.domain // << Domain.
于 2015-09-09T15:36:29.780 に答える