如何设置 ASP.NET Core + Vue.js?

58

我需要将Vue.js与一些ASP.NET Core MVC视图集成。我选择Vue.js而不是其他替代方案,因为他们说它似乎更简单——"只需通过<script>标签添加就可以了"。无需学习Gulp/Grunt/Webpack/Browserify等工具。

然而这个说法被证明是错误的。在我的第一个尝试中,我尝试使用一些扩展库,如vue-momentvue-datetime-picker,它们都来自于这个官方与Vue.js相关的精选列表,但是我遇到了问题。虽然第一个不强制使用require() JS语法(CommonJS?),但第二个则不能没有它正常工作。其他扩展库需要'use babel'imports/exports,这是ECMAScript 6,需要编译。所以,大多数Vue.js的库和工具确实需要编译器,加上来自Node世界的require()语法和所有相关内容吗?

我应该如何设置我的项目才能与ASP.NET Core MVC + Vue.js一起工作呢?这样我就可以开发许多小的Vue应用程序,使用Vue插件(可以require(stuff))吗?


1
原来vue-moment在未编译的环境中出现问题实际上是一个错误(bug)。参考链接:https://github.com/brockpetrie/vue-moment/issues/11 - https://dev59.com/G5rga4cB1Zd3GeqPuO5H - Gerardo Grignoli
我尝试了ASP.NET Core模板包。但是我不明白它是什么。它只是一个托管在kestrel上的vue-webpack-boilerplate吗? - Gerardo Grignoli
4
这里提供了 Aspnetcore 和 Vue(ES6)的模板,供那些需要的人使用:https://github.com/MarkPieszak/aspnetcore-Vue-starter - Mark Pieszak - Trilon.io
我知道这个话题已经很老了,但我是在搜索如何做的时候找到的。在2018年,现代解决方案是执行以下命令:npx vue-cli-service build --mode development --dest ../2-BackEnd/wwwroot/ --watch 在这里,npx允许启动vue-cli-service,它将构建vue js应用程序,在开发模式下,并通过指定目标和使用观察器,您可以获得除了服务以外的所有内容。然后,您只需要运行您的.NET应用程序,它将显示wwwroot中包含的内容。 - Adavo
12个回答

76
我很迷茫,当我提出上面的问题时。我已经花了几天时间,但仍然没有完整的答案。我相信的是2016年是学习JavaScript的难年
我想使用Vue.js,因为它比其他选择更简单。更少的仪式感,更少的样板文件,更少的代码。它被称为“渐进式框架”...没错!但只到一定程度。Vue.js无法解决构建系统中JavaScript生态系统碎片化的问题。
因此,您必须选择一个方向:您需要JavaScript模块和构建系统吗?
选项1:保持简单:避免使用JS模块和构建系统。
跟随这条道路的原因:
  • 你没有多少时间去学习很多东西。(配置bundler,npm+包依赖地狱,ES6等内容)
  • 你不想制作一个前沿的单页面应用程序。将Vue.js嵌入几个HTML页面似乎已经足够了。
  • HTTP/2正在成为主流,因此像Webpack或Browserify这样的bundler提供的好处会减少,至少在性能方面。
  • 最终, ES6模块将直接在浏览器中得到支持,因此我们不需要将最新的JavaScript构建成兼容浏览器的JavaScript。

通过不花费时间学习可能在未来几年内就过时的知识,您将节省许多时间。

如果您选择这条路线,则有几个建议:

  • 只需使用<script>标签即可添加JS库。
  • 只使用准备好的浏览器JavaScript库。使用require()或UMD前缀(function (root, factory) {的代码需要设置模块(因此,除非您设置CommonJS,否则它不是准备好的浏览器)。具有import/export语句的JS文件是用ES6编写的,因此也要避免使用它们。
  • 使用Bower下载已准备好的浏览器libs。避免使用NPM(这意味着必须安装一个模块系统)。

注意:您将无法使用高级Vue.js功能,如single-file components或Vue Router,但这没关系。您将需要手动完成一些任务。

选项2:学习JavaScript模块+构建系统。

准备几天时间来学习而不是编码。我将简要解释一下Webpack是如何工作的。Browserify也可以,但我没有尝试过。

我建议您花些时间了解 JavaScript 模块 是什么。然后学习如何构建和打包它们:我使用的是 Webpack。它的文档不太好,所以对我有用的是逐步按照 教程 进行操作。

目前为止,您可能已经听说过Webpack也有一个内置的Web服务器,具有“热模块重载”功能。这是一个仅用于开发的静态文件Web服务器。它的好处是,每当您编辑JS模块时,浏览器会自动应用更改而无需刷新。这是一个非常好的但可选的功能。问题在于:这个内置的Web服务器与我们的Web服务器(Kestrel)竞争。因此,如果您想在开发过程中尝试此功能,请使用Microsoft提供的Webpack ASP.NET Core middleware,该中间件位于JavaScriptServices repo中。在那里,您将找到我目前正在使用的WebApplicationBasic模板。我对其进行了解剖,删除了大部分内容,并通过尝试使用它逐渐理解了每个部分最初的用途。

使用Webpack时,您主要会使用3种工作流程:

  • 内置开发模式: 创建巨大的文件,易于调试。与'watch-mode'一起使用,这样每当您修改一个文件时,就会触发新的Webpack构建。
  • 内置生产模式: 创建小型缩小文件。对于'dotnet publish'非常有用。
  • 使用Webpack的Web服务器和Webpack ASP.NET Core中间件的热模块重新加载意味着您的应用程序将在后台运行Webpack,构建并监视源文件的更改。编译输出不写入磁盘,仅保留在内存中并通过HTTP提供服务。JavaScriptServices中间件将请求从Kestrel转发到Webpack的Web服务器以使其正常工作。

无论您选择哪种Webpack配置,都必须在Webpack配置中包含'vue-loader'。您可以受到Vue's webpack-simple template的启发。

我没有涵盖我想要的所有内容,但是这个主题太广泛了,我需要回去编码。请留下一些反馈。


非常好的答案!您是否知道有哪些简单的模板链接可以使用 Vue js + Webpack + Laravel 或者 VueJs + Browserify + Laravel,而不是使用 __Asp.net core__? - Rasel
1
我真的很理解你的感受。我被告知要在我们的Core应用程序下使Vue工作,一切都进行得很顺利,直到我需要添加路由。之后,我完全迷失了方向。你有时间为我解释一下如何在DotNet.Core下让Vue的路由正常工作吗?我们不运行NodeJs,但我可能能够手动执行gulpfile.json - Konrad Viltersten
嗨@Rasel。我没有使用过Laravel。也许你可以在LaraCasts.com上搜索,那里有很多信息。https://laracasts.com/index/webpack - Gerardo Grignoli
@KonradViltersten 这里有一个很棒的指南:https://www.liquidlight.co.uk/blog/article/building-a-vue-v2-js-app-using-vue-router/ - Gerardo Grignoli

21

虽然我来晚了,但现在有一个可用于.NET Core的模板,您可以使用单个命令构建它。在已安装.NET Core的Windows计算机上,只需创建一个空文件夹,在该文件夹中运行此命令以显示可用模板列表:

dotnet new

如果你没有所有的模板,你只需要运行以下命令来安装单页应用程序(SPA)模板:

dotnet new --install Microsoft.AspNetCore.SpaTemplates::*

以下是构建新的Vue应用程序的脚手架命令:

dotnet new vue

在毫秒级别内,使用 .NET Core 后端控制器、视图等构建了一个全新的 Vue.js 单页 Web 应用程序。这太棒了!只需在 VS 或 VS Code 中打开项目即可开始。

还有 Aurelia、Angular、Knockout 和 React 的模板!您可以构建它们并比较每个模板如何解决同一问题。 Angular 模板甚至可以直接进行服务器端预渲染!

我知道 .NET Core 还有很长的路要走,但它变得越来越棒!


1
太好了,他们正在增加对vue的支持,感谢您的发布!在新的Windows上使用VS2017时,dotnet new没有vue选项。必须通过dotnet new --install Microsoft.AspNetCore.SpaTemplates::*进行安装。 - Gerardo Grignoli
我注意到这个模板使用TypeScript,而我不懂这种语言。又要学一门新的语言吗?:( - Gerardo Grignoli
啊,是的,谢谢你提醒需要先安装模板!当然,你不一定非要使用TS,但我认为这样做很有意义。 - Norbert Norbertson
为什么TypeScript更有意义?只是好奇。 - user1093111
因为你可以利用TS中的功能,使在JS中编码更加容易和安全。你也可以使用较新的JS特性,但仍然编译到es5并支持旧版浏览器。当然,周围有很多人会告诉你TS是个坏主意,但这不会是Angular 2+团队的看法。 - Norbert Norbertson
显示剩余3条评论

10
首先,免责声明:我找不到真正符合我需求的东西,所以我从头开始构建了一个解决方案。请看结尾。
您询问如何通过<script>标签(在这种情况下为CDN构建)引入Vue。 然而,您还提到使用Babel和ES6模块特性。在这种情况下,我建议使用Webpack来编译客户端应用程序,它将使用Babel编译您的ES6,允许您使用模块和组件,并使用模板!您还可以获得热模块重新加载(编辑源代码并实时查看客户端应用程序中的更改!),Webpack将把您的SPA打包成静态HTML5应用程序。
官方Vue.js文档指向他们自己的Webpack模板
因此,如果适合您的需求,您可以独立运行Webpack dev服务器和ASP.NET Core应用程序,但有一个更好的解决方案可以使开发流程更加简化:

Microsoft的开源JavaScriptServices允许您从ASP.NET Core执行Node.js,并且他们有一些Webpack中间件,可以在调试构建期间将Webpack dev服务器集成到您的应用程序中。

他们为Angular 2提供了官方模板,甚至还有一个标记为Vue.js的模板,但是Vue模板只是官方的Webpack模板,没有与.NET的任何集成;这就像独立的服务器。

我找不到任何为Vue.js完成此操作的模板,因此我编写了一个ASP.NET Core示例应用程序,该应用程序使用Vue.js Webpack应用程序加载Webpack dev中间件。当.NET Core服务器以dev模式运行时,您可以编辑Vue源代码,而无需重新构建整个应用程序即可快速增量更新。在发布模式下,.NET Core将使用预构建的Webpack输出。您可以在GitHub上找到它:

https://github.com/0xFireball/YetAnotherShrinker

上面链接的代码库有一个完整的应用程序演示,使用了NancyFx、axios、Vue.js和Vue Material,并且是一个简单的URL缩短器。如果你想要更小的设置步骤,可以轻松地添加到现有的应用程序中,请查看我的这篇博客文章
必须说明:我写了那篇博客文章。

1
截至本文撰写时,您的博客文章链接(包括git仓库中的链接)均已失效。 - k3davis
2
我刚刚更新了帖子,加入了新链接;现在它们应该都是有效的。 - 839829389A

5
也许有人会发现这些信息很有用。
以下是一些入门模板,可用于快速项目设置。
第一个模板为您提供了一个多项目解决方案,并具有一些预定义的架构。此模板更接近于现实世界中的项目,而不是已经在此处提到的JavaScriptServices解决方案。它提供了域层、存储库层等。请注意,这是一个Yeoman生成器,它使用TypeScript。 https://github.com/vue-typed/generator-vue-net-core 第二个只是GitHub上的一个项目,如果您想使用它,应该克隆它。它不是Yeoman生成器,我认为这很遗憾,但我发现这个模板的结构比第一个更好。此外,它还有很多小巧的东西,如一些异常过滤器,您很可能仍然需要自己完成。如果您是初学者,这个模板将是一个福音。这个模板在awesome-vue页面上推荐。这里是链接: https://github.com/mrellipse/toucan

4

我发现了一种在ASP.NET Core Web应用中创建单文件Vue组件的方法,即将它们存储为共享Razor视图并在项目中引用为部分视图,这种方式不需要使用任何JavaScript捆绑包。这是一个非常简单的解决方案,并且与Vue v2.6.x完美配合。

下面是一个简单的单文件Bootstrap卡片Vue组件(_Card.cshtml)。

<style>
    .card {
        width: 15rem;
    }
</style>
<script type="text/javascript">
    Vue.component('vue-card', {
        props: {
            id: String,
            name: String,
            img: String
        },
        template: '#vue-card-template'
    });
</script>
<script type="text/template" id="vue-card-template">
    <div v-bind:id="id" v-bind:name="name">
        <div class="card">
            <img v-bind:src="img" class="card-img-top p-4 bg-light border-bottom">
            <div class="card-body">
                <p class="card-text">
                    <slot></slot>
                </p>
            </div>
        </div>
    </div>
</script>

以下是在 Razor 页面上使用它的部分:

<div id="app">
    <vue-card id="Id" name="Card" img="https://vuejs.org/images/logo.png" class="mb-4">
         <h6>Bootstrap 4 Card Vue Component</h6>
       </vue-card>
</div>

@section Scripts {

<partial name="_Card" />

<script type="text/javascript">
        var app = new Vue({
            el: '#app'
        })
</script>
}

请查看我的 Github 示例项目以获取详细信息: ASP.NET Core + Vue.js
我还在 Medium 上写了一篇关于如何在 ASP.NET Core 中使用 Vue 组件的文章: Using Vue Components in ASP.NET Core

3

3
您可以尝试以下步骤,来自这个简单的指南:链接
  1. Set up the npm configuration file (package.json)

Below is the npm package I will use:

{
  "version": "1.0.0",
  "name": "asp.net",
  "private": true,
  "scripts": {
    "prod": "gulp --production",
    "dev": "gulp watch"
  },
  "devDependencies": {
    "gulp": "^3.9.1",
    "laravel-elixir": "^6.0.0-14",
    "laravel-elixir-vue-2": "^0.2.0",
    "laravel-elixir-webpack-official": "^1.0.2",
    "vue": "^2.0.1",
    "vue-resource": "^1.0.3",
    "vuex": "^2.1.1"
  }
}
  1. Install the npm package

Open a command prompt and go to the root folder of your application and install the npm packages set from your package.json file using the command ‘npm install’, without the quotes.

  1. Set up Gulp

Once the npm package is installed you may now set up the Gulp file. You will need to add a Gulp configuration file (gulpfile.js). Later on we will create the Vue JS which we will call vueApp.js with the code below. The first argument is the public output directory and the other one is the source directory. For more details on Webpack click here.

var elixir = require('laravel-elixir');



require('laravel-elixir-vue-2');

elixir(function (mix) {
    mix.webpack('vueApp.js', 'wwwroot/js/dist', 'wwwroot/js');
});
  1. Create the Vue JS file

In your ASP.NET Core web app project solution explorer go to wwwroot and add a ‘js’ folder and if it does not exist then add again a new folder named ‘dist’. Now once the folder setup is complete add a new JavaScript file in the ‘js’ folder named ‘vueApp.js’.

  1. Start coding in your Vue JS file

You may now start coding. In the example below we will be displaying an alert to indicate that Vue.js is running.

import Vue from 'vue'

new Vue(
    {
        el: '#app',
        data() {
            message:'hello world using Vue.js on ASP.NET Core MVC.'
        },
        mounted() {
            console.log(this.message);
        }
    });
  1. Apply Vue JS to your Razor view or HTML

Open your layout page and wrap the content of your body tag with a div and an id of ‘app’. We will use ‘app’ since that is the id tag we used in our sample code from step 5. The name ‘app’ is not required and you may change it to your desired name. Lastly add a reference to the Vue JS file. Be sure to move outside the ‘app’ div the script references to prevent error.

<body>

<div id="app">

    <nav class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a asp-area="" asp-controller="Home" asp-action="Index" class="navbar-brand">Project.Payrole</a>
            </div>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li><a asp-area="" asp-controller="Home" asp-action="Index">Home</a></li>
                    <li><a asp-area="" asp-controller="Home" asp-action="About">About</a></li>
                    <li><a asp-area="" asp-controller="Home" asp-action="Contact">Contact</a></li>
                </ul>
                @await Html.PartialAsync("_LoginPartial")
            </div>
        </div>
    </nav>
    <div class="container body-content">
        @RenderBody()
        <hr />
        <footer>
            <p>&copy; 2017 - Project.Payrole</p>
        </footer>
    </div>

</div>

<environment names="Development">
    <script src="~/lib/jquery/dist/jquery.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>
</environment>

<environment names="Staging,Production">
    <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-2.2.0.min.js"
            asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
            asp-fallback-test="window.jQuery"
            crossorigin="anonymous"
            integrity="sha384-K+ctZQ+LL8q6tP7I94W+qzQsfRV2a+AfHIi9k8z8l9ggpc8X+Ytst4yBo/hH+8Fk">
    </script>
    <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/bootstrap.min.js"
            asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.min.js"
            asp-fallback-test="window.jQuery && window.jQuery.fn && window.jQuery.fn.modal"
            crossorigin="anonymous"
            integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa">
    </script>
    <script src="~/js/site.min.js" asp-append-version="true"></script>
</environment>

<script src="~/js/dist/vueApp.js" asp-append-version="true"></script>



    @RenderSection("Scripts", required: false)
</body>
  1. 运行Gulp

现在我们已经设置了Vue.js配置并将其应用于Razor视图,我们需要运行Gulp来执行我们在gulpfile中设置的内容。像第2步一样,转到根文件夹并打开命令提示符,然后执行命令“npm run dev”,同样不需要引号。

  1. 运行

现在进行最后一步,运行您的ASP.NET Core MVC应用程序并检查Web浏览器的控制台。您现在应该能够看到我们在第5步中设置的消息。

(我在博客文章中编写了指南,以备日后参考:D)


在复制内容时,请确保遵循我们的归属指南。请注意,直接复制整个页面很少能成为好的答案;相反,尝试发布针对问题量身定制的答案,并在必要时从来源中挑选片段。 - Matt
抱歉,我已经编辑了答案。我写了一个指南并转移了一些内容到这里,我认为这可能有助于回答问题。 - SlowNinja

2
我也来晚了,但我相信在过去的一年或更短时间内已经发生了很多变化。考虑到ES6模块规范(以及动态模块)现在有相对广泛的浏览器支持(请参见CanIUse),将Vue.js集成到ASP.NET MVC Razor视图中的选项现在远远更好了。关于Vue.js的一件事是,最好放弃关于“插件”的预设概念,就像jQuery那样。如果你和我一样来自jQuery世界(没有Angular或React经验),你必须坐下来学习Vue的组件模型(即使是SFCs;虽然在这种情况下不需要,但它们有助于定义整体图像)。这需要对ES6(ECMAScript 2015)有一个不错的掌握。
迭代和增量方法是,如果您想开始学习和利用Vue的最大优点之一(易于CDD-组件驱动开发),那么只需在脚本标记中添加“Full”构建(请参见指南)。使用ES6模块语法(导入/导出),您可以构建自己的组件库,这些组件可以插入到任何需要它们的地方;不需要Webpack或转码。这真是一个很棒的开发,因为您可以尝试使用Vue.js,并使用最佳实践进行组件化,而无需承担将Webpack和Babel添加到.NET项目中的初始(繁琐)学习曲线。而且,作为额外的奖励,当您需要通过现代工具和工作流程(NPM、Webpack、测试、HMR、VS Code等)提高您的游戏时,您已经准备好了许多组件。
基本上,您要在DOM元素中构建并附加根Vue实例(即Vue组件)。一旦您理解了一切都是组件,那么您就有信心深入挖掘开源包,如vue-moment和vue-datetime-picker,并通过模块语法导入它们或从它们中学习以合并到自己的自定义组件中。

2
如果你在2022年或之后,我认为你需要查看ServiceStack项目模板:https://docs.servicestack.net/templates-overview 安装方法如下:
dotnet tool install --global x
或者在苹果新款M1 Pro和M1 Max ARM芯片上安装:
dotnet tool install -g -a x64 x
之后,你可以通过以下命令查看可用的模板列表:
x new
或者直接获取你的vue + .net core模板:
x new vue-lite-corefx [ProjectName]

0

我花了很长时间学习如何使用Browserify和Babel,以便设置自己的ES6环境。然而,当涉及到使用Vue时,我很高兴选择默认模板,最好通过安装Vue-CLI来访问。您可以在Browserify和Webpack之间进行选择,并且可以使用仅运行时版本的简单设置或完整设置,包括linting、单元测试和Single-File组件。

它只是有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接