📖 文章导航
- 系统定义
- 浏览器定义
- 操作系统和浏览器信息获取
- 应用
- React 三方库
声明:全文手撸代码,移动端部分场景未经完全测试。
🐞 放弃兼容 IE 浏览器;且仅支持识别主流浏览器,不能精确 识别国产浏览器!当然,有兴趣的话可以拓展 UA 标识来识别更多浏览器。
💡 源码仓库地址: GITEE.COM
系统定义
'use strict';
function _OS(name, identifier) {this.name = name;this.identifier = identifier;
}
_OS.prototype.getVersion = () => '';
const getAppleVersion = (ua) => {const [versionInfo] = ua.match(/ [0-9]+(_|.)?[0-9]*(_|.)?[0-9]*/gi);const osVersion = versionInfo?.replaceAll('_', '.')?.trim();return osVersion || '';
};
const iOS = new _OS('iOS', ['iPhone', 'iPhone OS']);
iOS.getVersion = getAppleVersion;
const iPadOS = new _OS('iPad', ['iPad']);
iPadOS.getVersion = getAppleVersion;
const MacOS = new _OS('Mac OS', ['Macintosh', 'Mac OS']);
MacOS.getVersion = getAppleVersion;
const windowsOS = [{name: '10',identifier: ['10', '10.0']},{name: '7',identifier: ['6.1']},{name: '8',identifier: ['6.3']},{name: 'XP',identifier: ['5.1']}
];
const Windows = new _OS('Windows', ['Windows']);
Windows.getVersion = (ua) => {const [versionInfo] = ua.match(/ ?Windows NT [0-9]+.?[0-9]*/g);const osVersion = versionInfo?.replaceAll('Windows NT', '')?.trim();const matchVersion = windowsOS.find(({ identifier }) => identifier.some((id) => id === osVersion))?.['name'];return matchVersion || '';
};const Android = new _OS('Android', ['Android']);
Android.getVersion = (ua) => {const [versionInfo] = ua.match(/ ?Android [0-9]+.?[0-9]*/g);const osVersion = versionInfo?.replaceAll('Android', '')?.trim();return osVersion || '';
};const Linux = new _OS('Linux', ['Linux']);const systems = [iOS, iPadOS, MacOS, Windows, Android, Linux];export { systems as default, iOS, iPadOS, MacOS, Windows, Android, Linux };
浏览器定义
'use strict';
function _Browser(name, identifier) {this.name = name;this.identifier = identifier;
}
_Browser.prototype.getVersion = function (ua) {const { identifier = '' } = this;const [versionInfo] = ua.match(new RegExp(`(Version|${identifier})\/[0-9]+(\.?[0-9]*)*`, 'gi')) || [];const [_versionInfo] = (versionInfo||'').trim().split(' '); const [, version] = (_versionInfo||'').trim().split('/');return (version ?? '').trim();
};
const Firefox = new _Browser('Firefox', 'Firefox');
const Opera = new _Browser('Opera', 'OPR');
const MicrosoftEdge = new _Browser('Microsoft Edge', 'Edg');
const Edge = new _Browser('Edge', 'Edge');
const Safari = new _Browser('Safari', 'Safari');
const Chrome = new _Browser('Chrome', 'Chrome');const browsers = [Firefox, Opera, MicrosoftEdge, Edge, Chrome, Safari];
export { browsers as default, Firefox, Opera, MicrosoftEdge, Edge, Safari, Chrome };
操作系统和浏览器信息获取
import browsers from './browsers';
import systems from './systems';
export const getOSInfo = () => {const { userAgent } = navigator;const osInfo = systems.find(({ identifier }) => identifier.some((id) => userAgent.includes(id)));const osVersion = osInfo.getVersion(userAgent);return {osName: osInfo.name,osVersion};
};
export const getBrowserInfo = () => {const { userAgent } = navigator;const browserInfo = browsers.find(({ identifier }) => userAgent.includes(identifier));const browserVersion = browserInfo.getVersion(userAgent); return {browserName: browserInfo.name,browserVersion};
};
export const isMobile = () => {const isMatch = !!window.navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i);return isMatch;
};
export const getDeviceInfo = () => {return {...getOSInfo(),...getBrowserInfo(),isMobile: isMobile()};
};export { getDeviceInfo as default };
应用
在 Javascript 模块中
import getDeviceInfo from 'browser';const deviceInfo = getDeviceInfo();console.log(deviceInfo);
在 HTML 中
裸导入配置 (仅 Chrome、Edge 支持)
在 HTML
的 script
标签中可以通过配置路径的方式实现裸导入 (类似于定义别名而不用通过路径引入)
script
标签 type
设置为 importmap
- 标签内部配置模块的导入标识及文件路径
<script type&#61;"importmap">{ "imports": { "browser": "./lib/index.js" } }script>
完整代码
DOCTYPE html>
<html lang&#61;"zh-CN"><head><meta charset&#61;"UTF-8" /><meta http-equiv&#61;"X-UA-Compatible" content&#61;"IE&#61;edge" /><meta name&#61;"viewport" content&#61;"width&#61;device-width, initial-scale&#61;1.0" /><title>Documenttitle>head><body>body><script type&#61;"importmap">{ "imports": { "browser": "./lib/index.js" } }script><script type&#61;"module">import getDeviceInfo from &#39;browser&#39;;const { osName, osVersion, browserName, browserVersion } &#61; getDeviceInfo();window.addEventListener(&#39;load&#39;, () &#61;> {document.write(&#96;${osName}: ${osVersion}
${browserName}: ${browserVersion}&#96;);});console.log(getDeviceInfo());script>
html>
React 三方库
react-device-detect
npm i react-device-detect
use-mobile-detect-hook
npm install use-mobile-detect-hook