一、概念
首先我们可以把多页应用理解为由多个单页构成的应用,而何谓多个单页呢?其实你可以把一个单页看成是一个
html文件,那么多个单页便是多个html文件,多页应用便是由多个html组成的应用,如下图所示
既然多页应用拥有多个
html,那么同样其应该拥有多个独立的入口文件、组件、路由、vuex等。没错,说简单一点就是多页应用的每个单页都可以拥有单页应用src目录下的文件及功能,我们来看一下一个基础多页应用的目录结构
├── node_modules # 项目依赖包目录 |
二、多入口
在单页应用中,我们的入口文件只有一个,
CLI默认配置的是main.js,但是到了多页应用,我们的入口文件便包含了page1.js、page2.js、index.js等,数量取决于pages文件夹下目录的个数,这时候为了项目的可拓展性,我们需要自动计算入口文件的数量并解析路径配置到webpack中的entry属性上,如:
module.exports = { |
那么我们如何读取并解析这样的路径呢,这里就需要使用工具和函数来解决了。我们可以在根目录新建
build文件夹存放utils.js这样共用的webpack功能性文件,并加入多入口读取解析方法
/* utils.js */ |
读取并存储完毕后,我们得到了一个入口文件的对象集合,这个对象我们便可以将其设置到
webpack的entry属性上,这里我们需要修改vue.config.js的配置来间接修改webpack的值
/* vue.config.js */ |
这样我们多入口的设置便完成了,当然这并不是 CLI 所希望的操作,后面我们会进行改进。
三、多模板
相对于多入口来说,多模板的配置也是大同小异,这里所说的模板便是每个
page下的html模板文件,而模板文件的作用主要用于webpack中html-webpack-plugin插件的配置,其会根据模板文件生产一个编译后的html文件并自动加入携带 hash 的脚本和样式,基本配置如下
/* webpack 配置文件 */ |
以上是单模板的配置,那么如果是多模板只要继续往
plugins数组中添加HtmlWebpackPlugin即可,但是为了和多入口一样能够灵活的获取pages目录下所有模板文件并进行配置,我们可以在utils.js中添加多模板的读取解析方法
/* utils.js */ |
- 以上我们仍然是使用
glob读取所有模板文件,然后将其遍历并设置每个模板的config,同时针对一些自定义配置和生产环境的配置进行了merge处理,其中自定义配置的功能我会在下节进行介绍,这里介绍一下生产环境下minify配置的作用:将html-minifier的选项作为对象来缩小输出。 html-minifier是一款用于缩小html文件大小的工具,其有很多配置项功能,包括上述所列举的常用的删除注释、空白、引号等。- 当我们编写完了多模板的方法后,我们同样可以在
vue.config.js中进行配置,与多入口不同的是我们在configureWebpack中不能直接替换plugins的值,因为它还包含了其他插件
/* vue.config.js */ |
如此我们多页应用的多入口和多模板的配置就完成了,这时候我们运行命令
yarn build后你会发现dist目录下生成了3个html文件,分别是index.html、page1.html和page2.html
四、使用 pages 配置
其实,在
vue.config.js中,我们还有一个配置没有使用,便是pages。pages对象允许我们为应用配置多个入口及模板,这就为我们的多页应用提供了开放的配置入口。官方示例代码如下
/* vue.config.js */ |
我们不难发现,
pages对象中的key就是入口的别名,而其value对象其实是入口entry和模板属性的合并,这样我们上述介绍的获取多入口和多模板的方法就可以合并成一个函数来进行多页的处理,合并后的setPages方法如下
// pages 多入口配置 |
上述代码我们
return出的map对象就是pages所需要的配置项结构,我们只需在vue.config.js中引用即可
/* vue.config.js */ |
这样我们多页应用基于
pages配置的改进就大功告成了,当你运行打包命令来查看输出结果的时候,你会发现和之前的方式相比并没有什么变化,这就说明这两种方式都适用于多页的构建,但是这里还是推荐大家使用更便捷的pages配置