webpack入门(四)插件管理

摘要:So far we've manually included all our assets in our index.html file, but as your application grows and once you start using hashes in filenames and outputting multiple bundles, it will be difficult to keep managing your index.html file manually. However, a few plugins exist that will make this process much easier to manage.

大概意思是说到目前为止,已经手动的将一些资产添加到了index.html文件中,但是手动来操作是有问题的,因为一旦当你的项目或者应用变得非常大,一旦以哈希名来命名文件并且要输出多个模块时候,这是手动的管理index.html将变得非常困难。这时候就需要相应的插件来帮我们来管理,使其管理起来跟容易简单。

  • 首先简化我们之前的项目结构为如下:


    22.png

    新建一个dist目录,将index.html文件移动到dist目录下。具体文件的内容如下:

src/print.js:
export default function printMe() {
  console.log('I get called from print.js!');
}
src/index.js
import _ from 'lodash';
import printMe from './print.js';

 function component() {
   var element = document.createElement('div');
  var btn = document.createElement('button');

   element.innerHTML = _.join(['Hello', 'webpack'], ' ');

  btn.innerHTML = 'Click me and check the console!';
  btn.onclick = printMe;
  element.appendChild(btn);
   return element;
 }

 document.body.appendChild(component());
dist/index.html:
<!DOCTYPE html>
<html>
<head>
    <title>Asset Management</title>
</head>
<body>
<script src="./bundle.js"></script>
</body>
</html>
webpack.config.js:
  const path = require('path');
  module.exports = {
   entry: './src/index.js',
    output: {
      filename: 'bundle.js',
      path: path.resolve(__dirname, 'dist')
    }
  };

运行npm run build,在浏览器打开dist下的index.html,会看到hello webpack的字样,这就是相当于手动来添加资产到index.html中的,这种方式在以后的开发中我们也不用,接下来需要进行更改, 我们将添加我们的src / print.js作为新的入口点(print),并且我们也会更改输出,以便它根据入口点名称动态生成包名称,如下:

webpack.config.js:
  const path = require('path');

  module.exports = {
   entry: { // 新怎加一个构建入口
     app: './src/index.js', 
     print: './src/print.js'
   },
    output: {
     filename: 'bundle.js',
     filename: '[name].bundle.js', // 通过name动态的生成输出文件名
      path: path.resolve(__dirname, 'dist')
    }
  };

接下来更改该dist/index.html

 <!doctype html>
  <html>
    <head>
     <title>Output Management</title>
     <script src="./print.bundle.js"></script>
    </head>
    <body>
     <script src="./app.bundle.js"></script>
    </body>
  </html>

运行npm run build,有同样的效果,这时候在dist目录下还会生成如下的结构:


22.png

其中红色的是根据名字动态生成的,粉色的是之前生成的。很明显这样是有问题的,因为当每次更换文件名的时候他都会重新生成,而且之前生成的仍旧保留,合理的话应该是再生成好后将之前没用的都清除掉,当然这是一件困难的事,但是webpack提供了相关插件供我们使用。
接下来用插件来进行构建:

  • 首先安装插件并调整配置,步骤如下:
安装插件
npm install --save-dev html-webpack-plugin

webpack.config.js:

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

  module.exports = {
    entry: {
      app: './src/index.js',
      print: './src/print.js'
    },
   plugins: [
     new HtmlWebpackPlugin({ // 该插件用来生成一个.html文件
       title: 'Output Management'
     })
   ],
    output: {
      filename: '[name].bundle.js',
      path: path.resolve(__dirname, 'dist')
    }
  };

在运行npm run build之前将dist目录删掉,运行完毕后会生成dist目录,里面有根据文件生成的文件,还会为我们生成一个index.html文件,该文件是由HtmlWebpackPlugin插件来完成的。当然HtmlWebpackPlugin是来生成html文件的,在生成的过程中并不会清除旧文件,要清除旧文件就需要用到另一个插件clean-webpack-plugin ,首先需要安装插件

npm install clean-webpack-plugin --save-dev

在webpack.config.js添加如下:

const CleanWebpackPlugin = require('clean-webpack-plugin');
在plugins选项中添加如下:
 new CleanWebpackPlugin(['dist']),

这样运行npm run bulid就会在dist目录下生成最新的打包文件,并会清除旧的无用的文件。

  • 以上了解了CleanWebpackPlugin ,HtmlWebpackPlugin两个插件的基本使用,接下来了解一些常用的插件
    (1)WebpackManifestPlugin,该插件能够在项目根目录生成一份## manifest.json的文件,通过该文件的映射关系可以让我们知道webpack是如何追踪所有模块并映射到输出bundle中的。大致的使用方法如下:
  1. 安装插件:npm install --save-dev webpack-manifest-plugin
  2. 在 webpack.config.js中引入,大致如下:
var ManifestPlugin = require('webpack-manifest-plugin');

module.exports = {
   // ...
   plugins: [
     new ManifestPlugin() // ManifestPlugin方法可以接受一些选项参数options,如 new ManifestPlugin(options)
   ]
};

3.可选参数如下:

options.fileName 表示要生成文件的名称,默认为manifest.json
options.publicPath 表示生成映射文件的路径,默认为output.publicPath,字符串类型
options.basePath 
options.writeToFileEmit
还有其他的参数见官网https://github.com/danethurber/webpack-manifest-plugin

(2)MiniCssExtractPlugin,该插件将CSS解压到单独的文件中。 它为每个包含CSS的JS文件创建一个CSS文件。 它支持按需加载CSS和SourceMaps。它建立在新的webpack v4功能(模块类型)之上,并要求webpack 4工作。大致的使用方法如下:

  1. 安装插件 npm install --save-dev mini-css-extract-plugin
  2. 在 webpack.config.js中引入,大致如下:
 const path = require('path');
 const HtmlWebpackPlugin = require('html-webpack-plugin');
 const CleanWebpackPlugin = require('clean-webpack-plugin');
 var ManifestPlugin = require('webpack-manifest-plugin');
 const MiniCssExtractPlugin = require("mini-css-extract-plugin");
 module.exports = {
   entry: {
     app: './src/index.js',
     hh: './src/hh.js',
   },
  plugins: [
       new CleanWebpackPlugin(['dist']),
       new ManifestPlugin(),
    new HtmlWebpackPlugin({ // 该插件用来生成一个.html文件
      title: 'Output Management'
    }),
    new MiniCssExtractPlugin({ // 提取css插件
     filename: "[name].css",
     chunkFilename: "[id].css"
   })
  ],
   output: {
     filename: '[name].bundle.js',
     path: path.resolve(__dirname, 'dist')
   },
  module: {
   rules: [
     {
       test: /\.css$/,
       use: [
         MiniCssExtractPlugin.loader, // 重要,有对应的这个loader才能从js中提取css
         "css-loader"
       ]
     }
   ]
 }
 };

如果src/index.js中有 这样的css,如import './style/index.css',name打包后对应的css就可以被提取到单独的css文件中,不提取的话css会被打包到js文件中。
运行npm run build 就会在输出目录提取出一个app.css。因为我的webpack配置中对应index.js的输出名为app。输入的css正好是filename: "[name].css",即app.css.

其他常用的插件见官网https://webpack.js.org/plugins/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容