【问题标题】:Best approach when replacing jQuery with VueJS 2 in multi-page existing .NET MVC application在多页现有 .NET MVC 应用程序中用 VueJS 2 替换 jQuery 的最佳方法
【发布时间】:2017-07-21 08:18:34
【问题描述】:

我是 VueJS 的新手

我有一个多页 ASP.NET MVC 应用程序,我想在其中使用 VueJS(组件、2 路绑定、验证、CRUD 操作)

目前使用 jQuery 进行 DOM 操作、Ajax 请求等

我应该如何处理这个问题? 我从不同的帖子(在线)中得到了太多的想法

有人可以指导我并给我一些入门指南吗?

一些循序渐进的文档会很棒,它展示了如何使用带有 vuejs 单文件组件和捆绑的 hello world 页面(MVC 视图)来做到这一点

捆绑过程似乎很复杂。但我很想在我的代码中使用 LESS

感谢阅读

【问题讨论】:

  • 我了解单文件 vue 组件,但捆绑过程似乎过度杀戮。我可以有一些工具并指向我有 *.vue 组件的文件夹并编译所有文件。然后将输出文件部署到我的应用程序中的正确文件夹?还是我在这里想老办法??
  • 您需要单文件组件吗? Vue 被吹捧为一个渐进式框架。你不必使用它们。
  • 我只是为了简单。我想要一种易于理解和维护的最简单的方法。
  • 当我们开始时,对于组件,我们所做的只是创建一个包含常用组件的单个文件,为这些组件使用字符串模板,并将该脚本包含在页面上。然后在页面中,执行一个新的 Vue(),然后你就可以参加比赛了。编辑字符串模板可能很痛苦,但要开始使用并不难。
  • Bert,您还没有为组件创建 .vue 文件,然后使用预编译器为组件生成 js\css 文件或只是 .js 文件?还有这个项目或应用有多大?

标签: asp.net-mvc vuejs2 vue-component vue.js


【解决方案1】:

非常基本的

我所知道的在 ASP.NET 中使用 Vue 的最基本方法就是在项目中包含 Vue 脚本。您可以使用 vue.js Nuget 包,它将 Vue 脚本添加到您的 Scripts 目录中,并且只在您的 MVC 视图中包含开发版本或缩小版本。

<script src="~/Scripts/vue.min.js"></script>

然后在你的视图cshtml中,添加一个脚本块即可。

<script>
    new Vue({
        el: "#app",
        data: {
            message: "Hello from Vue"
        }
    })
</script>

其中#app 指的是您视图中的元素。如果你想使用一个组件,只需将它添加到你的脚本块中。

<script>
    Vue.component("child", {
        template:"<h1>I'm a child component!</h1>"
    })

    new Vue({
        el: "#app",
        data: {
            message: "Hello from Vue"
        }
    })
</script>

并修改您的 Vue 模板。

<div id="app">
    {{message}}
    <child></child>
</div>

如果您发现自己构建了很多组件(您可能会这样做),请将它们提取到 vue.components.js 文件或类似文件中,在其中定义所有组件,并将其包含在 vue 之外的视图中脚本。

使用单个文件组件

为了使用单文件组件,您需要将单文件组件的 node.js 构建过程集成到您的 ASP.NET MVC 构建过程中。

安装node.js。 node.js安装好后,全局安装webpack。

npm install webpack -g

将 package.json 添加到您的项目中。这是我使用的。

{
  "version": "1.0.0",
  "name": "vue-example",
  "private": true,
  "devDependencies": {
    "babel-core": "^6.23.1",
    "babel-loader": "^6.3.2",
    "babel-preset-env": "^1.1.8",
    "css-loader": "^0.26.1",
    "style-loader": "^0.13.1",
    "vue-loader": "^11.1.0",
    "vue-template-compiler": "^2.1.10",
    "webpack": "^2.2.0"
  },
  "dependencies": {
    "vue": "^2.2.1"
  }
}

我通常在我的项目中创建一个文件夹来保存我的 Vue 脚本和名为 Vue 的 .vue 文件。添加一个文件作为 Vue 构建过程的入口点。我们可以调用这个 index.js(或任何你想要的)。

import Vue from 'vue'
import App from './App.vue'

new Vue({
    el: '#app',
    render: h => h(App)
})

创建 App.vue。

<template>
    <div id="app">
        {{msg}}
    </div>
</template>

<script>
    export default {
      name: 'app',
      data () {
        return {
          msg: 'Welcome to Your Vue.js App'
        }
      }
    }
</script>

将 webpack.config.js 添加到您的项目中。这是我使用的。

module.exports = {
    entry: "./Vue/index.js",
    output: {
        path: __dirname,
        filename: "./Vue/bundle.js",
    },
    module: {
        loaders: [
            { test: /\.vue$/, loader: 'vue-loader' },
        ],
    }
}

此配置指定 index.js 作为 webpack 的入口点,以找出 bundle.js 文件中包含的内容,该文件将被编译并放入 Vue 文件夹中。

为了在项目构建时编译 bundle.js 文件,我修改了项目文件以包含以下内容。

<Target Name="RunWebpack">
  <Exec Command="npm install" />
  <Exec Command="webpack" />
</Target>
<Target Name="BeforeBuild" DependsOnTargets="RunWebpack"></Target>

这将安装必要的 npm 包,然后运行 ​​webpack 来构建 bundle.js。如果您在构建服务器上构建项目,这是必要的。

现在您只需将 bundle.js 文件包含在一个视图中,该视图具有一个带有 #app 的元素。你确实需要包含 vue.js 或 vue.min.js。那将在捆绑包中。

编译单个文件组件

我们发现有时我们想使用单个文件组件,但不想将其全部捆绑到单个脚本中。为此,您主要只需要修改 webpack.config.js。

const fs = require("fs");
const path = require("path");

// build an object that looks like 
// {
//      "filename": "./filename.vue"
// }
// to list the entry points for webpack to compile.
function buildEntry() {
    const reducer = (entry, file) => { entry[file.split(".").shift()] = `./Vue/${file}`; return entry; };

    return fs.readdirSync(path.join(__dirname, "Vue"))
        .filter(file => file.endsWith(".vue"))
        .reduce(reducer, {});
}

module.exports = {
    entry: buildEntry(),
    output: {
        path: path.join(__dirname, "Vue"),
        filename: "[name].js",
        library: "[name]"
    },
    module: {
        loaders: [
            { test: /\.vue$/, loader: 'vue-loader' },
        ],
    }
}

此 webpack 配置将为每个单独的文件组件构建一个脚本文件。然后,您可以将该脚本包含在使用上述“非常基本”技术的页面上,并通过全局公开或作为 Vue 的一部分在 Vue 中使用该组件。例如,如果我有一个 Modal.vue,我会在 ASP.NET MVC 视图中包含 Modal.js,然后通过

将其公开给 Vue
Vue.component("Modal", Modal);

new Vue({
    ...
    components:{
        "Modal": Modal
    }
})

Webpack 是非常可配置的,因此您可能希望采用不同的方法并为每个页面构建一个单独的包。

最后,你可以在开发和运行的时候打开命令行

webpack --watch

直接在您的项目中,您的包或单个组件将在您每次保存时构建。

【讨论】:

  • 真的很好,彻底的答案!
  • 太棒了!我不能感谢你。我会告诉你进展如何。
  • 我不追求单页应用。我需要将 vueJS 作为脚本挂接到我的页面上,并利用组件、数据绑定、验证、反应性、转换等。
  • @kheya 使用非常基本的方法,您不需要 SPA。只需在页面上所需的位置初始化一个 Vue。如果需要,您可以使用我描述的最后一种方法来利用 .vue 文件。
  • 我建议看看 Laravel (PHP) 社区。 Laravel 是 PHP 的 MVC,基本上从一开始就包含 Vue。他们有很多指南和教程,包括有和没有 webpack 配置的项目的设置。我建议从脚本开始真正基础,然后当你对它感到满意时,如果你需要它,请进行 webpack 配置。
【解决方案2】:

我试图按照@Bert 上面发布的帖子使用 ASP.NET MVC 5(.NET 4.5,而不是 Core!)来设置 Vue,但是我遇到了很多问题,所以我找到了另一种方法:

(警告:如果您想将 vue.js 与自己的组件一起使用,您需要安装 node.js - 用于 npm、webpack - 用于构建包和 vue-loader - 用于解析 *.vue 文件)

  1. 安装node.js
  2. 运行 Node.js 命令提示符并导航到您的 Visual Studio 项目文件夹(*.csproj 文件所在的位置)
  3. 输入:npm init -y 并回车 - 它应该生成 packages.json 文件,其中包含依赖项和基本设置
  4. Vue 添加必要的加载器(没有这些,*.vue 文件无法解析为 bundle 中的 javascript):npm install --save-dev vue-loader vue-template-compiler
  5. 添加 webpack(全局)并将其保存在我们的 package.json 文件中:

    a)npm install -g webpack

    b)npm install –-save-dev webpack

  6. 最后,将 Vue.js 添加到项目中:npm install --save vue

目前,我的 package.json 看起来像:

{
  "name": "VueExample",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "vue-loader": "^14.2.1",
    "vue-template-compiler": "^2.5.16",
    "webpack": "^4.2.0"
  },
  "dependencies": {
    "vue": "^2.5.16"
  }
}
  1. 下一步是配置 webpack - 返回 Visual Studio 并添加到项目 webpack.config.js 文件中,并将以下代码粘贴到其中:李>

module.exports = {
    entry: './Vue/index.js',
    output: {
        path: __dirname,
        filename: './Vue/dist/bundle.js'
    },
    devtool: 'source-map',
    module: {
        rules: [
            {
                test: /\.vue$/,
                exclude: /node_modules/,
                loader: 'vue-loader'
            }
        ]
    }
};
  1. Vue 文件夹添加到您的项目中,并在其中放置两个文件 - index.jsApp.vue

index.js:

import Vue from 'vue'
import App from './App.vue'

new Vue({
    el: '#app',
    render: h => h(App)
});

App.vue:

<template>
    <div id="app">
        {{msg}}
    </div>
</template>

<script>
    export default {
      name: 'app',
      data () {
        return {
          msg: 'Welcome to Your Vue.js App'
        }
      }
    }
</script>
  1. 示例 index.cshtml 文件:

@{
    ViewBag.Title = "Home Page";
}

<div id="app">

</div>

@section scripts{
    <script src="~/Vue/dist/bundle.js"></script>
}
  1. 返回 2) 中打开的 Node.js 命令提示符 并运行 webpack,输入:webpack,回车并等待用于构建您的 bundle.js,您可以在 ~/Vue/dist/bundle.js 中找到它
  2. 在 Visual Studio 中构建您的项目并运行它。

【讨论】:

  • 简单的代码格式化不起作用:(所以我决定将代码示例放入sn-ps。如果有人可以帮助格式化,请告诉我。
【解决方案3】:

我使用@1_bug 提供的很多答案在我的 ASP.NET MVC 4.5 项目中设置 Vue 单文件组件与 webpack 捆绑。

但是,当尝试使用 webpack 命令构建包时,我收到以下错误:

"vue-loader was used without the corresponding plugin. Make sure to include VueLoaderPlugin in your webpack config."

查看这个,我发现 vue-loader (v15) 的最新更新,需要对 webpack.config.js 文件稍作改动。

从 vue-loader 网站(https://vue-loader.vuejs.org/migrating.html),需要在 webpack.config.js 文件中引用 vue-loader 插件,如下:

// webpack.config.js
const { VueLoaderPlugin } = require('vue-loader')

module.exports = {
  // ...
  plugins: [
    new VueLoaderPlugin()
  ]
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    相关资源
    最近更新 更多