Node.js에서 스크립트가 실행 중인지 확인하는 방법


159

JavaScript 엔진을 독립적으로 유지하려는 Node.js 스크립트에서 필요한 스크립트가 있습니다.

예를 들어 exports.x = y;Node.js에서 실행중인 경우에만 하고 싶습니다 . 이 테스트를 어떻게 수행 할 수 있습니까?


이 질문을 게시 할 때 Node.js 모듈 기능이 CommonJS 기반인지 몰랐습니다 .

내가 준 구체적인 예에서보다 정확한 질문은 다음과 같습니다.

스크립트가 CommonJS 모듈로 필요한지 어떻게 알 수 있습니까?


3
나는 아무 생각도 없어 이 작업을 수행하려고하는,하지만 엄지 손가락의 규칙대로보다는 엔진 감지 기능 감지를 사용한다. quirksmode.org/js/support.html
Quentin

4
이것은 실제로 기능 감지를 구현하는 방법에 대한 요청이지만 질문 자체는 잘 설명되어 있지 않습니다.
monokrome

내 자신의 사용을위한 라이브러리를 게시, 이것이 도움이 될 것입니다 npmjs.com/package/detect-is-node
abhirathore2006


질문에 대한 한 가지 문제와 대부분의 답변은 Browser 또는 Node.js라는 두 가지 가능성 만 있다는 가정입니다. Oracle Java Nashorn의 경우와 같이 브라우저 나 Node.js가 아닐 수도 있습니다. JDK가 설치된 경우 jjs 명령을 사용하면 스크립트를 실행할 수 있습니다. 그러나 Nashorn과 Node.js에는 많은 차이점이 있으므로 어떤 가정도 할 수 없습니다. 그리고 미래에 어떤 옵션이 제공 될 수 있는지 누가 알겠습니까? 기능 감지가 필요합니다.

답변:


80

CommonJS 지원을 살펴보면 ,이 방법이다 Underscore.js을 라이브러리를 수행합니다

편집 : 업데이트 된 질문 :

(function () {

    // Establish the root object, `window` in the browser, or `global` on the server.
    var root = this; 

    // Create a reference to this
    var _ = new Object();

    var isNode = false;

    // Export the Underscore object for **CommonJS**, with backwards-compatibility
    // for the old `require()` API. If we're not in CommonJS, add `_` to the
    // global object.
    if (typeof module !== 'undefined' && module.exports) {
            module.exports = _;
            root._ = _;
            isNode = true;
    } else {
            root._ = _;
    }
})();

여기 예제는 모듈 패턴을 유지합니다.


45
브라우저가 지원할 수있는 CommonJS 지원을 감지합니다.
mikemaccana

7
여기에 문제가 있고 못 박는 사람이 "못을 박았다". 브라우저에서 CommonJS를 시도하고 있으며 사용중인 모듈 로더는 module.exports를 정의 하므로이 솔루션은 내가 노드에 있다고 잘못 알려줍니다.
Mark Melville

1
@MarkMelville 틀림없이 이것은 OP가 요구하는 것이므로 문제가 되지 않습니다 .
Ross

13
내 말이 형편 없다 이 솔루션에 문제가 있음을 의미합니다. OP가 승인했을 수도 있지만 동의하지 않습니다.
Mark Melville

7
이것은 가장 확실한 대답이 아닙니다.
user3751385

107

모든 웹 사이트가 동일한 변수를 쉽게 선언 할 수 있기 때문에 Node.js에서 실행을 감지하는 신뢰할 수있는 방법은 없지만 window기본적으로 Node.js에 객체 가 없으므로 다른 방법으로 이동하여 내부에서 실행 중인지 확인할 수 있습니다 브라우저.

이것은 브라우저와 Node.js에서 모두 작동 해야하는 lib에 사용하는 것입니다.

if (typeof window === 'undefined') {
    exports.foo = {};

} else {
    window.foo = {};
}

그것은 아직도 경우 폭발 할 수 windowNode.js를에 정의되어 있지만 없다 좋은의 명시 적 떠날 필요가 있기 때문에 사람이 작업을 수행 할 이유는, var나에 대한 속성 설정 global개체를.

편집하다

CommonJS 모듈로 스크립트가 필요한지 여부를 감지하는 것은 쉽지 않습니다. commonJS가 지정한 것은 A : 함수에 대한 호출을 통해 모듈이 포함되며 requireB : 모듈은 exports객체의 속성을 통해 항목을 내 보냅니다 . 이제 이것이 구현 방식이 기본 시스템에 남아 있습니다. Node.js는 모듈의 내용을 익명 함수로 래핑합니다.

function (exports, require, module, __filename, __dirname) { 

참조 : https://github.com/ry/node/blob/master/src/node.js#L325

그러나 미친 물건 을 통해 그것을 감지하려고 하지 말고arguments.callee.toString() 대신 브라우저를 확인하는 위의 예제 코드를 사용하십시오. Node.js는 더 깨끗한 환경이므로 window거기에 선언 되지는 않습니다 .


2
"Node.js는 더 깨끗한 환경이므로 창이 선언 될 것 같지 않습니다.": 글쎄, 방금 스크립트가 node.js + JSDOM에 의해 에뮬레이트 된 브라우저에서 실행되고 있는지 확인하는 방법을 찾았습니다 또는 일반 브라우저에서 ... 그 이유는 setTimeout을 사용하여 URL 위치를 확인하기 위해 무한 루프를 사용하기 때문입니다. 브라우저에서는 괜찮지 만 node.js 스크립트는 계속 실행됩니다 ... 그래서 창이있을 수 있습니다 모든 :) 후 Node.js를 스크립트에
에릭 Bréchemier

1
@Eric 전역 범위에있을 것이라고 의심 window합니다. 모듈의 첫 번째 줄에서와 같이 무언가를 가져 오지 않으면 아무런 문제가 없습니다. 또한 익명 함수를 실행하고 확인할 수 [[Class]]의를 this에서 "클래스"를 참조 (단 비 엄격 모드에서 작동) 안에 : bonsaiden.github.com/JavaScript-Garden/#typeof
이보 Wetzel는

1
내 문제는 OP와 약간 다릅니다. 스크립트가 필요하지 않습니다.이 스크립트는 JSDOM에 의해 에뮬레이트 된 창을 전역 컨텍스트로로드합니다 ... 여전히 일반적인 모듈과 다른 컨텍스트에서 node.js + V8에 의해 실행됩니다.
Eric Bréchemier 2019

1
아마 ... 나는 다른 방향으로 갔다 : 1) 무한 루프 생성을 피하기 위해 onhashchange (창의 "onhashchange")에 대한 지원을 감지합니다. 2) 기본 node.js 스크립트의 에뮬레이트 된 창에서 onhashchange 속성을 설정하여 지원을 시뮬레이션합니다.
Eric Bréchemier

1
typeof self === 'object'typeof window === 'undefined'웹 작업자 범위에서 실패하기 때문에 더 안전 할 수 있습니다 .
Lewis

45

현재 오해의 소지가있는 기능 감지로 인해 Electron 의 노드 환경을 인식 하지 못하는 잘못된 노드 감지를 발견했습니다. 다음 솔루션은 프로세스 환경을 명시 적으로 식별합니다.


Node.js 만 식별

(typeof process !== 'undefined') && (process.release.name === 'node')

이것은 노드 프로세스에서 실행 중인지를 발견합니다. process.release"현재 [노드] 릴리스와 관련된 메타 데이터"가 포함되어 있습니다.

산란 후 io.js 후에도 값이 process.release.name될 수 있습니다 io.js( process-doc 참조). ). 노드 준비 환경을 올바르게 감지하려면 다음과 같이 확인해야합니다.

노드 식별 (> = 3.0.0) 또는 io.js

(typeof process !== 'undefined') &&
(process.release.name.search(/node|io.js/) !== -1)

이 문장은 Node 5.5.0, Electron 0.36.9 (Node 5.1.1) 및 Chrome 48.0.2564.116으로 테스트되었습니다.

노드 식별 (> = 0.10.0) 또는 io.js

(typeof process !== 'undefined') &&
(typeof process.versions.node !== 'undefined')

@daluege의 의견은 더 일반적인 증거에 대해 생각하도록 영감을주었습니다. Node.js에서 작동해야합니다.> = 0.10 . 이전 버전의 고유 식별자를 찾지 못했습니다.


추신 : OP가 다른 질문에 대한 답을 찾고 있었지만 질문이 여기로 이어 지므로 여기에 답을 게시하고 있습니다.


2
이것은 가장 신뢰할만한 접근법 인 것 같습니다. 감사합니다. 버전> = 3.0.0에서만 작동하지만.
filip

@daluege-영감을 주셔서 감사합니다. 불행히도 0.10보다 낮은 증거를 찾지 못했습니다.
Florian Breisch

3
나는 웹팩 반응하여 발견 processprocess.version번들 내에 존재, 내가 대한 추가 검사를 추가 있도록 process.version위치를 process.release.node클라이언트 측에서 정의되지를하지만, 서버 측의 값으로 노드 버전은
아론

@Aaron : 힌트를 주셔서 감사합니다. process.version변수에 대한 정의를 찾을 수 없었습니다 (react, webpack 또는 react-webpack에서). 버전 변수가 정의에 추가되도록 정의 된 힌트를 주시면 감사하겠습니다. 노드에 release.node 제약에 따라> = 3.xx
플로리안 브레 쉬

2
하나의 라이너와 더 안전한 :function isNodejs() { return typeof "process" !== "undefined" && process && process.versions && process.versions.node; }
brillout

25

코드가 실행중인 환경을 파악하려고 할 때 발생하는 문제는 모든 객체를 수정하고 선언하여 환경에 고유 한 객체와 프로그램에 의해 수정 된 객체를 파악하는 것이 거의 불가능하다는 것입니다.

그러나 어떤 환경에 있는지 확인하기 위해 사용할 수있는 몇 가지 트릭이 있습니다.

밑줄 라이브러리에서 일반적으로 사용되는 솔루션으로 시작해 보겠습니다.

typeof module !== 'undefined' && module.exports

이 기술은 실제로 require함수가 호출되면 this객체를 빈 객체로 재설정 하고 다시 재정의 하므로 서버 측에 완벽하게 적합 module합니다. 즉, 외부 변조에 대해 걱정할 필요가 없습니다. 코드가로드 된 한require 있으면 안전합니다.

그러나 이것은 누구나 module원하는 객체처럼 보이도록 쉽게 정의 할 수 있기 때문에 브라우저와 다릅니다 . 한편으로는 원하는 동작 일 수도 있지만 라이브러리 사용자가 전역 범위에서 사용할 수있는 변수도 결정합니다. 누군가가 이름을 가진 변수를 사용하고 싶을 수도 있습니다.module 을 있습니다.exports 있습니다. 다른 환경에서 해당 변수 이름을 사용하기 때문에 다른 사람이 사용할 수있는 변수를 누가 판단해야합니까?

그러나 트릭은 스크립트가 전역 범위 (스크립트 태그를 통해로드 된 경우)에로드되고 있다고 가정하면 브라우저가 허용하지 않기 때문에 변수를 외부 클로저에 예약 할 수 없다는 것입니다 . 이제 노드에서 this객체는 빈 객체이지만 module변수는 여전히 사용 가능 하다는 것을 기억하십시오 . 외부 폐쇄로 선언 되었기 때문입니다. 그런 다음 추가 검사를 추가하여 밑줄의 검사를 수정할 수 있습니다.

this.module !== module

이를 통해 누군가 module브라우저의 전역 범위에서 선언 하면 this객체가 객체에 배치되어 this.module모듈과 동일한 객체가 되기 때문에 테스트가 실패 합니다. 노드 this.module에는 존재하지 않으며 module외부 폐쇄 내에 존재하므로 테스트가 동일하지 않으므로 테스트에 성공합니다.

따라서 최종 테스트는 다음과 같습니다.

typeof module !== 'undefined' && this.module !== module

참고 : 이제 module전역 범위에서 변수를 자유롭게 사용할 수 있지만 새 클로저를 만들고 그 module안에 선언 한 다음 해당 클로저 내에 스크립트를로드하여 브라우저에서이 변수를 무시할 수 있습니다 . 이 시점에서 사용자는 노드 환경을 완전히 복제하고 있으며 자신이 무엇을하고 있는지 알고 노드 스타일 요구 사항을 수행하려고합니다. 코드가 스크립트 태그에서 호출 된 경우에도 새로운 외부 클로저로부터 안전합니다.


2
와우, 하나의 라이너의 각 부분의 근거를 명확하게 설명해 주셔서 감사합니다.
Jon Coombs

가지고 Cannot read property 'module' of undefined이 예를 들어 모카 시험에서 정의되지 않기 때문에
srghma

20

의도적으로 명시 적으로 방해하지 않는 한 다음은 브라우저에서 작동합니다.

if(typeof process === 'object' && process + '' === '[object process]'){
    // is node
}
else{
    // not node
}

밤.


4
var process = {toString : function () {return '[객체 프로세스]'; }};
Nick Desaulniers 2014

1
당신이 process+''대신 사용 하는 이유 가 process.toString()있습니까?
harmic

3
거의. 대신 이것을 사용하십시오 :Object.prototype.toString.call(process)
sospedra

2
이것이이 질문에 대한 최선의 답변입니다.
loretoparisi 2016 년

3
@harmic : var process = null;두 번째 경우가 실패합니다. Javascript와 Java에서 표현식 은 불쾌 할 때 , 전자가 생성 하거나 후자가 오류를 발생시키는 경우 '' + xx.toString()제외하고 동일한 결과를 생성합니다 . x"null""undefined"
joeytwiddle

17

다음과 같이 멋진 방법이 있습니다.

const isBrowser = this.window === this;

이것은 브라우저에서 전역 'this'변수에 'window'라는 자체 참조가 있기 때문에 작동합니다. 이 자체 참조는 노드에 없습니다.

  • 브라우저에서 'this'는 'window'라는 전역 객체에 대한 참조입니다.
  • 노드 'this'는 module.exports 객체에 대한 참조입니다.
    • '이것'은 아닙니다 'global'이라는 Node 전역 객체에 대한 참조 .
    • 'this'는 모듈 변수 선언 공간에 대한 참조 가 아닙니다 .

위의 제안 된 브라우저 확인을 중단하려면 다음과 같은 작업을 수행해야합니다

this.window = this;

확인을 실행하기 전에.


왜 간단하지 const isBrowser = this.window !== undefined않습니까? 그리고 노드의 이론 상으로는 this.window = this솔루션을 속일 수 있습니다 .
타일러 롱

11

또 다른 환경 감지 :

(의미 : 대부분의 답변은 괜찮습니다.)

function isNode() {
    return typeof global === 'object'
        && String(global) === '[object global]'
        && typeof process === 'object'
        && String(process) === '[object process]'
        && global === global.GLOBAL // circular ref
        // process.release.name cannot be altered, unlike process.title
        && /node|io\.js/.test(process.release.name)
        && typeof setImmediate === 'function'
        && setImmediate.length === 4
        && typeof __dirname === 'string'
        && Should I go on ?..
}

약간 편집증이 맞습니까? 더 많은 글로벌 을 확인하여 더 자세한 정보를 얻을 수 있습니다 .

그러나하지 마십시오!.

어쨌든 위의 모든 내용은 위조 / 시뮬레이션 될 수 있습니다.

예를 들어 global객체 를 위조하려면

global = {
    toString: function () {
        return '[object global]';
    },
    GLOBAL: global,
    setImmediate: function (a, b, c, d) {}
 };
 setImmediate = function (a, b, c, d) {};
 ...

이것은 노드의 원래 전역 객체에 첨부되지 않지만 window 브라우저 객체에 . 따라서 브라우저 내부의 Node env에 있음을 의미합니다.

인생은 짧다!

환경이 위조되는지 걱정합니까? 바보 같은 개발자가 전역 변수를 선언 할 때 발생합니다.global 가 전역 범위에서 된 합니다. 또는 어떤 사악한 개발자가 우리 환경에 코드를 주입합니다.

우리는 이것을 잡을 때 코드가 실행되는 것을 막을 수 있지만 앱의 다른 많은 의존성이 이것에 잡힐 수 있습니다. 결국 코드가 깨질 것입니다. 코드가 충분하다면, 다른 사람들이했을 수있는 각각의 어리석은 실수는 신경 쓰지 않아야합니다.

그래서 무엇?

2 개의 환경을 타겟팅하는 경우 : 브라우저 및 노드;
"use strict"; 및 중 하나를 간단히 확인 window또는 global; 문서에서 코드가 이러한 환경 만 지원한다는 것을 명확하게 표시하십시오. 그게 다야!

var isBrowser = typeof window !== 'undefined'
    && ({}).toString.call(window) === '[object Window]';

var isNode = typeof global !== "undefined" 
    && ({}).toString.call(global) === '[object global]';

가능한 경우 사용 사례; 환경 감지 대신; try / catch 블록 내에서 동기식 기능 탐지를 수행합니다. 실행하는 데 몇 밀리 초가 걸립니다.

예 :

function isPromiseSupported() {
    var supported = false;
    try {
        var p = new Promise(function (res, rej) {});
        supported = true;
    } catch (e) {}
    return supported;
}

9

제안 된 솔루션의 대부분은 실제로 위조 될 수 있습니다. 강력한 방법은을 Class사용하여 전역 객체 의 내부 속성 을 확인하는 것 Object.prototype.toString입니다. 내부 클래스는 JavaScript에서 위조 될 수 없습니다 :

var isNode = 
    typeof global !== "undefined" && 
    {}.toString.call(global) == '[object global]';

2
이것은 browserify에서 다시 나타납니다.
alt

1
당신은 그것을 테스트 했습니까? browserify가 객체의 내부 클래스를 어떻게 바꿀 수 있는지 알 수 없습니다. 이를 위해서는 JavaScript VM에서 코드를 변경하거나 덮어 쓰는 것이 필요하며 Object.prototype.toString이는 실제로 나쁜 습관입니다.
Fabian Jakobs

나는 그것을 테스트했다. var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {};
browserify의 기능

Chrome에서이 ({}.toString.call(window))같다는 것을 알 수 있습니다 "[object global]".
Vanuan

2
window.toString()생산 하기 때문에 이상하다"[object Window]"
Vanuan

5

프로세스 객체를 사용하고 execPath 를 확인하는 것은node 어떻습니까?

process.execPath

프로세스를 시작한 실행 파일의 절대 경로 이름입니다.

예:

/ usr / local / bin / 노드


2
무엇에 대해 window.process = {execPath: "/usr/local/bin/node"};?
Константин Ван


4

위의 내용에 대한 변형은 다음과 같습니다.

(function(publish) {
    "use strict";

    function House(no) {
        this.no = no;
    };

    House.prototype.toString = function() {
        return "House #"+this.no;
    };

    publish(House);

})((typeof module == 'undefined' || (typeof window != 'undefined' && this == window))
    ? function(a) {this["House"] = a;}
    : function(a) {module.exports = a;});

이를 사용하려면 마지막 두 번째 줄의 "House"를 브라우저에서 모듈 이름으로 지정하고 원하는 모듈 값 (일반적으로 생성자 또는 객체 리터럴)을 게시하십시오. ).

브라우저에서 전역 객체는 window이며, 자체에 대한 참조가 있습니다 (window.window, == window). 브라우저가 아니거나 브라우저에 있다고 믿기를 원하는 환경이 아니면 이런 일이 발생하지 않을 것 같습니다. 다른 모든 경우에 전역 '모듈'변수가 선언 된 경우 전역 변수를 사용합니다.


4

processnode.js를 확인 하는 데 사용 하고 있습니다.

if (typeof(process) !== 'undefined' && process.version === 'v0.9.9') {
  console.log('You are running Node.js');
} else {
  // check for browser
}

또는

if (typeof(process) !== 'undefined' && process.title === 'node') {
  console.log('You are running Node.js');
} else {
  // check for browser
}

여기에 문서화


2
process.title변경 가능
Ben Barkay

그런 다음 제목을 변경했는지 확인하십시오. 또는 process.version을 사용하십시오
Chris

도서관을 위해 글을 쓰고 있다면 (예를 들어) 제목이 무엇인지 기대할 수 없습니다.
Ben Barkay

3

이 글을 쓰는 시점에서이 답변은 JavaScript의 새로운 기능을 활용한다는 점에서 "곧 제공 될"옵션에 가깝습니다.

const runtime = globalThis.process?.release?.name || 'not node'
console.log(runtime)

runtime값이 될 것이다 nodenot node.

언급했듯이 이것은 몇 가지 새로운 JavaScript 기능에 의존합니다. globalThisECMAScript 2020 사양의 최종 기능입니다. 옵션 체인 / nullish 병합합니다 ( ?의 일부globalThis.process?.release?.name )은 Chrome 80과 함께 제공되는 V8 엔진에서 지원됩니다. 4/8/2020부터이 코드는 브라우저에서 작동하지만 노드 13 분기가 사용되므로 노드에서 작동하지 않습니다 V8 7.9.xxx. 노드 14 (4/21/2020의 출시 예정)는 V8 8.x +를 사용해야한다고 생각합니다.

이 접근 방식에는 현재의 제한적인 용량이 있습니다. 하나; 브라우저 / 노드가 출시되는 속도에 따라 결국 신뢰할 수있는 단일 라이너가됩니다.


1
이것이 정답입니다! 그리고 모두 노드 14 btw를 사용해야합니다
Sceat

2

Node.js에는 process객체가 있으므로 생성하는 다른 스크립트가 process없는 한 코드를 사용하여 노드에서 코드를 실행할 수 있는지 확인할 수 있습니다.

var isOnNodeJs = false;
if(typeof process != "undefined") {
  isOnNodeJs = true;
}

if(isOnNodeJs){
  console.log("you are running under node.js");
}
else {
  console.log("you are NOT running under node.js");
}

2

이것은 서버 측과 클라이언트 측 자바 스크립트 간의 호환성을 보장하는 매우 안전하고 직접적인 방법이며 클라이언트 측 브라우저 브라우저, RequireJS 또는 CommonJS와 함께 작동합니다.

(function(){

  // `this` now refers to `global` if we're in NodeJS
  // or `window` if we're in the browser.

}).call(function(){
  return (typeof module !== "undefined" &&
    module.exports &&
    typeof window === 'undefined') ?
    global : window;
}())

1

편집 : 업데이트 된 질문 : "스크립트가 commonjs 모듈로 필요한지 어떻게 알 수 있습니까?" 나는 그것이 할 수 있다고 생각하지 않습니다. 스펙 이 모듈에 제공되어야 하므로 exports오브젝트 ( if (typeof exports === "object")) 인지 확인할 수 있지만, 사용자에게 알려주 는 것은 오브젝트입니다. :-)exports


원래 답변 :

NodeJS 특정 기호가 있다고 확신합니다 ( EventEmitter, 아마도 아니오, require이벤트 모듈을 얻는 데 사용해야 합니다. 아래 참조) )가 확실하지만 David가 말했듯이 이상적으로는 기능을 감지하는 것이 좋습니다. 그렇게하는 것이 합리적이라면 환경보다.

업데이트 : 아마도 다음과 같습니다.

if (typeof require === "function"
    && typeof Buffer === "function"
    && typeof Buffer.byteLength === "function"
    && typeof Buffer.prototype !== "undefined"
    && typeof Buffer.prototype.write === "function") {

그러나 그것은 단지 당신이 requireNodeJS와 매우 비슷한 환경에 있다는 것을 말해줍니다 Buffer. :-)


웹 사이트에 모든 것을 설정하여 여전히 문제를 해결할 수 있습니다 ... 단지 과잉입니다.) 노드 환경이 깨끗하기 때문에 브라우저에 있는지 확인하는 것이 더 쉽습니다.
Ivo Wetzel

1
@Ivo : 예, 마지막 문장을보십시오. windowNodeJS 응용 프로그램 내에서 변수 를 정의하여 확인을 쉽게 중단 할 수 있습니다 . :-)
TJ Crowder

1
@Ivo : 나는에 노출되지 않습니다 모든 사람이 정의 된 경우 놀라게 windowNodeJS 모듈에 그들이에 의존 코드를 포함 할 수 있도록 window전역 객체 인이 아니라 그 코드를 수정할했다입니다. 나는 그것을하지 않을 것입니다, 당신 은하지 않을 것이지만, 나는 누군가 가지고 있습니다. :-) 아니면 방금 window다른 것을 의미 하는 데 사용 했습니다.
TJ Crowder

1
@Ivo : yuiblog.com/blog/2010/04/09/… window 객체가 node.js에 정의 될 수있는 이유 중 하나입니다.
slebetman

1
@TJCrowdertypeof process !== "undefined" && process.title === "node"
Raynos

0
const isNode =
  typeof process !== 'undefined' &&
  process.versions != null &&
  process.versions.node != null;


-1

node.js의 소스를 가져 와서 변수를 정의하도록 변경하십시오. runningOnNodeJS . 코드에서 해당 변수를 확인하십시오.

개인 버전의 node.js를 소유 할 수없는 경우 프로젝트에서 기능 요청을여십시오. 실행중인 node.js 버전을 제공하는 변수를 정의하도록 요청하십시오. 그런 다음 해당 변수를 확인하십시오.


1
그것은 다시 그의 (기본적으로 해결할 수없는) 문제를 해결하지 못합니다. 브라우저에서 그러한 변수를 다시 만들 수 있습니다. 더 나은 방법은 스크립트가 window전역 을 작성하지 못하게 하는 것입니다. 기능 요청을 제출 할 것입니다.
Ivo Wetzel

@ Ivo : YUI 및 jQuery와 같은 익숙한 라이브러리를 사용하여 서버 측 dom 조작을 수행하기 위해 jsdom ( github.com/tmpvar/jsdom )을 사용하는 코드를 손상시키는 나쁜 생각입니다 . 그리고 현재이 작업을 수행하는 코드가 있습니다.
slebetman

@slebetman 아니요 jsdom을 중단하지 않습니다. 나는 var 선언문 global 에서와 같이 global이라고 말하고 있습니다 . 예제 코드는 문장을 사용합니다 . 전역 네임 스페이스로 유출 한 사람들은 물론 자체 포함 모듈의 개념을 얻지 못합니다.var
Ivo Wetzel

@Ivo는 폭력적입니다. 사람들이 케이크를 과식하기 때문에 케이크를 먹을 수있는 능력을 가져야한다는 것과 같습니다. 당신은 해야한다 모듈 간을 작동하는 라이브러리를 달성하기 위해 글로벌 네임 스페이스를 혼란. 아니면 하나의 모듈로 모두 마무리 할 수 ​​있지만 요점은 무엇입니까?
벤 Barkay

-1

아주 오래된 게시물이지만, try-catch로 require 문을 감싸서 해결했습니다.

try {
     var fs = require('fs')
} catch(e) {
     alert('you are not in node !!!')
}

2
사실은 아닙니다. "nodeish"require () 호출을 사용하기 위해 browserify를 사용할 수 있습니다
fat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.