Webpack构建多页应用Mpa(三):文件结构和自动化打包

2023-11-11

本系列教程整体完成后,会完成一个可用的MPA应用,教程实际就是整个MPA的实现过程的记录。
如果是想了解单项功能的实现,请继续往下看;如果是想了解整个MPA的开发和思考过程,建议从 Webpack构建多页应用Mpa(一):阐述设计概要 教程开始看起…

我们需要实现的是一个多页面应用,到目前为止,我们还没有讲到如何创建多页面?以及如何规划文件存放结构?

一、概述

我们在做SPA单页面应用时,往往会使用一些现成的框架脚手架来做,框架本身已经提供了整套的解决方案,如页面切换、页面结构规划、公共文件结构规划等。

那么一个MPA,也需要考虑同样的问题,下面我们逐一来分析

需要解决的问题

比如有个应用有A、B、C三个页面,页面相互独立

  • 1、如何跳转: 页面间跳转用 <a href="B.html">B页面</a> 这种连接跳转
  • 2、如何新建页面: 把每个页面对应的htmljscss都统一放在同一个文件夹
  • 3、如何引入公共html代码(后面教程解决) : 页面会有相同的header.htmlfooter.htmlsidebat.html,统一引入
  • 4、如何使用公共的js方法和css样式(后面教程解决): 单独创建文件夹,用于存放公共的js和css文件
  • 5、如何引入常用的第三方js库(后面教程解决)

二、开发

接上一篇教程,继续完善MPA...

下面我们开始一步步实现,let’s go…

1、创建多页面

创建页面A:
src目录下新建文件夹A,并在A中新建三个文件index.htmlindex.jsindex.css,这里的三个文件是用于显示页面A,是页面A的独有文件;

src/A/index.html 代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>A页面</title>
</head>
<body>
    A页面
</body>
</html>

src/A/index.js 代码如下:

import "./index.css";
console.log("A页面");

src/A/index.css 代码如下:

body{
    background-color: gray;
}

同样方法,再创建页面B和页面C,把上面代码所有A页面A字样分别替换成当前页面的文字,方便区分;

src目录下的文件结构如图:

2、配置webpack.config.js

我们想要最终打包输出的文件结构也和src下一样,想象以下如果要访问页面A,那么只要打开 http://域名/A 就可以。

  1. entry:修改成多页面入口形式
    这里采用json对象形式,key表示chunk名字,在output字段中可以用[name]占位符获得,用于设置输入的文件路径。
    context字段用于配置entry的上下文父路径,之后entry路径是在context目录下配置子路径;
	context: path.resolve(__dirname, 'src'),
	entry: {
        A: "./A/index.js",
        B: "./B/index.js",
        C: "./C/index.js"
    },
  1. output:将各个页面的js文件生成到各自页面目录中
    [name]占位符用于获取entry中设置的key,__dirname是node自带的系统变量,表示当前文件的绝对路径;
	output: {
       filename: "[name]/index.js",
       path: path.resolve(__dirname, "dist"),
       chunkFilename: "[name]/index.js"		//异步导入时,用chunkFilename字段来命名
   },
  1. 生成多个页面的html代码
    由于有3个页面,那么这里就要定义3个页面的输出,其中chunks参数很重要,需要引用对应页面的chunk,这里的chunk其实对应entry中的key;

这里顺便说下webpack一些名字的概念(自己的理解):

  • bundle:bundle 由许多不同的模块生成,包含已经经过加载和编译过程的源文件的最终版本。
  • chunk:由入口或代码切割决定的过程代码块;
  • module:模块,在 Webpack ⾥⼀切皆模块,⼀个模块对应着⼀个⽂件。 Webpack 会从配置的 Entry 开始递归找出所有依赖的模块。
    直达:webpack官网术语表
    推荐文章:Webpack 理解 Chunk
	plugins: [
      ...
       new HtmlWebpackPlugin({
           filename: "./A/index.html",
           template: "./A/index.html",
           chunks: ["A"]
       }),
       new HtmlWebpackPlugin({
           filename: "./B/index.html",
           template: "./B/index.html",
           chunks: ["B"]
       }),
       new HtmlWebpackPlugin({
           filename: "./C/index.html",
           template: "./C/index.html",
           chunks: ["C"]
       })
       ...
   ]
  1. 生成多个页面的css代码,并单独打包
    chunkFilename字段是为异步加载的Chunk命名
	plugins: [
		...
        new MiniCssExtractPlugin({
            filename: "[name]/index.css",
            chunkFilename: "[name]/index.css"	//异步导入时,用chunkFilename字段来命名
        })
    ]

到这里就配置完成了,我们执行npm run dev打包,看到dist下生成的目录结构如下:

执行http-server dist,打开A、B、C三个页面如下:
在这里插入图片描述
页面访问一切正常!!!!
阶段性成功!

到这里我们我们思考,这里是三个页面,如果以后有更多的页面,是否也有一个个加HtmlWebpackPlugin的配置呢,岂不是很麻烦,所以,我们还要根据src下的文件夹结构,自动生成HtmlWebpackPlugin配置;

3、根据src目录动态生成配置项

我们的目标是根据src下的文件夹,自动添加HtmlWebpackPlugin配置,达到自动生成dist下页面文件的目的;

我们想要自动化生成entryhtmlwebpackplugins,其实只要能拿到src目录下的文件夹列表就可以。这里就需要先安装一个glob插件(npm i -D glob),用于获取文件夹列表。

自动生成配置代码如下:

function getMpa() {
    const entry = {},
        htmlwebpackplugins = [];
    const entryfiles = glob.sync(path.resolve(__dirname, "./src/*/index.js"));
    entryfiles.forEach(function (item) {
        const folder = item.match(/\/src\/(\w+)\/index\.js$/)[1];
        entry[folder] = `./${folder}/index.js`;
        htmlwebpackplugins.push(new HtmlWebpackPlugin({
            title: `${folder}页面`,
            filename: `./${folder}/index.html`,
            template: `./${folder}/index.html`,
            chunks: [folder],//以数组的形式指定由html-webpack-plugin负责加载的chunk文件(打包后生成的js文件),不指定的话就会加载所有的chunk。
            inject: "body",//指示把加载js文件用的<script>插入到哪里,默认是插到<body>的末端,如果设置为'head',则把<script>插入到<head>里。
            minify: true,//生成压缩后的HTML代码。
        }));
    });
    return { entry, htmlwebpackplugins };
}

分析以上代码:

  1. glob.sync方法获取src下的所有子目录
  2. 遍历子目录,生成所有页面的entry和htmlwebpackplugins
  3. 导出两个配置项

再次执行打包npm run dev,我们看到dist目录下生成的文件结构还是和之前一模一样,达到了自动化的要求。


下面的教程我们将继续完善,最终附上一份到本节教程截止,webpack.config.jspackage.json
webpack.config.js 代码如下:

const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const glob = require("glob");

function getMpa() {
    const entry = {},
        htmlwebpackplugins = [];
    const entryfiles = glob.sync(path.resolve(__dirname, "./src/*/index.js"));
    entryfiles.forEach(function (item) {
        const folder = item.match(/\/src\/(\w+)\/index\.js$/)[1];

        entry[folder] = `./${folder}/index.js`;

        htmlwebpackplugins.push(new HtmlWebpackPlugin({
            title: `${folder}页面`,
            filename: `./${folder}/index.html`,
            template: `./${folder}/index.html`,
            chunks: [folder],//以数组的形式指定由html-webpack-plugin负责加载的chunk文件(打包后生成的js文件),不指定的话就会加载所有的chunk。
            inject: "body",//指示把加载js文件用的<script>插入到哪里,默认是插到<body>的末端,如果设置为'head',则把<script>插入到<head>里。
            minify: true,//生成压缩后的HTML代码。
        }));
    });
    return { entry, htmlwebpackplugins };
}

const { entry, htmlwebpackplugins } = getMpa();

module.exports = {
    context: path.resolve(__dirname, 'src'),
    entry,
    output: {
        filename: "[name]/index.js",
        path: path.resolve(__dirname, "dist"),
        chunkFilename: "[name]/index.js"
    },
    mode: "development",
    module: {
        rules: [
            {
                test: /\.css$/,
                use: [MiniCssExtractPlugin.loader, "css-loader"]
            }
        ]
    },
    plugins: [
        ...htmlwebpackplugins,
        new CleanWebpackPlugin(),
        new MiniCssExtractPlugin({
            filename: "[name]/index.css",
            chunkFilename: "[name]/index.css"
        })
    ]
};

package.json 代码如下:

{
  "name": "mpa",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "dependencies": {
    "webpack": "^4.46.0",
    "webpack-cli": "^4.7.0"
  },
  "devDependencies": {
    "clean-webpack-plugin": "^3.0.0",
    "css-loader": "^5.2.6",
    "glob": "^7.1.7",
    "html-webpack-plugin": "^4.3.0",
    "mini-css-extract-plugin": "^1.6.0",
    "style-loader": "^2.0.0"
  },
  "scripts": {
    "dev": "npx webpack",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Webpack构建多页应用Mpa(三):文件结构和自动化打包 的相关文章

随机推荐

  • Springmvc+mybatis+Dubbo+ZooKeeper+Redis+KafKa

    开发工具 1 Eclipse IDE 采用Maven项目管理 模块化 2 代码生成 通过界面方式简单配置 自动生成相应代码 目前包括三种生成方式 增删改查 单表 一对多 树结构 生成后的代码如果不需要注意美观程度 生成后即可用 技术选型 只
  • Androidstudio快捷操作之多选

    如图 想要批量复制属性名 不需要一个一个的复制 只需按住alt 鼠标左键从上往下拉 将光标定位在每个属性名的前面 再按ctrl w就可以选中所有光标后面的单词了
  • QT里使用sqlite的问题,好多坑

    1 我使用sqlite 开发机上好好的 测试机上却不行 后来发现是缺少驱动 Driver not loaded Driver not loaded 代码检查了又检查 发现应该是缺少dll文件 系统不提示 是自己使用 QMessageBox
  • c语言基础五子棋,十分的易懂理解,详细解释,容易上手

    前言 提示 经过b站和视频学习后编程 提示 以下是本篇文章正文内容 下面案例可供参考 文章目录 前言 五子棋 头文件 展示棋盘 display 下棋 PlayMove 主体函数 game 完整代码 五子棋 本篇博客主要写了关于c语言的五子棋
  • MySQL主从搭建-Centos实战

    目录 一 规划说明 二 主节点安装MySQL 1 下载MySQL和安装 2 启动Mysql 设置root密码 允许远程登录 三 副节点安装MySQL 参考主节点 四 主节点配置 1 配置my cnf 修改默认存储目录为指定目录 data 下
  • 解决SQL查询总是超时已过期

    解决SQL查询总是超时已过期 在WIN8里提示 OLE DB 或 ODBC 错误 查询超时已过期 HYT00 1 由于数据库设计问题造成SQL数据库新增数据时超时 症状 Microsoft OLE DB Provider for SQL S
  • web前端页面适配方法

    流式布局 就是百分比布局 非固定像素 内容向两侧填充 理解成流动的布局 称为流式布局 视觉窗口 viewport 是移动端特有 这是一个虚拟的区域 承载网页的 承载关系 浏览器 gt viewport gt 网页 适配要求 1 网页宽度必须
  • c++基础十一(跳转语句)

    跳转语句 1 break 2 continue 3 goto 1 break 作用 跳出循环结构和选择结构 1 switch语句中 用于终止case并跳出switch语句 2 在循环结构中 用于跳出当前循环 3 在嵌套循环语句中 跳出最近的
  • 企业微信 => 接入第三方vue应用 第三阶段:企业微信使用JSSDK

    目录 使用说明 官方文档不会告诉你的内容 都是会踩的坑 一 我采用的混入方法去使用这个官方SDK 二 可能会遇到的坑 前提 我们开发的是三方应用 不是内部应用 使用说明 所有的JS接口只能在企业微信应用的可信域名下调用 包括子域名 且可信域
  • 深度学习环境搭建( Tensorflow & PyTorch)

    前言 硬件配置 基础软件 1 安装VC redist x64 2 安装显卡驱动并确定算力 3 确认cuda版本 4 安装CUDA 配置cudnn 5 安装Anaconda 6 安装PyCharm 深度学习框架Tensorflow安装 深度学
  • 复习之linux系统中的权限管理

    1 权限的查看及读取 1 权限的查看 ls l file 查看文件的权限 ls ld dir 查看目录权限 2 权限的读取 文件的属性叫做文件的元数据 元数据 Metadata 又称中介数据 中继数据 为描述数据的数据 data about
  • HTML爱心表白代码,亲测有效,独一无二!福利来啦!

    发福利啦 小编最近搜集了好几个表白代码 感兴趣可以点进主页看看哟 如果觉得文章不错 还请一键三联 不定时发布各种全免费的独一无二的代码 这次我们来分享跳动的爱心的代码 网上有很多 但是个人觉得我这个比较温馨一点 背景也好看
  • springboot框架介绍,让我们深入的了解

    Spring Boot是一种用于快速构建基于Spring框架的Java应用程序的开源框架 它旨在简化Spring应用程序的开发过程 通过提供一种约定优于配置的方式 让开发人员能够快速搭建起一个可独立运行的 可部署的 易于扩展的应用 Spri
  • Java的内存机制

    1 Java的内存机制 Java 把内存划分成两种 一种是栈内存 另一种是堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配 当在一段代码块定义一个变量时 Java 就在栈中为这个变量分配内存空间 当超过变量的
  • 虚拟化一、虚拟化技术基础原理

    一 虚拟化 虚拟化 是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机 在一台计算机上同时运行多个逻辑计算机 每个逻辑计算机可运行不同的操作系统 并且应用程序都可以在相互独立的空间内运行而互不影响 从而显著提高计算机的工作效率 虚拟化使用软
  • java字符串转json

    针对不同jar包 一 import org json JSONObject JSONObject jo new JSONObject new String 需要转换的字符串 二 import com alibaba fastjson JSO
  • 巧用机器学习定位云服务器故障

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由roganhuang 发表于云 社区专栏 导语 随着腾讯云业务的扩大 母机数量越来越多 为减少人力并实现母机故障的自动化定位 本文尝试利用机器学习算法 通过对历史故障母机的日志
  • 在钉钉上怎么手写_钉钉群上课入门和独家进阶功能(图文)

    钉钉群上课入门和独家快速进阶 在钉钉上有两种视频连接方式 直播和视频会议 两者各有利弊 前者合适人数较多 超过两百人 的时候进行 后者适合一个班级进行上课 下面就两者之间的具体操作说明 文中图片皆可点击放大 一 直播 手机 只有手机怎么直播
  • mysql的连接路径_Mysql 连接路径 url 参数解析

    1 mysql url 参数解析 url jdbc mysql 127 0 0 1 3306 user useUnicode true characterEncoding utf8 useUnicode characterEncoding
  • Webpack构建多页应用Mpa(三):文件结构和自动化打包

    本系列教程整体完成后 会完成一个可用的MPA应用 教程实际就是整个MPA的实现过程的记录 如果是想了解单项功能的实现 请继续往下看 如果是想了解整个MPA的开发和思考过程 建议从 Webpack构建多页应用Mpa 一 阐述设计概要 教程开始