浅谈如何使用webpack构建多页面应用


Posted in Javascript onMay 30, 2018

前言

之前使用 vue2.x + webpack3.x 撸了一个 vue 单页脚手架

vue 版 spa 脚手架

有兴趣的同学可以看下,内附详细注释,适合刚学习 webpack 的童鞋.

react 版 spa 脚手架

但在一些场景下,单页应用显然无法满足我们的需求,于是便有了

mulXc-cli

好了,废话不多说,进入正题!!!!

文件结构 

├── build            构建服务和webpack配置
 ├──── build.js         构建全量压缩包 (打包项目)
 ├──── setting.js        多页面入口配置
 ├──── style.js         页面1对1抽取生成css文件
 ├──── utils.js         工具类
 ├──── webpack.base.conf.js   webpack通用配置
 ├──── webpack.dev.conf.js    webpack开发环境配置
 ├──── webpack.prod.conf.js   webpack生产环境配置
├── config           webpack开发/生产环境部分配置
├── dist            项目打包目录
├── package.json        项目配置文件
├── src             项目目录
├──── common          多页面公用方法与css
├──── about           about页面
├──── home           home页面

思路

多页面应用,顾名思义:就是有多个页面(废话!!!)

从 webpack 的角度来看:

1.多个入口(entry),每个页面对应一个入口,理解为 js 资源.

2.多个 html 实例,webpack 使用html-webpack-plugin 插件来生成 html 页面.

3.每个页面需要对应的 css 文件.webpack 使用 extract-text-webpack-plugin 抽取 css.

这样我们一个多页面应用该有的东西都具备了,go,开撸!!!

入口配置与 html 页面生成

通过以上文件结构,我们可以找到我们在 build/setting.js 进行了多页面入口配置与 html 页面生成。

setting.js

//node 文件操作模块
const fs = require('fs');

//node 路径模块
const path = require('path');

//使用node.js 的文件操作模块来获取src文件夹下的文件夹名称 ->[about,common,home]
const entryFiles = fs.readdirSync(path.resolve(__dirname, '../src'));

//生成html文件插件
const HtmlWebpackPlugin = require('html-webpack-plugin');

//工具类提取_resolve方法
const { _resolve } = require('./utils');

//入口文件过滤common文件夹(因为common文件夹我们用来存放多页面之间公用的方法与css,所以不放入入口进行构建!)
const rFiles = entryFiles.filter(v => v != 'common');

module.exports = {
 //构建webpack入口
 entryList: () => {
  const entryList = {};
  rFiles.map(v => {
   entryList[v] = _resolve(`../src/${v}/index.js`);
  });
  return entryList;
 },
 //src文件夹下的文件夹名称 ->[about,common,home]
 entryFiles: entryFiles,
 //使用html-webpack-plugin生成多个html页面.=>[home.html,about.html]
 pageList: () => {
  const pageList = [];
  rFiles.map(v => {
   pageList.push(
    new HtmlWebpackPlugin({
     template: _resolve(`../src/${v}/index.html`),
     filename: _resolve(`../dist/${v}.html`),
     chunks: ['common', v],
     //压缩配置
     minify: {
      //删除Html注释
      removeComments: true,
      //去除空格
      collapseWhitespace: true,
      //去除属性引号
      removeAttributeQuotes: true
     },
     chunksSortMode: 'dependency'
    })
   );
  });
  return pageList;
 }
};

webpack.base.conf.js

//引入setting.js 入口配置方法,与html生成配置
const { entryList, pageList } = require('./setting.js');

const baseConf = {
 entry: entryList(),
 plugins: [...pageList()]
};

css 文件生成

通过以上文件结构,我们可以找到我们在 build/style.js 进行了 css 文件生成。

style.js

const path = require('path');
//抽取css文件插件
const ExtractTextPlugin = require('extract-text-webpack-plugin');
//引入入口配置
const { entryList, entryFiles } = require('./setting.js');
//多个ExtractTextPlugin实例
const plugins = [];
entryFiles.map(v => {
 plugins.push(
  new ExtractTextPlugin({
   filename: `css/${v}.[contenthash].css`,
   allChunks: false
  })
 );
});

module.exports = {
 //使用正则匹配到每个页面对应style文件夹下的css/less文件,并配置loader来进行解析.从而实现html<->css 1对1
 rulesList: () => {
  const rules = [];
  entryFiles.map((v, k) => {
   rules.push({
    test: new RegExp(`src(\\\\|\/)${v}(\\\\|\/)style(\\\\|\/).*\.(css|less)$`),
    use: plugins[k].extract({
     fallback: 'style-loader',
     use: ['css-loader', 'postcss-loader', 'less-loader']
    })
   });
  });
  return rules;
 },
 //插件实例
 stylePlugins: plugins
};

webpack.prod.conf.js

//引入方法
const { rulesList, stylePlugins } = require('./style.js');

const prodConf = {
 module: {
  rules: [...rulesList()]
 },
 plugins: [...stylePlugins]
};

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 检测浏览器类型和版本的代码
Sep 15 Javascript
jQuery学习笔记之jQuery的DOM操作
Dec 22 Javascript
浅析JavaScript中的隐式类型转换
Dec 05 Javascript
javascript实例--教你实现扑克牌洗牌功能
May 15 Javascript
分享十五款 jQuery 社交网络分享插件
May 16 Javascript
js中获取jsp表单中radio类型的值简单实例
Aug 15 Javascript
基于jQuery实现一个marquee无缝滚动的插件
Mar 09 Javascript
JavaScript实现随机数生成器(去重)
Oct 13 Javascript
Vue slot用法(小结)
Oct 22 Javascript
JavaScript原型对象原理与应用分析
Dec 27 Javascript
VUE单页面切换动画代码(全网最好的切换效果)
Oct 31 Javascript
vue从零实现一个消息通知组件的方法详解
Mar 16 Javascript
vue项目中jsonp跨域获取qq音乐首页推荐问题
May 30 #Javascript
Angular4 反向代理Details实践
May 30 #Javascript
使用vuex缓存数据并优化自己的vuex-cache
May 30 #Javascript
vue源码学习之Object.defineProperty 对数组监听
May 30 #Javascript
vue源码学习之Object.defineProperty对象属性监听
May 30 #Javascript
Angular搜索场景中使用rxjs的操作符处理思路
May 30 #Javascript
微信小程序实现跑马灯效果完整代码(附效果图)
May 30 #Javascript
You might like
浅析php创建者模式
2014/11/25 PHP
Yii分页用法实例详解
2014/12/04 PHP
PHP+Mysql+jQuery实现发布微博程序 php篇
2015/10/15 PHP
PHP打印输出函数汇总
2016/08/28 PHP
php微信开发之自定义菜单完整流程
2016/10/08 PHP
PHP经典实用正则表达式小结
2017/05/04 PHP
Javascript在IE或Firefox下获取鼠标位置的代码
2009/12/18 Javascript
javascript 事件处理、鼠标拖动效果实现方法详解
2012/05/11 Javascript
js data日期初始化的5种方法
2013/12/29 Javascript
Javascript基础教程之for循环
2015/01/18 Javascript
Javascript实现单例模式
2016/01/24 Javascript
深入浅析JS的数组遍历方法(推荐)
2016/06/15 Javascript
微信小程序 生命周期详解
2016/10/12 Javascript
详解vue.js移动端配置flexible.js及注意事项
2019/04/10 Javascript
JavaScript实现轮播图效果代码实例
2019/09/28 Javascript
jQuery 实现DOM元素拖拽交换位置的实例代码
2020/07/14 jQuery
Vue实现开关按钮拖拽效果
2020/09/22 Javascript
[00:35]TI7不朽珍藏III——寒冰飞龙不朽展示
2017/07/15 DOTA
[23:18]Spirit vs Liquid Supermajor小组赛A组 BO3 第二场 6.2
2018/06/03 DOTA
[50:27]Secret vs VG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python三元运算符实现方法
2013/12/17 Python
Python中表达式x += y和x = x+y 的区别详解
2017/06/20 Python
python实现画一颗树和一片森林
2018/06/25 Python
Python实现压缩文件夹与解压缩zip文件的方法
2018/09/01 Python
Python使用字典的嵌套功能详解
2019/02/27 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
2020/05/26 Python
浅谈Python中的生成器和迭代器
2020/06/19 Python
加拿大女装网上购物:Reitmans
2016/10/20 全球购物
中国跨境电商:Tomtop
2017/03/16 全球购物
哈曼俄罗斯官方网上商店:Harman.club
2020/07/24 全球购物
韩国乐天网上商城:Lotte iMall
2021/02/03 全球购物
财务方面个人工作的自我评价
2013/12/28 职场文书
高中数学教学反思
2014/01/30 职场文书
个人借款担保书
2014/04/02 职场文书
新手上路标语
2014/06/20 职场文书
Win11电脑显示本地时间与服务器时间不一致怎么解决?
2022/04/05 数码科技