Flutter服务器中间件GZIP压缩插件shelf_gzip的使用

发布于 1周前 作者 eggper 来自 Flutter

Flutter服务器中间件GZIP压缩插件shelf_gzip的使用

shelf_gzip简介

shelf_gzip 是一个用于Dart语言的Shelf中间件,它能够对HTTP响应进行GZIP压缩。这可以有效地减少网络传输的数据量,从而提高网页加载速度和用户体验。

版本与安全信息

使用方法

下面是一个完整的示例demo,展示了如何在Flutter服务器端使用shelf_gzip来实现响应的GZIP压缩。

import 'dart:async' show runZonedGuarded;
import 'dart:io';

import 'package:path/path.dart' show join, dirname;
import 'package:shelf/shelf.dart' as shelf;
import 'package:shelf/shelf_io.dart' as shelf_io;
import 'package:shelf_gzip/shelf_gzip.dart';
import 'package:shelf_static/shelf_static.dart';

void main() {
  // 假设服务器位于bin/目录下,并且已经执行了`pub build`
  var pathToBuild = join(dirname(Platform.script.toFilePath()), '..', 'build/web');
  var staticHandler = createStaticHandler(pathToBuild, defaultDocument: 'index.html');

  var portEnv = Platform.environment['PORT'];
  var port = portEnv == null ? 9999 : int.parse(portEnv);

  runZonedGuarded(() async {
    var handler = const shelf.Pipeline()
        .addMiddleware(gzipMiddleware) // 添加Gzip编码中间件
        .addHandler(staticHandler);

    await shelf_io.serve(handler, '0.0.0.0', port);

    print("Serving $pathToBuild on port $port");
  }, (e, stackTrace) => print('Server error: $e $stackTrace'));
}

在这个例子中,我们首先设置了要服务的静态文件路径,然后创建了一个静态文件处理器staticHandler。接着定义了监听的端口(如果环境变量中有指定则使用环境变量中的值,否则默认为9999)。最后通过shelf.Pipeline()gzipMiddleware添加到处理链中,并启动服务器。

不进行压缩的情况

需要注意的是,并不是所有的响应都会被压缩:

  • 如果响应的内容类型已经是压缩格式(例如:image/jpeg、application/pdf等),那么这些内容不会再次被压缩。
  • 对于较小的响应体(长度<512字节),由于压缩后可能并不会显著减小体积,甚至可能会因为增加了头部信息而变大,所以也不会对其进行压缩。

压缩级别

默认情况下,shelf_gzip使用压缩级别4,这是针对实时压缩(而非存储文件压缩)推荐的设置。这个级别的压缩对于文本或代码内容来说,在压缩效果和CPU消耗之间取得了较好的平衡。原始的默认压缩级别是6,但在实际应用中4级往往更加合适。

功能和问题反馈

如果您发现了任何问题或者有新的功能需求,请前往issue tracker提交报告。

作者

许可证

shelf_gzip遵循BSD-3-Clause License发布。

以上就是关于shelf_gzip插件的基本介绍及其在Flutter服务器端的应用示例。希望这对您有所帮助!


更多关于Flutter服务器中间件GZIP压缩插件shelf_gzip的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter服务器中间件GZIP压缩插件shelf_gzip的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter服务器中间件中使用shelf_gzip插件进行GZIP压缩的示例代码。shelf_gzip是一个用于shelf Dart服务器的中间件,它会自动对响应内容进行GZIP压缩。

首先,确保你在pubspec.yaml文件中添加了shelfshelf_gzip的依赖:

dependencies:
  shelf: ^1.2.0
  shelf_gzip: ^3.0.0

然后,运行flutter pub get来安装这些依赖。

接下来,创建一个简单的shelf服务器并使用shelf_gzip中间件。以下是一个完整的示例代码:

import 'dart:io';
import 'package:shelf/shelf.dart';
import 'package:shelf_gzip/shelf_gzip.dart';

void main() {
  // 创建一个简单的请求处理器
  var handler = (Request request) async {
    // 返回一个简单的响应
    return Response.ok('Hello, this is a GZIP compressed response!')
      ..headers.contentType = ContentType.text;
  };

  // 使用 shelf_gzip 中间件包装处理器
  var gzipHandler = createGzipMiddleware(handler);

  // 创建一个 shelf 服务器并监听端口
  var server = await shelf.serve(gzipHandler, 'localhost', 8080);

  print('Serving at http://${server.address.host}:${server.port}');
}

在这个示例中:

  1. 我们首先导入了必要的包:dart:io用于I/O操作,shelf用于创建服务器,shelf_gzip用于GZIP压缩。
  2. 创建了一个简单的请求处理器handler,它返回一个包含文本“Hello, this is a GZIP compressed response!”的响应。
  3. 使用createGzipMiddleware函数将handler包装起来,生成一个新的处理器gzipHandler,这个处理器会对响应进行GZIP压缩。
  4. 创建一个shelf服务器,监听localhost的8080端口,并将处理请求的任务交给gzipHandler
  5. 打印服务器的地址和端口号。

运行这个程序后,你可以打开浏览器访问http://localhost:8080,并查看响应头。你应该会看到Content-Encoding: gzip,这表明响应内容已经被GZIP压缩了。

这个示例展示了如何在Flutter服务器(实际上是Dart服务器,因为Flutter主要用于客户端开发,但Dart可以用于服务器端开发)中使用shelf_gzip插件进行GZIP压缩。根据你的实际需求,你可以进一步扩展和修改这个示例。

回到顶部