node.js全局variables?

我在这里问: node.js是否需要inheritance?

并被告知可以通过忽略var来将variables设置为全局范围。

这对我不起作用。

即:

_ = require('underscore'); 

不要使所需的文件可用。 我可以用express的app.set来设置,并且可以在其他地方使用它。

有人可以证实,这是应该工作? 谢谢。

global._ = require('underscore')

在节点中,可以通过“global”或“GLOBAL”对象设置全局variables:

 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”对象(即“您的代码”)不是全局上下文。 为了certificate这一点,请参阅下面我发送“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._”。 我正在创build一个定义“configuration”文件的系统,这些文件基本上是JSON,但是用“JS编写”来提供更多的灵活性。 这样的configuration文件没有“require”语句,但是我希望它们可以访问下划线(ENTIRE系统是以下划线和下划线模板为基础的),所以在评估“config”之前,我会设置“GLOBAL._”。 所以,对于每一条规则,都有一个例外。 但是你最好有一个很好的理由,不仅仅是“我厌倦了打字”的要求,所以我想打破惯例。

请考虑这个答案

使用GLOBAL关键字的其他解决scheme是维护/可读性(+名称空间污染和错误),当项目变大的噩梦。 我多次看到这个错误,并且有修理它的麻烦。

正确的解决scheme:

使用JS文件,然后使用模块导出。

例:

globals.js

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

那么如果你想使用这些,请使用require。

 var globals = require('globals'); //<< globals.js path globals.domain //<< Domain. 
 global._ = require('underscore'); 

请注意,使用GLOBAL已弃用:

 (node:59502) DeprecationWarning: 'GLOBAL' is deprecated, use 'global' 

我的评论:

如果你知道你在做什么,我认为可以使用全球。 当我每次需要使用图书馆的时候都需要一些图书馆(假设我使用的是数十或者数百个文件),我认为这破坏了很多图书馆的要点,并快速使用。 为什么命名为_ ,而不是amazingLibraryCalledUnderscore

所以对于我来说,需要写30个字符的var _ = require('underscore'); 比最低要求(1个字符)多3000% 。 是。 在编写代码时,我着迷于让我的生活更轻松。 我只是讨厌重复明显的事情。 如果我曾经告诉该死的节点我的意思是I want you to know _ means I use underscore我不想再说一遍。

所以 – 我相信当你控制你的代码时,你应该试着让它变得性感 。 我相信每次写30个字,做这么简单的事情是该死的丑!

PS。 当你说I control my code ,要相信你自己,你至less有一次失去这个控制的经验。

那么像global.MYAPI = {}这样的全局命名空间global.MYAPI = {}

 global.MYAPI._ = require('underscore') 

在camilo-martin的评论之后编辑 :所有其他海报谈论涉及的坏模式。 因此,抛开这个讨论,让全局定义variables(OP的问题)的最好方法是通过命名空间。

@tip: http ://thanpol.as/javascript/development-using-namespaces/

你可以使用全局对象。

 var X = ['a', 'b', 'c']; global.x = X; console.log(x); //['a', 'b', 'c'] 

我同意使用global / GLOBAL命名空间来设置全局的东西是不好的做法,根本不用理论( 理论上是操作的词)。 然而(是的,操作)我用它来设置自定义错误类:

 // Some global/config file that gets called in initialisation global.MyError = [Function of MyError]; 

是的,这里禁忌,但是如果你的网站/项目在整个地方使用自定义错误,你基本上需要在任何地方或至less在某个地方定义:

  1. 首先定义Error类
  2. 在你扔它的脚本
  3. 在你抓到它的脚本

在全局命名空间中定义我的自定义错误可以节省我需要我的客户错误库的麻烦。 映像抛出一个自定义错误,其中的自定义错误是未定义的。

另外,如果这是错误的,请让我知道,因为我最近才刚刚开始这样做