在ASP.NET Core 2.2 Web应用程序项目中自定义Bootstrap

.NET Core 2的默认Web应用程序模板

介绍

Visual Studio 2017.NET Core 2.2的默认Web应用程序模板包含Bootstrap的默认实现,其在wwwroot/lib文件夹中。这非常好,如果您不关心您的应用程序/站点的样式与其他每个Bootstrap站点一样,或者不管您是否使用Bootstrap的所有功能,都包括大量的cssjs文件。

我定制、修剪Bootstrap的解决方案是使用npmwebpack创建自己的自定义Bootstrap cssjs包。我选择npm只是因为我在开发前端应用程序时使用它,因此它是熟悉的领域。

虽然这篇文章涉及定制Bootstrap以用于.NET Core应用程序,但同样的技术可用于其他项目。

如果尚未安装它们,请确保安装了Visual Studio 2017(社区或其他),.NET Core SDK 2.2Node.js. 您还需要在Visual Studio 2017中安装“ASP.NETWeb开发工作负载。

https://www.codeproject.com/KB/aspnet/1276979/01-installer-300x146.png

Visual Studio 2017中包含“ASP.NETWeb开发

https://www.codeproject.com/KB/aspnet/1276979/02-coreinstall-300x298.png

安装.NET Core 2.2 SDK

https://www.codeproject.com/KB/aspnet/1276979/04-node-300x224.png

安装包含npmnode.js.

扫描二维码关注公众号,回复: 5347709 查看本文章

首次创建.NET Core Web应用程序时,最终会得到一个文件夹结构,如下所示:

https://www.codeproject.com/KB/aspnet/1276979/08-filelist-194x300.png

初始文件列表

删除wwwroot /lib/bootstrap文件夹及其所有内容和子文件夹。我们将不再使用它了。

Visual Studio 2017中,在项目的名为package.json的根文件夹中添加npm Configuration File” 

https://www.codeproject.com/KB/aspnet/1276979/07-npmconfig-300x150.png

添加npm配置文件

注意:使用npm安装软件包时,我们需要在项目文件夹中,而不是解决方案文件夹(如果不同)。另外,请注意,在安装软件包时,您不会编辑npm配置文件,因为npm将尝试更新配置文件,如果将其锁定,可能无法执行此操作。

在项目的根文件夹中打开命令提示符并发出以下命令来安装我们将要使用的包:

npm install --save bootstrap popper.js jquery
npm install --save-dev webpack webpack-cli
npm install --save-dev sass-loader node-sass
npm install --save-dev babel-loader @babel/core @babel/preset-env
npm install --save-dev uglifyjs-webpack-plugin

更新package.json文件,使其包含一个包含命令的scripts部分,我们将用它来构建我们的捆绑文件,snip

"scripts": {
    "bootstrap-js": "webpack --mode production --progress --profile --config webpack.bootstrap.js",
    "bootstrap-css": "node-sass 
       --output-style compressed client/css/bootstrap.scss wwwroot/css/bootstrap.min.css",
    "bundles": "npm run bootstrap-js && npm run boostrap-css"
}

在项目的文件夹中创建clients”文件夹,并在client文件夹中创建jscss文件夹。

使用以下测试内容创建client/css/_custom.scss(我们可以覆盖此文件中的任何Bootstrap sass变量以更改Bootstrap外观):

// Will change the backcolor of the body to yellow instead of white
$body-bg: #f9fbaf;

使用以下测试内容创建client/css/bootstrap.scss

// import our application specific bootstrap overrides in _custom.scss
@import "custom";

// import whole of bootstrap
@import "~bootstrap/scss/bootstrap";

// or just import the bits of bootstrap we will be using 
// (look in bootstrap's bootstrap.scss file for full list)
//@import "~bootstrap/scss/functions";
//@import "~bootstrap/scss/variables";
//@import "~bootstrap/scss/mixins";
//@import "~bootstrap/scss/root";
//@import "~bootstrap/scss/reboot";
//@import "~bootstrap/scss/type";
//@import "~bootstrap/scss/grid";
//@import "~bootstrap/scss/buttons";

client/js中,创建此bootstrap.js文件:

// include all of bootstrap javascript
//import 'bootstrap';

// or include just the bits of bootstrap javascript we want
import 'bootstrap/js/dist/modal';
import 'bootstrap/js/dist/tooltip';

使用Visual Studio 2017在项目的文件夹中添加以下JavaScript文件; “ webpack.bootstrap.js ”

// path is so we can resolve relative paths later regardless 
// of operating system differences
const path = require('path');
// uglifyjs-webpack-plugin will allow us to minify our js
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');

module.exports = {
    entry: {
        // js entry point
        bootstrap: './client/js/bootstrap.js'
    },
    // default mode
    mode: 'production',
    // apply rules
    module: {
        rules: [
            {
                // use babel to transpile latest js into 
                // something earlier browsers understand
                // may not be needed depending on source
                test: /\.js$/,
                use: {
                    loader: 'babel-loader',
                    options: {
                        presets: ['@babel/preset-env']
                    }
                }
            }
        ]
    },
    optimization: {
        minimizer: [
            // js minification options
            new UglifyJsPlugin({
                cache: true,
                parallel: true,
                sourceMap: true
            })
        ]
    },
    output: {
        // output js and map filenames
        filename: 'js/[name].min.js',
        path: path.resolve(__dirname, 'wwwroot'),
        sourceMapFilename: 'js/[name].js.map'
    },
    // make sure a .map is created
    devtool: 'source-map'
};

您现在可以在项目的根文件夹中的命令提示符处使用以下命令来生成初始文件包:

npm run bundles

我们现在可以进行自定义,例如,更改bootstrap中使用的颜色和字体,可能只包括用于模态(modals)和工具提示(tooltips)JavaScript,并且仅包括我们将实际使用的Bootstrap CSS的选择。这是通过编辑client/js/bootstrap.jsclient/css/_custom.scssclient/css/bootstrap.scss文件的内容,然后重新运行npm run bundles来重新创建我们的捆绑文件来完成的。

我们还需要更新Pages/Shared/_Layout.cshtml文件以引用我们的bootstrap文件而不是bootstrap cdnlib文件夹中的JavaScriptCSS文件,snip

...
    <link rel="stylesheet" href="~/css/bootstrap.min.css" asp-append-version="true" />
    <link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
...
    <script src="~/js/bootstrap.min.js" asp-append-version="true"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>
...

是否需要添加或删除其他库将完全取决于您计划在Web应用程序中交付的内容。

如果您只是想提供整个Bootstrap JS并且只修改CSS,那么通过众所周知的CDN包含对完整JS的引用是最佳解决方案,如果最终用户可以访问互联网,因为完整的JS可能已经缓存在浏览器中,而不是通过相同的cdn访问其他引用它的站点。

您可以进行的另一项更改是确保每次构建项目时都会构建捆绑包。为此,请选择工具 > 其他窗体任务运行器资源管理器 ”。在任务运行器资源管理器中,您应该看到package.jso文件和我们在Custom下创建的脚本项。右键单击bundles项,选择Bindings然后选择Before Build,现在无论何时构建项目,都会首先构建bundle。但是,您可能会发现构建需要的时间太长,您可以根据需要重新构建Bootstrap文件。

如果要使用Azure DevOps将项目和Bootstrap捆绑包构建为CI管道的一部分,则需要执行几个步骤。

目前,您需要包含.NET Core 2.2 SDK,因为截至此日期,Azure DevOps尚未准备好。当您来阅读本文时可能会出现这种情况,在这种情况下,可以跳过此第一步。在管道顶部添加“.NET Core SDK安装程序步骤,如下所示:

https://www.codeproject.com/KB/aspnet/1276979/pipeline01-1024x526.png

您还需要让管道安装npm及其依赖项,因此在Restore步骤之后使用install命令添加npm步骤,确保选择正确的工作文件夹,类似于:

https://www.codeproject.com/KB/aspnet/1276979/pipeline02-1024x655.png

然后,您可以添加一个npm命令来构建捆绑包,方法是使用自定义命令run bundles(或您设置的任何脚本命令)添加另一个npm步骤,再次确保选择了正确的工作文件夹,类似于:

https://www.codeproject.com/KB/aspnet/1276979/pipeline03-1024x676.png

 

原文地址:https://www.codeproject.com/Articles/1276979/Customising-Bootstrap-in-ASP-NET-Core-2-2-Web-Appl

猜你喜欢

转载自blog.csdn.net/mzl87/article/details/87561000