Gulp 连接,从不同于 'root' 的目录提供一些资产

Gulp connect, serving some assets from a directory different from '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/' 

您可以将 middleware function 传递给 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/' },
        { from: '^/css/(.*)$', to: '/css/' },
        { from: '^(.*)$', to: '/app/' }
      ])];
    }
  });
});