0

这完全是一个撇号 CMS 问题。捎带这个从未回答过的问题,我决定在 Stack Overflow 上问我的问题。我在这里找不到主题。

https://forum.apostrophecms.org/t/performance-engineering/61/2

考虑到这一点,ApostropheCMS 是一个非常酷的编辑器内 CMS,它构建在快速服务器上,但我不知道如何访问典型的快速设置中的 app.js 文件。

这个 npm 模块正是我们需要实现的。 https://www.npmjs.com/package/express-static-gzip

要添加以表达的代码:

var express = require('express');
var expressStaticGzip = require('express-static-gzip');
var app = express();

app.use('/', expressStaticGzip('/my/rootFolder/', {
    enableBrotli: true,
    customCompressions: [{
        encodingName: 'deflate',
        fileExtension: 'zz'
    }],
    orderPreference: ['br']
}));

1)如何将其添加到标准撇号设置?或 2) 撇号CMS 中是否已经有一种方法可以启用 brotli 和 gzip?

4

1 回答 1

1

首先,Node.js 代码不是执行此操作的最佳位置。如果您通过生产反向代理(例如 nginx)在生产中实现它,并且根本不在 dev 中实现它,您将获得更好的性能。由于在代理后面运行 Node 始终是最佳实践,因此这对您来说应该是一个可行的选择。

但是,话虽如此,这也可以在 Node 中完成。也许您有一个用例,例如无论代理是否存在,都允许以这种方式提供预压缩文件。

该模块的servePublicAssets方法apostrophe-assets负责/public通过服务express.static。您可以在项目级别更改它:

// in your PROJECT LEVEL lib/modules/apostrophe-assets/index.js file.

// DO NOT modify node_modules/apostrophe, you do not need to do that.

// DO NOT copy the entire index.js.

// This is all you need to override just this ONE method.

const expressStaticGzip = require('express-static-gzip');

module.exports = {
  construct: function(self, options) {
    self.servePublicAssets = function() {
      const middleware = [];
      if (self.lessMiddleware) {
        middleware.push(self.lessMiddleware);
      }
      middleware.push(expressStaticGzip(
        self.apos.rootDir + '/public',
        {
          enableBrotli: true,
          customCompressions: [
            {
              encodingName: 'deflate',
              fileExtension: 'zz'
            }
          ],
          orderPreference: ['br']
        }
      ));
      self.expressMiddleware = {
        when: 'beforeRequired',
        middleware: middleware
      };
    };
  }
};

我们确实在这里覆盖了整个方法,而不仅仅是注入不同的中间件。如果 Apostrophe 没有假设您想要express.static,而是咨询了一个允许您注入替代中间件的选项,那就太好了。那将是一个很好的公关。

于 2019-08-30T20:35:57.283 回答