浅谈如何使用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实现Sleep函数的代码
Mar 04 Javascript
基本jquery的控制tabs打开的数量的代码
Oct 17 Javascript
解析img图片没找到onerror事件 Stack overflow at line: 0
Dec 23 Javascript
javascript函数重载解决方案分享
Feb 19 Javascript
jQuery在页面加载时动态修改图片尺寸的方法
Mar 20 Javascript
在Node.js中使用HTTP上传文件的方法
Jun 23 Javascript
jquery通过name属性取值的简单实现方法
Jun 20 Javascript
如何利用模板将HTML从JavaScript中抽离
Oct 08 Javascript
微信小程序 标签传入数据
May 08 Javascript
Vue使用.sync 实现父子组件的双向绑定数据问题
Apr 04 Javascript
JS数组方法reverse()用法实例分析
Jan 18 Javascript
小程序瀑布流组件实现翻页与图片懒加载
May 19 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自毁程序(慎用)
2015/07/09 PHP
WordPress后台中实现图片上传功能的实例讲解
2016/01/11 PHP
php生成图片验证码的方法
2016/04/15 PHP
php实现学生管理系统
2020/03/21 PHP
解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题
2019/10/14 PHP
jquery mobile changepage的三种传参方法介绍
2013/09/13 Javascript
node.js中的path.delimiter方法使用说明
2014/12/09 Javascript
运行Node.js的IIS扩展iisnode安装配置笔记
2015/03/02 Javascript
JavaScript DSL 流畅接口(使用链式调用)实例
2015/03/15 Javascript
JavaScript获取网页支持表单字符集的方法
2015/04/02 Javascript
javascript遇到html5的一些表单属性
2015/07/05 Javascript
浅谈JavaScript的自动垃圾收集机制
2016/12/15 Javascript
JavaScript中无法通过div.style.left获取值的解决方法
2017/02/19 Javascript
vue如何获取点击事件源的方法
2017/08/10 Javascript
Vue from-validate 表单验证的示例代码
2017/09/26 Javascript
浅谈Angular文字折叠展开组件的原理分析
2017/11/24 Javascript
解决vue axios的封装 请求状态的错误提示问题
2018/09/25 Javascript
微信小程序拼接图片链接无底洞深入探究
2019/09/03 Javascript
Vue监听滚动实现锚点定位(双向)示例
2019/11/13 Javascript
解决在Vue中使用axios POST请求变成OPTIONS的问题
2020/08/14 Javascript
tensorflow实现简单的卷积网络
2018/05/24 Python
python实现多人聊天室
2020/03/31 Python
python利用跳板机ssh远程连接redis的方法
2019/02/19 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
2019/11/11 Python
Python 求向量的余弦值操作
2021/03/04 Python
小孩百日宴答谢词
2014/01/15 职场文书
吸烟检讨书2000字
2014/02/13 职场文书
春节请假条
2014/04/11 职场文书
《会走路的树》教后反思
2014/04/19 职场文书
软件测试专业推荐信
2014/09/18 职场文书
无房产证房屋转让协议书合同样本
2014/10/18 职场文书
2014年办公室文秘工作总结
2014/12/09 职场文书
2014年司法局工作总结
2014/12/11 职场文书
行政上诉状范文
2015/05/23 职场文书
商务英语邮件开头问候语
2015/11/10 职场文书
vue数据字典取键值项目的字典问题
2022/04/12 Vue.js