如何在 Angular cli 中启用 gzip 压缩以进行生产构建

Posted

技术标签:

【中文标题】如何在 Angular cli 中启用 gzip 压缩以进行生产构建【英文标题】:how to enable gzip compression in angular cli for production build 【发布时间】:2017-11-29 05:40:58 【问题描述】:

我想压缩在构建angular 项目时创建的捆绑文件。我目前使用ng build --environment=$environment 构建应用程序,"@angular/compiler-cli": "^4.0.0" 的版本不会将.gz 文件生成到 dist 文件夹。生成.gz 捆绑文件的最简单方法是什么(最好不要接触webpack.config.js 文件)? PS:我知道创建.gz 文件的选项在某个时候被 angular/cli 团队删除了。但是我非常需要它,因为我的捆绑文件很大。

【问题讨论】:

【参考方案1】:

我的理解是 cli 团队删除了 .gz 压缩选项,因为大多数服务器会在将文件提供给浏览器之前自动压缩文件(只要浏览器支持压缩响应 - 大多数都支持)。

【讨论】:

有什么替代方法?我想在我的 Angular7、Ionic 4 项目中进行压缩?【参考方案2】:

您可以在将它们传输到服务器之前使用简单的 bash 脚本来实现这一点,甚至可以将其作为命令添加到 package.json 中

 "scripts": 
   "build.prod": "ng build --environment=prod && tar -zcvf archive.tar.gz dist/prod/*",

不确定您的文件夹结构是什么,但您可以在终端中使用tar -zcvf archive.tar.gz dist/prod/*,直到找到适合您需要的路径。

编辑:似乎我误解了这个问题,如果在向最终用户提供内容时涉及捆绑大小,您应该查看 AOT + Rollup 以最小化捆绑大小。并在提供文件时在您的网络服务器上启用 gzip 压缩(可能大多数服务器已经启用它)。

【讨论】:

我继续在服务器上进行 gzip 压缩,效果很好。 不知何故它失败了tar -zcvf archive.tar.gz dist/prod/*" 命令,即使我已经安装了tar 这种服务器压缩很神奇。但是为什么 Angular 本身不提供这样的压缩呢? 好的,接下来的答案讨论一下。【参考方案3】:

Angular-cli 团队已移除对生成压缩文件 (.gz) 的支持。 Github discussion url.

我们可以为此使用 gulp 任务。 安装以下 npm 模块:

$npm install --save-dev gulp
$npm install --save-dev gulp-gzip

创建 gulpfile.js

var gulp = require('gulp');
var gzip = require('gulp-gzip');

gulp.task('compress', function() 
  return gulp.src(['./dist/**/*.*'])
      .pipe(gzip())
      .pipe(gulp.dest('./dist'));
);

由于.gz 支持可以在Web 服务器中配置,但服务器必须自己进行压缩并为此花费一些CPU 周期。如果我们预先构建它,那么它可以帮助服务器节省一些 cpu 周期。 :)

我们可以将它作为脚本添加到package.json 中,以便在应用程序的每个build 之后运行。

"scripts": 
       ...
       "postbuild": "gulp compress"
       ...
   

【讨论】:

在哪里添加这个 gulpfile.js ? 嗨@SureshKumar,您可以将文件保存在项目的根目录或package.json的同一级别 ng serve创建的文件可以gzip吗? @OkashaRafique 这个脚本在npm run build 命令之后运行。 @Amitesh 谢谢。我在 IIS 上发布了它,还在 IIS 中添加了 URL 审查包,然后我就可以对其进行测试了。【参考方案4】:

我找到了更简单的解决方案来解决这个问题。 试试这个:

npm i --save-dev gzipper

并在您的 angular-cli.json 中将 gzipper --verbose ./dist 添加到您的构建命令中,例如:

ng build && gzipper --verbose ./dist

【讨论】:

@iliya.rudberg 命令ng build --prod && gzipper --verbose ./dist 创建压缩文件,但一旦部署,仍然引用js 文件。知道为什么吗? @UthpalaPathirana 你的意思是浏览器没有得到压缩文件?您使用哪个服务器来托管您的文件?如果是 nginx,请检查此链接 - ***.com/questions/12640014/… 我认为需要启用 SSL 才能获取预压缩文件,即使服务器配置为在 IIS 中获取具有 URL-rewrite 的文件。 这是我的首选解决方案。提示:在新版本的 gzipper 中你必须写 ng build && gzipper compress ./dist --verbose 运行“ng build --prod && gzipper ./dist”后,我将所有文件上传到 Azure 静态 Web 存储,但是当访问网站仍然使用未压缩版本时...有人可以指点我吗方向?【参考方案5】:

我认为您需要在您的 api 上启用 gzip 编码。 这样,客户端就会向服务器请求压缩资源。

【讨论】:

以上是关于如何在 Angular cli 中启用 gzip 压缩以进行生产构建的主要内容,如果未能解决你的问题,请参考以下文章

如何设置“内容编码”以启用 Webpack 服务器的 gzip 文件

如何在 Jetty 中启用 gzip 压缩?

如何启用 gzip?

在 IIS7 上使用 MVC3 时如何启用 gzip 压缩?

如何在 YAWS 上启用 gzip 压缩?

Java如何在spring boot中启用gzip压缩并验证其生效