[javascript] NodeJS 모듈에서 상수를 어떻게 공유합니까?

현재 나는 이것을하고있다 :

foo.js

const FOO = 5;

module.exports = {
    FOO: FOO
};

그리고 그것을 사용 bar.js:

var foo = require('foo');
foo.FOO; // 5

더 좋은 방법이 있습니까? 내보내기 개체에서 상수를 선언하는 것이 어색합니다.



답변

을 사용하여 명시 적으로 전역 범위로 내보낼 수 있습니다 global.FOO = 5. 그런 다음 단순히 파일이 필요하고 반환 값을 저장하지 않아도됩니다.

그러나 실제로는 그렇게해서는 안됩니다. 제대로 캡슐화 된 상태를 유지하는 것이 좋습니다. 당신은 이미 올바른 생각을 가지고 있으므로, 당신이하고있는 일을 계속하십시오.


답변

내 생각에, 활용 Object.freeze은 DRYer와보다 선언적인 스타일 을 허용합니다. 내가 선호하는 패턴은 다음과 같습니다.

./lib/constants.js

module.exports = Object.freeze({
    MY_CONSTANT: 'some value',
    ANOTHER_CONSTANT: 'another value'
});

./lib/some-module.js

var constants = require('./constants');

console.log(constants.MY_CONSTANT); // 'some value'

constants.MY_CONSTANT = 'some other value';

console.log(constants.MY_CONSTANT); // 'some value'

오래된 성능 경고

다음 문제는 2014 년 1 월 v8에서 수정되었으며 더 이상 대부분의 개발자와 관련이 없습니다.

쓰기 가능을 false로 설정하고 Object.freeze를 사용하면 v8 ( https://bugs.chromium.org/p/v8/issues/detail?id=1858http://jsperf.com) 에서 큰 성능 저하가 발생합니다. / 성능 고정 개체


답변

기술적으로 const ECMAScript 사양의 일부가 아닙니다. 또한 앞서 언급 한 “CommonJS Module”패턴을 사용하여 이제 “일정한”값을 오브젝트 특성으로 변경할 수 있습니다. (동일한 모듈이 필요한 다른 스크립트로 변경 사항을 캐스케이드할지 확실하지 않지만 가능합니다)

공유 할 수있는 상수를 얻으려면 Object.create,Object.defineProperty 등을 Object.defineProperties. 을 설정하면 writable: false“일정한”값을 수정할 수 없습니다. 🙂

약간 장황하지만 (작은 JS로 변경할 수도 있음) 상수 모듈에 대해 한 번만 수행하면됩니다. 이러한 방법을 사용하면 제외하는 모든 속성의 기본값은 false입니다. (할당을 통해 속성을 정의하는 것과 반대로, 모든 속성의 기본값은 true)

그래서, 가설, 당신은 단지 설정할 수 valueenumerable밖으로 떠나, writable그리고configurable 그들은 기본적 것이기 때문에 false, 난 그냥 명확성을 위해 그들을 포함 시켰습니다.

업데이트 -새 모듈을 만들었습니다 ( 매우 사용 사례에 대한 도우미 기능을 가진 node-constants )을 .

constants.js-양호

Object.defineProperty(exports, "PI", {
    value:        3.14,
    enumerable:   true,
    writable:     false,
    configurable: false
});

constants.js-더 나은

function define(name, value) {
    Object.defineProperty(exports, name, {
        value:      value,
        enumerable: true
    });
}

define("PI", 3.14);

script.js

var constants = require("./constants");

console.log(constants.PI); // 3.14
constants.PI = 5;
console.log(constants.PI); // still 3.14


답변

ES6 방식.

foo.js로 내보내기

const FOO = 'bar';
module.exports = {
  FOO
}

bar.js로 가져 오기

const {FOO} = require('foo');


답변

나는 Dominic이 제안한 솔루션이 가장 좋은 솔루션이라는 것을 알았지 만 여전히 “const”선언의 한 가지 특징을 놓치고있다. “const”키워드를 사용하여 JS에서 상수를 선언하면 런타임이 아니라 구문 분석시 상수가 있는지 확인합니다. 따라서 코드 후반부에 상수 이름을 잘못 입력하면 node.js 프로그램을 시작하려고 할 때 오류가 발생합니다. 철자가 틀린 철자 검사보다 훨씬 좋습니다.

Dominic이 제안한 것처럼 define () 함수를 사용하여 상수를 정의하면, 철자가 틀린 경우 오류가 발생하지 않으며 철자가 틀린 상수의 값이 정의되지 않아 두통을 유발할 수 있습니다.

그러나 이것이 우리가 얻을 수있는 최선이라고 생각합니다.

또한 constans.js에서 Dominic의 기능이 개선되었습니다.

global.define = function ( name, value, exportsObject )
{
    if ( !exportsObject )
    {
        if ( exports.exportsObject )
            exportsObject = exports.exportsObject;
        else
            exportsObject = exports;
    }

    Object.defineProperty( exportsObject, name, {
        'value': value,
        'enumerable': true,
        'writable': false,
    });
}

exports.exportObject = null;

이 방법으로 다른 모듈에서 define () 함수를 사용할 수 있으며 constants.js 모듈 내부의 상수와 함수를 호출 한 모듈 내부의 상수를 정의 할 수 있습니다. 그런 다음 script 상수에 두 가지 방법으로 모듈 상수 선언을 수행 할 수 있습니다.

먼저:

require( './constants.js' );

define( 'SOME_LOCAL_CONSTANT', "const value 1", this ); // constant in script.js
define( 'SOME_OTHER_LOCAL_CONSTANT', "const value 2", this ); // constant in script.js

define( 'CONSTANT_IN_CONSTANTS_MODULE', "const value x" ); // this is a constant in constants.js module

둘째:

constants = require( './constants.js' );

// More convenient for setting a lot of constants inside the module
constants.exportsObject = this;
define( 'SOME_CONSTANT', "const value 1" ); // constant in script.js
define( 'SOME_OTHER_CONSTANT', "const value 2" ); // constant in script.js

또한 define () 함수를 상수 모듈에서만 호출하려면 (전역 객체를 팽창시키지 말고) constants.js에서 다음과 같이 정의하십시오.

exports.define = function ( name, value, exportsObject )

script.js에서 다음과 같이 사용하십시오.

constants.define( 'SOME_CONSTANT', "const value 1" );


답변

이전 프로젝트 경험에서이 방법이 좋습니다.

constants.js에서 :

// constants.js

'use strict';

let constants = {
    key1: "value1",
    key2: "value2",
    key3: {
        subkey1: "subvalue1",
        subkey2: "subvalue2"
    }
};

module.exports =
        Object.freeze(constants); // freeze prevents changes by users

main.js (또는 app.js 등)에서 다음과 같이 사용하십시오.

// main.js

let constants = require('./constants');

console.log(constants.key1);

console.dir(constants.key3);


답변

내 생각에는 const이 답변을 찾는 대부분의 사람들이 문제를 해결 . 불변 상수가 정말로 필요한 경우 다른 답변을 살펴보십시오. 모든 것을 체계적으로 유지하려면 모든 상수를 폴더에 저장 한 다음 전체 폴더가 필요합니다.

src / main.js 파일

const constants = require("./consts_folder");

src / consts_folder / index.js

const deal = require("./deal.js")
const note = require("./note.js")


module.exports = {
  deal,
  note
}

추신. 여기 deal그리고note main.js에 첫 번째 수준이 될 것입니다

src / consts_folder / note.js

exports.obj = {
  type: "object",
  description: "I'm a note object"
}

추신. objmain.js에서 두 번째 수준이 될 것입니다

src / consts_folder / deal.js

exports.str = "I'm a deal string"

추신. strmain.js에서 두 번째 수준이 될 것입니다

main.js 파일의 최종 결과 :

console.log(constants.deal);
출력 :

{거래 : {str : ‘I \’ma deal string ‘},

console.log(constants.note);
출력 :

참고 : {obj : {유형 : ‘object’, 설명 : ‘I \’ma note object ‘}}