浅谈如何使用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 相关文章推荐
超级强大的表单验证
Jun 26 Javascript
通过DOM脚本去设置样式信息
Sep 19 Javascript
给jqGrid数据行添加修改和删除操作链接(之一)
Nov 04 Javascript
javascript抖动元素的小例子
Oct 28 Javascript
javascript 回调函数详解
Nov 11 Javascript
js实现的光标位置工具函数示例
Oct 03 Javascript
谈谈JavaScript数组常用方法总结
Jan 24 Javascript
解决webpack打包速度慢的解决办法汇总
Jul 06 Javascript
vue使用axios实现文件上传进度的实时更新详解
Dec 20 Javascript
vue中实现移动端的scroll滚动方法
Mar 03 Javascript
详解Vue源码学习之双向绑定
Apr 10 Javascript
Vue实现导航栏的显示开关控制
Nov 01 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语法(4)
2006/10/09 PHP
用PHPdig打造属于你自己的Google[图文教程]
2007/02/14 PHP
php xml 入门学习资料
2011/01/01 PHP
ThinkPHP3.1新特性之命名范围的使用
2014/06/19 PHP
PHP输入输出流学习笔记
2015/05/12 PHP
php实现socket推送技术的示例
2017/12/20 PHP
php中钩子(hook)的原理与简单应用demo示例
2019/09/03 PHP
使用js获取QueryString的方法小结
2010/02/28 Javascript
js获取判断上传文件后缀名的示例代码
2014/02/19 Javascript
js+HTML5基于过滤器从摄像头中捕获视频的方法
2015/06/16 Javascript
js实现当前输入框高亮显示的方法
2015/08/19 Javascript
JS弹出窗口插件zDialog简单用法示例
2016/06/12 Javascript
Node.JS中事件轮询(Event Loop)的解析
2017/02/25 Javascript
JS鼠标滚动分页效果示例
2017/07/05 Javascript
ES6使用Set数据结构实现数组的交集、并集、差集功能示例
2017/10/31 Javascript
谈谈vue中mixin的一点理解
2017/12/12 Javascript
react-router 路由切换动画的实现示例
2018/12/03 Javascript
vue中引入第三方字体文件的方法示例
2018/12/17 Javascript
浅谈layer弹出层按钮颜色修改方法
2019/09/11 Javascript
Nuxt.js nuxt-link与router-link的区别说明
2020/11/06 Javascript
addEventListener()和removeEventListener()追加事件和删除追加事件
2020/12/04 Javascript
[07:40]DOTA2每周TOP10 精彩击杀集锦vol.4
2014/06/25 DOTA
python实现简单购物商城
2016/05/21 Python
Python命令行解析模块详解
2018/02/01 Python
python的常用模块之collections模块详解
2018/12/06 Python
Python3常用内置方法代码实例
2019/11/18 Python
python3正则模块re的使用方法详解
2020/02/11 Python
用HTML5制作一个简单的弹力球游戏
2015/05/12 HTML / CSS
犹他州最古老的体育用品公司:Al’s
2020/12/18 全球购物
《一株紫丁香》教学反思
2014/02/19 职场文书
机电职业生涯规划书范文
2014/03/08 职场文书
市场拓展计划书
2014/05/03 职场文书
项目经理任命书
2014/06/04 职场文书
建筑安全生产目标责任书
2014/07/23 职场文书
超市仓管员岗位职责范本
2014/09/18 职场文书
劳动仲裁代理词范文
2015/05/25 职场文书