Как предотвратить Метеор от просмотра файлов?

Я хотел бы использовать Dojo Toolkit с Meteor.

  • Я сначала скопирую все дерево инструментов Dojo Toolkit в /public

  • Затем я включаю его на стороне клиента:

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

Все работает отлично, за исключением того, что Meteor фактически контролирует каждый файл в /public для изменений, чтобы он мог перезапустить сервер. Это фактически вызывает очень большую задержку во время первого запроса на localhost:3000.

Есть ли способ предотвратить, чтобы Метеор наблюдал файлы из определенного каталога?


Dojo Инструментарий - это файлы 10k +, поэтому я получаю сообщение об ошибке EMFILE здесь, исправленное с помощью

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

Ответы

Ответ 1

понял, что это дублирует: создание и обслуживание статических файлов с помощью Meteor

см. https://github.com/meteor/meteor/issues/437

Это была серьезная проблема для меня. Я должен служить ~ 12000 статических изображений, которые я изначально помещал в общую папку. Это привело к тому, что node использовал почти 100% одного ядра процессора, постоянно. С ограниченной памятью приложение сбой.

Обходной путь, который я использую на данный момент

  • создайте папку public/.#static/ и переместите в нее все статические активы. Эта папка не отслеживается метеоритом
  • prefix urls со статическими (/img/cat.png -> /static/img/cat.png)
  • установить пакет mime npm

    cd ~/.meteor/tools/latest/lib/node_modules/
    npm install mime
    
  • создать rawConnectionHandler для обслуживания активов (кредиты: fooobar.com/questions/289424/...) Сервер /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. Если вы хотите сделать их доступными в автономном режиме, ознакомьтесь с параметром addPaths, который я добавил в https://github.com/buildhybrid/appcache-extra

Если вы не хотите обойти проблемы, подумайте об обслуживании активов из внешней службы (например, AWS S3).

Ответ 2

Это большая проблема для крупномасштабных приложений, встроенных в Meteor. Я поговорил с Мэттом в "Метеор", и он сказал, что их команда работает над решением этой проблемы для одного из своих будущих выпусков. Поэтому заходите в их информационный бюллетень, и вы будете уведомлены, когда он будет доступен.

Матье, ваш комментарий:

Наконец-то я нашел обходное решение. Я помещаю все в /public/lib/. Затем, строка 286 из /usr/lib/meteor/app/run.js, я добавляю папку, в которой я не хочу наблюдать Meteor: self.exclude_paths = [path.join(app_dir, '.meteor', ' local '), path.join(app_dir,' public ',' lib ')]; Таким образом, у меня может быть столько файлов, сколько я хочу в lib, и они не замедляют все. include path is '/lib/ dojo/dojo.js'.

- это хороший взлом, и вот другие вопросы, которые касаются этого, также будут рассмотрены в следующем выпуске:

  • Некоторые пакеты имеют перекрывающиеся зависимости, но не исключают их, как в PHP require_once().

  • Нативный требует/определяет динамический загрузчик script, поэтому не все файлы загружаются на запись, которая может вычислять порядок зависимостей без необходимости идти на уровни, lib или main. *

  • Официальный способ создания и развертывания пакетов в репозитории. В настоящее время он использует Meteorite (mrt) и Atmosphere.