小编Kev*_*Kev的帖子

在用户离开选项卡或关闭屏幕后,如何检测浏览器何时限制计时器和 websockets 断开连接?(javascript)

语境

作为渐进式 Web 应用程序提供的游戏,它具有计时器 ( setTimeout, setInterval) 和 websocket 连接以获得实时通信。

怎么了

只要用户留在应用程序中,一切都很好。但是当用户转到另一个选项卡、另一个应用程序或关闭屏幕(在移动设备的情况下)时,它就变成了一个“地狱般的未知世界”。

  • Websockets 可能会也可能不会“暂停”或“关闭”
  • 计时器看起来像是受到了限制或去抖动。

这种行为似乎取决于浏览器和平台,甚至可能取决于特定的用户行为。我猜浏览器和操作系统有自己的生命周期/机制来节省电池和/或计算。

当用户回来时,应用程序处于未知状态,我正在努力正确恢复状态。

关于 websockets 我有与socket.ioreconnecting-websocket 的自动重新连接,但这还不足以解决所有问题。

寻找答案

  • 不同浏览器的“生命周期”是什么?这是记录在案吗?他们什么时候决定关闭和油门?
  • 他们对 websockets 做了什么?浏览器只是断开它们?
  • 他们究竟对计时器做了什么?他们扼杀他们或消除他们或其他什么?
  • javascript 执行一般会发生什么?暂停/销毁/节流?
  • 当它要关闭时,有没有办法挂钩某种浏览器生命周期事件?我唯一能找到的可能是可见性 API
  • 有没有办法人为地重现这种行为以测试解决方案?在桌面上尤其困难。Websockets 无法关闭,并且 Chrome 开发人员似乎并不急于解决 2014 年的问题(!):使用连接限制时不包括 websockets

  • 不管上述情况,是否有实用的跨浏览器解决方案来检测/解决此问题?(例如,根据经验,与 Chrome 相比,桌面版 Firefox 的行为似乎完全不同,iPhone 断开连接的频率远高于 Android)

相关链接

javascript cross-browser websocket progressive-web-apps

21
推荐指数
1
解决办法
2270
查看次数

无法在尚未装入的组件上调用setState

这是我第一次面对这个警告信息.

无法在尚未装入的组件上调用setState.

具体情况如下:

这是一个无操作,但它可能表示您的应用程序中存在错误.相反,this.state直接指定或state = {};在MyComponent组件中定义具有所需状态的类属性.

" 尚未安装 "部分实际上几乎没有意义,因为触发问题的唯一方法是通过单击需要安装的组件中的按钮来调用函数以查看按钮.该组件在任何给定时间都没有卸载.

这个虚拟组件在我的应用程序中重现错误:

import PropTypes from 'prop-types'
import React from 'react'

export default class MyComponent extends React.Component {
  constructor (props) {
    super(props)
    this.state = {
      initial: 'state'
    }
    this.clickMe = this.clickMe.bind(this)
  }

  clickMe () {
    this.setState({
      some: 'new state'
    })
  }

  render () {
    return (
      <div>
        <button onClick={this.clickMe}>click</button>
      </div>
    )
  }
}
Run Code Online (Sandbox Code Playgroud)

我在用:

"react": "16.3.2",
"react-dom": "16.3.2",
"mobx": "4.2.0",
"mobx-react": "5.1.2",
Run Code Online (Sandbox Code Playgroud)

我在最新的React/mobx版本中遗漏了什么吗?(注意组件不使用任何与mobx相关的东西,但它的父级是一个mobx-react观察者)

编辑:

一定有什么相关的组件实例,进一步的调查表明,在某些情况下,创建渲染功能内的处理程序将使该警告消失,但不是在所有情况下.

class MyComponent extends React.component …
Run Code Online (Sandbox Code Playgroud)

javascript reactjs mobx mobx-react

16
推荐指数
4
解决办法
2万
查看次数

如何在网络单页应用程序中使用 Firebase Analytics 跟踪页面浏览量?

我正在尝试通过 Firebase 分析跟踪简单的事件和页面/视图。

我有一个渐进式网络应用程序(SPA)。这是一款全屏游戏,不使用浏览器历史记录。

老实说,我对 Google 的文档有些困惑,有时他们只解释了它在 ios/Android 中的工作原理,而不是在网络中。此外,Firebase 分析与“普通 Google 分析”不同。

Firebase 分析 API 没有太多:

analytics().logEvent()
analytics().setAnalyticsCollectionEnabled()
analytics().setCurrentScreen()
analytics().setUserId()
analytics().setUserProperties()
Run Code Online (Sandbox Code Playgroud)

虽然“Google Analytics 文档”确实有一个关于 SPA 的部分,但我还没有找到如何使用 Firebase 分析来做同样的事情,例如手动发送如下页面视图:

ga('set', 'page', '/new-page.html');
ga('send', 'pageview');
Run Code Online (Sandbox Code Playgroud)

我试过使用,setCurrentScreen但它什么也没做。帮助表示赞赏。

javascript google-analytics firebase single-page-application firebase-analytics

14
推荐指数
2
解决办法
7188
查看次数

使用box-sizing:与Twitter Bootstrap 2.x的边框,我们可以轻松地完成它而不会破坏一切吗?

我在上一期项目中一直使用"边框盒模型".这有很多优点,我不会在这里解释.但你可以在这里阅读:css-tricks中的边框

现在我开始了一个更大的项目,我们已经确定twitter bootstrap将是一个很好的解决方案,满足我们的需求.我想知道是否可以在没有破坏一切的情况下使其成为"边境盒装".有没有人试过这个,后果是什么?调整太多了?真正的改善?

谢谢

css twitter-bootstrap

10
推荐指数
2
解决办法
1万
查看次数

如何获取visual studio代码段中的基目录?

我试图将文件当前目录放在Visual Studio代码的代码段中.

VSCode有一个变量:TM_DIRECTORY,即fullpath.

例如:

{folder: "$TM_DIRECTORY"}
Run Code Online (Sandbox Code Playgroud)

将被替换为

{folder: "/Volumes/my-project-path/ParentFolder/MyFolder"}
Run Code Online (Sandbox Code Playgroud)

但我只想要MyFolder.

通常,我们可以使用文档中指示转换.Sublime Text以相同的方式工作.但是,就像我尝试的那样,片段只输出整个正则表达式.

有人可以用魔法变量/变换来回答吗?:)

code-snippets visual-studio-code

9
推荐指数
3
解决办法
979
查看次数

mod_rewrite - Apache是​​否缓存.htaccess规则?(即使在删除.htaccess文件后仍遵循规则)

我在wamp环境中使用mod_rewrite进行了一些测试.

我测试了一个简单的规则,我把它放在我的一个网站的根目录,并要求它将任何以index.php结尾的请求重定向到localhost(没有任何意义,只是想查看规则)

它工作,但之后,我对.htaccess文件规则所做的任何更改都没有反映出来.过了一会儿我就决定删除.htaccess ......好吧它还在重定向!我只是不明白.Apache是​​否缓存规则或某些东西(通过wamp菜单重新启动服务并没有改变任何东西)

(不要问我使用的确切规则,因为我删除了文件,我认为无论如何都不相关)

apache mod-rewrite

8
推荐指数
2
解决办法
5918
查看次数

如何测试电子生成器自动更新流程?

我构建了一个Electron应用程序,现在我正在研究如何分发它.我和电子制造商一起去处理包装等.

对于一些上下文,作为Web开发人员,我习惯于在Web服务器上不断部署Web应用程序,但我很难弄清楚如何在Electron中分发打包的应用程序.

电子建设者文档中,有一个关于测试自动更新的简短提及:

"请注意,为了在不打包应用程序的情况下开发/测试更新的UI/UX,您需要在项目的根目录中创建名为dev-app-update.yml的文件,该文件与电子构建器配置中的发布设置相匹配(但是以YAML格式)"

但是,它相当含糊......

所以我实际上有两个问题:

1.我如何实际测试自动更新流程?

我是否需要实际发布新版本以在本地触发更新?似乎很不清楚,这就像开发生产服务器一样.

2.是否可以对未签名的代码进行回退?

我还没有任何代码签名证书.因此OS/app将阻止自动更新.但是,我仍然想告诉用户更新可用,以便他们可以手动下载应用程序.我能这样做吗?(回到第1点,我希望能够测试这个流程)

testing auto-update electron electron-builder

8
推荐指数
1
解决办法
926
查看次数

如何处理React嵌套组件循环依赖?(使用es6类)

我正在使用React with Babel(es6).我有一个问题来解决我的组件之间的循环依赖.

我正在建立一个菜单,我们有:

  • ItemFactory
  • ItemFolder
  • ItemGeneric
  • MoreTypesOfItems

ItemFactory 根据传递的props,简单地返回任何其他组件.

ItemFolder需要能够重复使用ItemFactory,建立嵌套的菜单项.

ItemFactory组件,itemFactory.js(简化):


// I need ItemFolder
import ItemFolder from './itemFolder'

// import all different items too

...

function ItemFactory (props) {
  switch (props.type) {
    case 'link': return <ItemLink {...props} />
    case 'blank': return <ItemBlank {...props} />
    case 'folder': return <ItemFolder {...props} />
    default: return <ItemGeneric {...props} />
  }
}

modules.exports = ItemFactory
Run Code Online (Sandbox Code Playgroud)

ItemFolder组件,itemFolder.js(简化):


// I need the itemFactory
import ItemFactory from './itemFactory'
...
Items = props.items.map(item …
Run Code Online (Sandbox Code Playgroud)

javascript commonjs ecmascript-6 reactjs

7
推荐指数
2
解决办法
7754
查看次数

是否可以更改 Visual Studio Code 提示工具提示的位置?

我想更改有用的 Visual Studio Code 提示工具提示的位置,但有时放置得很糟糕。(覆盖代码,打字时到处跳等)

我不知道它是否会有所帮助,但现在我想将提示位置固定在编辑器的右上角。(或者它可以适应情况并根据我打字的位置在右上角或右下角)

会寻找类似的东西:

hintPanelPositionMode: 'fixed'
hintPanelPositionPlacement: 'right'
Run Code Online (Sandbox Code Playgroud)

或在伪 CSS 样式中编辑一些设置

.hint-panel {position: 'fixed'; top: 0; right: 0}
Run Code Online (Sandbox Code Playgroud)

作为旁注:它与此问题中的解释有些相关Disable tooltip hint in Visual Studio Code

目前这可能吗?

visual-studio-code

5
推荐指数
1
解决办法
657
查看次数

如何解决browserify(基于Backbone的应用程序)和require.js在同一页面上的冲突?

我有一个骨干应用程序正常运行.它意味着在第3页中用作小部件.不幸的是,我刚刚意识到其中一个页面已经加载了Backbone/underscore.

我得到这样的错误:

Uncaught TypeError: Cannot read property 'extend' of undefined 
Run Code Online (Sandbox Code Playgroud)

通常在先前未加载下划线时出现.

我的典型视图是这样的:(正常的Backbone视图)

./view1.js

var Backbone = require('backbone')
var _ = require('underscore')
var $ = require('jquery')
Backbone.$ = $

module.exports = Backbone.View.extend({

  events: {

  },

  initialize: function () {

  },

  render: function () {

  }
})
Run Code Online (Sandbox Code Playgroud)

然后我只需要打电话给它:

var View1 = require('view1')
var view1Instance = new View1(...)
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助 :)

调查后编辑:当运行调试器时,看起来Backbone变量是一个空对象而不是Backbone.好像require('backbone')刚回来了{}

编辑2:这似乎与这个问题有关:https://github.com/substack/node-browserify/issues/790

requirejs backbone.js underscore.js browserify

4
推荐指数
1
解决办法
2664
查看次数

无法在CORS请求中发送凭据

我有一个应用程序,其中Vue前端与服务器位于不同的域.具体来说,Vue位于,localhost:8080服务器位于localhost:4000.

在成功登录期间,服务器使用具有会话密钥的HttpOnly cookie进行响应.这是回复:

HTTP/1.1 200 OK
server: Cowboy
date: Wed, 15 Mar 2017 22:35:46 GMT
content-length: 59
set-cookie: _myapp_key=SFMyNTY.g3QAAAABbQAAABBndWFyZGlhbl9kZWZhdWx0bQAAAUNleUpoYkdjaU9pSklVelV4TWlJc0luUjVjQ0k2SWtwWFZDSjkuZXlKaGRXUWlPaUpWYzJWeU9qSWlMQ0psZUhBaU9qRTBPVEl5TURrek5EY3NJbWxoZENJNk1UUTRPVFl4TnpNME55d2lhWE56SWpvaVFYTndhWEpsSWl3aWFuUnBJam9pWWpreU5tVmpZek10TVRrM1lTMDBPREkyTFRrek5tSXRaRGxsTURneE5UUTNZVEpsSWl3aWNHVnRJanA3ZlN3aWMzVmlJam9pVlhObGNqb3lJaXdpZEhsd0lqb2lZV05qWlhOekluMC43THdySDUxb1hVVFR3OEhYMzBPWDJTeTd0Si05RTFFZEpQV3ZDLS1WU3YycllpZ29aTUY4NkhUMzB6Q29SWXFBajlxYXFQc0dqTzNNNFJyOHYyY1ZGZw.2k1A4HuW6VV8ACZhgHY6Szuf5gXKAe_QwMCN3doi9D4; path=/; HttpOnly
content-type: application/json; charset=utf-8
cache-control: max-age=0, private, must-revalidate
x-request-id: qi2q2rtt7mpi9u9c703tp7idmfg4qs6o
access-control-allow-origin: http://localhost:8080
access-control-expose-headers: 
access-control-allow-credentials: true
vary: Origin
Run Code Online (Sandbox Code Playgroud)

但是,使用Vue Resource进行的后续请求不会将此cookie发送回服务器,即使我包含以下credentials: true选项:

this.$http.get("http://localhost:4000/api/account/", {credentials: true}).then(response => {
  //do stuff
}, response => {
  console.log(response.body.error)
})
Run Code Online (Sandbox Code Playgroud)

我知道凭据不包括在内,因为我可以在Chrome中看到请求标头:

GET /api/account/ HTTP/1.1
Host: localhost:4000
Connection: keep-alive
Accept: application/json
Origin: http://localhost:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 …
Run Code Online (Sandbox Code Playgroud)

cookies cors vue.js vue-resource axios

4
推荐指数
1
解决办法
3083
查看次数

什么导致PHP MySQL库版本与MySQL服务器版本不同?

此消息显示在PhpMyAdmin中.经过一些更新后经常会

已经有很多类似的问题.一个典型的答案是"更新你的库".但最后我仍然看到很多人无法解决它.(包括我自己)

我试图从头开始重新安装所有东西,但它仍然存在,我得到了这个确切的版本错误:

您的PHP MySQL库版本5.5.34与您的MySQL服务器版本5.1.69不同.

我添加了包列表的输出.一切看起来都很正确.或者我认为.我不明白这个5.1.69版本来自哪里.我对linux/server设置知之甚少.

有没有可以提供帮助的linux/server向导?谢谢 : )

[root @ server bin] #yum list installed | grep mysql

@remi compat-mysql51.x86_64 5.1.54-1.el6.remi
@remi mysql.x86_64 5.5.34-1.el6.remi
@remi mysql-libs.x86_64 5.5.34-1.el6.remi
@remi mysql- server.x86_64 5.5.34-1.el6.remi
@remi php-mysql.x86_64 5.4.20-1.el6.remi

[root @ server bin] #yum list installed | grep php

@remi php.x86_64 5.4.20-1.el6.remi
@remi php-bcmath.x86_64 5.4.20-1.el6.remi
@remi php-cli.x86_64 5.4.20-1.el6.remi
@remi php- common.x86_64 5.4.20-1.el6.remi
@remi php-fpm.x86_64 5.4.20-1.el6.remi
@remi php-gd.x86_64 5.4.20-1.el6.remi
@remi php-imap. x86_64 5.4.20-1.el6.remi
@remi php-ldap.x86_64 5.4.20-1.el6.remi
@remi php-magickwand.x86_64 1.0.9.2-4.el6.remi
@remi php-magpierss.noarch 0.72 -6.el6
@epel php-mbstring.x86_64 …

php mysql phpmyadmin

2
推荐指数
1
解决办法
1万
查看次数