Обслуживание созданного веб-пакета CSS-файла через CDN в среде Heroku CI - PullRequest
0 голосов
/ 22 мая 2019

У меня есть приложение Node.JS Meteor, которое я связываю с webpack , которое генерирует файл CSS с хэшем в имени: [hash] .bundle.css . Я могу установить publicPath для домена CDN:

output: {
  publicPath: 'https://xxx.cloudfront.com/',
},

В Heroku комплект будет сгенерирован в промежуточной среде, а сгенерированный slug будет перемещен в живую среду (включая файл css).

Когда в CSS произойдет изменение, в промежуточной среде будет новый хэш . При открытии сайта (тестирование ...) облачный фронт будет запрашивать у этого файла живую среду, но сервер Node.JS отвечает приложением-HTML , которое выдает не найденный ошибка в браузере.

Идея: сделать CDN откатом к постановке

Это рекомендуется в документации к герою. Но поскольку сервер приложений не отвечает с ошибкой 404 http, cloudfront не будет смотреть на промежуточный сервер.

Проблема: сообщение об ошибке 404 http для отсутствующих файлов

Этот звук не сложный. Meteor webapp использует connect , а я использую FlowRouter на стороне клиента, поэтому я могу:

WebApp.connectHandlers.use('/', function(req, res, next) {
  if(FlowRouter.matchPath(req.url).route.name == 'not-found') {
    res.writeHead(404);
    res.end('Not found.');
  } else {
    return next();
  }
});

Но: есть много других connectHandlers, которые мне нужно знать, и проверять файловую систему. Я пытался идти по этому пути, но он кажется бесконечным, требует интенсивного обслуживания и не является надежным.

Идея: Использование Метеора ?meteor_css_resource=1

Существует Специальная обработка для метеора файла css с параметром запроса xx.css?meteor_css_resource=1, но это не будет считаться ошибкой 404 для CDN, чтобы выполнить запрос на повторную подготовку.

1 Ответ

0 голосов
/ 22 мая 2019

Вместо проверки всех доступных connectHandlers, мы фильтруем только файлы .css.

WebApp.connectHandlers.use('/', function(req, res, next) {
  const urlParts = url.parse(req.url)

  if(urlParts.pathname.endsWith('.css')) {
    res.writeHead(404)
    res.end('CSS file not found.')
  } else {
    return next()
  } 
}
...