Gulp connect, обслуживающий некоторые ресурсы из каталога, отличного от "root"

Интересно, возможно ли с gulp-connect обслуживать некоторые файлы из другого каталога. Что-то вроде:

http://localhost:8080/index.html => root: '/root/app'

но

http://localhost:8008/js/main.js => from '/root/js/' not from 'root/app/js' 
http://localhost:8008/css/main.css => from '/root/css/' not from 'root/app/css/' 

1 ответ

Решение

Вы можете передать функцию промежуточного программного обеспечения gulp-connect это позволяет вам изменить объект запроса и, следовательно, переписать URL запроса:

gulp.task('serve', function() {
  connect.server({
    root: 'root',
    middleware: function() {
      return [ function(req, res, next) {
        if (!/^\/(js|css)\/.*/.test(req.url)) {
          req.url = '/app' + req.url;
        }
        next();
      }];
    }
  });
});

В приведенном выше любой путь, который начинается с /js/ или же /css/ будет передано без изменений. Так как наша базовая папка root это означает, что путь как /js/main.js будет разрешать root/js/main.js,

Все остальные пути будут дополнены /app, означая путь как /index.html будет прозрачно разрешить root/app/index.html,

Вместо использования пользовательской логики, как я делал выше, вы также можете использовать что-то вроде http-rewrite-middleware, что позволяет вам задавать выражения перезаписи в стиле nginx:

var rewrite = require('http-rewrite-middleware');

gulp.task('serve', function() {
  connect.server({
    root: 'root',
    middleware: function() {
      return [ rewrite.getMiddleware([
        { from: '^/js/(.*)$', to: '/js/$1' },
        { from: '^/css/(.*)$', to: '/css/$1' },
        { from: '^(.*)$', to: '/app/$1' }
      ])];
    }
  });
});
Другие вопросы по тегам