前言
前两天在使用vue+webpack做移动端项目时,公司负责人要求打包项目时,可以生成多个html页面,话不多说进入正题。
前提条件:你已熟悉vue-cli
配置
创建项目
vue init webpack 项目名
添加多页面帮助工具:这是封装的各种多页面支持的方法,命名为multipage-helper.js,放在项目的build文件夹下
var path
= require('path')
var fs
= require("fs")
var HtmlWebpackPlugin
= require('html-webpack-plugin')
var moduleList
var moduleRootPath
= './src/module'
exports
.getEntries = function getEntries(){
var entries
= {}
this.getModuleList()
moduleList
.forEach(function (module
) {
if (module
.moduleID
!= "" && module
.moduleJS
!= ""){
entries
[module
.moduleID
] = module
.moduleJS
}
})
return entries
}
exports
.getModuleList = function getModuleList() {
if (moduleList
){
return moduleList
}else {
moduleList
= new Array();
readDirSync(moduleRootPath
, "")
return moduleList
}
}
exports
.getDevHtmlWebpackPluginList = function getDevHtmlWebpackPluginList(){
var devHtmlWebpackPluginList
= []
var moduleList
= this.getModuleList()
moduleList
.forEach(function (mod
) {
var conf
= {
filename
: mod
.moduleID
+".html",
template
: mod
.moduleHTML
,
chunks
: [mod
.moduleID
],
inject
: true
}
devHtmlWebpackPluginList
.push(new HtmlWebpackPlugin(conf
))
})
return devHtmlWebpackPluginList
}
exports
.getProdHtmlWebpackPluginList = function getProdHtmlWebpackPluginList(){
var prodHtmlWebpackPluginList
= []
var moduleList
= this.getModuleList()
moduleList
.forEach(function (mod
) {
var conf
= {
filename
: mod
.moduleID
+".html",
template
: mod
.moduleHTML
,
inject
: true,
minify
: {
removeComments
: true,
collapseWhitespace
: true,
removeAttributeQuotes
: true
},
chunksSortMode
: 'dependency',
chunks
: ['manifest','vendor',mod
.moduleID
]
}
prodHtmlWebpackPluginList
.push(new HtmlWebpackPlugin(conf
))
})
return prodHtmlWebpackPluginList
}
function readDirSync(path
,moduleName
){
var module
= {moduleID
:"",moduleHTML
:"",moduleJS
:""}
var moduleID
= path
.replace(moduleRootPath
+"/","")
if (path
== moduleRootPath
){
moduleID
= ""
}
module
.moduleID
= moduleID
var pa
= fs
.readdirSync(path
)
pa
.forEach(function(ele
,index
){
var info
= fs
.statSync(path
+"/"+ele
)
if(info
.isDirectory()){
readDirSync(path
+"/"+ele
, ele
)
}else{
if (moduleName
+".html" == ele
){
module
.moduleHTML
= path
+"/"+ele
}
if (moduleName
+".js" == ele
){
module
.moduleJS
= path
+"/"+ele
}
}
})
if ((module
.moduleID
!= "" && module
.moduleHTML
!= "") || (module
.moduleID
!= "" && module
.moduleJS
!= "")){
moduleList
.push(module
)
}
}
修改webpack.base.conf.js:配置多个页面的js入口
var multipageHelper
= require('./multipage-helper')
module
.exports
= {
entry
: multipageHelper
.getEntries(),
...
}
修改webpack.dev.conf.js:开发时的多页面模板配置
var multipageHelper
= require('./multipage-helper')
new HtmlWebpackPlugin({
filename
: 'index.html',
template
: 'index.html',
inject
: true
})
Array
.prototype
.push
.apply(module
.exports
.plugins
,multipageHelper
.getDevHtmlWebpackPluginList())
修改webpack.prod.conf.js:编译时的多页面模板配置
var multipageHelper
= require('./multipage-helper')
new HtmlWebpackPlugin({
filename
: config
.build
.index
,
template
: 'index.html',
inject
: true,
minify
: {
removeComments
: true,
collapseWhitespace
: true,
removeAttributeQuotes
: true
},
chunksSortMode
: 'dependency'
})
Array
.prototype
.push
.apply(module
.exports
.plugins
,multipageHelper
.getProdHtmlWebpackPluginList())
目录结构及其使用:目录结构有点讲究,一看就懂 用userManage来举例
userManage.js:vue的入口文件(以前的main.js)userManage.html :这就是一个Html页面(以前的index.html)userManage.vue:vue的视图文件(以前的App.vue)
需要注意的是:上面三个文件名需要和文件夹名字相同
打包后的目录 gitHub地址
如有问题,欢迎指正!