Webpack5 多页面的项目实践

 更新时间:2025年07月11日 11:13:19   作者:蓝精灵001  
本文主要介绍了Webpack5 多页面的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
特性维度单页面应用-SPA多页面统一目录-MPA多页面单独部署-MPA
入口数量单个,只有一个 HTML 文件多个,多个 HTML 文件多个,多个 HTML 文件,分别打包输出
资源输出结构所有资源输出到统一目录(如 js/, css/)所有页面的资源共用 js/, css/ 等目录每页资源放在各自目录(如 index/js/, index/css/)
公共资源复用高:依赖打入主包或懒加载 chunk,资源完全共享中:可通过 splitChunks 提取公共模块,多个页面共用依赖低:默认每个页面依赖重复打包,需通过 CDN 或构建优化共享资源
首屏加载速度中低:主包体积大需优化高:每页只加载自身资源高:每页打包独立、加载自身资源
项目推荐模式用户交互复杂、状态集中、路由频繁页面之间结构清晰、流程独立但资源共用需要页面级灰度、子模块独立开发与部署

1. 示例多页面配置

  1. 配置外部依赖、CDN 资源以及页面级 CDN 扩展
  2. 自动生成入口和 HtmlWebpackPlugin 实例
  3. 导出生成的入口配置、插件配置、依赖过滤配置
  • entries:入口配置对象(用于 entry)
  • plugins:HtmlWebpackPlugin 实例数组(用于 plugins)
  • externals:供主配置使用(用于排除模块打包)

1.1多页面统一目录(MPA)

dist/
├── test1.html
├── test2.html
├── js/
│   ├── test1.[hash].js
│   └── test2.[hash].js
└── 图片、字体等资源
const path = require("path");
const glob = require("glob");
const { merge } = require("webpack-merge");
const HtmlWebpackPlugin = require("html-webpack-plugin");
 
const resolve = (dir) => path.resolve(__dirname, "..", dir);
 
// 打包排除某些依赖
const externals = {
  vue: "Vue",
  vuex: "Vuex",
  "vue-router": "VueRouter",
  axios: "axios",
  vant: "vant",
};
 
// cdn资源
const assetsCDN = {
  // 开发环境
  dev: {
    css: ["//xxx/npm/vant@2.12/lib/index.css"],
    js: ["//xxx/npm/eruda@2.4/eruda.min.js"],
  },
  // 生产环境
  build: {
    css: ["//xxx/npm/vant@2.12/lib/index.css"],
    js: [
      "//xxx/npm/vue@2.6/dist/vue.min.js",
      "//xxx/npm/vuex@3.6/dist/vuex.min.js",
      "//xxx/npm/vue-router@3.5/dist/vue-router.min.js",
      "//xxx/npm/axios@0.21/dist/axios.min.js",
      "//xxx/npm/vant@2.12/lib/vant.min.js",
    ],
  },
};
 
const entryCDN = {
  test: {
    dev: merge(assetsCDN.dev, {
      css: [],
      js: ["//res.wx.qq.com/open/js/jweixin-1.6.0.js"],
    }),
    build: merge(assetsCDN.build, {
      css: [],
      js: ["//res.wx.qq.com/open/js/jweixin-1.6.0.js"],
    }),
  },
};
 
const getEntry = () => {
  // 多页面打包的入口集合
  const entries = {};
  // 多页面打包的模板集合
  const plugins = [];
  // 借助 glob 获取 src 目录下的所有入口文件
  const globPath = resolve("src/views/**/main.js");
  // 遍历文件集合,生成所需要的 entries、plugins 集合
  glob.sync(globPath).map((item) => {
    const match = item.match(/src/views/(.*)/main.js$/);
    const name = match?.[1];
    entries[name] = [item];
    // CDN配置
    const env = process.env.NODE_ENV === "production" ? "build" : "dev";
    const pageCDN = (entryCDN[name] && entryCDN[name][env]) || assetsCDN[env];
    if (!entryCDN[name]) {
      console.warn(`页面 ${name} 未配置 entryCDN,已使用默认配置`);
    }
    // 多页面所需要的模板集合
    plugins.push(
      new HtmlWebpackPlugin({
        title: "",
        filename: `${name}.html`,
        template: "public/index.html",
        favicon: "public/favicon.ico",
        chunks: [name],
        minify:
          process.env.NODE_ENV === "production"
            ? {
                //压缩HTML文件
                removeComments: true, // 移除HTML中的注释
                collapseWhitespace: true, // 删除空白符和换行符
              }
            : false,
        cdn: process.env.NODE_ENV === "production" ? entryCDN[name].build : entryCDN[name].dev,
      })
    );
  });
  // 对外输出页面打包需要的 入口集合、依赖过滤
  return { entries, plugins, externals };
};
 
module.exports = getEntry();
const { entries, plugins, externals } = require("./entry");
 
entry: {
  base: ["core-js/stable", "regenerator-runtime/runtime"],
  ...entries
}

1.2多页面单独部署(MPA)

dist/
├── test1/
│   ├── index.html
│   └── js/
│       └── test1.[hash].js
└── test2/
    ├── index.html
    └── js/
        └── test2.[hash].js
// 在多页面统一目录的基础上新增配置
const CopyWebpackPlugin = require("copy-webpack-plugin");
 
const getEntry = () => {
  // 多页面打包的入口集合
  const entries = {};
  // 多页面打包的模板集合
  const plugins = [];
  // 借助 glob 获取 src 目录下的所有入口文件
  const globPath = resolve("src/views/**/main.js");
  const base = ["core-js/stable", "regenerator-runtime/runtime"];
  // 遍历文件集合,生成所需要的 entries、plugins 集合
  glob.sync(globPath).map(item => {
    const match = item.match(/src/views/(.*)/main.js$/);
    const name = match?.[1];
    entries[name] = [...base, item];
 
    const env = process.env.NODE_ENV === "production" ? "build" : "dev";
    const pageCDN = (entryCDN[name] && entryCDN[name][env]) || assetsCDN[env];
 
    if (!entryCDN[name]) {
      console.warn(`页面 ${name} 未配置 entryCDN,已使用默认配置`);
    }
 
    // 多页面所需要的模板集合
    plugins.push(
      new HtmlWebpackPlugin({
        title: "",
        filename: `${name}/index.html`,
        template: "public/index.html",
        // favicon: "public/favicon.ico",
        chunks: [name],
        minify:
          process.env.NODE_ENV === "production"
            ? {
                //压缩HTML文件
                removeComments: true, // 移除HTML中的注释
                collapseWhitespace: true // 删除空白符和换行符
              }
            : false,
        cdn: pageCDN
      }),
      new CopyWebpackPlugin({
        patterns: [{ from: "public/favicon.ico", to: `${name}/favicon.ico` }]
      })
    );
  });
 
  // 对外输出页面打包需要的 入口集合、依赖过滤
  return { entries, plugins, externals };
};
// 1. 注释掉 entry base 的配置
// 2. css、img、font的filename 增加 [name]/
 
splitChunks: false // ❌ 禁用公共拆包

到此这篇关于Webpack5 多页面的项目实践的文章就介绍到这了,更多相关Webpack5 多页面内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于JS前端实现水印的代码操作

    关于JS前端实现水印的代码操作

    这篇文章主要介绍了关于JS前端实现水印的代码操作,文中给出了详细的实现思路和代码示例供大家参考,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-06-06
  • 浅析JSONP技术原理及实现

    浅析JSONP技术原理及实现

    这篇文章主要介绍了浅析JSONP技术原理及实现 的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • javascript二维数组和对象的深拷贝与浅拷贝实例分析

    javascript二维数组和对象的深拷贝与浅拷贝实例分析

    这篇文章主要介绍了javascript二维数组和对象的深拷贝与浅拷贝,结合实例形式分析了JavaScript针对数组与对象的深拷贝及浅拷贝相关操作技巧,需要的朋友可以参考下
    2019-10-10
  • JavaScript下利用fso判断文件是否存在的代码

    JavaScript下利用fso判断文件是否存在的代码

    JavaScript下利用fso判断文件是否存在的代码,需要的朋友可以参考下,这个一般需要运行确认的。
    2010-12-12
  • 原生js实现放大镜特效

    原生js实现放大镜特效

    这篇文章主要为大家详细介绍了原生js实现放大镜特效,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • 使用Javascript判断浏览器终端设备(PC、IOS(iphone)、Android)

    使用Javascript判断浏览器终端设备(PC、IOS(iphone)、Android)

    WEB开发中如何通过Javascript来判断终端为PC、IOS(iphone)、Android呢?可以通过判断浏览器的userAgent,用正则来判断手机是否是ios和Android客户端,下面通过本文学习下吧
    2017-01-01
  • JavaScript实现为事件句柄绑定监听函数的方法分析

    JavaScript实现为事件句柄绑定监听函数的方法分析

    这篇文章主要介绍了JavaScript实现为事件句柄绑定监听函数的方法,结合实例形式分析了javascript事件绑定的常用技巧与注意事项,需要的朋友可以参考下
    2017-11-11
  • Javascript处理循环的异步操作指南

    Javascript处理循环的异步操作指南

    这篇文章主要给大家介绍了关于Javascript处理循环的异步操作的相关资料,文中通过实例代码介绍的非常详细,对大家学习或者使用js具有一定的参考学习价值,需要的朋友可以参考下
    2022-03-03
  • js+canvas绘制图形验证码

    js+canvas绘制图形验证码

    这篇文章主要为大家详细介绍了js+canvas绘制图形验证码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-09-09
  • webpack自动打包和热更新的实现方法

    webpack自动打包和热更新的实现方法

    这篇文章主要介绍了webpack自动打包和热更新的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06

最新评论