详解webpack多页面配置记录

作者:测试手账

时间:2026-10-22

浏览:473

本文详细记录了基于webpack的多页面应用配置过程。从确定目录结构开始,区分开发与生产环境,通过全局和局部安装依赖,利用webpack-merge合并配置。重点讲解了如何自动获取入口文件、分离第三方库以及使用HTMLWebpackPlugin生成HTML,旨在提供一套实用的多页面构建方案。

文章目录

多页面配置背景与目标

此前曾撰写过webpack的学习笔记,由于当前项目需要一套常用的多页面配置方案,因此着手进行实践。秉持着精简代码的原则,开始了webpack的配置工作。

目录结构设计

确定目录结构

首先仅需区分开发环境(支持自动更新)和打包环境,初步规划的目录结构如下所示。

多页面配置背景与目标

经过反复权衡,最终根据习惯确定了如下目录结构:

多页面配置背景与目标 


app
 -libs # 第三方插件库,可以是css也可以是js,eg:jq
 -static # 公共的静态资源文件夹
 -temlates # 模板文件夹
  -*** # 模块文件夹
  -css # 当前模块独有的css文件需要在index.js中import
  -html # 模板文件,计划支持html,pug两种模板语言
  -index.js # 当前模块入口文件

Webpack基础配置与依赖安装

配置webpack

按照上述规划建立文件后,在根目录下新建webpack.config.js文件。

接着进行全局安装webpack和webpack-dev-server。


npm i webpack webpack-dev-server -g

随后进行局部安装。


npm i webpack webpack-dev-server --save-dev

此时项目已能引入webpack,并可使用webpack-dev-server的相关功能。webpack.config.js的内容较为简单,主要依据环境变量中指定的当前环境来加载不同的webpack配置。


// 未指定这手动指定为生产环境
process.env.NODE_ENV = process.env.NODE_ENV ? process.env.NODE_ENV : 'product';
// 获取环境命令,并去除首尾空格
const env = process.env.NODE_ENV.replace( /(\s*$)|(^\s*)/ig, "" );
// 根据环境变量引用相关的配置文件
module.exports = require( `./config/webpack.config.${env}.js` )

环境配置分离与合并策略

在config文件夹下分别新建webpack.config.dev.js和webpack.config.product.js,分别代表开发环境的配置和生成打包文件的配置。考虑到大量配置项相同,再建立一个webpack.config.base.js用于编写统一配置。

webpack.config.dev.js与webpack.config.product.js的区别在于前者是运行时配置,后者是文件生成配置。简而言之,开发环境的差异主要体现在配置webpack-dev-server,而生产环境则侧重于压缩、map等配置。

核心配置:入口、输出与插件

webpack.config.base.js文件才是webpack配置的核心,包含entry、output、modules、plugins等关键部分。

获取所有入口文件的文件夹路径。


function getEntryDir() {
  let globPath = 'app/templates/**/*.' + config.tplLang
  // (\/|\\\\) 这种写法是为了兼容 windows和 mac系统目录路径的不同写法
  let pathDir = 'app(\/|\\\\)(.*?)(\/|\\\\)html'
  let files = glob.sync( globPath )
  let dirname, entries = []
  for ( let i = 0; i < files.length; i++ ) {
    dirname = path.dirname( files[ i ] )
    entries.push( dirname.replace( new RegExp( '^' + pathDir ), '$2' ) )
  }
  return entries;
}

注入entry并生成HTMLWebpackPlugin实例。


getEntryDir()
  .forEach( ( page ) => {
    let moduleName = page.split( '/' )
    let moduleNameStr = moduleName[ moduleName.length - 1 ]
    const htmlPlugin = new HTMLWebpackPlugin( {
      filename: `${moduleNameStr}.html`,
      template: path.resolve( __dirname, `../app/${page}/html/index.${config.tplLang}` ),
      chunks: [ moduleNameStr, 'vendors' ],
    } );
    HTMLPlugins.push( htmlPlugin );
    Entries[ moduleNameStr ] = path.resolve( __dirname, `../app/${page}/index.js` );
  } )

关于HTMLWebpackPlugin的具体用法,可参考html-webpack-plugin用法全解以及官方文档,已有非常详尽的说明。

第三方库与HTML生成处理

自动获取第三方库入口。


function getVendors() {
  let globPath = `app/${config.libraryDir}/**/*.*`
  let files = glob.sync( globPath )
  let libsArr = []
  files.forEach( ( v, i ) => {
    libsArr.push( './' + v )
  } )
  return libsArr
}
Entries[ 'vendors' ] = getVendors() // 第三方类库

其中多页面入口和第三方库的配置,请参考这篇webpack中文站文档关于分离应用程序(app)和第三方库(vendor)入口的介绍。

output配置部分。


output: {
 filename: "static/js/[name].bundle.[hash].js",
 path: path.resolve( __dirname, config.devServerOutputPath )
}

配置合并与总结

webpack配置合并处理。

主要使用一个webpack插件webpack-merge,可将分开配置的config合并,从而区分生产环境和调试环境。

最后附上github地址: webpack-multi-skeleton,如有不当之处,欢迎指正!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章