基于vue cli重构多页面脚手架过程详解


Posted in Javascript onJanuary 23, 2018

官方提供的项目生成工具vue-cli没有对多页面webApp的支持,但是在实际的项目中,我们需要这样的脚手架,参考了很多大牛的方法,这里提供了一种我的单页面脚手架转换为多页面脚手架的方案,供大家参考。不好的地方也请大家指正。

准备

使用vue-cli生成一个你需要的单页面项目脚手架,然后我们就要开始我们的改装工程了。

重构过程

步骤一 改变目录结构

  • step1 在src目录下面新建views文件夹,然后再views文件夹下新建index文件夹
  • step2 将src目录下的main.js和App.vue移动到step1中的index文件夹下,并将main.js重命名为index.js
  • step3 将src目录下的router文件夹移动到step1中的index文件夹下,如果不使用router可以再index.js中注释掉,我没有使用,因为我的每个页面不是单页面的应用,不必要使用路由功能
  • step4 将根目录下的index.html文件移动到step1中的index文件夹下

步骤二 修改build下的配置文件

在生产环境下会分页面打包独有js文件,并抽取公共js,不会什么都打包成一坨。打包后文件目录结构也是比较清晰地。一下所有修改都在build文件夹下

step1 修改utils.js,增加两个函数,一个用来获取页面多入口,一个用来输入打包后的页面,并注入js:

var glob = require('glob')
var HtmlWebpackPlugin = require('html-webpack-plugin')
var PAGE_PATH = path.resolve(__dirname, '../src/views')
var merge = require('webpack-merge')
//多入口配置
//获取views文件夹下,每个页面下的index.js作为页面入口,故每个页面下都必须有index.js
exports.entries = function() {
 var entryFiles = glob.sync(PAGE_PATH + '/*/index.js')
 var map = {}, tmp = [], pathname = '';
 entryFiles.forEach((filePath) => {
 var filename = filePath.substring(filePath.lastIndexOf('\/') + 1, filePath.lastIndexOf('.'))
 tmp = filePath.split('/').splice(-4)
 map[tmp[2] + '/' + filename] = filePath
 })
 return map
}
//多页面输出配置
//读取views文件夹下的对应每个页面的html后缀文件,然后放入数组中
//如果想要更深的定制或者修改,建议大家看一下CommonsChunkPlugin
//推荐一个基础的 https://segmentfault.com/q/1010000009070061
exports.htmlPlugin = function() {
 let entryHtml = glob.sync(PAGE_PATH + '/*/*.html')
 let arr = []
 entryHtml.forEach((filePath) => {
 let jsPath = '', tmp = [];
 let filename = filePath.substring(filePath.lastIndexOf('\/') + 1, filePath.lastIndexOf('.'))
 tmp = filePath.split('/').splice(-4)
 jsPath = tmp[2] + '/' + 'index'
 let conf = {
  template: filePath,
  filename: filename + '.html',
  chunks: ['manifest', 'vendors', jsPath],
  inject: true
 }
 if (process.env.NODE_ENV === 'production') {
  conf = merge(conf, {
  minify: {
   removeComments: true,
   collapseWhitespace: true,
   removeAttributeQuotes: true
  },
  chunksSortMode: 'dependency'
  })
 }
 arr.push(new HtmlWebpackPlugin(conf))
 })
 return arr
}
step2 修改webpack.base.conf.js文件配置的入口
// entry: {
// app: './src/main.js'
// },
entry: utils.entries(),
step3 修改webpack.dev.conf.js文件的打包方法 找到下面的代码,将其注释掉:
new HtmlWebpackPlugin({
 filename: 'index.html',
 template: 'index.html',
 inject: true
}),

在plugins这个属性值的后面加上我们上面的方法,下面是代码片段:

// new HtmlWebpackPlugin({
 // filename: 'index.html',
 // template: 'index.html',
 // inject: true
 // }),
 new FriendlyErrorsPlugin()
 ].concat(utils.htmlPlugin())
step4 修改webpack.prod.conf.js 找到下面的代码,注释掉:
new HtmlWebpackPlugin({
filename: config.build.index,
template: 'index.html',
inject: true,
minify: {
 removeComments: true,
 collapseWhitespace: true,
 removeAttributeQuotes: true
 // more options:
 // https://github.com/kangax/html-minifier#options-quick-reference
},
// necessary to consistently work with multiple chunks via CommonsChunkPlugin
chunksSortMode: 'dependency'
}),

在plugins这个属性值的后面加上我们上面的方法,下面是代码片段:

new CopyWebpackPlugin([{
  from: path.resolve(__dirname, '../static'),
  to: config.build.assetsSubDirectory,
  ignore: ['.*']
 }])
 ].concat(utils.htmlPlugin())

配置完成。正常启动项目即可。

总结

以上所述是小编给大家介绍的基于vue cli重构多页面脚手架过程详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jquery $.ajax各个事件执行顺序
Oct 15 Javascript
passwordStrength 基于jquery的密码强度检测代码使用介绍
Oct 08 Javascript
js 代码优化点滴记录
Feb 19 Javascript
js模拟滚动条(横向竖向)
Feb 22 Javascript
使用JQ来编写最基本的淡入淡出效果附演示动画
Oct 31 Javascript
JavaScript获取页面上被选中文字的方法技巧
Mar 13 Javascript
jQuery实现仿腾讯视频列表分页效果的方法
Aug 07 Javascript
jquery实现全选功能效果的实现代码
May 05 Javascript
浅析bootstrap原理及优缺点
Mar 19 Javascript
详解webpack进阶之loader篇
Aug 23 Javascript
postman自定义函数实现 时间函数的思路详解
Apr 17 Javascript
如何在微信小程序里面退出小程序的方法
Apr 28 Javascript
JS实现点击下拉菜单把选择的内容同步到input输入框内的实例
Jan 23 #Javascript
实时监控input框,实现输入框与下拉框联动的实例
Jan 23 #Javascript
从parcel.js打包出错到选择nvm的全部过程
Jan 23 #Javascript
浅谈vue项目重构技术要点和总结
Jan 23 #Javascript
bootstrap fileinput插件实现预览上传照片功能
Jan 23 #Javascript
php 解压zip压缩包内容到指定目录的实例
Jan 23 #Javascript
three.js 入门案例详解
Jan 23 #Javascript
You might like
mysql From_unixtime及UNIX_TIMESTAMP及DATE_FORMAT日期函数
2010/03/21 PHP
PHP中生成UUID自定义函数分享
2015/06/10 PHP
总结PHP删除字符串最后一个字符的三种方法
2016/08/30 PHP
解决laravel资源加载路径设置的问题
2019/10/14 PHP
List Installed Software Features
2007/06/11 Javascript
JS面向对象编程之对象使用分析
2010/08/19 Javascript
基于jquery的滚动鼠标放大缩小图片效果
2011/10/27 Javascript
js中有关IE版本检测
2012/01/04 Javascript
jQuery toggleClass应用实例(附效果图)
2014/04/06 Javascript
JavaScript中的方法调用详细介绍
2014/12/30 Javascript
jquery实现可拖拽弹出层特效
2015/01/04 Javascript
DOM基础教程之使用DOM控制表单
2015/01/20 Javascript
JS+CSS实现感应鼠标渐变显示DIV层的方法
2015/02/20 Javascript
用vue和node写的简易购物车实现
2017/04/25 Javascript
React-Native 组件之 Modal的使用详解
2017/08/08 Javascript
vue-cli脚手架引入图片的几种方法总结
2018/03/13 Javascript
Node.js npm命令运行node.js脚本的方法
2018/10/10 Javascript
微信小程序实现复选框效果
2018/12/28 Javascript
微信小程序学习笔记之本地数据缓存功能详解
2019/03/29 Javascript
js实现web调用摄像头 js截取视频画面
2019/04/21 Javascript
vue router动态路由设置参数可选问题
2019/08/21 Javascript
React.js组件实现拖拽排序组件功能过程解析
2020/04/27 Javascript
python中pygame针对游戏窗口的显示方法实例分析(附源码)
2015/11/11 Python
使用Python生成随机密码的示例分享
2016/02/18 Python
python try 异常处理(史上最全)
2019/03/07 Python
Python3.5模块的定义、导入、优化操作图文详解
2019/04/27 Python
俄罗斯优惠券网站:BIGLION
2017/05/21 全球购物
澳大利高级泳装品牌:Bondi Born
2018/05/23 全球购物
飞利浦美国官网:Philips美国
2020/02/28 全球购物
附答案的Java面试题
2012/11/19 面试题
大门门卫岗位职责
2013/11/30 职场文书
党校学习思想汇报
2014/01/06 职场文书
开学典礼感言
2014/02/16 职场文书
2014年银行年终工作总结
2014/12/19 职场文书
副总经理岗位职责
2015/02/02 职场文书
企业安全生产规章制度
2015/08/06 职场文书