vue 3、单页面|多页面

单页面 – 多页面

  • 单页面有一个html ,多页面有多个html
  • 多页面应用拥有多个独立的入口文件、组件、路由、vuex等
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    ├── node_modules               # 项目依赖包目录
    ├── build # 项目 webpack 功能目录
    ├── config # 项目配置项文件夹
    ├── src # 前端资源目录
    │ ├── images # 图片目录
    │ ├── components # 公共组件目录
    │ ├── pages # 页面目录
    │ │ ├── page1 # page1 目录
    │ │ │ ├── components # page1 组件目录
    │ │ │ ├── router # page1 路由目录
    │ │ │ ├── views # page1 页面目录
    │ │ │ ├── page1.html # page1 html 模板
    │ │ │ ├── page1.vue # page1 vue 配置文件
    │ │ │ └── page1.js # page1 入口文件
    │ │ ├── page2 # page2 目录
    │ │ └── index # index 目录
    │ ├── common # 公共方法目录
    │ └── store # 状态管理 store 目录
    ├── .gitignore # git 忽略文件
    ├── .env # 全局环境配置文件
    ├── .env.dev # 开发环境配置文件
    ├── .postcssrc.js # postcss 配置文件
    ├── babel.config.js # babel 配置文件
    ├── package.json # 包管理文件
    ├── vue.config.js # CLI 配置文件
    └── yarn.lock # yarn 依赖信息文件

    多个入口文件

  • 需要配置webpack中的entry属性
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    module.exports = {
    ...

    entry: {
    page1: '/xxx/pages/page1/page1.js',
    page2: '/xxx/pages/page2/page2.js',
    index: '/xxx/pages/index/index.js',
    },

    ...
    }
  • 如何读取这些路径,需要新建build文件夹存放utils.js这样公用的webpack功能性文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    /* utils.js */
    const path = require('path');

    // glob 是 webpack 安装时依赖的一个第三方模块,该模块允许你使用 * 等符号,
    // 例如 lib/*.js 就是获取 lib 文件夹下的所有 js 后缀名的文件
    // yarn add glob --dev
    const glob = require('glob');

    // 取得相应的页面路径,因为之前的配置,所以是 src 文件夹下的 pages 文件夹
    const PAGE_PATH = path.resolve(__dirname, '../src/pages');

    /*
    * 多入口配置
    * 通过 glob 模块读取 pages 文件夹下的所有对应文件夹下的 js * 后缀文件,如果该文件存在
    * 那么就作为入口处理
    */
    exports.getEntries = () => {
    let entryFiles = glob.sync(PAGE_PATH + '/*/*.js') // 同步读取所有入口文件
    let map = {}

    // 遍历所有入口文件
    entryFiles.forEach(filePath => {
    // 获取文件名
    let filename = filePath.substring(filePath.lastIndexOf('\/') + 1, filePath.lastIndexOf('.'))

    // 以键值对的形式存储
    map[filename] = filePath
    })

    return map
    }
  • 读取并存储完毕后,我们得到了一个入口文件的对象集合,这个对象我们便可以将其设置到 webpack 的 entry 属性上,这里我们需要修改 vue.config.js 的配置来间接修改 webpack 的值:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /* vue.config.js */

    const utils = require('./build/utils')

    module.exports = {
    ...

    configureWebpack: config => {
    config.entry = utils.getEntries()
    },

    ...
    }