.net 项目静态文件自动压缩打包
在 ASP.NET MVC 时代,我们常使用 BundleCollection
设置需要打包压缩的 js 和 css 文件,运行时框架会自动处理打包压缩过程并将最终结果传入响应。
ASP.NET Core 开始,不再提供内置的打包压缩组件,官方推荐 WebOptimizer 替代使用。
上述两者都是在运行时实时处理,应该至少在系统初始化时会占用一定的资源。
【资料图】
时间来到 .NET 大一统时代,截止目前(.NET7),我们仍然只能寻求外部组件的帮助。有一个编译期生成预期文件的组件 BuildBundlerMinifier
,nuget 安装后进行简单的 JSON 配置即可使用,但遗憾的是,它不支持压缩包含 ES6 语法的 js,会报未将对象引用设置到对象的实例
错误。
于是我们开始考虑独立于 .NET 平台的,较为成熟的方案,比如 grunt
和 gulp
。
grunt
: 使用 JSON 描述构建步骤gulp
:基于流传递(管道机制)
这两者都拥有丰富的插件,以应对各种需求。下面以更年轻更简单的 gulp
为例,说明如何使之与 Visual Studio
配合使用。
假设有如下 .NET 项目,其中按约定静态文件存放在 wwwroot
目录下
# 全局安装 gulp 或 gulp-cli,提供可在命令行执行的 gulp 指令npm install -g gulp-cli
需要注意的是,我们还需要在待处理的目录下安装 gulp,否则后续运行命令时会提示 Local gulp not found.
错误。其实这是Gulp故意设计的,原因是为了版本和依赖的控制,也就是当别人 fork 你的代码,或者你过段时间拷贝到别的电脑上再 gulp 的时候,能控制该项目中 gulp 的版本和其他插件的版本始终保持不变。(这里的 gulp 其实也可看作插件,只是它是官方提供的。博主不怀疑 gulp 团队前向兼容的能力,推测是考虑第三方插件前向兼容的能力参差不齐的缘故。)
# 进入待处理的目录,此是 .net 项目下的一个子目录cd wwwroot/# 将此子目录初始化为 npm 项目npm init -y# 安装 gulp 插件,提供各种 gulp.xxx()npm install gulp -D
此时在该目录下查看 gulp 版本
gulp --version# 输出:CLI version: 2.3.0 # 全局 cli 版本Local version: 4.0.2 # 当前项目下 gulp 插件版本
安装需要的第三方插件# 以下各插件功能请查阅相关资料 npm i -D gulp-cssmin gulp-autoprefixer gulp-uglify# es6 语法转 es5,窃以为目前浏览器对 es6 的支持程度,大可不必npm i -D gulp-babel @babel/core @babel/preset-env# 提供合并若干文件为单一文件的功能npm i -D gulp-concat
编写 gulpfile.js在项目根目录下(wwwroot/)新建 gulpfile.js,编写任务脚本
// 加载 项目gulp 依赖包const gulp = require("gulp");// 加载 css相关依赖包const autoprefixer = require("gulp-autoprefixer");const cssmin = require("gulp-cssmin");// 加载 js相关依赖包const uglify = require("gulp-uglify");const babel = require("gulp-babel");// 加载文件合并处理包const concat = require("gulp-concat");// 打包 cssconst cssHandler = function () { return gulp.src("./css/main.css") .pipe(autoprefixer()) .pipe(cssmin()) .pipe(concat("main.min.css")) .pipe(gulp.dest("./css"))}// 打包 jsconst jsHandler = function () { return gulp.src(["./js/instruction/*.js", "./js/repos/*.js", "./js/app/*.js"]) .pipe(babel({ presets: ["@babel/env"] })) .pipe(uglify()) .pipe(concat("main.min.js")) .pipe(gulp.dest("./js"))}// 3-3,定义默认执行程序module.exports.default = gulp.parallel(cssHandler, jsHandler)
注意,gulp.dest() 参数表示的是目标目录而非目标文件名(输出文件名默认同源文件名),如果要自定义输出文件名可使用 gulp-rename 插件;或如上使用 gulp-concat,它的目的是合并若干文件为单一文件,自然能指定生成的文件名咯。
完成上述步骤后,我们就可以在命令行执行 gulp
检查输出结果。
在 .net 项目根目录下(注意非 wwwroot/)新建一个批处理文件 package-statics.bat:
cd wwwrootgulp
然后编辑项目文件(.csproj),在
意思很简单:在编译前先执行批处理文件,也就是先执行之前我们设置好的 gulp 流程。
如果你的项目采用了 CI/CD 自动构建,可能服务器上并没有安装 gulp,那么可以在本地先执行打包,将生成后的文件提交,然后在服务器上编译时跳过打包步骤,直接使用提交的文件。实现这个场景也很简单,只要在上述
。参看演练:使用 MSBuild
ps:在页面中,我们希望开发时依然引用的是原文件,上线后才引用打包后文件,那么可以使用
标记,通过判断环境变量达到这一目的:
参考资料gulp打包详解
关键词:
相关阅读
-
.net 项目静态文件自动压缩打包
打包工具选型在ASP NETMVC时代,我们常使用`BundleCollection`设置需 -
天天热消息:中能观察丨绿色能源与新能...
中国能源新闻网是由国家能源局主管,中国电力报社、中电传媒股份有限公 -
天天热点评!国家气候中心:预计6月18日...
央视网消息:据国家气候中心官微6月15日消息,综合最新气候监测和国内 -
保定市青年路小学开展 党的二十大精神...
保定晚报讯(通讯员闫冰)6月14日,在升旗仪式上,市青年路小学校长从 -
夏天快把“彩色背心”穿起来!时尚减龄...
搭配一双格纹袜,穿一双清新干净的小白鞋,一身简约舒适又有元气十足的 -
今日热讯:古代四大美女图片_古代四大美...
大家好,小石来为大家解答以上问题。古代四大美女图片,古代四大美女指
精彩放送
-
.net 项目静态文件自动压缩打包
打包工具选型在ASP NETMVC时代,我们常使用`BundleCollection`设置需 -
天天热消息:中能观察丨绿色能源与新能...
中国能源新闻网是由国家能源局主管,中国电力报社、中电传媒股份有限公 -
天天热点评!国家气候中心:预计6月18日...
央视网消息:据国家气候中心官微6月15日消息,综合最新气候监测和国内 -
保定市青年路小学开展 党的二十大精神...
保定晚报讯(通讯员闫冰)6月14日,在升旗仪式上,市青年路小学校长从 -
夏天快把“彩色背心”穿起来!时尚减龄...
搭配一双格纹袜,穿一双清新干净的小白鞋,一身简约舒适又有元气十足的 -
今日热讯:古代四大美女图片_古代四大美...
大家好,小石来为大家解答以上问题。古代四大美女图片,古代四大美女指 -
全球今热点:环翠区:“链”上发力 产...
企业干起来,项目动起来,实体经济发展茁壮起来……眼下,在环翠大... -
天天热资讯!与读者建立美学信任,从“...
近日,继《坦率》后,同系列图书《直言》面世,两本书收录潘凯雄自2016 -
速看:微信表情包下载后怎么删除_微信表...
1、下载微信表情包可以直接在表情商店添加也可以从手机导入,具体操作 -
野外烤鱼要怎么烤熟?
野外烤鱼的做法教程:1、将鲫鱼收拾干净背上开两刀,撒盐、姜粉、料酒