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

作者:webfansplz_ 时间:2024-04-16 09:27:13 

前言

之前使用 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]
};

来源:https://juejin.im/post/5b0e0720f265da090f737807

标签:webpack,多页
0
投稿

猜你喜欢

  • 发散后的期望

    2008-07-31 18:32:00
  • Django 5种类型Session使用方法解析

    2022-08-05 06:46:10
  • python 星号(*)的多种用途

    2021-08-13 06:16:27
  • Javascript模拟加速运动与减速运动代码分享

    2024-06-07 15:27:46
  • Python方差特征过滤的实例分析

    2021-08-11 01:12:56
  • 如何使用Python发送HTML格式的邮件

    2022-10-01 12:24:02
  • python的重要技能输入与输出字符串格式化使用详解

    2021-02-15 09:49:11
  • python Windows最新版本安装教程

    2023-02-25 21:09:52
  • 什么是blob,mysql blob大小配置介绍

    2024-01-12 19:05:27
  • python 决策树算法的实现

    2022-10-15 05:49:56
  • Python工厂函数用法实例分析

    2022-07-10 05:30:05
  • 基于python实现聊天室程序

    2022-09-26 07:50:33
  • python 使用shutil复制图片的例子

    2023-10-19 07:43:10
  • python3 实现除法结果为整数

    2023-06-27 20:08:22
  • python实现顺序表的简单代码

    2022-01-10 05:03:20
  • 调整Jupyter notebook的启动目录操作

    2022-04-02 19:40:58
  • 下载文件个别浏览器文件名乱码解决办法

    2024-04-17 10:05:04
  • Python获取指定网段正在使用的IP

    2022-04-22 23:49:27
  • Ajax发明人:Ajax并不适合所有网站

    2008-01-30 12:20:00
  • mysql数据库下损坏数据的恢复操作其过程总结

    2009-02-13 13:36:00
  • asp之家 网络编程 m.aspxhome.com