前言

本文介绍的是AspNetCore的MVC项目,WebApi+独立前端这种前后端分离的项目就不需要多此一举了~默认前端小伙伴是懂得使用前端工具链的。

为啥要用MVC这种服务端渲染技术呢?

  1. 简单项目不需要强行分离增加复杂度(如:我正在开发的博客项目)
  2. 后端渲染利于SEO,对博客网站友好

OK,虽然MVC的技术老了点,但依然可以结合现代前端工具链来提高效率

本文的食用需要先安装好Node.js环境,下载地址:https://nodejs.org/en/download

在开始前,先看看我们的项目文件结构

  • Blog/

    • Blog.Web/

      • Program.cs
      • Blog.Web.csproj
    • Blog.Data/
    • Blog.sln

使用NPM安装依赖

首先在项目根目录(也就是Blog/Blog.Web)执行

  1. npm init

生成package.json文件

完成之后项目结构应该类似这样

  • Blog/

    • Blog.Web/

      • Program.cs
      • Blog.Web.csproj
      • package.json (npm init 命令创建的文件)

然后编辑package.json或者使用命令行npm install bootstrap来添加需要的前端库

安装的前端库会保存在Blog/Blog.Web/node_modules这个目录下,但我们的静态文件需要放在Blog/Blog.Web/wwwroot里才行,也就是说,我们需要将使用到的 npm 包移动到 wwwroot 文件下。

怎么搞?手动移动或复制是不可能的,太麻烦了。

这时候就要借助自动化工具,这里选择了gulp.js,用于实现自动移动文件,打包压缩 js、css、image、删除文件等操作。提高生产力~

安装gulp

首先安装gulp全局工具

  1. npm install --global gulp-cli

然后在项目中安装gulp以及几个插件作为开发依赖(devDependencies)

  1. //gulp.js
  2. npm install gulp --save-dev
  3. //压缩 css
  4. npm install gulp-clean-css --save-dev
  5. //合并文件
  6. npm install gulp-concat --save-dev
  7. //压缩 js
  8. npm install gulp-uglify --save-dev
  9. //重命名
  10. npm install gulp-rename --save-dev
  11. //删除文件、文件夹
  12. npm install rimraf --save-dev
  13. //监听文件变化
  14. npm install gulp-changed --save-dev

安装完了之后,项目的package.json文件应该类似下面这样:

  1. {
  2. "name": "star-blog",
  3. "devDependencies": {
  4. "gulp": "^4.0.2",
  5. "gulp-changed": "^4.0.3",
  6. "gulp-clean-css": "^4.3.0",
  7. "gulp-concat": "^2.6.1",
  8. "gulp-rename": "^2.0.0",
  9. "gulp-uglify": "^3.0.2",
  10. "rimraf": "^3.0.2"
  11. },
  12. "dependencies": {
  13. ...
  14. }
  15. }

配置gulp

继续在根目录(和package.json同级目录)下新建gulpfile.js文件

  1. /// <binding BeforeBuild='min' Clean='clean' ProjectOpened='auto' />
  2. "use strict";
  3. //加载使用到的 gulp 插件
  4. const gulp = require("gulp"),
  5. rimraf = require("rimraf"),
  6. concat = require("gulp-concat"),
  7. cssmin = require("gulp-clean-css"),
  8. rename = require("gulp-rename"),
  9. uglify = require("gulp-uglify"),
  10. changed = require("gulp-changed");
  11. //定义 wwwroot 下的各文件存放路径
  12. const paths = {
  13. root: "./wwwroot/",
  14. css: './wwwroot/css/',
  15. js: './wwwroot/js/',
  16. lib: './wwwroot/lib/'
  17. };
  18. //css
  19. paths.cssDist = paths.css + "**/*.css";//匹配所有 css 的文件所在路径
  20. paths.minCssDist = paths.css + "**/*.min.css";//匹配所有 css 对应压缩后的文件所在路径
  21. paths.concatCssDist = paths.css + "app.min.css";//将所有的 css 压缩到一个 css 文件后的路径
  22. //js
  23. paths.jsDist = paths.js + "**/*.js";//匹配所有 js 的文件所在路径
  24. paths.minJsDist = paths.js + "**/*.min.js";//匹配所有 js 对应压缩后的文件所在路径
  25. paths.concatJsDist = paths.js + "app.min.js";//将所有的 js 压缩到一个 js 文件后的路径
  26. //使用 npm 下载的前端组件包
  27. const libs = [
  28. {name: "jquery", dist: "./node_modules/jquery/dist/**/*.*"},
  29. {name: "popper", dist: "./node_modules/popper.js/dist/**/*.*"},
  30. {name: "bootstrap", dist: "./node_modules/bootstrap/dist/**/*.*"},
  31. {name:"bootswatch",dist: "./node_modules/bootswatch/dist/**/*.*"}
  32. ];
  33. //清除压缩后的文件
  34. gulp.task("clean:css", done => rimraf(paths.minCssDist, done));
  35. gulp.task("clean:js", done => rimraf(paths.minJsDist, done));
  36. gulp.task("clean", gulp.series(["clean:js", "clean:css"]));
  37. //移动 npm 下载的前端组件包到 wwwroot 路径下
  38. gulp.task("move", done => {
  39. libs.forEach(function (item) {
  40. gulp.src(item.dist)
  41. .pipe(gulp.dest(paths.lib + item.name + "/dist"));
  42. });
  43. done()
  44. });
  45. //每一个 css 文件压缩到对应的 min.css
  46. gulp.task("min:css", () => {
  47. return gulp.src([paths.cssDist, "!" + paths.minCssDist], {base: "."})
  48. .pipe(rename({suffix: '.min'}))
  49. .pipe(changed('.'))
  50. .pipe(cssmin())
  51. .pipe(gulp.dest('.'));
  52. });
  53. //将所有的 css 文件合并打包压缩到 app.min.css 中
  54. gulp.task("concatmin:css", () => {
  55. return gulp.src([paths.cssDist, "!" + paths.minCssDist], {base: "."})
  56. .pipe(concat(paths.concatCssDist))
  57. .pipe(changed('.'))
  58. .pipe(cssmin())
  59. .pipe(gulp.dest("."));
  60. });
  61. //每一个 js 文件压缩到对应的 min.js
  62. gulp.task("min:js", () => {
  63. return gulp.src([paths.jsDist, "!" + paths.minJsDist], {base: "."})
  64. .pipe(rename({suffix: '.min'}))
  65. .pipe(changed('.'))
  66. .pipe(uglify())
  67. .pipe(gulp.dest('.'));
  68. });
  69. //将所有的 js 文件合并打包压缩到 app.min.js 中
  70. gulp.task("concatmin:js", () => {
  71. return gulp.src([paths.jsDist, "!" + paths.minJsDist], {base: "."})
  72. .pipe(concat(paths.concatJsDist))
  73. .pipe(changed('.'))
  74. .pipe(uglify())
  75. .pipe(gulp.dest("."));
  76. });
  77. gulp.task("min", gulp.series(["min:js", "min:css"]));
  78. gulp.task("concatmin", gulp.series(["concatmin:js", "concatmin:css"]));
  79. //监听文件变化后自动执行
  80. gulp.task("auto", () => {
  81. gulp.watch(paths.css, gulp.series(["min:css", "concatmin:css"]));
  82. gulp.watch(paths.js, gulp.series(["min:js", "concatmin:js"]));
  83. });

执行任务

上面定义这几个任务:

  • move:把在libs常量里配置的node_modules包的dist文件夹移动到wwwroot/lib
  • min:把我们在wwwroot/csswwwroot/js里写的css和js,每一个都压缩成xxx.min.css/xxx.min.js
  • concatmin:把上面min压缩的所有css和js,合成一个app.min.cssapp.min.js
  • auto:自动监听文件变化后自动执行上面的minconcatmin任务

在终端中输入gulp --tasks,可以查看我们定义的这些任务

  1. > gulp --tasks
  2. [17:37:44] Tasks for /home/da/Code/StarBlog/StarBlog.Web/gulpfile.js
  3. [17:37:44] ├── clean:css
  4. [17:37:44] ├── clean:js
  5. [17:37:44] ├─┬ clean
  6. [17:37:44] └─┬ <series>
  7. [17:37:44] ├── clean:js
  8. [17:37:44] └── clean:css
  9. [17:37:44] ├── move
  10. [17:37:44] ├── min:css
  11. [17:37:44] ├── concatmin:css
  12. [17:37:44] ├── min:js
  13. [17:37:44] ├── concatmin:js
  14. [17:37:44] ├─┬ min
  15. [17:37:44] └─┬ <series>
  16. [17:37:44] ├── min:js
  17. [17:37:44] └── min:css
  18. [17:37:44] ├─┬ concatmin
  19. [17:37:44] └─┬ <series>
  20. [17:37:44] ├── concatmin:js
  21. [17:37:44] └── concatmin:css
  22. [17:37:44] └── auto

使用gulp task-name的命令可以执行任务,例如:

  1. > gulp min
  2. [17:41:41] Using gulpfile /home/da/Code/StarBlog/StarBlog.Web/gulpfile.js
  3. [17:41:41] Starting 'min'...
  4. [17:41:41] Starting 'min:js'...
  5. [17:41:41] Finished 'min:js' after 19 ms
  6. [17:41:41] Starting 'min:css'...
  7. [17:41:41] Finished 'min:css' after 21 ms
  8. [17:41:41] Finished 'min' after 44 ms

这就完成了把我们在wwwroot/csswwwroot/js里写的css和js,每一个都压缩成xxx.min.css/xxx.min.js的任务。方便!

结合IDE

VS我没有用过,我是用Rider做开发的,所以只介绍一下rider的

很简单,打开 Run/Debug Configuration,在添加配置里面选择 JavaScript Build Tools 里的 Gulp.js

然后选择项目里的GulpFile,Tasks栏下拉可以看到我们定义好的任务,直接添加就完事了

添加完就像C#项目一样,可以直接执行

razor里使用

使用Gulp.js收集静态文件到wwwroot目录后,razor文件里的引用需要小小的改一下,如下:

引用CSS文件

  1. <link rel="stylesheet" href="~/lib/fontawesome-free-6.0.0-web/css/all.css">
  2. <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css">
  3. <link rel="stylesheet" href="~/lib/bootswatch/dist/united/bootstrap.min.css">
  4. <link rel="stylesheet" href="~/css/app.min.css">

引用JS文件

  1. <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
  2. <script src="~/js/app.min.js"></script>

大功告成!

参考资料

Asp-Net-Core开发笔记:使用NPM和gulp管理前端静态文件的更多相关文章

  1. Django项目引入NPM和gulp管理前端资源

    前言 之前写了一篇<Asp-Net-Core开发笔记:使用NPM和gulp管理前端静态文件>,现在又来用Django开发项目了,之前我搞了一个Django的快速开发脚手架「DjangoSt ...

  2. Asp.Net Core Linux环境下 找不到配置文件、静态文件的问题

    直接发布会找不到配置文件,和静态文件.需要先cd到项目文件夹,然后在发布.

  3. 在 ASP.NET Core 项目中使用 npm 管理你的前端组件包

    一.前言 在项目的前端开发中,对于绝大多数的小伙伴来说,当然,也包括我,不可避免的需要在项目中使用到一些第三方的组件包.这时,团队中的小伙伴是选择直接去组件的官网上下载,还是图省事直接在网上搜索,然后 ...

  4. 在CentOS7 开发与部署 asp.net core app笔记

    原文:在CentOS7 开发与部署 asp.net core app笔记 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lihongzhai/art ...

  5. asp.net core开发环境准备

    1.1  安装sdk和运行时 浏览器打开网址https://www.microsoft.com/net/download, 到.Net Core下载页面. 根据操作系统,下载对应的SDK进行安装.安装 ...

  6. C# -- HttpWebRequest 和 HttpWebResponse 的使用 C#编写扫雷游戏 使用IIS调试ASP.NET网站程序 WCF入门教程 ASP.Net Core开发(踩坑)指南 ASP.Net Core Razor+AdminLTE 小试牛刀 webservice创建、部署和调用 .net接收post请求并把数据转为字典格式

    C# -- HttpWebRequest 和 HttpWebResponse 的使用 C# -- HttpWebRequest 和 HttpWebResponse 的使用 结合使用HttpWebReq ...

  7. 2月送书福利:ASP.NET Core开发实战

    大家都知道我有一个公众号“恰童鞋骚年”,在公众号2020年第一天发布的推文<2020年,请让我重新介绍我自己>中,我曾说到我会在2020年中每个月为所有关注“恰童鞋骚年”公众号的童鞋们送一 ...

  8. [转]ASP.NET Core 开发-Logging 使用NLog 写日志文件

    本文转自:http://www.cnblogs.com/Leo_wl/p/5561812.html ASP.NET Core 开发-Logging 使用NLog 写日志文件. NLog 可以适用于 . ...

  9. ASP.NET Core 开发-中间件(Middleware)

    ASP.NET Core开发,开发并使用中间件(Middleware). 中间件是被组装成一个应用程序管道来处理请求和响应的软件组件. 每个组件选择是否传递给管道中的下一个组件的请求,并能之前和下一组 ...

随机推荐

  1. mybatis-plus中查询出的字段为空

    数据查询出后其中几个字段为null 解决方法: 数据库的字段命名方式为使用下划线连接,对应的实体类应该是驼峰命名方式,而我使用的是和数据库同样的命名方式. 所以mybatis-plus映射不到,修改实 ...

  2. 不用find,怎样递归地给目录设置700,给文件设置600权限?

    https://stackoverflow.com/questions/36553701/how-to-set-permissions-recursively-700-for-folders-and- ...

  3. vert.x框架-简单路由使用

    package xue.myVertX; import io.vertx.core.AbstractVerticle; import io.vertx.core.Vertx; import io.ve ...

  4. gitlab新增ssh

    https://blog.csdn.net/u011925641/article/details/79897517

  5. 用户注册调优 及Connection对象

    调优的方法: (1)减少Connection对象的销毁与创建 我们可以在服务器启动时 预先创建好二十个Connection对象 因为每次Coonection对象的创建与销毁会浪费大量的时间  我们需要 ...

  6. 安装TestNG

    1.启动Eclipse,选择"Help"-->'Install New Software' 2.在谈出的弹框中选择"Add" 3.在弹出的"Ad ...

  7. 多种语言tcp编程

    再次强调,最好socket编程 c#的tcpclient等封装无法对接android的socket服务器 c#的tcpclient等封装可对接java的socket服务器 python socket服 ...

  8. Android开发 定时任务清理数据

    原文地址:Android开发 定时任务清理数据 | Stars-One的杂货小窝 公司项目,需要整定时任务,对数据进行清理,需要在每天凌晨0:00进行数据的清理,使用了Alarm和广播的方式来实现 P ...

  9. NOIP2020 排水系统

    几度欲写,却望高精而却步,今习得__int128,君子报仇,一年不晚. NOIP2020 排水系统 DAG图,拓扑就好,核心难点在于毒瘤的分数的操作,毕竟只是T!只有分数相加,就很简单了. a/b + ...

  10. Spring @SessionAttributes注解 @ModelAttribute注解

    一.@SessionAttribute详解 如果多个请求之间需要共享数据,就可以使用@SessionAttribute. 配置的方法: 在控制器类上标注@SessionAttribute. 配置需要共 ...