浅谈如何使用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 相关文章推荐
控制页面按钮在后台执行期间不重复提交的JS方法
Jun 24 Javascript
使用text方法获取Html元素文本信息示例
Sep 01 Javascript
jQuery判断一个元素是否可见的方法
Jun 05 Javascript
简介JavaScript中用于处理正切的Math.tan()方法
Jun 15 Javascript
Bootstrap Table的使用总结
Oct 08 Javascript
详解Angular 开发环境搭建
Jun 22 Javascript
JavaScript实现单击网页任意位置打开新窗口与关闭窗口的方法
Sep 21 Javascript
vue element-ui 绑定@keyup事件无效的解决方法
Mar 09 Javascript
vue配置请求本地json数据的方法
Apr 11 Javascript
浅析vue-router jquery和params传参(接收参数)$router $route的区别
Aug 03 jQuery
vue项目中使用fetch的实现方法
Apr 25 Javascript
纯js+css实现仿移动端淘宝网站的弹出详情框功能
Dec 29 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 配置文件中open_basedir选项作用
2009/07/19 PHP
PHP学习 变量使用总结
2011/03/24 PHP
使用图灵api创建微信聊天机器人
2015/07/23 PHP
WordPress迁移时一些常见问题的解决方法整理
2015/11/24 PHP
Yii实现简单分页的方法
2016/04/29 PHP
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
6个常见的 PHP 安全性攻击实例和阻止方法
2020/12/16 PHP
jQuery EasyUI 中文API Layout(Tabs)
2010/04/27 Javascript
详细解读JavaScript编程中的Promise使用
2015/07/27 Javascript
Webpack 实现 AngularJS 的延迟加载
2016/03/02 Javascript
原生JS实现平滑回到顶部组件
2016/03/16 Javascript
Bootstrap+jfinal退出系统弹出确认框的实现方法
2016/05/30 Javascript
浅析JavaScript的几种Math函数,random(),ceil(),round(),floor()
2016/12/22 Javascript
微信小程序中post方法与get方法的封装
2017/09/26 Javascript
Vue项目使用CDN优化首屏加载问题
2018/04/01 Javascript
node中modules.exports与exports导出的区别
2018/06/08 Javascript
Vue.directive使用注意(小结)
2018/08/31 Javascript
30分钟快速实现小程序语音识别功能
2018/11/27 Javascript
使用异步组件优化Vue应用程序的性能
2019/04/28 Javascript
使用js原生实现年份轮播选择效果实例
2021/01/12 Javascript
浅谈Python生成器generator之next和send的运行流程(详解)
2017/05/08 Python
对numpy中array和asarray的区别详解
2018/04/17 Python
浅析Python 3 字符串中的 STR 和 Bytes 有什么区别
2018/10/14 Python
用Python读取几十万行文本数据
2018/12/24 Python
python从内存地址上加载python对象过程详解
2020/01/08 Python
Python sqlite3查询操作过程解析
2020/02/20 Python
python怎么自定义捕获错误
2020/06/29 Python
Html5在手机端调用相机的方法实现
2020/05/13 HTML / CSS
数控技校生自我鉴定
2014/04/19 职场文书
护士长竞聘演讲稿
2014/04/30 职场文书
优秀教师先进个人事迹材料
2014/08/31 职场文书
庆七一宣传标语
2014/10/08 职场文书
社区学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
奖励申请报告范文
2015/05/15 职场文书
检讨书怎么写?
2019/06/21 职场文书
Elasticsearch 索引操作和增删改查
2022/04/19 Python