详解基于webpack2.x的vue2.x的多页面站点
发布时间 - 2026-01-11 02:53:30 点击率:次本文介绍了基于webpack2.x的vue2.x的多页面站点,分享给大家,具体如下:

vue的多页面
依旧使用vue-cli来初始化我们的项目
然后修改主要目录结构如下:
├── build │ ├── build.js │ ├── check-versions.js │ ├── dev-client.js │ ├── dev-server.js │ ├── utils.js │ ├── vue-loader.conf.js │ ├── webpack.base.conf.js │ ├── webpack.dev.conf.js │ └── webpack.prod.conf.js ├── src │ ├── pages │ │ ├── boys │ │ │ ├── index.html │ │ │ ├── index.js │ │ │ └── index.vue │ │ ├── goods │ │ │ ├── index.html │ │ │ ├── index.js │ │ │ └── index.vue │ │ ├── index │ │ │ ├── index.html │ │ │ ├── index.js │ │ │ └── index.vue │ │ └── sotho │ │ ├── index.html │ │ ├── index.js │ │ └── index.vue
编写每个页面
可以看到这里我们有4个单独的页面,分别是boys,goods,index,sotho
首先看boys文件夹中的代码:
index.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>vue3</title> </head> <body> <div id="app"></div> <!-- built files will be auto injected --> </body> </html>
这个是我们要单独生成的页面,最后也是生成index.html
index.vue
<style scoped>
.boys {
background-color: red;
}
</style>
<template>
<div id="app" class="boys">
boys got many things.
</div>
</template>
<script>
export default {
name: 'boys'
}
</script>
这是我们的vue文件,可以看成一个组件,其实.vue文件你可以看成一个语法糖,最终会被vue-loader编译成js,生成对应的css,js,dom
index.js
import Vue from 'vue'
import Index from './index.vue'
Vue.config.productionTip = false
new Vue({
el: '#app',
template: '<Index/>',
components: { Index }
})
这就是主要文件了,这里执行vue的实例化,用法同在浏览器端页面中直接引入vue.js文件一样的含义
其他几个页面一样也是同理,具体可以见:
- https://github.com/zhaoqize/vue-advance/tree/master/vue2-multiple
修改webpack.config.js
由于vue中的配置使用了模块化管理,所以我们需要修改下面两个文件:
1、webpack.base.conf.js
我们需要修改webpack.base.conf.js的入口entry,这是配置多入口文件的重点!
如果不懂多入口含义的化,建议去看下webpack的文档。
webpack.base.conf.js
...
module.exports = {
entry: {
'pages/boys/index': './src/pages/boys/index.js', //配置boys页面入口
'pages/goods/index': './src/pages/goods/index.js', //配置goods页面入口
'pages/index/index': './src/pages/index/index.js', //配置index页面入口
'pages/sotho/index': './src/pages/sotho/index.js', //配置sotho页面入口
},
...
2、webpack.dev.conf.js
这里我们需要修改plugins,它是个强大的即插即用的拓展。
我们使用html-webpack-plugin来生成我们的对于的页面。
...
var HtmlWebpackPlugin = require('html-webpack-plugin')
...
...
module.exports = merge(baseWebpackConfig, {
...
plugins: [
new webpack.DefinePlugin({
'process.env': config.dev.env
}),
new HtmlWebpackPlugin({
filename:'./pages/boys/index.html', //指定生成的html存放路径
template:'./src/pages/boys/index.html', //指定html模板路径
inject: true, //是否将js等注入页面,以及指定注入的位置'head'或'body'
chunks:['pages/boys/index'] //需要引入的chunk(模块资源),不配置就会引入所有页面的资源(js/css),这是个很重要的属性,你可以不配置试试效果
}),
new HtmlWebpackPlugin({
filename:'./pages/goods/index.html',
template:'./src/pages/goods/index.html',
inject: true,
chunks:['pages/goods/index']
}),
new HtmlWebpackPlugin({
filename:'./pages/index/index.html',
template:'./src/pages/index/index.html',
inject: true,
chunks:['pages/index/index']
}),
new HtmlWebpackPlugin({
filename:'./pages/sotho/index.html',
template:'./src/pages/sotho/index.html',
inject: true,
chunks:['pages/sotho/index']
}),
...
]
})
以上就是我们进行多页开发的主要配置项。
开发环境访问页面
运行npm run dev,我们看下怎么访问我们的多页vue应用。
- http://localhost:9090/pages/index/index.html 访问index页面
- http://localhost:9090/pages/boys/index.html 访问boys页面
- http://localhost:9090/pages/goods/index.html 访问goods页面
- http://localhost:9090/pages/sotho/index.html 访问sotho页面
再来看下我们的dom结构是什么样:
页面里的js就是我们通过插件注入的,并且我们是通过指定chunks完成。
build
运行npm run build
➜ vue2-x-multiple git:(master) ✗ npm run build
> vue3@1.0.0 build /study/vue2-x-multiple
> node build/build.js
⠋ building for production...
Starting to optimize CSS...
Processing static/css/pages/boys/index.19ebbc80a1c187989dbf02d03192e84e.css...
Processing static/css/pages/goods/index.fe8f1bc39f33dce4c4d610c2326482c6.css...
Processing static/css/pages/index/index.f6340f14071a89cf2b092da280ffaf8c.css...
Processing static/css/pages/sotho/index.7415ffd3ef7b9d1a4398cba49927b12b.css...
Processed static/css/pages/boys/index.19ebbc80a1c187989dbf02d03192e84e.css, before: 114, after: 44, ratio: 38.6%
Processed static/css/pages/goods/index.fe8f1bc39f33dce4c4d610c2326482c6.css, before: 116, after: 46, ratio: 39.66%
Processed static/css/pages/index/index.f6340f14071a89cf2b092da280ffaf8c.css, before: 92, after: 22, ratio: 23.91%
Processed static/css/pages/sotho/index.7415ffd3ef7b9d1a4398cba49927b12b.css, before: 92, after: 22, ratio: 23.91%
Hash: 2467c91090ccf4690865
Version: webpack 2.5.1
Time: 6319ms
Asset Size Chunks Chunk Names
static/css/pages/sotho/index.7415ffd3ef7b9d1a4398cba49927b12b.css.map 312 bytes 1 [emitted] pages/sotho/index
static/js/vendor.d7548891d04d4f883b29.js 83.2 kB 0 [emitted] vendor
static/js/pages/index/index.b2ce74f4155fb942a064.js 671 bytes 2 [emitted] pages/index/index
static/js/pages/goods/index.7d0dda2791db2d3b1500.js 702 bytes 3 [emitted] pages/goods/index
static/js/pages/boys/index.2c268b75ba9424211d79.js 699 bytes 4 [emitted] pages/boys/index
static/js/manifest.f466ccb58b3271558be5.js 1.57 kB 5 [emitted] manifest
static/css/pages/boys/index.19ebbc80a1c187989dbf02d03192e84e.css 44 bytes 4 [emitted] pages/boys/index
static/css/pages/goods/index.fe8f1bc39f33dce4c4d610c2326482c6.css 46 bytes 3 [emitted] pages/goods/index
static/css/pages/index/index.f6340f14071a89cf2b092da280ffaf8c.css 22 bytes 2 [emitted] pages/index/index
static/css/pages/sotho/index.7415ffd3ef7b9d1a4398cba49927b12b.css 22 bytes 1 [emitted] pages/sotho/index
static/js/vendor.d7548891d04d4f883b29.js.map 687 kB 0 [emitted] vendor
static/js/pages/sotho/index.e706490d7c42ad8e4f73.js.map 5.55 kB 1 [emitted] pages/sotho/index
static/js/pages/sotho/index.e706490d7c42ad8e4f73.js 674 bytes 1 [emitted] pages/sotho/index
static/js/pages/index/index.b2ce74f4155fb942a064.js.map 5.55 kB 2 [emitted] pages/index/index
static/css/pages/index/index.f6340f14071a89cf2b092da280ffaf8c.css.map 312 bytes 2 [emitted] pages/index/index
static/js/pages/goods/index.7d0dda2791db2d3b1500.js.map 5.64 kB 3 [emitted] pages/goods/index
static/css/pages/goods/index.fe8f1bc39f33dce4c4d610c2326482c6.css.map 338 bytes 3 [emitted] pages/goods/index
static/js/pages/boys/index.2c268b75ba9424211d79.js.map 5.62 kB 4 [emitted] pages/boys/index
static/css/pages/boys/index.19ebbc80a1c187989dbf02d03192e84e.css.map 333 bytes 4 [emitted] pages/boys/index
static/js/manifest.f466ccb58b3271558be5.js.map 14.6 kB 5 [emitted] manifest
./pages/boys/index.html 386 bytes [emitted]
./pages/goods/index.html 389 bytes [emitted]
./pages/index/index.html 389 bytes [emitted]
./pages/sotho/index.html 389 bytes [emitted]
Build complete.
Tip: built files are meant to be served over an HTTP server.
Opening index.html over file:// won't work.
进入dist目录,查看生成的页面
├── pages
│ ├── boys
│ │ └── index.html
│ ├── goods
│ │ └── index.html
│ ├── index
│ │ └── index.html
│ └── sotho
│ └── index.html
└── static
├── css
│ └── pages
│ ├── boys
│ │ ├── index.19ebbc80a1c187989dbf02d03192e84e.css
│ │ └── index.19ebbc80a1c187989dbf02d03192e84e.css.map
│ ├── goods
│ │ ├── index.fe8f1bc39f33dce4c4d610c2326482c6.css
│ │ └── index.fe8f1bc39f33dce4c4d610c2326482c6.css.map
│ ├── index
│ │ ├── index.f6340f14071a89cf2b092da280ffaf8c.css
│ │ └── index.f6340f14071a89cf2b092da280ffaf8c.css.map
│ └── sotho
│ ├── index.7415ffd3ef7b9d1a4398cba49927b12b.css
│ └── index.7415ffd3ef7b9d1a4398cba49927b12b.css.map
└── js
├── manifest.f466ccb58b3271558be5.js
├── manifest.f466ccb58b3271558be5.js.map
├── pages
│ ├── boys
│ │ ├── index.2c268b75ba9424211d79.js
│ │ └── index.2c268b75ba9424211d79.js.map
│ ├── goods
│ │ ├── index.7d0dda2791db2d3b1500.js
│ │ └── index.7d0dda2791db2d3b1500.js.map
│ ├── index
│ │ ├── index.b2ce74f4155fb942a064.js
│ │ └── index.b2ce74f4155fb942a064.js.map
│ └── sotho
│ ├── index.e706490d7c42ad8e4f73.js
│ └── index.e706490d7c42ad8e4f73.js.map
├── vendor.d7548891d04d4f883b29.js
└── vendor.d7548891d04d4f883b29.js.map
到此为止,一个简单的基于vue2.x的多页应用完成了。
升级
webpack.base.conf.js中的entry入口都是手工写入,如果页面多的话这样肯定有问题。
所以我们通过如下的方式来自动完成这段代码:
var entryJS = glob.sync('./src/pages/**/*.js').reduce(function (prev, curr) {
prev[curr.slice(6, -3)] = curr;
return prev;
}, {});
这里的 './src/pages/**/*.js' 我们按照一定的规则去匹配我们的入口j s即可。
生成的的是:
{ 'pages/boys/index': './src/pages/boys/index.js',
'pages/goods/index': './src/pages/goods/index.js',
'pages/index/index': './src/pages/index/index.js',
'pages/sotho/index': './src/pages/sotho/index.js' }
与我们想要的行为一致
同样我们也升级下我们的webpack.dev.conf.js中的plugins
var htmls = glob.sync('./src/pages/**/*.html').map(function (item) {
return new HtmlWebpackPlugin({
filename: './' + item.slice(6),
template: item,
inject: true,
chunks:[item.slice(2, -5)]
});
});
module.exports = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap })
},
// cheap-module-eval-source-map is faster for development
devtool: '#cheap-module-eval-source-map',
plugins: [
new webpack.DefinePlugin({
'process.env': config.dev.env
}),
// https://github.com/glenjamin/webpack-hot-middleware#installation--usage
new webpack.HotModuleReplacementPlugin(),
new webpack.NoEmitOnErrorsPlugin(),
// https://github.com/ampedandwired/html-webpack-plugin
new FriendlyErrorsPlugin()
].concat(htmls)
})
生成的是:
HtmlWebpackPlugin {
options:
{ template: './src/pages/boys/index.html',
filename: './pages/boys/index.html',
hash: false,
inject: true,
compile: true,
favicon: false,
minify: false,
cache: true,
showErrors: true,
chunks: [ 'pages/boys/index' ],
excludeChunks: [],
title: 'Webpack App',
xhtml: false } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# webpack
# vue
# 多页面
# vuejs
# vue2
# 详解webpack + vue + node 打造单页面(入门篇)
# electron-vue利用webpack打包实现多页面的入口文件问题
# webpack4打包vue前端多页面项目
# 详解webpack编译多页面vue项目的配置问题
# 详解vue-cli + webpack 多页面实例配置优化方法
# webpack如何将vue3单页面应用改造成多页面应用
# 多页
# 的是
# 这是
# 你可以
# 都是
# 几个
# 就会
# 是个
# 这就是
# 不懂
# 这段
# 去看
# 给大家
# 再来
# 很重要
# 可以看到
# 到此为止
# 这是个
# 即用
# 大家多多
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
深圳网站制作平台,深圳市做网站好的公司有哪些?
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
Python函数文档自动校验_规范解析【教程】
Laravel如何实现API速率限制?(Rate Limiting教程)
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
零基础网站服务器架设实战:轻量应用与域名解析配置指南
js实现点击每个li节点,都弹出其文本值及修改
php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】
个人摄影网站制作流程,摄影爱好者都去什么网站?
如何用西部建站助手快速创建专业网站?
Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
Laravel如何保护应用免受CSRF攻击?(原理和示例)
如何获取免费开源的自助建站系统源码?
Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门
使用Dockerfile构建java web环境
百度输入法ai组件怎么删除 百度输入法ai组件移除工具
java中使用zxing批量生成二维码立牌
VIVO手机上del键无效OnKeyListener不响应的原因及解决方法
如何确认建站备案号应放置的具体位置?
英语简历制作免费网站推荐,如何将简历翻译成英文?
canvas 画布在主流浏览器中的尺寸限制详细介绍
JavaScript如何实现错误处理_try...catch如何捕获异常?
Angular 表单中正确绑定输入值以确保提交与验证正常工作
laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法
大连 网站制作,大连天途有线官网?
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
公司门户网站制作流程,华为官网怎么做?
清除minerd进程的简单方法
JavaScript模板引擎Template.js使用详解
详解Android中Activity的四大启动模式实验简述
Linux后台任务运行方法_nohup与&使用技巧【技巧】
昵图网官网入口 昵图网素材平台官方入口
香港网站服务器数量如何影响SEO优化效果?
Laravel DB事务怎么使用_Laravel数据库事务回滚操作
Python自动化办公教程_ExcelWordPDF批量处理案例
青岛网站建设如何选择本地服务器?
作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】
android nfc常用标签读取总结
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
Laravel如何实现一对一模型关联?(Eloquent示例)
黑客入侵网站服务器的常见手法有哪些?
如何快速生成橙子建站落地页链接?
高防服务器如何保障网站安全无虞?
如何快速搭建高效香港服务器网站?
微信小程序 scroll-view组件实现列表页实例代码
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
*服务器网站为何频现安全漏洞?

