또 다른 환경 감지 :
(의미 : 대부분의 답변은 괜찮습니다.)
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;
}