48 votes

Pourquoi mélanger Razor Pages et VueJs est-il une mauvaise chose?

J'essaie de mettre en place un projet de base .NET en utilisant les pages Razor et d'inclure des vuesJ dans la page Razor pour toute ma logique.

Quelque chose comme ça:

 @{
    ViewData["Title"] = "VueJs With Razor";
}
<h2>@ViewData["Title"].</h2>

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

<script>
     new Vue({
        el: '#app',
        data: {
          message : 'Hello vue.js'
        }
    })
</script>
 

J'ai lu que mélanger les pages Vue et Razor est une mauvaise pratique, et il faut utiliser Razor OR Vue.

Pourquoi est-ce?

133voto

Ron C Points 8275

Le mélange VueJs et Rasoir Pages n'est pas nécessairement une mauvaise chose, il peut être grande!

J'utilise Vue de rasoir pour les non SPA pages et les deux fonctionnent bien ensemble. Je choisis d'utiliser la Vue par chargement par l'intermédiaire d'une balise de script à partir d'un CDN, et je n'ai pas tirer parti de l'utilisation de WebPack pour transpiling, j'ai simplement écris mon code (gasp) ES5. J'ai choisi cette approche pour les raisons suivantes.

  • À l'aide de Rasoir pages plutôt que d'un SPA sida dans le RÉFÉRENCEMENT et moteur de recherche de classement des publics confrontés à des pages.
  • Chargement de Vue directement à partir d'un CA élimine l'intégralité de la pile de Webpack centrée sur la technologie de la courbe d'apprentissage qui le rend beaucoup plus facile pour les nouveaux développeurs de se lever à la vitesse sur le système.
  • L'approche fournit toujours le réactif de la bonté de développement de l'INTERFACE utilisateur que Vue intrinsèquement apporte à la table.
  • En accord avec le "modèle de page" le code qui fournit la fonctionnalité du site est logiquement regroupées autour de la page backend qui offre cette fonctionnalité.

Depuis la Vue et le Rasoir peut faire beaucoup de choses identiques, mon objectif pour le public en face de pages est d'utiliser Rasoir pour générer près de le html final que possible, et d'utiliser Vue d'ajouter de la réactivité à la page. Ce livre un excellent RÉFÉRENCEMENT avantages pour les robots que l'index de la page en analysant le code HTML retourné.

Je réalise ma consommation de Vue est tout à fait différent que d'aller l'itinéraire d'un SPA et WebPack et l'approche signifie souvent que je ne peux pas utiliser la 3ème partie Vue des Composants sans les retravailler un peu le code. Mais l'approche simplifie l'architecture du logiciel et offre un léger réactif de l'INTERFACE utilisateur.

En utilisant cette approche de Rasoir peut être fortement à effet de levier pour générer les premiers rendu de l'HTML avec quelques balises contenant de vue des attributs. Puis, après le chargement de la page dans le navigateur, Vue prend le dessus et la possibilité de reconfigurer cette page toute manière souhaitée.

Évidemment, cette approche ne sera pas adapté à tous les besoins des développeurs ou des projets, mais pour certains cas d'utilisation, il est tout à fait une bonne installation.

Un peu plus de détails pour ceux qui sont intéressés

Depuis que j'ai vue au niveau du site, my global _layout.fichier aspx est responsable de l'instanciation de vue. Tout au niveau du site de la fonctionnalité de mise en œuvre de vue est mis en œuvre à ce niveau. Le nombre de pages en pages spécifiques de vue de la fonctionnalité, ce qui est mis en œuvre comme un mixin sur cette page ou un mixin dans un fichier js chargé par cette page. Lorsque le _layout.page aspx instancie Vue, il le fait avec tous les mixin que je me suis inscrit à un plan global de mixin tableau. (La page poussé c'est mixin sur ce mondial mixin tableau)

Je ne l'utilise pas .vue des fichiers. Tous les composants nécessaires sont mis en œuvre directement sur la page ou si elles doivent être utilisées par plusieurs pages, puis ils sont mis en œuvre dans une vue partielle comme celle ci-dessous.:

dlogViewComponent.cshtml :

    @* dlog vue component template*@
    <script type="text/x-template" id="dlogTemplate">
        <div class="dlog" v-show="dlog.visible" v-on:click="dlog.closeBoxVisible ? close() : ''">
            <div class="dlogCell">
                <div class="dlogFrame" @@click.stop="" style="max-width:400px">
                    <i class="icon icon-close-thin-custom dlogCloseIcon" v-if="dlog.closeBoxVisible" @@click="close()"></i>
                    <div class="dlogCloseIconSpace" v-if="dlog.closeBoxVisible"></div>
                    <div class="dlogInner">
                        <div class="dlogTitle" style="float:left" v-text="title"></div>
                        <div class="clear"></div>
                        <div class="dlogContent">
                            <slot></slot>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </script>

    @* Vue dlog component *@
    <script type="text/javascript">
            Vue.component('dlog', {
                template: '#dlogTemplate',
                props: {    //don't mutate these!
                    closeBoxVisible: true,
                    title: 'One'
                },
                data: function () {
                    return {
                        dlog: { //nest the data props below dlog so I can use same names as cooresponding prop
                            closeBoxVisible: (typeof this.closeBoxVisible === 'undefined') ? true : (this.closeBoxVisible == 'true'),
                            title: (typeof this.title === 'undefined') ? '' : this.title,
                            visible: false
                        }
                    }
                },
                methods: {
                    //opens the dialog
                    open: function () {
                        app.hideBusy();        //just in case, no harm if not busy
                        this.dlog.visible = true;
                        var identifyingClass = this.getIdentifyingClass();
                        Vue.nextTick(function () {
                            $("." + identifyingClass).addClass("animateIn");
                            fx.manageDlogOnly();
                        });
                    },
                    //closes the dialog
                    close: function () {
                        fx.prepDlogClose();
                        var identifyingClass = this.getIdentifyingClass();
                        this.dlog.visible = false;
                        $("." + identifyingClass).removeClass("animateIn");
                    },
                    getIdentifyingClass: function () {
                        if (this.$el.classList.length > 1) {
                            //the last class is always our identifying css class.
                            return this.$el.classList[this.$el.classList.length - 1];
                        } else {
                            throw "A dialog must have an identifying class assigned to it.";
                        }
                    }

                }
            });
    </script>

Ci-dessus, c'est la Vue.composant('dlog', ... une partie de la js qui installe le composant et le rend disponible à la page.

La vue de code sur le _layout.cshtml page ressemble à quelque chose comme le code ci-dessous. Par l'instanciation de Vue sur la _layout.cshtml qui est utilisé par l'ensemble du site, la Vue est instancié dans un lieu unique au niveau du site:

_layout.cshtml :

 <script type="text/javascript">
    var app = new Vue({
        el: '#appTemplate',
        mixins: mixinArray,                     //The page adds it's mixin to mixinArray before this part of the layout executes. 
        data: {
            errorMsg: ''                        //used sitewide for error messages
            //other data used sitewide
        }, 
        methods: {
            //methods that need to be available in vue sitewide, examples below:
            showBusy: function (html) {
                //functionality to show the user that the site is busy with an ajax request.
            },
            hideBusy: function () {
                //functionality to hide the busy spinner and messaging
            }
        },
        created: function () {
             //this method is particularly useful for initializing data.
        }
    });

</script>

Ce que j'ai fournis dépeint ici une idée assez claire de cette approche non traditionnelle et ses avantages. Cependant, puisque plusieurs personnes m'ont demandé, j'ai aussi écrit un blog liées: à l'Aide de VueJs avec ASP.NET Rasoir Peut Être Grande!

34voto

user1585345 Points 33

Vous pouvez le faire. Parfois, vous êtes tenu de le faire, si, comme nous, vous êtes la migration d'un code de base et vous ne pouvez pas convertir tout à la fois. Et comme Ron C dit, il fonctionne bien.

Si vous êtes le démarrage d'un nouveau projet, vous avez le luxe de choisir. Raisons pour privilégier un SPA et pas de Rasoir, ce serait...

  • La réactivité. SPA apps se sentent généralement (beaucoup) plus réactif. Initiale rend souvent servi de cache, avant que les données arrivent. Sur la première charge, toutes les ressources arrivent dans un ensemble, dans une requête-réponse. Il n'y a pas, ou beaucoup moins, la demande de la chaîne.

  • Flux de travail. Webpack, de regroupement et chaud recharge sont grands. Vous obtenez de production construit, avec minification, compilation de Vue rendu fonctions, l'élimination de 404 style erreurs, js les erreurs de syntaxe sont pris au piège. Le cycle de l'introduction d'une erreur pour la découverte, il est fortement réduite par de nombreuses erreurs.

  • Le SPA de l'univers. De routage, Vuex, c'est vraiment la voie de l'avenir.

  • La pureté. Rasoir et Vue faire des choses similaires à la fin de la journée. Si vous les mélangez, vous pouvez avoir du mal à garder la tête droite.

2voto

Vous pouvez désormais également peloter les modèles VueJS dans les vues Razor:

https://www.npmjs.com/package/razor-vue-lint

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X