【问题标题】:Bundling and minification of ES6 javascript files in an asp.net MVC web application在 asp.net MVC Web 应用程序中捆绑和缩小 ES6 javascript 文件
【发布时间】:2021-01-17 06:09:27
【问题描述】:

我们知道 System.Web.optimization 不支持 ES6 javascript 文件打包和缩小,那么如何支持呢?

【问题讨论】:

    标签: c# asp.net asp.net-mvc bundling-and-minification system.web.optimization


    【解决方案1】:
    1. BuildBundlerMinifier NuGet 包安装到您的项目中。
    2. 将具有以下 devDependencies 的 package.json 文件添加到项目的根目录:

    {
      "name": "YourProjectName",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "devDependencies": {
        "del": "^3.0.0",
        "gulp": "^4.0.0",
        "gulp-concat": "^2.6.1",
        "gulp-cssmin": "^0.2.0",
        "gulp-htmlmin": "^3.0.0",
        "gulp-terser": "^1.4.0",
        "gulp-uglify": "^3.0.0",
        "merge-stream": "^1.0.1"
      },
      "keywords": [],
      "author": "",
      "license": "ISC"
    }
    1. 在项目根目录中运行以下 npm 命令:

    npm 我

    npm i -g gulp-cli

    1. 将以下 gulpfile.js 文件添加到项目根目录:

    'use strict';
    
    var gulp = require('gulp'),
        concat = require('gulp-concat'),
        cssmin = require('gulp-cssmin'),
        htmlmin = require('gulp-htmlmin'),
        uglify = require('gulp-uglify'),
        merge = require('merge-stream'),
        del = require('del'),
        bundleconfig = require('./bundleconfig.json');
    const terser = require('gulp-terser');
    
    const regex = {
        css: /\.css$/,
        html: /\.(html|htm)$/,
        js: /\.js$/
    };
    
    gulp.task('min:js', async function () {
        merge(getBundles(regex.js).map(bundle => {
            return gulp.src(bundle.inputFiles, { base: '.' })
                .pipe(concat(bundle.outputFileName))
                //.pipe(uglify())
                .pipe(terser())
                .pipe(gulp.dest('.'));
        }))
    });
    
    gulp.task('min:css', async function () {
        merge(getBundles(regex.css).map(bundle => {
            return gulp.src(bundle.inputFiles, { base: '.' })
                .pipe(concat(bundle.outputFileName))
                .pipe(cssmin())
                .pipe(gulp.dest('.'));
        }))
    });
    
    gulp.task('min:html', async function () {
        merge(getBundles(regex.html).map(bundle => {
            return gulp.src(bundle.inputFiles, { base: '.' })
                .pipe(concat(bundle.outputFileName))
                .pipe(htmlmin({ collapseWhitespace: true, minifyCSS: true, minifyJS: true }))
                .pipe(gulp.dest('.'));
        }))
    });
    
    gulp.task('min', gulp.series(['min:js', 'min:css', 'min:html']));
    
    gulp.task('clean', () => {
        return del(bundleconfig.map(bundle => bundle.outputFileName));
    });
    
    gulp.task('watch', () => {
        getBundles(regex.js).forEach(
            bundle => gulp.watch(bundle.inputFiles, gulp.series(["min:js"])));
    
        getBundles(regex.css).forEach(
            bundle => gulp.watch(bundle.inputFiles, gulp.series(["min:css"])));
    
        getBundles(regex.html).forEach(
            bundle => gulp.watch(bundle.inputFiles, gulp.series(['min:html'])));
    });
    
    const getBundles = (regexPattern) => {
        return bundleconfig.filter(bundle => {
            return regexPattern.test(bundle.outputFileName);
        });
    };
    
    gulp.task('default', gulp.series("min"));
    1. 在项目的 .csproj 文件中添加以下构建任务:

    <Target Name="MyPreCompileTarget" BeforeTargets="Build">   
      <Exec Command="gulp min" />
     </Target>
    1. 在项目根目录下添加如下bundleconfig.json文件(这里可以添加js,css文件需要缩小):

    [
      {
        "outputFileName": "Content/css/site.min.css",
        "inputFiles": [
          "Content/css/site.css"
        ]
      },
      {
        "outputFileName": "Content/js/site.min.js",
        "inputFiles": [
          "Content/js/site.js"
        ],
        "minify": {
          "enabled": true,
          "renameLocals": true
        },
        "sourceMap": false
      }
    ]
    1. 在您的 BundleConfig.cs 中,您可以执行以下操作:

      public class BundleConfig
      {
          public static void RegisterBundles(BundleCollection bundles)
        {
      
      
           bundles.Add(new Bundle("~/Content/css/site").Include(
                    "~/Content/css/site.css"));
      
      
           bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                       "~/Content/lib/jquery/jquery-{version}.js"));
      
           //use Bundle instead of ScriptBundle
           bundles.Add(new Bundle("~/Content/js/site").Include(
                       "~/Content/js/site.js"));
      
           //disable it for development environment
           if (Environment.Development)
           {
               BundleTable.EnableOptimizations = false;
           }
           else
           {
               BundleTable.EnableOptimizations = true;
           }
       }
      }
      
    2. 终于进入你的视野:

      @Styles.Render("~/Content/css/site")
      @Scripts.Render("~/Content/js/site")
      

    我的回答基于以下 MSDN 资源:

    Bundling and Minification

    Bundle and minify static assets in ASP.NET Core

    【讨论】:

      猜你喜欢
      • 2017-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-21
      • 2023-03-21
      • 2014-04-16
      • 1970-01-01
      • 2014-11-26
      相关资源
      最近更新 更多