如何在 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 文件