Webpack 4 教程 - 3 . 使用插件

Hello! 今天我们介绍插件的概念。某种程度上来说,与加载器不同的是插件能够处理更大范围内的任务。基本上,它们能做加载器不能做的任何事情。加载器往往囿于一定类型的文件,而插件就普适得多了。这一回我们将学习loader(译注:原文如此,理应为plugins)服务的目的以及如何使用它们。我们将触及到一个真实的例子,这个例子中我们生成带有资源链接的HTML文件,以及抽离css到分离的文件中。

Webpack 4 教程: 插件,如何使用?

use loaders(译注: 原文如此,理应为 use plugins)最基本的方式是把它们放到我们的配置的plugins属性中。你需要调用new操作符来生成一个插件的实例。

如果你要对new关键字及原型了解更多,请参阅Prototype. The big bro behind ES6 class

html-webpack-plugin

手工在HTML中添加JavaScripts文件很是繁琐。谢天谢地,你并不必这么做!这里有一个叫HtmlWebpackPlugin的很好用的插件。

npm install html-webpack-plugin

非常容易使用:

// webpack.config.js

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

module.exports = {
    plugins: [
        new HtmlWebpackPlugin()
    ]
};

这将给我们创建一个index.html文件,并把其放在dist目录中。我们输出的javascript代码将链接在<body>标签的尾部。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Webpack App</title>
  </head>
  <body>
  <script type="text/javascript" src="main.js"></script></body>
</html>

这就方便了,尤其在你的文件数增长得越来越多的时候。因为(手工的话)你不得不跟踪每个文件并将它们放到HTML中。

另外一个重要的事情就是在使用hash的情况下,你的文件名可以被更改。这让HtmlWebpackPlugin变得更有用了,因为你不必跟踪文件名了。引入这个机制是为了应付浏览器的缓存(效应)。在接下来的教程中,我们将更多的覆盖这个主题。

给插件传递可选参数

你可以给插件传递可选参数。这里有一个给HtmlWebpackPlugin传递模板(template)可选项的例子:

// webpack.config.js

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

module.exports = {
    plugins: [
        new HtmlWebpackPlugin({template: './src/index.html'})
    ]
};

这样,就不再创建一个默认的HTML文件了,而是使用你提供的。了解更多可选参数的意义,请参考仓库

多次使用同一个插件

你可能想知道每次使用插件时为什么要用new关键字。这是因为使得你能多次使用同一个插件这一事实。

当创建多页应用时,你可能需要输出多个HTML文件。

如果你想了解更多的如何通过入口和输出来创建多页应用,请参阅本教程的第1部分

为此,可通过多次使用HtmlWebpackPlugin插件来实现

// webpack.config.js

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

module.exports = {
    entry: {
        one: './src/one.js',
        two: './src/two.js',
    },
    output: {
        filename: '[name].bundle.js',
        path: path.resolve(__dirname, 'dist')
    },
    plugins: [
        new HtmlWebpackPlugin({
            filename: 'one.html',
            template: './src/one.html',
            chunks: ['one']
        }),
        new HtmlWebpackPlugin({
            filename: 'two.html',
            template: './src/two.html',
            chunks: ['two']
        })
    ]
};

插件实例按其chunks属性的值与入口点来匹配。运行上面这个配置将生成这些文件: one.html,
two.html, one.bundle.js, two.bundle.js.

插件与加载器一块工作

在上一节的教程中,我们结合css-loader和style-loader把css代码插入到<style>标签里。你可能更喜欢给你的用户提供一个实际的css文件。要这么做,使用mini-css-extract-plugin.

在Webpack版本4以前,我们使用ExtractTextWebpackPlugin插件来做这件事,但从4开始,不这么干了,想知道得更多请参读issue

你要这么做:

npm install mini-css-extract-plugin
// webpack.config.js

const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require("mini-css-extract-plugin");

module.exports = {
    module: {
        rules: [
            {
                test: /\.css$/,
                use: [
                    MiniCssExtractPlugin.loader,
                    'css-loader'
                ]
            }
        ]
    },
    plugins: [
        new HtmlWebpackPlugin(),
        new MiniCssExtractPlugin()
    ]
}
// index.js

import './styles.css';

由于HtmlWebpackPlugin的作用, 生成的css文件将被自动插入到HTML中。你最终会得到如下的输出:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Webpack App</title>
  <link href="main.css" rel="stylesheet"></head>
  <body>
  <script type="text/javascript" src="main.js"></script></body>
</html>

用这份配置运行webpack将创建一个css文件,每个javascript文件都导入它。要改变这种行为需要使用SplitChunksPlugin插件,我们在后面部分的教程中涉及它。你可以在官方文档找到如何这么做的说明。

小结

今天我们涉及到了loaders(译注:原文如此,理应为plugins,我再次疑惑)是什么,以及学习了使用它们的基本方式。不只如此,我们也学习了如何给它们传递附加选项参数,以及如何让其与加载器协同工作。尽管这里只是举了一个插件的例子,但使用其它插件都是类似的。更多可用的插件请参阅官方的插件列表。这个列表太多了,使用搜索引擎去找吧。因为webpack自己本身也是建立在同样插件系统之上的,了解其底层如何工作是件有趣的事情。我们将在以后实现一个我们自己的插件。

相关推荐