Grunt模块将所有静态资产上传到S3 / CloudFront,替换路径并使旧资产失效

max*_*max 2 amazon-s3 node.js express amazon-cloudfront gruntjs

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

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

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

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

  4. 使旧的CDN资产无效

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

使用Rails,我已经读到它像

# Setup amazon CDN
config.action_controller.asset_host = "xxxxxxxxxxxxx.cloudfront.net"
Run Code Online (Sandbox Code Playgroud)

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

fir*_*oit 5

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

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

例如:

my-app/1.2.3/main.js
my-app/1.2.4/main.js
Run Code Online (Sandbox Code Playgroud)

等等等等。

这给您带来两个好处:

  • 您可以放心地永久缓存。相同的URL将始终提供相同的文件。
  • 如果发生灾难部署,您可以快速回滚。旧文件就在其中。

为了部署到S3,有一些特定的插件。但是,我更喜欢将grunt-shell与正式的Amazon AWS CLI一起使用

配置它看起来像这样:

shell: {
  cp: {
    command: "aws s3 cp --recursive dist/ s3://my-bucket/my-app/"
  }
}
Run Code Online (Sandbox Code Playgroud)

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