如何防止Meteor观看文件?

时间:2012-07-16 13:01:04

标签: dojo meteor

我想将Dojo ToolkitMeteor一起使用。

  1. 我首先在/public

  2. 中复制整个Dojo Toolkit树
  3. 然后,我将其包含在客户端:

    <script src="/dojo/dojo.js" data-dojo-config="async: true"></script>`
    
  4. 一切正常,除了Meteor实际监控/public中的每个文件的更改,以便它可以重新启动服务器。这实际上是在localhost:3000的第一次请求期间造成了很长的延迟。

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


    Dojo Toolkit是10k +文件,所以我得到了here的EMFILE错误,用

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

2 个答案:

答案 0 :(得分:4)

意识到这与以下内容重复:generating and serving static files with Meteor

请参阅:https://github.com/meteor/meteor/issues/437

这对我来说是个主要问题。我必须服务~12000个静态图像,我最初放入公共文件夹。这导致节点不断地使用几乎100%的一个CPU核心。内存有限,应用程序崩溃。

我正在使用的解决方法

  • 创建文件夹public/.#static/并将所有静态资源移入其中。 meteor不会监视此文件夹
  • 前缀urls with static(/img/cat.png -> /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)提供资产。

答案 1 :(得分:2)

对于在Meteor中构建的大规模应用程序来说,这是一个大问题。我在Meteor和Matt谈过,他说他们的团队正在为他们即将发布的版本中的一个解决这个问题。所以上传他们的时事通讯,你会收到通知。

Mathieu,您的评论:

  

我终于找到了解决方法。我把所有东西放在/ 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中拥有尽可能多的文件,并且它们不会减慢一切。 include path是'/lib/dojo/dojo.js'。

目前是一个很好的黑客攻击,以下是与即将发布的版本相关的其他相关问题:

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

  • 本机需要/定义动态脚本加载器,因此并非所有文件都加载到可以计算依赖顺序的条目上,而不必转到level,lib或main。*

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