【问题标题】:Implement Express Static in Apostrophe CMS在 Apostrophe CMS 中实现 Express Static
【发布时间】:2019-08-31 04:35:57
【问题描述】:

这完全是一个撇号 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) apostropheCMS 中是否已经内置了启用 brotli 和 gzip 的方法?

【问题讨论】:

    标签: express compression gzip apostrophe-cms brotli


    【解决方案1】:

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

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

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

    // 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 而是咨询允许您注入替代中间件的选项,那就太好了。这将是一个很好的 PR。

    【讨论】:

    • 我明白你的意思。这些资产现在将从 s3/Cloudfront 提供,所以我想这就是处理方式。我不太明白你在说什么关于反向代理......
    • Node 几乎从不用于直接在端口 80 或 443 上建立连接。它被认为是实现 HTTPS 的最佳实践,例如,在 nginx 或 Amazon 的负载平衡代理或几乎任何用本机编写的东西中用于此目的的 C++。 gzip 传输编码等也是如此。这些低级别的事情最好在通用网络服务器中完成,然后仅将静态文件无法解决的请求代理到节点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多