React的exenv模块简析
来源:互联网 发布:ant编译java文件 编辑:程序博客网 时间:2024/05/22 15:25
问题1:为什么要使用exenv模块
React的ExecutionEnvironment模块被单独抽取出来,用于在其他组件或者包中使用,其简单用法如下:
var ExecutionEnvironment = require('exenv');// You now have...ExecutionEnvironment.canUseDOM // is the DOM available? i.e window document etc. ExecutionEnvironment.canUseWorkers // are Web Workers available?ExecutionEnvironment.canUseEventListeners // are Events available? i.e addEventListener etc.ExecutionEnvironment.canUseViewport // is there a viewport? i.e window.screen在React的0.13中的ExecutionEnvironment包中包含了一个isInWorker属性,其值为!canUseDOM(如果在worker线程中,那么是不能操作DOM的),但是因为其只用于React的内部,同时有点hack的味道,无法用于其他的模块,所以后来被废弃掉了。虽然很多包和组件都使用React私有的ExecutionEnvironment库去检测一些特性,特别是服务端渲染。例如:
canUseDOM = require('react/lib/ExecutionEnvironment').canUseDOM; // BAD
但是使用这种React内部方法的方式并非最佳实践,因为在未来很可能被废弃掉
问题2:其内部是如何检测我们需要的特性的,如canUseDOM等
/*! Copyright (c) 2015 Jed Watson. Based on code that is Copyright 2013-2015, Facebook, Inc. All rights reserved.*//* global define */(function () {'use strict';var canUseDOM = !!(typeof window !== 'undefined' &&window.document &&window.document.createElement //window,window.document,window.document.createElement同时存在);var ExecutionEnvironment = {canUseDOM: canUseDOM,canUseWorkers: typeof Worker !== 'undefined',//在检测浏览器的webworker使用就是采用这种方式canUseEventListeners:canUseDOM && !!(window.addEventListener || window.attachEvent),canUseViewport: canUseDOM && !!window.screen //判断window.screen是否存在};if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {define(function () {return ExecutionEnvironment;});} else if (typeof module !== 'undefined' && module.exports) {module.exports = ExecutionEnvironment;} else {window.ExecutionEnvironment = ExecutionEnvironment;}}());
上面的代码应该很容易看懂,此处不做分析
参考资料:
React的exenv模块
0 0
- React的exenv模块简析
- React-Native导出模块的认识
- React学习-业务中模块的拆分
- React Native原生模块的基本使用
- React Native平台与Android本地模块之间的调用
- react native 学习笔记----使用Android的原生模块
- React-Native与原生的模块桥接(一)
- React Native 导出项目全局共用组件的模块
- React Native原生模块与JS模块通信的几种方式
- React Native原生模块向JS模块传递数据的几种方式(Android)
- react-native 添加 Toast 模块
- react native使用原生模块
- React Native十四:原生模块
- React Native之AppRegistry模块
- React Native使用指南-原生模块
- React Native创建原生模块
- react native使用原生模块
- react-intl中injectIntl/intlProvider方法的源码简析
- BZOJ 3438 最大权闭合子图
- Android 双击Back键退出应用
- JavaScript Truthy和Falsy
- Gradle中的buildScript代码块
- 基于python和amap(高德地图)web api的爬虫,用于搜索某POI点
- React的exenv模块简析
- 画虚线,指定宽度
- 修改JVM的启动内存
- android注册内容观察者
- 你不知道的javascript---词法作用域
- NanoPCT3开发板的安卓系统模块编译及烧录
- 关于Android依赖库文件的一些经验
- MPU6050使用dmp时,Pitch范围只有-90-90的问题
- htm页面l导出excel表格