2012-07-16 49 views
15

我想用Dojo ToolkitMeteor如何防止流星觀看文件?

  1. 我第一次在/public

  2. 然後複製整個Dojo Toolkit的樹,我包括它在客戶端與:

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

一切工作正常,除了流星實際上監控/public中的每個文件以進行更改,以便它可以重新啓動服務器。這實際上在localhost:3000的第一次請求期間會造成非常長的延遲。

有沒有辦法阻止Meteor從某個目錄下看文件?


Dojo Toolkit的是10K +文件,所以我得到的EMFILE錯誤陳述here,與

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

我終於找到了解決方法。 我把所有內容放在/ 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 2012-07-23 12:06:14

+0

不錯的修復方法,你應該給他們發一個補丁,並將其作爲下面的回答發佈。 – Milimetric 2012-10-27 01:43:25

+0

@Mathieu建議的解決方法應該可以很好地用於此目的,但Meteor應該在本地支持這樣的東西。這也是作爲GitHub問題提交的,GitHub問題是繼續討論此問題或跟蹤其解決方案的適當位置。 https://github.com/meteor/meteor/issues/437 – avital 2012-12-14 00:37:59

回答

2

這是建於流星大規模應用的一個大問題糾正。我在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'。

是現在一個不錯的黑客,這裏是涉及這也將在即將發佈涉及的其他問題:

  • 一些包有重疊的依賴關係,但不排除他們像在PHP的require_once()中。

  • 一個土生土長的需要/定義動態腳本加載程序,所以並非所有的文件都加載在進入一個可以計算的依賴順序,而不必去水平,lib或主*

  • 一名官員的方式創建和將軟件包部署到存儲庫。目前它使用Meteorite(mrt)和Atmosphere

+0

目標是讓流星服務,但不要在目錄中觀看資產文件,最好是公開發布的所有大型視頻文件。您的exclude_paths行是否繼續提供這些文件? – 2015-03-15 03:29:27

3

意識到這是複製到:generating and serving static files with Meteor

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

這是一個重大問題,對我來說。我必須提供〜12000個靜態圖像,我最初將其放入公用文件夾中。這導致節點不斷地使用幾乎100%的一個CPU核心。由於內存有限,應用程序崩潰。

我使用的那一刻

  • 解決方法創建文件夾public/.#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嘗試提供包含參數的文件名。這很容易改變。
  • 流星完全不知道這些文件,因此它們不包含在appcache清單中。如果你想使它們可脫機使用,檢查出我加入https://github.com/buildhybrid/appcache-extra

的addPaths選項如果你不想解決的問題,可以考慮從外部服務供應的資產(例如,AWS S3) 。

+0

如果你打算在* .meter.com上部署這個應用程序,會出現問題 - 這會導致錯誤 - 這是因爲流星忽略了(實際上沒有)。#static directory – 2015-04-10 15:58:06