Как предотвратить Метеор от просмотра файлов?
Я хотел бы использовать 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.