首页 > 其他分享 >【前端必会】HtmlWebpackPlugin 和 SplitChunksPlugin 是什么?

【前端必会】HtmlWebpackPlugin 和 SplitChunksPlugin 是什么?

时间:2022-09-25 23:35:04浏览次数:88  
标签:__ lodash SplitChunksPlugin require __. webpack HtmlWebpackPlugin 必会 var

背景

了解什么是webpack插件,在来看一下不能不知道的两个插件

  1. HtmlWebpackPlugin 有了这个插件,webpack执行后会自动帮我们在dist目录生成一个html文件,并且添加bundle.js的引用。
    https://webpack.docschina.org/plugins/html-webpack-plugin
  2. SplitChunksPlugin 这个插件可以协助我们在生成的bundle上进行更为精确的配置,比如node_modules下的模块单独打包到一个文件(方便缓存)等

开始

写2个按钮,点击分别加载页面1,页面2

//index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Webpack App</title>
    <meta name="viewport" content="width=device-width,initial-scale=1" />
  </head>
  <body>
    <h1>Hello webpack splitchunks</h1>
    <button id="btn1">页面1</button>
    <button id="btn2">页面2</button>
  </body>
</html>

//入口脚本
window.addEventListener("load", function () {
  var btn1 = document.getElementById("btn1");
  btn1.addEventListener("click", function () {
    import("./p1");
  });

  var btn2 = document.getElementById("btn2");
  btn2.addEventListener("click", function () {
    import("./p2");
  });
});

两个页面

//页面1
import { max } from "lodash";
console.log("p1 lodash", max);
//页面2
import { max } from "lodash";
console.log("p2 lodash", max);
//webpack 配置
const webpack = require("webpack");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const path = require("path");
const config = {
  context: path.resolve(__dirname),
  mode: "production",
  optimization: {
    minimize: false,
  },
  entry: "./main.js",
  target: ["web", "es5"],
  output: {
    clean: true,
    filename: "bundle.js",
    path: path.resolve(__dirname, "dist"),
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: "index.html",
    }),
  ],
};

const compiler = webpack(config);
compiler.run((err, stats) => {
  console.log(err);
});

生成后的目录

//bundle.js 关键代码
var __webpack_exports__ = {};
console.log("hello");
window.addEventListener("load", function () {
  var btn1 = document.getElementById("btn1");
  btn1.addEventListener("click", function () {
    Promise.all(/* import() */[__webpack_require__.e(891), __webpack_require__.e(751)]).then(__webpack_require__.bind(__webpack_require__, 751));
  });

  var btn2 = document.getElementById("btn2");
  btn2.addEventListener("click", function () {
    Promise.all(/* import() */[__webpack_require__.e(891), __webpack_require__.e(291)]).then(__webpack_require__.bind(__webpack_require__, 291));
  });
});
//751.bundle.js 关键代码
"use strict";
(self["webpackChunk"] = self["webpackChunk"] || []).push([[751],{

/***/ 751:
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {

__webpack_require__.r(__webpack_exports__);
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(891);
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_0__);

console.log("p1 lodash", lodash__WEBPACK_IMPORTED_MODULE_0__.max);

/***/ })

}]);
//291.bundle.js 关键代码
"use strict";
(self["webpackChunk"] = self["webpackChunk"] || []).push([[291],{

/***/ 291:
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {

__webpack_require__.r(__webpack_exports__);
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(891);
/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_0__);

console.log("p2 lodash", lodash__WEBPACK_IMPORTED_MODULE_0__.max);

/***/ })

}]);
//891.bundle.js 关键代码(lodash模块代码)
(self["webpackChunk"] = self["webpackChunk"] || []).push([[891],{

/***/ 891:
/***/ (function(module, exports, __webpack_require__) {

/* module decorator */ module = __webpack_require__.nmd(module);
var __WEBPACK_AMD_DEFINE_RESULT__;/**
 * @license
 * Lodash <https://lodash.com/>
 * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
 * Released under MIT license <https://lodash.com/license>
 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
 */
;(function() {

  /** Used as a safe reference for `undefined` in pre-ES5 environments. */
  var undefined;

  /** Used as the semantic version number. */
  var VERSION = '4.17.21';

  /** Used as the size to enable large array optimizations. */
  var LARGE_ARRAY_SIZE = 200;
......

总结

  1. 使用了异步加载模块,自动生成2个bundle(751、251)。异步模块好像一定是会拆分为一个新的文件(不确定)
  2. 2个模块都引用了lodash,所以lodash又单独拆出一个bundle(891)
  3. 进入页面加载
  4. 点击按钮1
  5. 点击按钮2
  6. 多看文档、多看文档、多看文档
    https://webpack.docschina.org/plugins/split-chunks-plugin/

标签:__,lodash,SplitChunksPlugin,require,__.,webpack,HtmlWebpackPlugin,必会,var
From: https://www.cnblogs.com/lee35/p/16729376.html

相关文章

  • 【前端必会】webpack 插件,前进路绕不过的障碍
    背景webpack的使用中我们会遇到各种各样的插件、loader。webpack的功力主要体现在能理解各个插件、loader的数量上。理解的越多功力越深开始https://webpack.docschi......
  • SQL必知必会
    检索数据SELECTprod_nameFROMProducts;#检索多列数据SELECTprod_id,prod_name,prod_priceFROMProducts;#检索所有列SELECT*FROMProducts;#DISTINCT关键字,返......
  • 【前端必会】webpack的目标代码
    背景webpack生成什么样的代码呢?同的模块依赖的写法(import、exportexportdefault),会导致生成代码的不同,下面介绍普通的import与export开始导出PI1,max//index.jsletPI......
  • htmlWebpackPlugin config
    namedescribetypedefaultfaviconhtml图标string''title创建的html的titlestring'WebpackApp'metameta标签{object}{}base配置base标签obj......
  • 【前端必会】单页应用-你的新朋友wepack
    背景我们开发的功能可能是简单的,但是实现功能的代码行数却可能成千上万出于易于维护、安全、服用,我们会根据我们的经验设计我们的代码,拆解成多个独立的功能模块(代码片段......
  • 消息队列MQ核心原理全面总结(11大必会原理)
    消息队列已经逐渐成为分布式应用场景、内部通信、以及秒杀等高并发业务场景的核心手段,它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能。无论是Rabbi......
  • 【前端必会】让ESLint与Prettier一起玩耍
    背景上回说到ESlint和Prettier可能会有规则上的冲突,解决的办法有多种,好比不用Prettier不用Prettier也是一种选择配置相同的规则我们选择一种可以共存的方式可以参考......
  • 【前端必会】Prettier,有了ESlint,还要Prettier
    介绍已经安装了ESLint为什么还要Prettier,主要是让ESLint专注于语法相关的验证,检查潜在问题。而代码格式化则有Prettier来接管对比参考:https://blog.csdn.net/aaqingying/......
  • 【前端必会】eslint搞起
    介绍eslint进行代码审查,统一代码风格,预防潜在BUG官网https://eslint.bootcss.com/docs/user-guide/getting-started安装init时提示无法执行脚本参考https://www.cn......
  • 阿里前端一面必会面试题(附答案)
    浏览器的主要组成部分⽤户界⾯包括地址栏、前进/后退按钮、书签菜单等。除了浏览器主窗⼝显示的您请求的⻚⾯外,其他显示的各个部分都属于⽤户界⾯。浏览器引擎在⽤户......