Programing

node.js 표준 모듈의 전역 변수?

lottogame 2021. 1. 5. 07:39
반응형

node.js 표준 모듈의 전역 변수?


전역 변수가 나쁘다는 것을 알고 있습니다.

하지만 프레임 워크의 40 개 파일에서 노드의 모듈 "util"을 사용하는 경우 다음과 같은 전역 변수로 선언하는 것이 더 낫지 않습니까?

util = require('util');

40 개의 파일에 그 줄을 쓰는 대신 index.js 파일에?

나는 종종 각 파일에서 동일한 5-10 개의 모듈을 사용하기 때문에 항상 복사 붙여 넣기 대신 많은 시간을 절약 할 수 있습니다.

이 경우 DRY가 좋지 않습니까?


각 모듈은 독립적이어야합니다. 요구 사항은 각 모듈에 대한 첫 번째 이후에 비용이 들지 않습니다.

하나의 모듈 만 테스트하려면 어떻게해야합니까? 앱에있는 일부 "글로벌"요구 사항을 인식하지 못하기 때문에 많은 문제가 발생합니다.

예,이 경우에도 전역은 나쁩니다. 테스트 가능성, 캡슐화 및 유지 관리의 용이성 : 글로벌은 거의 항상 파멸합니다.

업데이트 된 답변 2012 년 1 월

이제 global개체는 각 모듈 내부의 전역입니다. 따라서 모듈 내의 전역 변수 (범위 없음)에 할당 할 때마다 global해당 모듈 개체의 일부가됩니다 .

따라서 global객체는 여전히 전역 이 아니며 그렇게 사용할 수 없습니다.

2012 년 12 월 업데이트 됨

이제 global개체는 응용 프로그램 내에서 전역 범위를 가지며 모든 모듈에서 액세스해야하는 모든 데이터 / 함수를 저장하는 데 사용할 수 있습니다.


공통 모듈을 가질 수 있습니다.

common.js :

Common = {
  util: require('util'),
  fs:   require('fs'),
  path: require('path')
};

module.exports = Common;

app.js :

var Common = require('./common.js');
console.log(Common.util.inspect(Common));

global.util = require('util');

노드 문서 에 전역 객체에 대한 섹션이 있습니다 .

그러나 전역은주의해서 사용해야합니다. 전역 공간에 모듈을 추가하면 테스트 가능성과 캡슐화가 줄어 듭니다. 그러나이 방법을 사용하는 것이 허용되는 경우가 있습니다. 예를 들어, 단위 테스트 스크립트에서 사용할 함수와 개체를 전역 네임 스페이스에 추가합니다.


이 스레드의 답변에 혼란 스럽습니다.

나는 이것을 할 수있다 ...

파일 : test.js

global.mytest = {
    x: 3,
    y: function() { console.log('Works.'); }
};

파일 : test2.js

console.log('Does this work?');
mytest.y();

파일 : server.js

require('test.js');
require('test2.js');

그리고 그것은 필요한 질문으로 작동하는 것 같습니다. 첫 번째 require는 mytest 개체를 전역 범위에 배치하고 두 번째 require는 다른 한정자없이 해당 개체에 액세스 할 수 있습니다.

나는 이것을 알아 내려고 노력했고 (Google 검색 에서이 스레드로 나를 데려왔다) 지금 나를 위해 작동하는 것을 게시하고 싶었습니다. 원래 답변 이후 상황이 변경되었을 수 있습니다.


I have successfully been using the process object for passing around my configuration object. While in theory suffering from the exact same issues as mentioned above (encapsulation, testability and so forth) it works fine when using only non-state modifying properties (a hash table with primitives, basically).


If you wrap your modules in blocks (e.g. anon functions) you can bind to a local name (via parameter or 'var') and then have any arbitrary long (perhaps "package" labeled) name you want (if you even need a global at this point).

For instance, my modules often look similar to:

;(function ($, $exp, other) {
  $(...)
  other.xyz()
  $exp.MyExportedObject = ...;
})(jQuery, window, some_module.other_expression) // end module

I use jQuery with noConflict, this the former, and the latter show you can do this for any expression -- global, require, computed, in-line, whatever... this same "wrapping" approach can be used to eliminate all (or almost all) "special named" globals -- globals must exist at some level, however, removing potentially conflicts is a very big win.

ReferenceURL : https://stackoverflow.com/questions/4140661/global-variables-for-node-js-standard-modules

반응형