浅谈如何使用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 相关文章推荐
解析arp病毒背后利用的Javascript技术附解密方法
Aug 06 Javascript
vs2003 js文件编码问题的解决方法
Mar 20 Javascript
jQuery中获取Radio元素值的方法
Jul 02 Javascript
easyui datagrid 键盘上下控制选中行示例
Mar 31 Javascript
jQuery UI库中dialog对话框功能使用全解析
Apr 23 Javascript
使用JavaScript开发跨平台的桌面应用详解
Jul 27 Javascript
JS动态添加的div点击跳转到另一页面实现代码
Sep 30 Javascript
JS实现网页抢购功能(触发,终止脚本)
Nov 27 Javascript
轻松搞定jQuery+JSONP跨域请求的解决方案
Mar 06 jQuery
webpack 模块热替换原理
Apr 09 Javascript
node.js中TCP Socket多进程间的消息推送示例详解
Jul 10 Javascript
Centos7 安装Node.js10以上版本的方法步骤
Oct 15 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读取大文件的几种方法介绍
2016/10/27 PHP
在js文件中写el表达式取不到值的原因及解决方法
2013/12/23 Javascript
JavaScript中的lastIndexOf()方法使用详解
2015/06/06 Javascript
JS实现文档加载完成后执行代码
2015/07/09 Javascript
Angularjs整合微信UI(weui)
2016/03/15 Javascript
JS代码随机生成姓名、手机号、身份证号、银行卡号
2016/04/27 Javascript
详解使用angular-cli发布i18n多国语言Angular应用
2017/05/20 Javascript
JavaScript之underscore_动力节点Java学院整理
2017/07/03 Javascript
详解如何在vue项目中引入elementUI组件
2018/02/11 Javascript
网页爬虫之cookie自动获取及过期自动更新的实现方法
2018/03/06 Javascript
用ES6写全屏滚动插件的示例代码
2018/05/02 Javascript
微信小程序调用摄像头隐藏式拍照功能
2018/08/22 Javascript
vue集成百度UEditor富文本编辑器使用教程
2018/09/21 Javascript
vue动态注册组件实例代码详解
2019/05/30 Javascript
监控Nodejs的性能实例代码
2019/07/02 NodeJs
Vue路由之JWT身份认证的实现方法
2019/08/26 Javascript
JavaScript 实现同时选取多个时间段的方法
2019/10/17 Javascript
Vue解析带html标签的字符串为dom的实例
2019/11/13 Javascript
tornado框架blog模块分析与使用
2013/11/21 Python
Python的地形三维可视化Matplotlib和gdal使用实例
2017/12/09 Python
解决python web项目意外关闭,但占用端口的问题
2019/12/17 Python
python3的pip路径在哪
2020/06/23 Python
美国受欢迎的女性牛仔裤品牌:DL1961
2016/11/12 全球购物
西班牙鞋子和箱包在线销售网站:zapatos.es
2020/02/17 全球购物
大学同学聚会邀请函
2014/01/19 职场文书
室内设计专业自荐信
2014/05/31 职场文书
社会学专业求职信
2014/07/17 职场文书
中级会计大学生职业生涯规划书
2014/09/16 职场文书
加强作风建设演讲稿
2014/10/24 职场文书
2014年消防工作总结
2014/11/21 职场文书
2014年小学体育工作总结
2014/12/11 职场文书
Python快速实现一键抠图功能的全过程
2021/06/29 Python
redis客户端实现高可用读写分离的方式详解
2021/07/04 Redis
mysql脏页是什么
2021/07/26 MySQL
Java Spring 控制反转(IOC)容器详解
2021/10/05 Java/Android
图文详解nginx日志切割的实现
2022/01/18 Servers