webpack打包多页面的方法

作者:编译时光

时间:2026-10-23

浏览:595

本文详解如何使用webpack构建传统多页面应用,解决SPA复杂性及后端渲染需求。通过配置html-webpack-plugin实现多入口打包,集成pug模板引擎统一UI布局,并结合ESLint、TypeScript及jQuery增强开发体验,提供完整配置方案与项目地址。

文章目录

webpack多页面打包概述

前言

最初接触webpack是因为Vue框架,其脚手架基于webpack构建。起初认为webpack专为单页面应用设计,但仔细思考后,若将这一高效打包方案应用于传统多页面项目,效率或许能显著提升。目前已有许多优秀的前端开发者提供了相关demo和教程,我也编写了一个示例项目,希望能帮助读者更好地学习webpack。

以上为简要介绍,接下来提供项目地址和核心内容,建议配合实际代码阅读以获得更佳体验。

webpack-multi-page

项目解决的问题

项目解决的问题

  • SPA开发复杂度较高,若偏好传统多页应用架构,或公司项目需要后端渲染,该如何处理页面模板?
  • 各页面共用相同的UI布局导致维护困难,UI微调时需逐个页面修改,既繁琐又易遗漏,如何解决?
  • 能否将ESLint整合进构建流程以进行语法检查?
  • 能否集成PostCSS以增强浏览器兼容性处理?
  • 如何在webpack环境中使用jQuery?
  • 如何在webpack环境中使用TypeScript?

多页面目录结构与打包配置

src目录对应dist目录

webpack多页面打包概述

使用webpack打包多页面时,期望src目录下的结构在打包后对应dist目录的布局如上图所示。开发者依据页面模块思路搭建架构,经webpack打包后生成传统页面结构。


/**
 * 创建打包路径
 */
const createFiles = function() {
 const usePug = require('../config').usePug;
 const useTypeScript = require('../config').useTypeScript;
 const path = require('path');
 const glob = require('glob');
 const result = [];
 const type = usePug ? 'pug' : 'html';
 const scriptType = useTypeScript ? 'ts' : 'js';
 const files = glob.sync(path.join(__dirname, `../src/views/**/*.${type}`));
 for (file of files) {
  result.push({
   name: usePug ? file.match(/\w{0,}(?=\.pug)/)[0] : file.match(/\w{0,}(?=\.html)/)[0],
   templatePath: file,
   jsPath: file.replace(type, scriptType),
   stylePath: file.replace(type, 'stylus')
  });
 }
 return result;
};

利用该方法可获取需要打包的文件路径(获取路径的模块也可替换为fs模块),根据得到的文件路径,我们可以使用html-webpack-plugin来实现多页面打包。

由于每个html-webpack-plugin的实例仅针对/生成一个页面,因此构建多页应用需配置多个html-webpack-plugin实例:


const plugins = function() {
 const files = createFiles();
 const HtmlWebpackPlugin = require('html-webpack-plugin');
 const path = require('path');
 const ExtractTextPlugin = require('extract-text-webpack-plugin');

 let htmlPlugins = [];
 let Entries = {};
 files.map(file => {
  htmlPlugins.push(
   new HtmlWebpackPlugin({
    filename: `${file.name}.html`,
    template: file.templatePath,
    chunks: [file.name]
   })
  );
  Entries[file.name] = file.jsPath;
 });

 return {
  plugins: [
   ...htmlPlugins,
   new ExtractTextPlugin({
    filename: getPath => {
     return getPath('css/[name].css');
    }
   })
  ],
  Entries
 };
};

因使用了ExtractTextPlugin,这些CSS代码最终将生成至所属chunk目录下,成为独立的CSS文件。

集成Pug模板引擎

模版引擎

各页面共用相同的UI布局导致维护困难,UI微调时需逐个页面修改,既繁琐又易遗漏,如何解决?

针对此问题,项目引入并使用了pug模版引擎。

现在,我们可以利用pug的特性,创建一个共用组件:

demo.pug

p 这是一个共用组件

随后,当需要使用该公用组件时,只需引入即可:


include 'demo.pug'

此外,你还可以使用所有pug支持的特性。

在webpack中配置pug十分简单,首先安装:


npm i --save-dev pug pug-html-loader

接着将所有.html后缀的文件改为.pug后缀,并采用pug语法编写。

然后在规则中再增加一条配置


{
  test: /\.pug$/,
  use: 'pug-html-loader'
}

同时,将plugins对象中引用index.html的HtmlWebpackPlugin的template属性,也需改为index.pug。

整合ESLint进行代码检查

webpack整合eslint

先展示配置代码:


if (useEslint) {
 loaders.push({
  test: /\.js$/,
  loader: 'eslint-loader',
  enforce: 'pre',
  include: [path.resolve(__dirname, 'src')],
  options: {
   formatter: require('stylish')
  }
 });
}

通过webpack整合ESLint,可确保编译生成的代码无语法错误且符合编码规范;但在开发过程中,等到编译时才发现问题可能过于滞后。

因此建议将ESLint整合进编辑器或IDE中,例如本人使用VS Code,可安装名为Eslint的插件,一旦编写有问题代码,系统会立即标识出来。

开发环境与生产环境配置

dev环境与prod环境

阅读webpack项目时,通常需先查看package.json文件。因为当你在命令行输入一句命令


npm run dev

webpack便会找到package.json文件中的script属性并依次分析命令,可见该命令对应执行

代码如下:

nodemon --watch build/ --exec \"cross-env NODE_ENV=development webpack-dev-server --color --progress --config build/webpack.dev.js\"

同样,当输入命令


npm run build

script便会执行


ross-env NODE_ENV=production webpack --config build/webpack.prod.js

以此区分开发环境或生产环境。

尽管我们会对环境进行区分,但基于不重复原则,项目将两个环境公用的配置整合到(build/webpack.base.js)文件中。随后利用webpack-merge插件将配置合并在一起

集成jQuery与TypeScript

webpack中使用jquery

在webpack中使用jquery也很简单,我们可以在loaders中增加一条配置:


if (useJquery) {
 loaders.push({
  // 通过require('jquery')来引入
  test: require.resolve('jquery'),
  use: [
   {
    loader: 'expose-loader',
    // 暴露出去的全局变量的名称 随便你自定义
    options: 'jQuery'
   },
   {
    // 同上
    loader: 'expose-loader',
    options: '$'
   }
  ]
 });
}

随后当需要在某个js文件使用jq时,引用暴露出来的变量名即可:


import $ from 'jQuery';

webpack中使用typescript

在webpack中使用jquery也很简单,我们可以在loaders中增加一条配置:


if (useTs) {
 loaders.push({
  test: /\.tsx?$/,
  use: 'ts-loader',
  exclude: /node_modules/
 });
}

然后将js文件改为ts即可。

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

实用工具推荐

电子包浆

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

使用 ›
图片压缩

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

使用 ›
相关文章