使用 vue-cli 3.x 开发多页面应用

2,214 阅读3分钟

之前一直用vue来做的单页面应用,现在公司业务需要开发多页面,于是花时间去研究了vue如何配置多页面,特地记录一下。

单、多页面应用的区别

  • 单页面应用(spa):整个应用在一张页面中完成。用户体验好,因所有的资源都在一张页面上加载,所以首屏渲染在不做优化的情况下可能会很慢,其次spa也不利于seo。
  • 多页面应用(mpa):整个应用由多个页面构成。切换页面需要用a标签的href属性来做到,跳转到的页面需要加载该页面需要的资源,因而再切换页面的时候就显得不丝滑。 至于更多的详细区别,网上有很多答案了。

简单配置

用vue-cli生成一个简单项目,敲下vue create xxx 后我直接选的默认创建方式。

项目生成后,删除 App.vue 和 main.js 这两个文件,然后在根目录下新建 vue.config.js 文件

下面是我的demo:

在 src 目录下新建一个 pages 页面,用来管理页面文件夹,然后再在 pages 目录下新建 xxx 目录,这个 xxx 目录就是用来存放你的页面的,类似于微信小程序的pages目录。

比如我这里的两个目录(里面需要3个基本的文件,html, js, vue)

配置 vue.config.js

接下来要按照官网给的例子去配置入口页面,vue官网示例

这个结构也很类似微信小程序的配置,根据我上面的目录结构,最后配置好的样子:

module.exports = {
    devServer: {
      publicPath: '/',
      index: 'test.html'  // 启动后默认进入的页面
    },
    pages: {
        test: {
            entry: './src/pages/test/test.js', // 这个一定要有,必填
            template: './src/pages/test/test.html',
            filename: 'test.html',
            title: 'test page'
            // chunks: ['chunk-vendors', 'chunk-common', 'test'] 如果这里填写了,记得这个数组的最后一项是当前的文件名
        },
        test2: {
            entry: './src/pages/test2/test2.js',
            template: './src/pages/test2/test2.html',
            filename: 'test2.html',
            title: 'test2 page',
            chunks: ['chunk-vendors', 'chunk-common', 'test2']
        }
    }
}

接下来配置test目录下的3个页面,其他的目录都是一样的配置,我就不一一配了。

test.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body>
    <div id="test"></div>
</body>
</html>

test.js (注意$mount('#test')里面的id要和html里 <div id="test"></div> 的id一致)

import Vue from 'vue'
import Test from './test.vue'

Vue.config.productionTip = false

new Vue({
    render: h => h(Test)
}).$mount('#test')

test.vue

<template>
    <div class="test2">
        {{msg}}
        <a href="test2.html">去test2 page</a>
    </div>
</template>

<script>
export default {
    data(){
        return{
            msg: '这里是test page'
        }
    }
}
</script>

其他页面都是一样的,其他的页面配置好之后,就可以愉快的敲下 npm run serve 了。

效果:

总结

  • 个人理解哈,之后的开发就在页面目录下的xxx.vue页面里面开发就行,这里的玩法就回到了熟悉的单页面方式,这里面的路由就可以上vue-router,只要在xxx.js文件中的vue实例里面配置好就行,当然上vuex的话一样的。其实多页面的玩法还是很简单的。

  • 多页面之间的跳转可以用a标签,或者windon.open方法来跳转,各个多页面之间的router, vuex不共享。

  • 在vue.config.js中的pages配置随着页面的增多,可能会很麻烦,后续可以使用 glob 来处理文件目录,使用方法官网也有,网上也一大堆。这里就不多介绍了。