ยังตรวจจับสภาพแวดล้อมอื่น:
(ความหมาย: คำตอบส่วนใหญ่ที่นี่ไม่เป็นไร)
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 ?..
}
หวาดระแวงบิตใช่ไหม? คุณสามารถทำให้มากขึ้นโดยการตรวจสอบอย่างละเอียดมากGlobals
แต่อย่า!
สิ่งเหล่านี้สามารถปลอมแปลง / จำลองได้
ตัวอย่างเช่นการปลอม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
อยู่ในขอบเขตส่วนกลาง หรือ dev dev ตัวร้ายใส่รหัสใน env ของเรา
เราอาจป้องกันโค้ดของเราไม่ให้ทำงานเมื่อเราตรวจจับสิ่งนี้ แต่การพึ่งพาอื่น ๆ มากมายของแอพของเราอาจติดอยู่กับสิ่งนี้ ในที่สุดรหัสก็จะพัง หากรหัสของคุณดีพอคุณไม่ควรสนใจความผิดพลาดที่เกิดขึ้นจากคนอื่น
แล้วอะไรล่ะ
หากกำหนดเป้าหมาย 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]';
ถ้าเป็นไปได้สำหรับกรณีการใช้งานของคุณ; แทนที่จะตรวจจับสภาพแวดล้อม ทำการตรวจจับคุณสมบัติแบบซิงโครนัสภายในบล็อกลอง / catch (สิ่งเหล่านี้จะใช้เวลาไม่กี่มิลลิวินาทีในการดำเนินการ)
เช่น
function isPromiseSupported() {
var supported = false;
try {
var p = new Promise(function (res, rej) {});
supported = true;
} catch (e) {}
return supported;
}