【问题标题】:How to prevent Meteor from watching files?如何防止 Meteor 观看文件?
【发布时间】:2012-07-15 08:01:51
【问题描述】:

我想将Dojo ToolkitMeteor 一起使用。

  1. 我首先将整个 Dojo Toolkit 树复制到 /public

  2. 然后,我将它包含在客户端:

    <script src="/dojo/dojo.js" data-dojo-config="async: true"></script>`
    

一切正常,除了 Meteor 实际上正在监视 /public 中的每个文件的更改,以便它可以重新启动服务器。这实际上在localhost:3000 上的第一个请求期间导致了很长的延迟。

有没有办法阻止 Meteor 从某个目录观看文件?


Dojo Toolkit 有 10k+ 个文件,所以我收到了here 中的 EMFILE 错误,更正了

sudo sh -c 'echo 16384 > /proc/sys/fs/inotify/max_user_watches'

【问题讨论】:

  • 我终于找到了解决方法。我把所有东西都放在 /public/lib/.然后,/usr/lib/meteor/app/run.js 的第 286 行,我添加了我不希望 Meteor 观看的文件夹:self.exclude_paths = [ path.join(app_dir, '.meteor', 'local'), path.join(app_dir, 'public', 'lib') ]; 这样我可以在 lib 中拥有尽可能多的文件,他们不会减慢一切。包含路径是'/lib/dojo/dojo.js'。
  • 很好的修复,你应该给他们发一个补丁并在下面发布这个作为答案
  • @Mathieu 建议的解决方法应该可以正常工作,但 Meteor 应该原生支持类似的东西。这也作为 GitHub 问题提交,这是继续讨论此问题或跟踪其解决方案的适当位置。 github.com/meteor/meteor/issues/437
  • @BjoernRennhak 您知道您链接的问题中的答案实际上是该主题的引文吗?

标签: dojo meteor


【解决方案1】:

意识到这是重复的:generating and serving static files with Meteor

见:https://github.com/meteor/meteor/issues/437

这对我来说是个大问题。我必须提供大约 12000 张静态图像,我最初将它们放入公共文件夹中。这导致节点不断地使用近 100% 的一个 CPU 内核。由于内存有限,应用会崩溃。

我目前使用的解决方法

  • 创建文件夹public/.#static/ 并将所有静态资源移入其中。这个文件夹没有被流星监视
  • 为静态网址添加前缀 (/img/cat.png -&gt; /static/img/cat.png)
  • 安装 mime npm 包

    cd ~/.meteor/tools/latest/lib/node_modules/
    npm install mime
    
  • 创建一个 rawConnectionHandler 来服务资产(感谢:https://stackoverflow.com/a/20358612) 服务器/static_files_handler.coffee

    fs = Npm.require('fs')
    mime = Npm.require('mime')
    WebApp.rawConnectHandlers.use (req, res, next) ->
      re = /^\/static\/(.*)$/.exec(req.url)
      if re isnt null # Only handle URLs that start with /static/*
        filePath = process.env.PWD + "/public/.#static/" + re[1]
        type = mime.lookup(filePath)
        data = fs.readFileSync(filePath, data)
        res.writeHead 200,
          "Content-Type": type
    
        res.write data
        res.end()
      else # Other urls will have default behaviors
        next()
      return
    

这种方法的局限性:

  • 不适合提供带有查询参数的资产。正则表达式还将匹配 /static/html/image.html?src=/static/img/cat.png 试图提供文件名包括参数的文件。这很容易改变。
  • Meteor 完全不知道这些文件,因此它们不会包含在 appcache 清单中。如果您想让它们离线可用,请查看我添加到 https://github.com/buildhybrid/appcache-extra 的 addPaths 选项

如果您不想解决这些问题,请考虑从外部服务(例如 AWS S3)提供资产。

【讨论】:

  • 如果您在 *.meter.com 上部署此应用程序会出现问题 - 这将导致错误 - 这是因为 Meteor 忽略(实际上没有).#static 目录跨度>
【解决方案2】:

对于在 Meteor 中构建的大型应用程序来说,这是一个大问题。我在 Meteor 与 Matt 进行了交谈,他说他们的团队正在为他们即将发布的版本之一解决这个问题。因此,请访问他们的时事通讯,当它可用时,您会收到通知。

马修,你的评论:

我终于找到了解决方法。我把所有东西都放在 /public/lib/.然后,/usr/lib/meteor/app/run.js 的第 286 行,我添加了我不希望 Meteor 观看的文件夹:self.exclude_paths = [ path.join(app_dir, '.meteor', ' local'), path.join(app_dir, 'public', 'lib') ];这样我就可以在 lib 中拥有尽可能多的文件,并且它们不会减慢所有速度。包含路径是'/lib/dojo/dojo.js'。

目前是一个很好的 hack,以下是其他相关问题,也将在即将发布的版本中介绍:

  • 有些包有重叠的依赖关系,但不要像 PHP 的 require_once() 那样排除它们。

  • 原生的 require/define 动态脚本加载器,因此并非所有文件都加载到可以计算依赖顺序而无需进入级别、lib 或 main 的条目一上。*

  • 创建包并将其部署到存储库的官方方法。目前它正在使用Meteorite (mrt) 和Atmosphere

【讨论】:

  • 目标是让流星服务但不观看目录中的资产文件,最好是我公开的所有大型视频文件。您的 exclude_paths 行是否继续提供文件?
猜你喜欢
  • 2023-03-12
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
  • 2017-12-06
  • 2012-01-28
  • 1970-01-01
  • 2019-04-10
相关资源
最近更新 更多