发布于 2025-12-10 34 阅读
0

Webpack 基础介绍 简介 Webpack 是什么?Webpack 有什么用?安装 Webpack 配置文件 运行 Webpack Webpack DevServer 总结

Webpack 基本介绍

介绍

什么是 Webpack?

Webpack 如何提供帮助?

安装 Webpack

配置文件

运行 Webpack

Webpack 开发服务器

结论

介绍

在本文中,我将以实用易懂的方式介绍 Webpack 的核心概念。我将讲解如何从头开始设置 Webpack 配置文件,以及入口点、CSS、加载器、插件等每个配置的含义。

许多人可能没有意识到,当你使用 angular-cli 或 create-react-app 引导 Angular 或 React 项目时,Webpack 就在后台运行。

我写这篇文章是为了跟进。你可以从Github 仓库获取文中描述的 webpack starter 的完整代码。

什么是 Webpack?

Webpack 是一个用于现代 JavaScript 应用程序的静态模块打包器。当 Webpack 处理你的应用程序时,它会在内部构建一个依赖关系图,该图会映射项目所需的每个模块,并生成一个或多个打包文件。

下面的插图可以更简单地解释 Webpack 实际的作用。

https://cdn.hashnode.com/res/hashnode/image/upload/v1599234539688/5qLIgwl0R.png

Webpack 如何提供帮助?

让我们以任意 Web 应用程序为例。它通常包含一个 index.html 文件,其中包含许多脚本标签,如下所示。

<body>

  ...

  <script src='src/blog.js'></script>
  <script src='src/about.js'></script>
  <script src='src/contact.js'></script>
  <script src='src/index.js'></script>
</body>

Enter fullscreen mode Exit fullscreen mode

虽然上述在 HTML 页面中包含脚本标签的方式有效,但它也带来了一些挑战,例如:

  • 脚本标签需要按特定顺序加载。这是必要的,这样,引用其他脚本中函数的脚本会先于自身加载。在上面的例子中,about.js、contact.js 和 blog.js 必须在 index.js 之前加载到浏览器中,因为 index.js 很可能引用了其他脚本中的函数。
  • 此外,上述方法容易出现拼写错误。

Webpack 恰恰解决了这个问题,通过使用捆绑器,您不必担心在 index.html 中包含每个脚本标签,当然也不必担心顺序。

<body>

  ...

  <script src='dist/index_bundle.js'></script>
</body>

Enter fullscreen mode Exit fullscreen mode

模块打包只是 Webpack 解决的一个方面。但是,它在将 HTML、CSS 和 JS 文件引入打包器之前进行转换的能力无疑要强大得多。让我们直接开始学习如何安装和设置 Webpack。

安装 Webpack

首先,您需要安装以下两个包才能使用 Webpack。

//Create a new folder
$ mkdir webpack-example

//Initialize a new NPM projects (Creates a package.json with default values)
> webpack-example$npm init -y

//Include the packages webpack and webpack-cli as dev dependencies
> webpack-example$npm install webpack webpack-cli --save-dev

Enter fullscreen mode Exit fullscreen mode

注意事项:

  • 如果您想继续操作,请创建一个新文件夹。打开终端,进入新文件夹并运行上述命令。
  • 选项“—save-dev”会将软件包作为 dev 依赖项添加到你的 package.json 中。这意味着这些软件包不会包含在你的最终生产版本中。

配置文件

webpack.config.js 文件是大多数操作发生的主要位置。在这里,您将向“Webpack”提供一组指令,让它知道如何处理您的项目文件,以及如何以您希望使用的方式打包它们。

注意:根据 Webpack 官方文档,从 Webpack 4.0.0 开始,你无需配置文件即可设置打包器。然而,配置文件可能是 Webpack 中最重要的部分,你需要根据项目需求进行自定义。

我们将介绍配置文件的以下核心概念:

  • 入口
  • 装载机
  • 输出
  • 插件
  • 模式

在我们开始研究概念之前,首先在项目的根结构中创建 webpack.config.js。

> webpack-example$ touch webpack.config.js

Enter fullscreen mode Exit fullscreen mode

Webpack 按指定顺序执行以下操作:

  • 如何找到需要打包的文件?或者如何选择应用转换?
  • 访问这些文件后我需要做什么?我需要进行任何特定的转换吗?
  • 我需要将我生成的捆绑包输出(保存)到哪里?

入口点

启动一切的单个文件通常是 Webpack 的入口点。它通常是“index.js”或“app.js”。

您可以将下面显示的导入结构可视化,就像 Webpack 如何创建依赖关系图一样。

index.js
  imports about.js
  imports contact.js
  imports blog.js
    imports util.js
    imports api.js

Enter fullscreen mode Exit fullscreen mode

让我们在应用程序文件夹中创建“index.js”。

> webpack-example$ mkdir app

> webpack-example$ cd app

> webpack-example$ touch index.js

Enter fullscreen mode Exit fullscreen mode

让我们将入口点添加到 webpack.config.js

module.exports {
    entry: './app/index.js'
}

Enter fullscreen mode Exit fullscreen mode

装载机

现在我们已经设置了入口点,接下来要告诉 Webpack 应该如何处理项目中的文件。换句话说,需要对我们的文件应用什么样的转换。

为此,我们引入了一个叫做“加载器”的东西。默认情况下,Webpack 会查看所有 JSON 和 JS 文件来构建如上所示的依赖关系图。

import contact from './app/config' // 👍
import config from './utils/config.json' // 👍
import './css/app.css' // ❌

Enter fullscreen mode Exit fullscreen mode

在上面的例子中,CSS 导入会被 Webpack 忽略,而 Loaders 正是我们在这里所需要的,它可以协助 Webpack 处理除 JS 和 JSON 之外的文件。

让我们看看如何按照以下步骤添加 CSS 加载器。

> webpack-example$ npm install css-loader --save-dev

Enter fullscreen mode Exit fullscreen mode

我们需要在“modules.rules”属性数组中添加加载器。Webpack 将查找规则数组,以确定加载器的设置以及每种文件类型的相关规则。

module.exports = {
  entry: './app/index.js',
  module: {
    rules: []
  }
}

Enter fullscreen mode Exit fullscreen mode

我们需要在规则数组中指定加载器属性。每个加载器都有两个需要定义的属性:

  • use——加载器的名称。
  • 测试——匹配文件路径的正则表达式。
module.exports = {
  entry: './app/index.js',
  module: {
    rules: [
      { test: /\\.css$/, use: 'css-loader' }
    ]
  }
}

Enter fullscreen mode Exit fullscreen mode

现在,如果我们在项目中的任何地方使用 CSS,Webpack 都会通过加载器识别它,并将其导入到项目中。基本上,上面那个带有 ❌ 的 CSS 导入语句现在会变成 👍。

import contact from './app/config' // 👍
import config from './utils/config.json' // 👍
import './css/app.css' // 👍

Enter fullscreen mode Exit fullscreen mode

DOM注入

虽然我们已经成功使用 webpack 配置导入了 CSS 文件,但还有一件事要做。我们需要将样式元素注入到 DOM 中。

简单来说,CSS 样式需要作为“样式”标签包含在 HTML 中。

为了帮助我们实现这一点,我们需要使用“style-loader”。

> webpack-example$ npm install style-loader --save-dev

Enter fullscreen mode Exit fullscreen mode

并修改 webpack.config.js 以将 'style-loader' 添加到 modules.rule 数组中。

module.exports = {
  entry: './app/index.js',
  module: {
    rules: [
      { test: /\\.css$/, use: [ 'style-loader', 'css-loader' ] }
    ]
  }
}

Enter fullscreen mode Exit fullscreen mode

注意事项:

  • 由于“use”属性中需要使用 2 个变量,我们将其更改为数组。
  • 加载器的引用顺序很重要,因为 webpack 会以相反的顺序处理它们。因此,css-loader 会先解释 import 命令,然后 style-loader 会将 CSS 注入到 DOM 中。

加载器可以做的事情还有很多,一个很常见的例子就是使用 Babel。Babel 根据 webpack.config.js 中指定的配置,将每个 JavaScript 文件转换为适当的 ES 语法。

您可以在此处查看完整的加载器列表。

输出

顾名思义,这个配置参数只是告诉 Webpack 在哪里输出它创建的包。

//Import 'path' to resolve the file path
const path = require('path');

//Add this configuration after module.rules config
output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'index_bundle.js'
}

Enter fullscreen mode Exit fullscreen mode

注意事项:

  • 我们正在导入“路径”包来帮助解析文件路径。
  • 输出配置需要 path 参数来告知 webpack 打包文件的保存位置。此外,使用 filename 参数可以指定生成的打包文件的名称。

快速回顾

到目前为止,我们已经了解了入口、加载器和输出配置。组合所有配置后,webpack.config.js 如下所示:

//Import 'path' to resolve the file path
const path = require('path')

module.exports = {
  entry: './app/index.js',
  module: {
    rules: [
      { test: /\\.css$/, use: [ 'style-loader', 'css-loader' ] }
    ]
  },
    output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'index_bundle.js'
  }
}

Enter fullscreen mode Exit fullscreen mode

快速回顾:

  1. Webpack 找到位于的入口点 ./app/index.js
  2.  它检查项目中的所有 import 和 语句并创建依赖关系图。require
  3. 然后它开始创建一个包,每当它遇到我们有加载器的路径时,它就会根据该加载器转换代码,然后将其添加到包中。
  4. 最后,它将其捆绑并输出到配置中提到的位置,即 dist/index_bundle.js

希望您能跟上到这里。我们还有两个配置“插件”和“模式”需要介绍。所以,请耐心等待,我们很快就完成了。

插件

虽然加载器用于转换某些类型的模块,但插件可以用来执行更广泛的任务,如捆绑优化、资产管理和环境变量注入。

插件允许你在创建 bundle 后执行某些任务。因此,这些任务可以放在 bundle 本身,也可以直接应用到源代码库中。

让我们看两个这样的插件的例子:

HtmlWebpack插件

之前我们看到,webpack 的主要好处是它会为我们生成一个单独的包,然后我们可以在主页中引用它 index.html 。

它的作用 HtmlWebpackPlugin 是,为我们生成页面,将 index.html 其粘贴到放置捆绑包的同一目录中,并自动包含 <script> 引用新生成的捆绑包的标签。

与往常一样,第一步是从 npm 下载插件。

> webpack-example$ npm install html-webpack-plugin --save-dev

Enter fullscreen mode Exit fullscreen mode

接下来,我们向 webpack 配置中添加一个 plugins 属性,它是一个数组。

//Import the HtmlWebpackPlugin
const HtmlWebpackPlugin = require('html-webpack-plugin')

//Add this to the module.exports configuration
plugins: [
    new HtmlWebpackPlugin()
]

Enter fullscreen mode Exit fullscreen mode

现在你的整个 webpack.config.js 将如下所示:

//Import 'path' to resolve the file path
const path = require('path')

//Import the HtmlWebpackPlugin
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
  entry: './app/index.js',
  module: {
    rules: [
      { test: /\\.css$/, use: [ 'style-loader', 'css-loader' ] }
    ]
  },
    output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'index_bundle.js'
  },
    plugins: [
    new HtmlWebpackPlugin()
    ]
}

Enter fullscreen mode Exit fullscreen mode

HtmlWebpackPlugin 是最基本的插件之一,您可以在这里查看 Webpack 提供的其他插件。

MiniCssExtract插件

MiniCssExtractPlugin 是我们将要介绍的第二个插件示例。如果您还记得之前的示例,我们使用了 Style-loader,但使用这个插件,我们可以完全分离 CSS 文件,而不是仅仅插入 CSS 的样式元素。

与往常一样,我们将从安装依赖项作为第一步开始:

> webpack-example$ npm install --save-dev mini-css-extract-plugin

Enter fullscreen mode Exit fullscreen mode

将以下内容添加到 webpack.config.js 文件:

const MiniCssExtractPlugin = require('mini-css-extract-plugin');

plugins: [
  new MiniCssExtractPlugin(),
],

Enter fullscreen mode Exit fullscreen mode

最后但并非最不重要的一点是,我们将用 MiniCssExtractPlugin.loader 替换 style-loader:

{
  test: /\\.css$/,
  use: [
    MiniCssExtractPlugin.loader, // instead of style-loader
    'css-loader'
  ]
}

Enter fullscreen mode Exit fullscreen mode

现在,当您运行 webpack 时,它将在 dist 文件夹中输出 main.css 文件,并将使用链接头从 index.html 文件引用。

模式

使用 mode 参数,您可以根据值“development”、“production”或“none”启用 webpack 的内置优化。默认值为“production”。

mode: 'production' //Other values include 'development' or 'none'

Enter fullscreen mode Exit fullscreen mode

当模式设置为“生产”时,Webpack 会执行构建优化的一个例子是,它会压缩代码并删除警告。有关后台运行的详细优化列表,您可以在此处阅读。

运行 Webpack

如果你一直跟着做,那么此时你的 webpack.config.js 应该如下所示:

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  entry: './app/index.js',
  module: {
    rules: [{ test: /\\.css$/, use: ['style-loader', 'css-loader'] }],
  },
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'index_bundle.js',
  },
  plugins: [new HtmlWebpackPlugin()],
  mode: 'production',
};

Enter fullscreen mode Exit fullscreen mode

现在让我们继续运行 Webpack。首先,我们需要在 package.json 中添加以下配置。

"scripts": {
    "build": "webpack"
}

Enter fullscreen mode Exit fullscreen mode

现在从命令终端运行以下命令。

> webpack-example$ npm run build

Enter fullscreen mode Exit fullscreen mode

Webpack 将执行并创建一个名为 index_bundle.js 的优化包并将其放入 dist 目录中。

您应该会看到在“dist”文件夹中创建的最终的index.html。

Webpack 开发服务器

Webpack DevServer 是 webpack 的开发服务器,它会在内存中跟踪您的文件并通过本地服务器提供它们,而不是生成 dist 目录。

但最棒的是,它支持实时重新加载。这意味着,无论何时你修改代码,webpack-dev-server 都会快速重新编译代码,并使用这些更改重新加载浏览器。

我们需要从 npm 安装该包。

> webpack-example$ npm install webpack-dev-server --save-dev

Enter fullscreen mode Exit fullscreen mode

然后我们需要更新 package.json 中的“scripts”属性来运行 webpack-dev-server。

"scripts": {
  "start": "webpack-dev-server"
}

Enter fullscreen mode Exit fullscreen mode

此外,如果环境变量中未指定“production”,我们将对 webpack.config.js 中的“mode”参数进行小幅更改,默认为“development”。

mode: process.env.NODE_ENV === 'production' ? 'production' : 'development'

//If you’re on Windows, then the command is as follows:
"SET NODE_ENV='production' && webpack"

Enter fullscreen mode Exit fullscreen mode

就是这样!如果你从终端运行“npm start”,那么你的项目将在http://localhost:8080上提供服务。

> webpack-example$ npm start

Enter fullscreen mode Exit fullscreen mode

经过定制的完整项目可在以下Github 存储库中找到。

结论

虽然这篇文章很长,但说实话,我们仅仅触及了 Webpack 的表面以及它所支持的配置的无限可能性。

总而言之,我们在本文中涵盖了以下内容:

  • 什么是 Webpack 以及它提供什么好处?
  • Webpack 的核心组件:
    • 入口点
    • 装载机
    • 输出
    • 插件
    • 模式
  • 运行 Webpack - 本地和生产模式

希望这篇文章对您有所帮助。如果您觉得我的文章有趣,请不要忘记订阅我的新闻通讯。

您可能还感兴趣:

文章来源:https://dev.to/skaytech/a-basic-introduction-to-webpack-4eke