私はここで尋ねました: node.jsには継承が必要ですか?
変数を省略して、変数をグローバルスコープに設定できると言われました。
これは私にはうまくいきません。
つまり:
_ = require('underscore');
必要なファイルで_を使用可能にしません。Expressで設定しapp.set
て、他の場所で利用できるようにすることもできます。
誰かがこれが動作するはずだと確認できますか?ありがとう。
exports
ます。それははるかに優れています。
私はここで尋ねました: node.jsには継承が必要ですか?
変数を省略して、変数をグローバルスコープに設定できると言われました。
これは私にはうまくいきません。
つまり:
_ = require('underscore');
必要なファイルで_を使用可能にしません。Expressで設定しapp.set
て、他の場所で利用できるようにすることもできます。
誰かがこれが動作するはずだと確認できますか?ありがとう。
exports
ます。それははるかに優れています。
回答:
次のglobal
ように使用できます:
global._ = require('underscore')
window
は、はグローバルオブジェクトです。document
のプロパティですwindow
。
ノードでは、「グローバル」または「グローバル」オブジェクトを介してグローバル変数を設定できます。
GLOBAL._ = require('underscore'); // but you "shouldn't" do this! (see note below)
またはもっと便利に...
GLOBAL.window = GLOBAL; // like in the browser
ノードのソースから、これらが互いにエイリアスされていることがわかります。
node-v0.6.6/src/node.js:
28: global = this;
128: global.GLOBAL = global;
上記のコードでは、「this」はグローバルコンテキストです。commonJSモジュールシステム(どのノードが使用するか)では、モジュール内の「this」オブジェクト(つまり「your code」)はグローバルコンテキストではありません。これの証明については、以下を参照して、「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で行うように、アンダースコアを使用するすべての単一ファイルでそれを行いますimport com.foo.bar;
。これにより、ファイル間のリンケージが「明示的」であるため、コードが何をしているかを理解しやすくなります。少し煩わしいですが、良いことです。....それが説教です。
すべてのルールに例外があります。「GLOBAL._」を設定する必要のあるインスタンスが1つだけありました。私は基本的にJSONである「config」ファイルを定義するためのシステムを作成していましたが、もう少し柔軟性を持たせるために「JSで書かれました」。このような構成ファイルには「require」ステートメントはありませんでしたが、アンダースコアにアクセスできるようにしたいので(システム全体がアンダースコアテンプレートとアンダースコアテンプレートに基づいていました)、「config」を評価する前に「GLOBAL._」を設定しました。つまり、すべてのルールについて、どこかに例外があります。ただし、「require」と入力するのに飽きたので、慣習を破るのではなく、十分な理由がある方がよいでしょう。
.js
ファイルに入れて、構成をrequire
エクスポートする前に呼び出すことができないのはなぜですか?
GLOBALキーワードを使用する他のソリューションは、プロジェクトが大きくなると、保守/可読性(+名前空間の汚染とバグ)の悪夢になります。私はこの間違いを何度も見たことがありますが、修正する手間がかかりました。
JSファイルを使用してから、モジュールのエクスポートを使用します。
例:
globals.js
var Globals = {
'domain':'www.MrGlobal.com';
}
module.exports = Globals;
次に、これらを使用する場合は、requireを使用します。
var globals = require('globals'); //<< globals.js path
globals.domain //<< Domain.
globals.domain
しかし、変更についてはどうですか?
のようなグローバル名前空間はどうですか global.MYAPI = {}
global.MYAPI._ = require('underscore')
camilo-martinのコメントの後に編集する:他のすべてのポスターは、関係する悪いパターンについて話します。したがって、その議論はさておき、変数をグローバルに定義する(OPの質問)ための最良の方法は、名前空間を使用することです。
@ヒント:http ://thanpol.as/javascript/development-using-namespaces
require
が目的です!名前空間を使用することは問題ありませんがglobal.foo = global.foo || {}
、すべてのファイルや何かにすべてを適用するのではありません。名前空間を定義するファイルが必要です。子供たちのためにしてください。
グローバルオブジェクトのみを使用できます。
var X = ['a', 'b', 'c'];
global.x = X;
console.log(x);
//['a', 'b', 'c']
グローバルを設定するためにグローバル/グローバル名前空間を使用することは悪い習慣であり、理論的にはまったく使用しないことに同意します(理論的には運用上の言葉です)。ただし、(はい、運用)カスタムエラークラスを設定するために使用します。
// Some global/config file that gets called in initialisation
global.MyError = [Function of MyError];
はい、ここではタブーですが、サイト/プロジェクトが場所全体でカスタムエラーを使用している場合、基本的にはどこでも、または少なくともどこかでそれを定義する必要があります。
グローバル名前空間でカスタムエラーを定義すると、顧客エラーライブラリを要求する手間が省けます。そのカスタムエラーが定義されていないカスタムエラーをスローするイメージング。
また、これが間違っている場合は、最近これを始めたばかりなので、お知らせください