当前位置: 首页 > Web前端 > vue.js

新的Vue3应用程序初始化代码的好处

时间:2023-03-31 16:20:13 vue.js

在这篇文章中,我们将首先了解应用程序初始化代码在Vue2应用程序中的工作原理。然后我们将了解它有哪些缺点,以及如何使用Vue框架版本3中使用的新初始化语法消除这些缺点。让我们首先谈谈Vue2中当前的初始化方法。通常,在src/main.js文件中,我们通过调用创建应用程序实例的新Vue构造函数来引导应用程序。从“vue”导入Vue;从“./App.vue”导入App;从“./router”导入路由器从“@/components/SomeComponent.vue”导入SomeComponent从“@/plugins/SomePlugin”导入SomePlugin=newVue({router,render:h=>h(App)});vue2AppCopy.component('SomeComponent',SomeComponent);vue2AppCopy.use(SomePlugin);vue2AppCopy.$mount('#app')这个应用实例将在我们的SPA的整个生命周期内为所有逻辑服务。这一切都很好,我们已经使用这种语法来引导我们的Vue应用程序大约3年了。但是,在Vue3中,初始化代码语法发生了变化。让我们先看看新语法,然后看看使用它的好处。新的Vue3createApp方法在Vue3中,我们有一个专门用于此的createApp函数。createApp函数以一个根组件(App.vue)作为参数并返回一个Vue应用程序实例。因此,最简单的应用程序初始化如下所示:对于应用程序上下文对象。该对象可以在引导过程中进一步使用,以向应用程序添加更多功能。下面是一个更高级的初始化代码示例:import{createApp}from'vue'importAppfrom'./App.vue''@/plugins/SomePlugin'constmyV3App=createApp(App)myV3App.component('SomeComponent',SomeComponent)myV3App.use(SomePlugin).use(router)//向myV3App添加更多功能//现在我们准备好mountmyV3App.mount('#app')在添加插件和组件等额外逻辑方面与V2相比并没有太大变化,对吗?您可以在Vue3文档中找到受支持方法的完整概述。这很好,有一个小但重要的变化——我们使用一个专用函数而不是新的Vue实例。//v2constvue2App=newVue({})//WorkingwiththemainVueinstace//v3constmyV3App=createApp(App).mount('#app')//创建Vue实例的副本那么为什么要使用newIs专用的createApp函数比使用新的Vue构造函数更好?Vue3初始化代码的好处在Vue2应用程序初始化代码中,我们使用从库中导入的Vue对象来创建这个应用程序实例和所有其他新的应用程序实例。使用这种方法,不可能将某些功能隔离到一个Vue实例中,因为Vue应用程序仍然使用从库中导入的相同Vue对象。为了证明这一点,让我们看一下下面的例子-如您所见,vue2AppOne和vue2AppTwo都可以访问名为m??yDirective的指令:Vue.directive('myDirective',{/*...*/})Vue.component({/*...*/})constvue2AppOne=newVue(/**/).mount('#app1')constvue2AppTwo=newVue(/**/).mount('#app1')它可能在一个网站或应用程序中创建多个Vue应用程序并不常见。但随着项目规模的增长,由不同的团队开发,前端微服务变得流行,你可能会在某个时候发现自己也在做同样的事情。那么几乎不可能使用v2语法获得另一个具有不同功能的Vue实例。Vue3中的新语法允许我们将每个应用程序的配置作为一个单独的自定义对象,因为应用程序是使用专用函数(createApp)创建独立实例的。新架构允许我们拥有两个或多个独立的Vue实例,默认情况下它们不共享任何特征,即使它们是在一个文件中创建的。但是,如果你想在两个实例之间共享一些功能,你可以!在下面的示例中,vue3AppOne和vue3AppTwo共享LocalePlugin但不共享searchchinput组件。constconfig={/*一些全局配置*/}constvue3AppOne=Vue.createApp(config)vue3AppOne.component('SearchInput',SearchInputComponent)vue3AppOne.use(LocalePlugin)constvue3AppTwo=Vue.createApp(config)vue3AppTwo.use(LocalePlugin)为了演示此行为,我们创建了一个存储库,其中包含2个简单的Vue3实例,由于新的createApp语法,它们不共享组件和指令。看看它在当地的表现如何。在配套存储库中,我们在一个页面模板的两个不同容器中初始化了两个Vue3应用程序,请参阅public/index.html。

一个应用程序将作为一个相对简单的标头标签,而另一个应用程序将能够使用路由器和与店家沟通合作。使用Vue3语法,我们可以很容易地在src/main.js文件的初始化代码中将它们分开:import{createApp}from'vue'importAppfrom'./App.vue'vue'从'./router'导入路由器'从'./store'导入商店createApp(App).use(store).use(router).mount('#main-app')createApp(Header).mount('#header-app')如果您使用vueserve运行该应用程序,您应该能够在一个页面上看到这两个部分。在控制台输出中,您会看到Main应用程序可以访问vue-router和使用Vuex的商店,而Header应用程序不能。created(){console.log('HellofromMainapp')console.log('Mainapprouter',this.$route)console.log('Mainappstore:',this.$store)}更直接测试设置如果您使用vue-test-utils(版本<2.0.0)为您的Vue2组件编写测试,您可能会遇到需要使用createLocalVue方法以避免污染全局Vue实例的情况。在我们的测试场景中,存在与Vue2应用程序中相同的潜在问题。当我们添加组件、插件等时,全局的Vue实例就被污染了,它们都与每个可用的Vue实例共享。为了解决这个问题,我们必须使用createlocalvalue,它(你猜对了)创建一个新的独立本地Vue实例。import{createLocalVue,mount}from'@vue/test-utils'importMyPluginfrom'@/plugins/MyPlugin'constlocalVueForTest=createLocalVue()localVueForTest.use(MyPlugin)mount(Component,{localVueForTest})这在Vue3中这不再是问题,因为所有应用程序扩展:插件、mixins和全局组件都不会更改全局Vue实例。所以在Vue3中使用vue-test-utils(版本>=2.0.0)时,测试文件中的应用程序初始化代码将如下所示:import{createStore}from'vuex'import{mount}from'@vue/test-utils'从'@/App'导入应用程序从'@/plugins/MyPlugin'导入MyPluginconstwrapper=mount(App,{global:{plugins:[MyPlugin]}})