【问题标题】:Grunt module(s) to upload all static assets to S3 / CloudFront, replace paths, and invalidate old assetsGrunt 模块将所有静态资产上传到 S3 / CloudFront、替换路径并使旧资产失效
【发布时间】:2015-03-10 14:58:48
【问题描述】:

使用 Grunt、NodeJs 和 Express,我应该使用哪些模块:

  1. 通过查看资产目录或通过代码库解析,发现应用中的所有静态资产(前端 JS、CSS、图像)

  2. 将资产上传到 Amazon S3 / CloudFront,用唯一的“指纹”名称重命名每个文件

  3. 将代码库中每个资产的路径替换为 CloudFront URL

  4. 使旧 CDN 资产无效

这是我第一次使用 CloudFront。我不确定是否可以使用 Grunt 完成以上所有操作,或者是否最好将其作为 Node/Express 模块来完成。

使用 Rails,I've read it's as easy as

# Setup amazon CDN
config.action_controller.asset_host = "xxxxxxxxxxxxx.cloudfront.net"

我正在为 Node 堆栈寻找类似的解决方案。

【问题讨论】:

    标签: node.js express amazon-s3 gruntjs amazon-cloudfront


    【解决方案1】:

    使 CDN 资产无效是个坏主意 ®。在 CloudFront 中,最多可能需要 15 分钟才能完成 - 这将为您的部署增加 15 分钟。此外,由于 URL 相同,某些浏览器可能会保存旧文件。

    相反,您可能应该对静态资产进行版本控制,并以不同的版本名称发布新版本。

    例如:

    my-app/1.2.3/main.js
    my-app/1.2.4/main.js
    

    以此类推。

    这给你两个好处:

    • 您可以放心地永久缓存。相同的 URL 将始终提供相同的文件。
    • 您可以在发生灾难部署时快速回滚。旧文件在原处。

    为了部署到 S3,有专门的插件。 但是,我更喜欢简单地将grunt-shell 与官方Amazon AWS CLI 结合使用

    配置它看起来像这样:

    shell: {
      cp: {
        command: "aws s3 cp --recursive dist/ s3://my-bucket/my-app/"
      }
    }
    

    您可以使用 grunt 从某处读取版本变量并自动将所有文件放入 dist/{version}/ 文件夹中,同时将 html 中的任何路径替换为正确的 version 路径。

    【讨论】:

    • 灾难回滚无疑是保持内容版本化的重要原因
    • 喜欢这种方法。我将使用什么模块来执行 (3) - “用 CloudFront URL 替换代码库中每个资产的路径?”你是用 grunt 还是 express 来处理这个问题?
    • 您可以在grunt-contrib-copy 中使用process 选项。从一个目录复制到另一个目录时,只需用正则表达式替换路径。有更高级的插件,但我发现副本对于这个目的来说已经绰绰有余了。这是一个个人示例:github.com/vtex/grunt-vtex/blob/master/lib/config.coffee#L38
    • 我们现在正在实施 - 您将应用版本存储在哪里?咕噜声?应用中的配置文件?
    • package.json。见 github.com/vtex/releasy
    猜你喜欢
    • 2021-05-10
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 2012-04-10
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    相关资源
    最近更新 更多