详解webpack编译多页面vue项目的配置问题


Posted in Javascript onDecember 11, 2017

 本文主要介绍了webpack编译多页面vue项目的配置问题,分享给大家,具体如下:

一般情况下,构建一个vue项目的步骤为:

1,安装nodejs环境

2,安装vue-cli

cnpm install vue-cli -g

3,构建vue项目

vue init webpack-simple vue-cli-multipage-demo

4, 安装项目依赖包

cnpm install

5,在开发环境下运行该项目:

npm run dev

通过上面这几步一个简单的vue项目的开发环境基本就搭建起来,接下来的工作就是填代码了。

最近在做一个前端代码重构的时候发现一个问题,使用这个脚手架构建的项目满足不了我的需求,其实这个需求有一点违背我们vue的初衷的,vue开发的是单页面应用(SPA),这里我需要他实现多页面的效果。什么意思呢?举个例子:我们在网页开发的时候,有时候点击一个连接,浏览器会新代开一个tab页来显示我们的内容,这个时候其实就出现多页面的情况了,新开的这个页面其实已经不属于我们之前的那个页面,(SPA)其实是通过路由的方式,让多个页面在主页面中显示。但是这个时候新开的页面已经脱离主页面了。

通过vue-cli脚手架构建的项目的webpack配置文件支持单页面的应用开发,他只有一个入口文件。而且最后只会生产一个页面。如何才能满足我的需求,让webpack同时便于多个页面呢,其实还是比较简单的,只需要将webpack稍微改装一下,就完全可以了。

首先我们需要在build文件下的utils.js文件家中增加一个获取文件夹中文件路径的方法,这个方法将目标文件解析成对象的形式。
utils.js

var glob = require("glob");//分析文件夹中文件路径的第三方模块
exports.getEntry = function(globPath) {
 var entries = {},
 basename, tmp, pathname;
 if (typeof (globPath) != "object") {
 globPath = [globPath]
 }
 globPath.forEach((itemPath) => {
 glob.sync(itemPath).forEach(function (entry) {
  basename = path.basename(entry, path.extname(entry));
  if (entry.split('/').length > 4) {
  tmp = entry.split('/').splice(-3);
  pathname = tmp.splice(0, 1) + '/' + basename; // 正确输出js和html的路径
  entries[pathname] = entry;
  } else {
  entries[basename] = entry;
  }
 });
 });
 return entries;
}

然后修改wenpack.base.conf.js文件,修改入口文件,原来的文件是单文件,现在需要将单文件入口改成多文件入口了。

webpack.dev.conf.js

var path = require('path')
var config = require('../config')
var utils = require('./utils')
var projectRoot = path.resolve(__dirname, '../')
var glob = require('glob');
var entries = utils.getEntry(['./src/module/**/*.js']); // 获得多页面的入口js文件
var env = process.env.NODE_ENV
// various preprocessor loaders added to vue-loader at the end of this file
var cssSourceMapDev = (env === 'development' && config.dev.cssSourceMap)
var cssSourceMapProd = (env === 'production' && config.build.productionSourceMap)
var useCssSourceMap = cssSourceMapDev || cssSourceMapProd
module.exports = {
 entry: entries,//这是通过前面新增的方法获取的文件路径对象
 output: {
 path: config.build.assetsRoot,
 publicPath: process.env.NODE_ENV === 'production' ? config.build.assetsPublicPath : config.dev.assetsPublicPath,
 filename: '[name].js'
 }
 ...
}

下面需要修改webpack.dev,conf.js文件了,这里主要是修改原来配置的首页,这里需要配置多个页面

webpack.dev.conf.js

var path = require('path');
var config = require('../config')
var webpack = require('webpack')
var merge = require('webpack-merge')
var utils = require('./utils')
var baseWebpackConfig = require('./webpack.base.conf')
var HtmlWebpackPlugin = require('html-webpack-plugin')
Object.keys(baseWebpackConfig.entry).forEach(function (name) {
 baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name])
})
module.exports = merge(baseWebpackConfig, {
 ...
});
//新增
var pages =utils.getEntry(['./src/module/*.html','./src/module/**/*.html']);
for (var pathname in pages) {
 // 配置生成的html文件,定义路径等
 var conf = {
 filename: pathname + '.html',
 template: pages[pathname], // 模板路径
 inject: true,    // js插入位置
 chunksSortMode: 'dependency'
 };
 if (pathname in module.exports.entry) {
 conf.chunks = ['manifest', 'vendor', pathname];
 conf.hash = true;
 }
 module.exports.plugins.push(new HtmlWebpackPlugin(conf));
}

这里这要是改变了new HtmlWebpackPlugin的conf对象,原来的配置的是单个html,现在通过循环pages对象,生成多个html配置对象。

通过上面的配置,当我们执行npm run dev 的时候,webpack就可以同时便于多个页面,然后将前面wenpack.base.conf.js中配置的js文件,插入到对应的html页面中。

这个时候我们运行项目npm run dev 然后我们就可以访问不同的页面了,这里需要注意一下,既然我们需要管理多个页面,我们就应该在src下建立一个目录专门来访放不同的页面。这样项目结构看起来更加清晰,便于维护。

这是我写的一个demo地址,有兴趣的可以拉下来看看vue-cli-multi-page

运行起来后访问http://localhost:8080/module/index.html,然后点击按钮,打开新页面。

上面这样配置只是开发环境,最后生产环境的配置文件webpack.prod.conf.js也需要修改,这样在生产打包的时候就可以同时在dist中生成多个html文件。

webpack.prod.conf:

var path = require('path')
var config = require('../config')
var utils = require('./utils')
var webpack = require('webpack')
var merge = require('webpack-merge')
var baseWebpackConfig = require('./webpack.base.conf')
var ExtractTextPlugin = require('extract-text-webpack-plugin')
var HtmlWebpackPlugin = require('html-webpack-plugin')
var CleanPlugin = require('clean-webpack-plugin')//webpack插件,用于清除目录文件
var env = config.build.env
var webpackConfig = merge(baseWebpackConfig, {
...
}
//这里是修改的部分,和webpack.dev.conf.js的修改是一样的
module.exports = webpackConfig
var pages =utils.getEntry(['./src/module/**/*.html']);
for (var pathname in pages) {
 // 配置生成的html文件,定义路径等
 var conf = {
 filename: pathname + '.html',//生成 html 文件的文件名
 template: pages[pathname], // 根据自己的指定的模板文件来生成特定的 html 文件。这里的模板类型可以是任意你喜欢的模板,可以是 html, jade, ejs, hbs, 等等,但是要注意的是,使用自定义的模板文件时,需要提前安装对应的 loader,
 inject: true,    // 注入选项。有四个选项值 true, body, head, false.true:默认值,script标签位于html文件的 body 底部,body:同 true,head:script 标签位于 head 标签内,false:不插入生成的 js 文件,只是单纯的生成一个 html 文件
 // necessary to consistently work with multiple chunks via CommonsChunkPlugin
 chunksSortMode: 'dependency'
 };
 if (pathname in module.exports.entry) {
 conf.chunks = ['manifest', 'vendor', pathname];
 conf.hash = true;
 }
 module.exports.plugins.push(new HtmlWebpackPlugin(conf));
}

以上就是使用vue-cli脚手架来解决vue多页面开发的解决方案,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript removeChild 使用注意事项
Apr 11 Javascript
把html页面的部分内容保存成新的html文件的jquery代码
Nov 12 Javascript
JavaScript 拾碎[三] 使用className属性
Oct 16 Javascript
IE中的File域无法清空使用jQuery重设File域
Apr 24 Javascript
简单的jQuery banner图片轮播实例代码
Mar 04 Javascript
js 将图片连接转换成base64格式的简单实例
Aug 10 Javascript
鼠标拖动改变DIV等网页元素的大小的实现方法
Jul 06 Javascript
浅谈Vue.js应用的四种AJAX请求数据模式
Aug 30 Javascript
Vue 中使用vue2-highcharts实现曲线数据展示的方法
Mar 05 Javascript
基于element-ui组件手动实现单选和上传功能
Dec 06 Javascript
jQuery 函数实例分析【函数声明、函数表达式、匿名函数等】
May 19 jQuery
Node与Python 双向通信的实现代码
Jul 16 Javascript
微信小程序使用checkbox显示多项选择框功能【附源码下载】
Dec 11 #Javascript
浅谈webpack编译vue项目生成的代码探索
Dec 11 #Javascript
微信小程序使用picker实现时间和日期选择框功能【附源码下载】
Dec 11 #Javascript
Mac中安装nvm的教程分享
Dec 11 #Javascript
jquery手机触屏滑动拼音字母城市选择器的实例代码
Dec 11 #jQuery
基于dataset的使用和图片延时加载的实现方法
Dec 11 #Javascript
Angular自定义组件实现数据双向数据绑定的实例
Dec 11 #Javascript
You might like
phpmyadmin3 安装配置图解教程
2012/03/29 PHP
PHP在线生成二维码代码(google api)
2013/06/03 PHP
php ci框架中加载css和js文件失败的原因及解决方法
2014/07/29 PHP
给WordPress中的留言加上楼层号的PHP代码实例
2015/12/14 PHP
CI框架使用composer安装的依赖包步骤与方法分析
2016/11/21 PHP
laravel执行php artisan migrate报错的解决方法
2019/10/09 PHP
在TP5数据库中四个字段实现无限分类的示例
2019/10/18 PHP
JavaScript获取/更改文本框的值的实例代码
2013/08/02 Javascript
jQuery函数的第二个参数获取指定上下文中的DOM元素
2014/05/19 Javascript
9款2014最热门jQuery实用特效推荐
2014/12/07 Javascript
Jquery树插件zTree用法入门教程
2015/02/17 Javascript
原生js实现百叶窗效果及原理介绍
2016/04/12 Javascript
12306 刷票脚本及稳固刷票脚本(防挂)
2017/01/04 Javascript
BootStrap的select2既可以查询又可以输入的实现代码
2017/02/17 Javascript
通过nodejs 服务器读取HTML文件渲染到页面的方法
2018/05/17 NodeJs
Vue通过ref父子组件拿值方法
2018/09/12 Javascript
vue全局使用axios的方法实例详解
2018/11/22 Javascript
修改Vue打包后的默认文件名操作
2020/08/12 Javascript
[57:41]Secret vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Django组件之cookie与session的使用方法
2019/01/10 Python
Python Pandas 如何shuffle(打乱)数据
2019/07/30 Python
使用coverage统计python web项目代码覆盖率的方法详解
2019/08/05 Python
Django models文件模型变更错误解决
2020/05/11 Python
matplotlib实现数据实时刷新的示例代码
2021/01/05 Python
澳大利亚最大的女装零售商:Millers
2017/09/10 全球购物
韩国美国时尚服装和美容在线全球市场:KOODING
2018/11/07 全球购物
奥地利购买珠宝和手表网站:ELLA JUWELEN
2019/09/03 全球购物
北京一家公司的.net开发工程师笔试题
2012/04/17 面试题
教师推荐信范文
2013/11/24 职场文书
面料业务员岗位职责
2013/12/26 职场文书
采购意向书范本
2014/03/31 职场文书
医药营销个人求职信
2014/04/12 职场文书
2014年国庆晚会主持词
2014/09/19 职场文书
关于运动会的广播稿50字
2014/10/17 职场文书
破坏寝室公物检讨书
2014/11/17 职场文书
python APScheduler执行定时任务介绍
2022/04/19 Python