给ASP.NET Core Web发布包做减法

1.引言

紧接上篇:ASP.NET Core Web App应用第三方Bootstrap模板。这一节我们来讲讲如何优化ASP.NET Core Web发布包繁重的问题。

在ASP.NET Core Web App中我们可以通过Bower或NPM来安装一些JS、CSS插件,来方便我们组织前端组件。但是这也给我带来了一个问题,那就是发布时需要把安装的Bower包或NPM包都要打包上传到服务器。

如果现在发布ASP.NET Core Web App,wwwroot下已包含到项目中的文件都会被发布。虽然我们可以使用捆绑和微小的技术对js、css进行压缩来减少网页大小来提升加载速度。但是,我们发布包的大小却不能减少。

如果我们项目中引用了较少的前端包文件,也无可厚非。但当我们引用了较多的包文件时。那我们的发布包将会占用很大一部分空间。尤其是当我们进行CI/CD时,将会耗费大量的时间来进行包还原和包文件上传。

2. 思路

我们就以集成AdminLte的ASP.NET Core Mvc项目为例,看看发布的包大小究竟有多大。

从上图我们看到发布后wwwroot/plugins文件夹就占了很大一部分空间。而wwwroot/plugins中就是安装的Bower包。

那这些Bower包中的文件我们都有用到吗?显然没有。我们就顶多引用了个js和css文件而已。到这里,减负的思路我们就清晰了。剔除ASP.NET Core Web中未引用的Bower包文件,把没有引用到的文件删除不就得了?!

但是你随便打开一个Bower包文件夹,你就不想这么做了,一个一个删要删到什么时候。而且如果直接去删除Bower包中无用的文件,可能会影响bower包的管理,比如bower包的升级降级。

不卖关子了,思路如下:

  1. 新建一个文件夹,将引用的文件复制到另外的目录。(保持原bower包中的目录层级)
  2. 修改项目中的引用到新的文件夹拷贝路径下。
  3. 将原来的wwwroot\plugins 排除到项目外(Exclude From Project)

你可能会说,这么复杂啊,还不如我一个一个删除啊。别怕,我们让这一切自动化。而这个自动化工具就是Gulp.js

3. 行动

以我们之前的Demo为例。

  1. 全局安装 gulp: $ npm install --global gulp
  2. 作为项目的开发依赖(devDependencies)安装: $ npm install --save-dev gulp $ npm install --save-dev path $ npm install --save-dev del 安装成功后会在项目根目录创建package-lock.json文件和node_components文件夹。
  3. 在项目根目录下创建一个名为 gulpfile.js 的文件。将以下代码粘贴复制进去。
const gulp = require('gulp');//1. 引用gulp
var path = require('path');//2. 引用path
var del = require('del');//3.引用del

//定义路径
const paths = {
    src: 'wwwroot/plugins/',
    dest: 'wwwroot/lib/'
};

//定义需要完整复制的Bower文件夹
const copyFolders = [
    "bootstrap",
    "font-awesome"
];

//定义项目中需要引用的bower包中的js、css文件
const copyFiles = [
    "Ionicons/css/ionicons.css",
    "jquery/dist/jquery.min.js",
    "bootstrap/dist/js/bootstrap.min.js"
];

//在复制之前先清空生成目录
gulp.task('clean:all', function (cb) {
    del([paths.dest], cb);
});

//复制文件
gulp.task('copy:file', () => {
    //循环遍历文件列表
    var tasks = copyFiles.map(function (file) {
        //拼接文件完整路径
        var scrFullPath = path.join(`${paths.src}`, file);
        //拼接完整目标路径
        var index = file.lastIndexOf('/');
        var destPath = file.substring(0, index);
        var destFullPath=path.join(`${paths.dest}`, destPath);
        return gulp.src(scrFullPath)
            .pipe(gulp.dest(destFullPath));

    });

});

//复制文件夹
gulp.task('copy:folder', () => {
    var tasks = copyFolders.map(function (folder) {
        //拼接完整目标路径
        var destFullPath = path.join(`${paths.dest}`, folder);
        return gulp.src(path.join(`${paths.src}`, folder + '/**/*'))
            .pipe(gulp.dest(destFullPath));
    });

});

//将三个任务组装在一起
gulp.task('default', ['clean:all', 'copy:file', 'copy:folder']);

代码注释的很详细,就不过多赘述了。有一点需要解释下,为什么需要完整拷贝bootstrap和font-awesome呢?因为引用的font-awesome.min.css会引用包文件的一些字体文件等,为了省事,就把包全部拷贝了一遍。而一般绝大多数包都是简单拷贝css和js文件就ok了的。而至于什么时候拷贝文件,什么时候文件夹。很简单,默认先拷贝文件,运行项目,然后浏览器F12,如果发现有无法加载的error,那就是了。

  1. 运行gulp 右键gulpfile.js-->Task Runner Exploerer-->双击Gulpfile.js-Tasks-default,即可运行。操作动图如下:

运行后,需要复制的Bower包文件和文件夹就会复制到wwwroot\lib文件夹下。如图:

  1. 将bower包安装文件夹排除到项目外。
  2. 更新项目中现有文件的引用到lib目录下。
  3. That's all, thank you.

4. 效果

重新发布,我们可以发现发布的包大小已有40M减小到8M。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

推荐一个工具包自定义HTTP 404错误

一个方便的工具Microsoft 的工具包--网页错误工具包,可以帮助您设计和实现自定义错误页。 网页错误工具包是点击到 IIS 的 ASP.NET 应用程...

2105
来自专栏张善友的专栏

.NET Core 系列5 :使用 Nuget打包类库

NuGet是个开源项目,项目包括 NuGet VS插件/NuGet Explorer/NuGetServer/NuGet命令行等项目,.NET Core项目完全...

2515
来自专栏河湾欢儿的专栏

npm

Npm: Node Package management node包管理工具; npm :Npm -v ------npm install 模块名称 ...

1891
来自专栏Porschev[钟慰]的专栏

.NET4.0下网站应用程序用UrlRewriter.dll重写无后缀路径 (在IIS7.5中的配置方法)

接上一篇  .NET4.0下网站应用程序用UrlRewriter.dll重写无后缀路径 在IIS中新建网站(端口号8111)       直接运行http://...

2068
来自专栏蓝天

SIGPIPE导致cronttab和shell脚本等工作异常

cron和sh等可能被某些共享库hook,而这些共享库可能会触发SIGPIPE,导致crontab和shell工作异常,解决办法是程序忽略SIGPIPE或脚本中...

681
来自专栏小轻论坛

Win10如何查看本地连接的WiFi密码?

Win10如何查看本地连接的WiFi密码?Win10电脑只要连接上WiFi,就会自动保存WiFi密码,今后开启电脑就会自动连接WiFi无线网络。有时候,当忘记W...

4K3
来自专栏WebDeveloper

Thinkphp的cron计划任务

cron1默认在ThinkPHP\Library\Cron\cron1.php如果没有cron目录则新建一个,cron1.php自己所要执行的脚本

1503
来自专栏依乐祝

.NET Core部署中你不了解的框架依赖与独立部署

框架依赖的部署:顾名思义,依赖框架的部署 (FDD) 依赖目标系统上存在共享系统级版本的 .NET Core。 由于已存在 .NET Core,因此应用在 .N...

1602
来自专栏Crossin的编程教室

Python 相关下载

常有同学反映 Python 官网打不开、网速慢,或者不知道下载哪一个安装包。因此帮大家下载好了目前常用的几个版本,上传了百度网盘,并根据平台和版本分类放置。顺便...

4346
来自专栏GuZhenYin

VS2017 WinFrom打包设置与教程

前言 项目中有用到winfrom做配套的打印程序,直接给客户一个debug文件夹,当然不是很好.. 记录一下打包过程. 正文 首先需要下载 Visual Stu...

4665

扫码关注云+社区

领取腾讯云代金券