16

我想将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+ 个文件,所以我得到了此处所述的 EMFILE 错误,更正为

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

2 回答 2

4

意识到这是重复的:使用 Meteor 生成和提供静态文件

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

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

我目前正在使用的解决方法

  • 创建文件夹public/.#static/并将所有静态资产移入其中。流星不监视此文件夹
  • /img/cat.png -> /static/img/cat.png带有静态 ( )的 URL 前缀
  • 安装 mime npm 包

    cd ~/.meteor/tools/latest/lib/node_modules/
    npm install mime
    
  • 创建一个 rawConnectionHandler 来服务资产(归功于:https://stackoverflow.com/a/20358612) server/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)提供资产。

于 2014-08-06T13:35:14.657 回答
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

于 2013-06-01T05:40:29.223 回答