我的编程空间,编程开发者的网络收藏夹
学习永远不晚

GoLang 有条件地提供 .js.gz(如果存在),否则提供 .js

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

GoLang 有条件地提供 .js.gz(如果存在),否则提供 .js

php小编苹果在介绍GoLang时指出,GoLang有一个有趣且实用的特性,即在提供JavaScript文件时,它会有条件地提供.js.gz文件(如果存在),否则才会提供.js文件。这个特性可以有效地减小文件的大小,提高网页加载速度,给用户带来更好的体验。这种智能的文件选择机制让GoLang在Web开发中更加高效和灵活。无论是前端开发还是后端开发,GoLang都是一个值得探索的优秀编程语言。

问题内容

我的背景主要是反应/前端,但我的任务是提高我们的 React Web 应用程序的性能,该应用程序使用 GoLang 提供服务,并使用适用于 Go 的 aws sdk 从 S3 中提取文件。 我已将 Webpack 配置为执行其任务并尽可能多地使用其优化功能,包括使用其压缩插件与部署到 S3 的捆绑包中的 .js 文件一起创建 gzip 压缩的 .js.gz 文件。

我的问题是,Go 和 aws sdk 中是否有一种方法,当它从 s3 存储桶中获取文件时,首先确定该文件的 gzip 压缩形式是否存在,然后获取该文件,如果不存在则获取常规文件?这是解决这个问题的最好方法吗?我知道 Go 中有一个用于运行时压缩的库,但提前完成压缩似乎更有效。

Go 服务器部分非常小,具有获取存储桶文件的功能,该功能基本上创建一个 s3 客户端,然后使用该客户端上的 getObject 方法来获取该存储桶的内容,然后使用 http 的 .write 方法.ResponseWriter 包含这些内容的正文。

解决方法

是的,可以直接发送压缩版本。

这是一个例子:

package main

import (
    "fmt"
    "net/http"
    "strings"

    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/s3"
)

func getFileFromS3(bucket, key string, w http.ResponseWriter, r *http.Request) error {
    sess, err := session.NewSession(&aws.Config{
        Region: aws.String("your-region"),
        // Add other necessary configurations
    })
    if err != nil {
        return err
    }

    client := s3.New(sess)

    // Check if gzipped version exists
    gzKey := key + ".gz"
    _, err = client.HeadObject(&s3.HeadObjectInput{
        Bucket: aws.String(bucket),
        Key:    aws.String(gzKey),
    })
    if err == nil {
        // Gzipped version exists, fetch and serve directly
        obj, err := client.GetObject(&s3.GetObjectInput{
            Bucket: aws.String(bucket),
            Key:    aws.String(gzKey),
        })
        if err != nil {
            return err
        }
        defer obj.Body.Close()

        // Set appropriate headers
        w.Header().Set("Content-Encoding", "gzip")
        w.Header().Set("Content-Type", "application/javascript") // Set the appropriate content type

        // Copy the gzipped content directly to the response
        _, err = fmt.Fprint(w, obj.Body)
        return err
    }

    // Gzipped version doesn't exist, fetch the regular version
    obj, err := client.GetObject(&s3.GetObjectInput{
        Bucket: aws.String(bucket),
        Key:    aws.String(key),
    })
    if err != nil {
        return err
    }
    defer obj.Body.Close()

    // Set appropriate headers
    w.Header().Set("Content-Type", "application/javascript") // Set the appropriate content type

    // Copy the regular content directly to the response
    _, err = fmt.Fprint(w, obj.Body)
    return err
}

func handler(w http.ResponseWriter, r *http.Request) {
    // Extract the file key from the request URL or any other way you have it
    fileKey := "your-file-key"

    // Set appropriate cache headers, handle CORS, etc.

    // Fetch the file from S3
    err := getFileFromS3("your-s3-bucket", fileKey, w, r)
    if err != nil {
        // Handle error, e.g., return a 404 or 500 response
        http.Error(w, "Internal Server Error", http.StatusInternalServerError)
        return
    }
}

func main() {
    http.HandleFunc("/your-endpoint", handler)
    http.ListenAndServe(":8080", nil)
}

以上就是GoLang 有条件地提供 .js.gz(如果存在),否则提供 .js的详细内容,更多请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

GoLang 有条件地提供 .js.gz(如果存在),否则提供 .js

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

GoLang 有条件地提供 .js.gz(如果存在),否则提供 .js

php小编苹果在介绍GoLang时指出,GoLang有一个有趣且实用的特性,即在提供JavaScript文件时,它会有条件地提供.js.gz文件(如果存在),否则才会提供.js文件。这个特性可以有效地减小文件的大小,提高网页加载速度,给用户
GoLang 有条件地提供 .js.gz(如果存在),否则提供 .js
2024-02-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录