[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Runtime Detection

uupaa edited this page May 30, 2017 · 5 revisions

このエントリでは動作環境の特定方法と、
その結果を格納した app.userAgent.{ browser | worker | node | nw | electron } について説明します。

Runtim detection

JavaScript の実行環境における特徴点を洗い出したものが以下の表になります。

Browser ESModules Worker Node.js NW.js Electron
render
Electron
main
typeof this object - - - object object -
typeof window object object - - object object -
typeof self object object object - object object -
typeof global - - - object object object object
typeof GLOBAL - - - object - object object
typeof document object object - - object object -
typeof WorkerLocation - - object - - - -
typeof __dirname - - - string - string string
typeof __filename - - - string - string string
setTimeout + "" native native native !native native native !native
process.type - - - - - "renderer" "browser"

このパズルを解き Global Object の獲得と、環境を特定するコードをコンパクトにまとめたものが以下になります。

GlobalObject の求め方は GlobalObject Idiom を参照してください。

const GlobalObject     = (typeof self !== "undefined") ? self : global;

const hasGlobal        = !!(GlobalObject.global);              // Node.js, NW.js, Electron
const processType      = !!((GlobalObject.process || 0).type); // Electron(render or main)
const nativeTimer      = !!(/native/.test(setTimeout));        // Node.js, Electron(main)

const worker           = !hasGlobal && ("WorkerLocation" in GlobalObject);      // Worker
const browser          = !hasGlobal && !worker && ("document" in GlobalObject); // Browser
const node             =  hasGlobal && !processType && !nativeTimer;            // Node.js
const nw               =  hasGlobal && !processType &&  nativeTimer;            // NW.js
const electron         =  hasGlobal &&  processType;                            // Electron(render or main)

app.userAgent.browser  = browser;
app.userAgent.worker   = worker;
app.userAgent.node     = node;
app.userAgent.nw       = nw;
app.userAgent.electron = electron;