Как я могу остановить минификацию ASP.NET Core 2.0 MVC от изменения определенного файла? - PullRequest
0 голосов
/ 06 мая 2018

Я выполняю Объединение и минификацию в ASP.NET Core 2.0 MVC , и я столкнулся с проблемой, когда минификация происходит, когда она не должна. На моей странице есть следующий тег script:

<script src="https://code.jquery.com/jquery-3.3.1.min.js"
        integrity="sha384-tsQFqpEReu7ZLhBV2VZlAu7zcOV+rXbYlF2cqB8txI/8aZajjp4Bqd+V6D5IgvKT"
        crossorigin="anonymous"
        asp-fallback-test="window.jQuery"
        asp-fallback-src="~/js/jquery.min.js">
</script>

В моем bundleconfig.json у меня есть следующий раздел:

{
    "outputFileName": "wwwroot/js/jquery.min.js",
    "inputFiles": [
        "node_modules/jquery/dist/jquery.min.js"
    ],
    "minify": {
        "enabled": false
    }
}

Проблема в том, что файл ~ / js / jquery.min.js теряет завершающий символ новой строки, когда он преобразуется этим процессом объединения / минификации, что делает ожидаемый хеш файла больше не совпадающим , В качестве обходного пути я могу указать 2 хэша для значения целостности для поддержки файла с или без новой строки, например:

integrity="sha384-tsQFqpEReu7ZLhBV2VZlAu7zcOV+rXbYlF2cqB8txI/8aZajjp4Bqd+V6D5IgvKT sha384-I7/UTpkJas2maMjJpGmrvEgQecqO8Dta/9Wwh+cQrH6Jj984WRRFhWg4MV/oTkIW"

Но это менее эффективно, чем просто убедиться, что минификация не затрагивает этот файл. Как я могу остановить эту новую строку от обрезки?

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Я считаю, что система минимизации по умолчанию несколько ограничена, и для таких вещей, как исключение файлов, я обычно использую вместо этого средство запуска задач, например Gulp .

Итак, как сделать то, что вы хотите, используя gulp:

Добавление поддержки npm

Сначала добавьте поддержку пакетов npm, добавив файл package.json , если у вас его еще нет, в обозревателе решений щелкните правой кнопкой мыши имя проекта, затем добавьте новый элемент и выполните поиск. для файла конфигурации npm .

Внутри package.json добавьте следующие требуемые зависимости gulp, а также любую другую клиентскую библиотеку, которую вы хотите использовать, например, jquery, bootstrap и т. Д. :

{
  "version": "1.0.0",
  "name": "asp.net",
  "private": true,
  "devDependencies": {
    "gulp": "3.9.1",
    "gulp-concat": "2.6.1",
    "gulp-cssmin": "0.2.0",
    "gulp-uglify": "3.0.0",
    "gulp-filter": "5.1.0",
    "gulp-watch": "5.0.0",
    "rimraf": "2.6.2",
    "jquery": "3.3.1",
    "bootstrap": "4.1.1",
    "popper.js": "1.14.3"
  }
}

После сохранения файла папка будет добавлена ​​в каталог вашего проекта с именем node_modules (эта папка не будет видна, если вы не активируете «Показать все файлы» на панели инструментов Solution Explorer.

Эта папка содержит все библиотеки и их зависимости, мы будем использовать gulp для копирования библиотек, которые вы хотите включить, из node_modules в вашу папку wwwroot.

Настройка Gulp

  • Создайте две другие папки в корне вашего проекта, назовите одну Стили и другую Скрипты .

Вы можете использовать эти папки для своих скриптов приложений и таблиц стилей, мы будем использовать gulp для объединения, минимизации и копирования в папку wwwroot всех этих ресурсов.

Идея состоит в том, чтобы избегать прямого использования папки wwwroot, чтобы иметь полный контроль над тем, что вы демонстрируете и как вы публикуете свой веб-сайт.

  • Добавьте файл javascript в корневой каталог вашего проекта и назовите его gulpfile.js

Вы можете использовать gulp для создания различных задач, которые могут выполняться автоматически до или после сборки, при очистке проекта, при открытии проекта в Visual Studio и т. Д. *

Для этого примера я создам следующие задачи:

  • clean: js , чтобы очистить все файлы в папке wwwroot / js.
  • clean: css для очистки всех файлов css в папке wwwroot / css.
  • clean для запуска clean: js и clean: css один за другим.
  • смотреть , чтобы следить за изменениями в вашем приложении и файлах таблиц стилей, поэтому при каждом их сохранении ресурсы восстанавливаются в wwwroot.
  • dev: js для создания ресурсов wwwroot javascript во время разработки.
  • dev: css для создания ресурсов wwwroot css во время разработки.
  • dev для выполнения dev: js и dev: css один за другим.
  • min: js для генерации ресурсов wwwroot javascript во время производства.
  • min: css для создания ресурсов wwwroot css во время производства.
  • min для выполнения min: js и min: css один за другим.

В Gulp есть много плагинов, вам нужно указать, какие из них требуются для вашего проекта, для этого добавьте в начало вашего скрипта следующее:

/// <binding BeforeBuild='clean, dev, min' Clean='clean' ProjectOpened='watch' />
"use strict";

var gulp = require("gulp"),
rimraf = require("rimraf"),
concat = require("gulp-concat"),
cssmin = require("gulp-cssmin"),
uglify = require("gulp-uglify"),
gulpFilter = require("gulp-filter");

Как вы можете сделать вывод из названия, плагин gulp-filter - это то, что мы будем использовать для исключения файлов из процесса минификации.

Теперь вам нужно настроить несколько общих путей:

var paths = {
    webroot: "./wwwroot/",
    scripts: "./Scripts/",
    styles: "./Styles/",
    node_modules: "./node_modules/"
};

//The following paths will be used to look for any js and css file in your Script and Styles folder or any subfolder inside them 
paths.scripts = paths.scripts + "**/*.js";
paths.styles = paths.styles + "**/*.css";

Примечание: если вам нужно указать порядок любого скрипта внутри этих папок, вы можете сделать следующее:

paths.scripts = [paths.scripts + "/somescript.js", paths.scripts + "**/*.js"];
paths.styles = [paths.styles + "/somecss.css", paths.styles + "**/*.css"];

Затем определите пути к скриптам вендора, которые находятся в папке node_modules:

paths.vendorJs = [paths.node_modules + "jquery/dist/jquery.js", 
        paths.node_modules + "popper.js/dist/umd/popper.js",
            paths.node_modules + "bootstrap/dist/js/bootstrap.js"];

paths.vendorCss = [paths.node_modules + "bootstrap/dist/css/bootstrap.css"];

paths.minVendorJs = [paths.node_modules + "jquery/dist/jquery.min.js", 
    paths.node_modules + "jquery/dist/umd/popper.min.js", 
      paths.node_modules + "bootstrap/dist/js/bootstrap.min.js"];

paths.minVendorCss = [paths.node_modules + "bootstrap/dist/css/bootstrap.min.css"];

Идея состоит в том, чтобы избежать минимизации для любого файла, указанного в paths.minVendorJs, поскольку они уже минифицированы. Следующий путь позволит вам минимизировать любой конкретный файл вендора, если вам нужно это сделать:

paths.vendorCssToMinify = [paths.node_modules + "perfect-scrollbar/css/perfect-scrollbar.css"]

Затем мы определяем выходные файлы, которые будут сгенерированы, для этого примера будет сгенерирован только один сценарий и одна таблица стилей, которая содержит все файлы приложения, а также все файлы поставщиков, объединенные в них:

paths.concatJsDest = paths.webroot + "js/application.js";
paths.concatCssDest = paths.webroot + "css/application.css";

paths.minConcatJsDest = paths.webroot + "js/application.min.js";
paths.minConcatCssDest = paths.webroot + "css/application.min.css";

Наконец, мы определяем каждую задачу:

gulp.task("clean:js", function (cb) {
    rimraf(paths.webroot + "js/**/*.js", cb);
});

gulp.task("clean:css", function (cb) {
    rimraf(paths.webroot + "css/**/*.css", cb);
});

gulp.task("clean", ["clean:js", "clean:css"]);

gulp.task('watch', function () {
    gulp.watch(paths.styles, ['dev:css', 'clean:css']);
    gulp.watch(paths.scripts, ['dev:js', 'clean:js', ]);
});

gulp.task("dev:js", function () {
    return gulp.src(paths.vendorJs.concat(paths.scripts))
        .pipe(concat(paths.concatJsDest))
        .pipe(gulp.dest('.'));
});

gulp.task("dev:css", function () {
    return gulp.src(paths.vendorCss.concat(paths.styles))
        .pipe(concat(paths.concatCssDest))
        .pipe(gulp.dest('.'));
});

gulp.task("min:js", function () {
    // Files to skip from minification.
    var filter = gulpFilter(paths.minVendorJs, {
        restore: true
    });

    return gulp.src(paths.minVendorJs.concat(paths.scripts))
        .pipe(filter)
        .pipe(uglify())
        .pipe(filter.restore)
        .pipe(concat(paths.minConcatJsDest))
        .pipe(gulp.dest("."));
});

gulp.task("min:css", function () {
    // Files to skip from minification.
    var filter = gulpFilter(paths.minVendorCss, {
        restore: true
    });
    return gulp.src(paths.minVendorCss.concat(paths.vendorCssToMinify).concat(paths.styles))
        .pipe(filter)
        .pipe(cssmin())
        .pipe(filter.restore)
        .pipe(concat(paths.minConcatCssDest))
        .pipe(gulp.dest("."));
});

gulp.task("dev", ["dev:js", "dev:css"]);
gulp.task("min", ["min:js", "min:css"]);

И это все!

Чтобы проверить конфигурацию, щелкните правой кнопкой мыши файл gulpfile.js и выберите Task Runner Explorer . Если все прошло правильно, вы должны увидеть что-то вроде этого:

Task Runner Explorer

Вы можете запускать задачи, дважды щелкнув по ним.

Вы можете использовать сгенерированные ресурсы в ваших видах бритвы следующим образом:

<environment include="Development">
    <link rel="stylesheet" href="~/css/application.css" />
</environment>
<environment exclude="Development">
    <link rel="stylesheet" href="~/css/application.min.css" />
</environment>

И

<environment include="Development">
    <script src="~/js/application.js"></script>
</environment>
<environment exclude="Development">
    <script src="~/js/application.min.js"></script>
</environment>

Если вам нужно скомпилировать файлы LESS или SASS, вам нужно использовать соответствующий плагин Gulp, см. здесь для примера.

Дополнительная информация об использовании Gulp в ASP.NET Core: https://docs.microsoft.com/en-us/aspnet/core/client-side/using-gulp?view=aspnetcore-2.0

0 голосов
/ 13 мая 2018

Попробуйте использовать следующую конфигурацию:

//1. by default outputMode is singleLine which removes new lines and output on a single line. We are setting it to none.
{
    "outputFileName": "wwwroot/js/jquery.min.js",
    "inputFiles": [
        "node_modules/jquery/dist/jquery.min.js"
     ],
     "minify": {
           "enabled": false,
            outputMode: "none"         
      }
}


//Alternatively, outputMode = "multipleLines" should work with a indentSize of 0 as well.
//In this mode , output file has each line indented by specified indentSize
{
    "outputFileName": "wwwroot/js/jquery.min.js",
    "inputFiles": [
        "node_modules/jquery/dist/jquery.min.js"
     ],
      "minify": {
       "enabled": false,
        outputMode: "multipleLines",
         indentSize: 0
    }
}

Вы можете прочитать о доступных настройках для javascript minifier здесь

...