-
Notifications
You must be signed in to change notification settings - Fork 1
Runtime Detection
uupaa edited this page May 30, 2017
·
5 revisions
このエントリでは動作環境の特定方法と、
その結果を格納した app.userAgent.{ browser |
worker | node | nw | electron } について説明します。
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;
- Install and Setup
- Devlopment (TODO)
- Distribution
- Deployment (TODO)
- Application Structure
- Idioms
- Troubleshooting
- Keywords