Dans Node.js, vous pouvez définir des variables globales via l'objet "global" ou "GLOBAL" :
GLOBAL._ = require('underscore'); // But you "shouldn't" do this! (see note below)
ou plus utilement...
GLOBAL.window = GLOBAL; // Like in the browser
Dans le code source de Node.js, vous pouvez voir que ces éléments sont liés l'un à l'autre :
node-v0.6.6/src/node.js:
28: global = this;
128: global.GLOBAL = global;
Dans le code ci-dessus, "this" est le contexte global. Avec le contexte CommonJS (que Node.js utilise), l'objet "this" à l'intérieur d'un module (c'est-à-dire "votre code") est no le contexte mondial. Pour s'en convaincre, voir ci-dessous où je crache l'objet "this" puis l'objet géant "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: {} }
*/
** Note : en ce qui concerne le réglage de "GLOBAL._", en général vous devriez simplement faire var _ = require('underscore');
. Oui, vous faites cela dans chaque fichier qui utilise Underscore.js, tout comme en Java vous faites import com.foo.bar;
. Il est ainsi plus facile de comprendre ce que fait votre code, car les liens entre les fichiers sont "explicites". C'est légèrement ennuyeux, mais c'est une bonne chose. .... C'est la prédication.
Il y a une exception à chaque règle. J'ai eu exactement exactement un où je devais définir "GLOBAL._". Je créais un système pour définir des fichiers de "configuration" qui étaient essentiellement JSON, mais qui étaient "écrits en JavaScript" pour permettre un peu plus de flexibilité. Ces fichiers de configuration n'avaient pas d'instructions "require", mais je voulais qu'ils aient accès à Underscore.js (le fichier entière était basé sur Underscore.js et les templates Underscore.js), donc avant d'évaluer la "configuration", je mettais "GLOBAL._". Donc oui, pour chaque règle, il y a une exception quelque part. Mais vous avez intérêt à avoir une sacrée bonne raison et pas seulement "j'en ai marre de taper 'require', donc je veux rompre avec la convention".
0 votes
Où se trouve la ligne ci-dessus ?
3 votes
Je pense que vous ne devriez pas poser une nouvelle question si la réponse à votre question précédente ne fonctionne pas. Ajoutez plutôt un commentaire à cet endroit et supprimez l'étiquette "accepté".
0 votes
@alienhard mais c'est vieux, personne ne va le voir.
5 votes
Il suffit de la modifier pour qu'elle apparaisse dans la liste des questions actives.
3 votes
Utilice
exports
. C'est beaucoup mieux.1 votes
Peut-être que cela ne fonctionne pas parce que vous avez "use strict" ; en haut de votre fichier. C'est ainsi que cela fonctionne pour moi.