如何定义常量在全局范围内nodejs

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何定义常量在全局范围内nodejs相关的知识,希望对你有一定的参考价值。

参考技术A 如果正在使用一系列node模块,或许是一个像Express.js一样的框架,突然需要使用几个全局变量。怎样在nodejs里创建全局变量呢?
对此最常见的建议是“不使用‘var’关键字声明一个变量”或“给object对象添加一个变量”或“给OBJECT对象添加一个变量”。你会使用哪种方式呢?

首先,让分析下global对象。打开一个终端,启动一个node命令提示界面:

[plain] view plain copy print?
$ node
>
在命令提示界面下看看关于global的所有信息:

[plain] view plain copy print?
> global
那是一个超级大的对象!事实上,看到了node的核心。所有在node进程里的对象都挂在这个对象上。如果非常熟悉javascript所在的浏览器环境,global对象是等同于window对象。

现在已经指导global对象是声明

[plain] view plain copy print?
> global.name
undefined
> global.name = 'El Capitan'
> global.name
'El Capitan'
> GLOBAL.name
'El Capitan'
> delete global.name
true
> GLOBAL.name
undefined
> name = 'El Capitan'
'El Capitan'
> global.name
'El Capitan'
> GLOBAL.name
'El Capitan'
> var name = 'Sparrow'
undefined
> global.name
'Sparrow'
令人兴奋的观察!

global和BLOBAL看起来是一个同一个东西且是一回事。确实,Global是global一个别名。
感兴趣的是一个使用还是不使用var关键字声明的变量附加到global对象上。在node里创建一个全局变量的最基本的方式就是通过不使用var关键字声明一个变量。这种做法与使用一个模块(module)略有不同
当启动一个node进程,将会启动一个模块,那么所有的模块将会被包含在它里面,所有模块都共享同一个global对象。应用上面的测试观察结合实际,你就会明白全局变量怎样在node里工作。然而有些轻微的变化,如果使用var关键字声明的变量将会保留在本地模块里;这些声明的变量没有附加到global对象里。
那么现在已经知道”没有使用var关键字声明的变量“,”向global里添加一个变量“,”给GLOBAL对象添加一个变量“,所有这些都是一回事。
在一个module里全局声明的变量能够被其他任何模块使用它们的名字来引用,没必要从global对象引用它们。但是这不意味这你就可以这样做。为什么呢?请看这样:

[plain] view plain copy print?
var company = 'Yahoo';
console.log(global.company); // 'Google'
console.log(company); // 'Yahoo'
当使用global.company时,知道使用的是全局变量,但是它的备用名字company在module是当作局部变量来使用的。

如果打算在你的node应用里使用全局变量,那么讨论的创建变量方法会工作的很好。然而,请不要过度使用它。话虽如此,还有可以不使用全局对象的替代解决方案吗?

是的,有这么一个,它涉及到module.exports的使用。使用例子来演示:
File: main.js

[plain] view plain copy print?
exports.company = 'Google';
var m = require('./mod');
File: mod.js

[plain] view plain copy print?
var company = require('./main').company;
console.log(company);
现在看看执行结果:

[plain] view plain copy print?
$ node main.js
Google
这样就实现了,一个其他模块的的变量可以在另外的模块中使用他而没有使用global对象。可以include main.js在其他的module来访问company名字。

注意:引用(include)一个已经被其他模块引用过的模块时,仅仅创建一个指向之前包体的引用,因此这意味着不会极度消耗内存。也因为没有重新创建一个真正的包体,在module里的所有初始化方法没有再执行。
因此,一个包体中,有2钟创建node全局变量的方法,一个是使用global对象,另一个是使用modules.exports。global方法适用小的应用,modules.exprots适用于大的应用。
参考技术B 1. 定义一些常量,使用闭包,匿名函数实现常量的定义。 例如: var Class = (function() var UPPER_BOUND = 100;//定义了常量 var Test=; // 定义了一个静态方法 获取常量的方法 Test.getUPPER_BOUND=function() return UPPER_BOUND; re...本回答被提问者采纳

Extjs如何定义一个全局常量文件

【中文标题】Extjs如何定义一个全局常量文件【英文标题】:Extjs how to define a global constants file 【发布时间】:2019-10-29 19:51:30 【问题描述】:

从here 和here 以及其他一些谷歌搜索中,我可以看到始终在代码中定义的全局常量是可能的。我需要用这些常量声明一个 XML 或 JSON 文件,这样如果我需要更改这些常量,就不会更改源代码。如何使用 Extjs 实现这一点?

【问题讨论】:

【参考方案1】:

在您的项目根目录中,您可以创建一个类似“data/”的目录并在其中添加一个 JSON 文件,例如 constants.json

然后,当您的应用启动时,您可以向该文件发出 ajax 请求并将其存储在某处,例如单例。

Constants.js:

Ext.define('MyApp.Constants', 
  alternateClassName: ['Constants'],
  singleton: true,

  SOME_CONSTANT: 'Abc',  // you can also add values that are not part of the file
  TIMEOUT: null // if you like to make it clear what values you are expecting, from constants.json
);

某处,可能在 RootController

Ext.Ajax.request(
   url: 'localhost:1841/data/constants.json',
   method: 'GET'
).then(function (result) 
   var data = Ext.Json.decode(result.responseText);

   Ext.Object.each(data, function (key, value) 
       Constants[key] = value; // assuming all key-values in result are valid constants...

   )
)

数据/常量.json:


  "TIMEOUT": 60000,
  "FOO": "BAR"

【讨论】:

以上是关于如何定义常量在全局范围内nodejs的主要内容,如果未能解决你的问题,请参考以下文章

Python常量池

打字稿:如何在全局范围内进行一些导入?

如何在全局范围内声明管道以在不同模块中使用?

在 C++ 中在哪里声明/定义类范围常量?

检查变量是不是设置在全局范围内?

如何在全局范围内初始化结构/类