当前位置:首页 > 技术 > 正文内容

webpack 常用核心配置解析

访客 技术 2026年10月4日 1

entry(入口)

entry 指定了构建的起点。webpack 会从这个文件开始递归解析依赖,最终生成对应的 bundle。

它的值可以是字符串、数组或对象。对象形式通常用于多入口场景,键名会成为输出 chunk 的名称:

module.exports = {
  entry: {
    app: './src/index.js',
    admin: './src/admin.js'
  }
};

output(输出)

output 用于定义打包产物如何输出。其中两个最常用的字段是 filename 和 path:

  • filename:生成的资源文件名,支持 [name]、[hash]、[chunkhash] 等占位符。
  • path:产物在本地磁盘上的绝对路径。
const path = require('path');

module.exports = {
  output: {
    filename: '[name].bundle.js',
    path: path.resolve(__dirname, 'build')
  }
};

chunkFilename(异步 chunk 命名)

对于没有在 entry 中声明、而是通过动态导入(按需加载)生成的代码块,需要使用 chunkFilename 来命名。

module.exports = {
  output: {
    filename: '[name].js',
    chunkFilename: '[name].async.js'
  }
};

配合 import() 或 require.ensure 使用时,被分割出来的模块就会以该规则生成独立的 chunk。

// 点击按钮后才会加载这个异步模块
document.querySelector('#btn').addEventListener('click', () => {
  import('./modules/tool').then(({ default: tool }) => {
    tool.init();
  });
});

publicPath(公共资源路径)

output.path 描述的是打包产物存放在本地磁盘的目录;而 publicPath 描述的是运行时浏览器访问这些静态资源的 URL 前缀。

例如,把 dist 目录部署到 CDN 或二级路径时,可以这样配置:

module.exports = {
  output: {
    path: path.resolve(__dirname, 'dist'),
    publicPath: '/assets/'
  }
};

这样,HTML 中引用的脚本路径会变为 /assets/main.js,而不是相对路径。

mode(模式)

mode 用于告诉 webpack 当前所处的构建环境,常见的有 development 和 production。不同模式会触发不同的内置优化策略,例如 production 模式会默认启用代码压缩。

module.exports = {
  mode: 'production'
};

module.rules(Loader 配置)

webpack 默认只能理解 JavaScript。要处理 CSS、图片、TypeScript 等模块,必须通过 Loader 进行转换。Loader 本质上是一个函数,它接收源文件并返回转换后的结果。

每条规则通常包含:

  • test:正则匹配需要处理的文件类型。
  • include / exclude:限定或排除某些目录,缩小查找范围。
  • use:指定应用的 Loader,多个 Loader 时默认从右向左执行。
  • enforce:强制某个 Loader 在最前或最后执行。
module.exports = {
  module: {
    rules: [
      {
        test: /\.jsx?$/,
        include: path.resolve(__dirname, 'src'),
        exclude: /node_modules/,
        use: [
          {
            loader: 'babel-loader',
            options: {
              presets: ['@babel/preset-env', '@babel/preset-react'],
              cacheDirectory: true
            }
          }
        ]
      },
      {
        test: /\.css$/,
        use: ['style-loader', 'css-loader']
      }
    ]
  }
};

如果需要某个 Loader 先执行或后执行,可以添加 enforce:

{
  test: /\.js$/,
  enforce: 'pre',
  loader: 'eslint-loader'
}

enforce: 'pre" 表示最先执行,enforce: "post" 表示最后执行。

module.noParse(跳过解析)

对于一些不依赖模块规范的第三方库,可以让 webpack 跳过对它的递归解析,从而加快构建速度。这些库中不应包含 require、import、define 等模块化语句。

module.exports = {
  module: {
    noParse: /jquery|lodash/
  }
};

resolve.alias(路径别名)

alias 可以把较长的导入路径映射成更简短的别名,使项目结构更清晰。

module.exports = {
  resolve: {
    alias: {
      '@': path.resolve(__dirname, 'src'),
      '@components': path.resolve(__dirname, 'src/components')
    }
  }
};

配置后,代码中可以这样引入组件:

import Header from '@components/Header';

resolve.extensions(自动补全后缀)

当使用 import 导入文件没有写后缀时,webpack 会按照 extensions 配置的顺序依次查找文件。默认值只包含 .js 和 .json。

module.exports = {
  resolve: {
    extensions: ['.js', '.jsx', '.ts', '.tsx', '.json']
  }
};

externals(排除打包)

如果某些库已经通过 CDN 或全局变量在运行时提供,可以使用 externals 告诉 webpack 不要把它们打包进产物。

module.exports = {
  externals: {
    react: 'React',
    'react-dom': 'ReactDOM'
  }
};

代码中仍然可以正常引入,但 webpack 不会把 react 和 react-dom 的代码打进 bundle:

import React from 'react';
import ReactDOM from 'react-dom';

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。