webpack优化之代码分割与公共代码提取详解

yizhihongxing

下面我将详细讲解“webpack优化之代码分割与公共代码提取详解”的完整攻略。

什么是代码分割

代码分割可以让我们把代码分割成更小的块,然后按需加载。这样做的好处是:

  • 减少首次加载时间,加速页面呈现。
  • 减少代码的重复加载,减少总代码量,提升性能。
  • 优化代码加载策略,按需加载不常用的模块,减少负担。

如何进行代码分割

Webpack提供了多种代码分割的方法:

方法一:使用entry配置(推荐)

entry: {
  index: './src/index.js',
  about: './src/about.js'
}

直接在entry配置属性中定义多个入口,Webpack会自动为每个入口文件生成一个相应的chunk。

方法二:使用require.ensure方法

require.ensure方法可以将代码分割成多个chunk,提供了更加灵活的语法糖。

require.ensure([], function(require){
  var about = require('./about.js');
  about();
}, 'about');

require.ensure方法支持三个参数,第一个参数是依赖的模块数组,这里可以写入要依赖的模块;第二个参数是回调函数,用于加载完成后的回调;第三个参数是chunk的名称,可以为空,如果不为空,则生成的chunk会以这个名称命名。

公共代码提取

上面的方法虽然可以将代码分割成多个chunk,但是如果多个入口文件之间有公共的模块,就会存在重复加载的问题。这时候,我们可以使用公共代码提取,将公共代码提取出来,单独打包成一个chunk,实现代码复用,减少加载。

Webpack提供了CommonsChunkPlugin插件,可以将公共代码提取出来。

plugins: [
  new webpack.optimize.CommonsChunkPlugin({
    name: 'common'
  })
]

上面的代码定义了一个名为common的chunk,将所有入口文件中的公共代码提取出来打包成一个单独的chunk。

除此之外,CommonsChunkPlugin还有其它可配置项,例如:

  • filename:生成的chunk的名称。
  • minChunks:模块被引用的最小次数,默认为2。
  • chunks:插件处理的chunk的范围,默认处理所有的chunk。

示例说明

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

module.exports = {
  entry: {
    index: './src/index.js',
    about: './src/about.js'
  },
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].[chunkhash:8].js'
  },
  plugins: [
    new webpack.optimize.CommonsChunkPlugin({
      name: 'common',
      minChunks: 2
    })
  ]
};

上面的Webpack配置文件定义了两个入口文件,分别对应了index.jsabout.js,Webpack会自动将它们分别打包成两个chunk,名称分别为indexabout。另外还定义了一个名为common的chunk,用于提取公共代码,当模块被引用的次数>=2时,才会被提取到common chunk中。

<!-- index.html -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Webpack Code Splitting Demo</title>
  </head>
  <body>
    <button id="index-btn">Index</button>
    <button id="about-btn">About</button>
    <script src="common.eaefa36c.js"></script>
    <script src="index.06c5e979.js"></script>
    <script src="about.88d33d8f.js"></script>
  </body>
</html>

上面的HTML代码是输出的页面,可以看到在body标签下引用了三个JS文件,分别对应index chunk、about chunk、common chunk。

// index.js
import './common.css';

console.log('index');

const indexBtn = document.querySelector('#index-btn');
indexBtn.addEventListener('click', function(){
  // 动态加载about模块
  import(/* webpackChunkName: "about" */ './about.js').then(function(about){
    about();
  });
});

上面的JS代码是index入口文件,其中引用了一个公共的CSS文件common.css,然后为index-btn按钮绑定了一个click事件,动态加载about模块。

// about.js
import './common.css';

console.log('about');

export default function(){
  alert('about');
}

上面的JS代码是about模块,同样引用了公共的CSS文件common.css,然后导出了一个默认函数。

在例子中,当用户点击index-btn按钮时,动态加载了about模块。如果没有进行代码分割,用户第一次访问页面时,会同时下载index.jsabout.js,增加了页面加载时间和带宽消耗。但是分割后,当用户第一次访问页面时,只会下载index.jscommon.js,避免了重复下载about.js模块。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:webpack优化之代码分割与公共代码提取详解 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • jQuery+jsp下拉框联动获取本地数据的方法(附源码)

    首先需要明确一下,jQuery是一个简洁易用的JavaScript库,而JSP(JavaServer Pages)是Java EE Web 应用程序的一种服务器端技术。本文要讲述的是如何在JSP中使用jQuery实现下拉框联动,并获取本地数据。 1. 首先引入jQuery库 在JSP页面中,我们需要在<head>标签中引入jQuery库,代码如下…

    jquery 2023年5月19日
    00
  • jQWidgets jqxBarcode labelMarginTop属性

    jQWidgets jqxBarcode labelMarginTop属性 jQWidgets是一个基于jQuery的UI组件库,提供了丰富的UI件和工具,包括表格、图表、表单、历、菜等。其中,jqxBarcode是jQWidgets中的一个件,可以用于生成各种类型的条码。jqxBarcode提供了labelMarginTop属性,用于设置条形码标签与条形码…

    jquery 2023年5月9日
    00
  • jQuery Mobile 页面 setContainerBackground()方法

    下面是关于”jQuery Mobile 页面 setContainerBackground()方法”的详细讲解: 一、什么是setContainerBackground()方法? setContainerBackground()方法是jQuery Mobile页面的一个方法,用于设置容器的背景颜色。这个函数可以在网页中动态地修改容器的样式,从而实现动态的样式…

    jquery 2023年5月12日
    00
  • jQWidgets jqxTreeGrid goToPrevPage()方法

    以下是关于 jQWidgets jqxTreeGrid 组件中 goToPrevPage() 方法的详细攻略。 jQWidgets jqxTreeGrid goToPrevPage() 方法 jQWidgets jqxTreeGrid 的 goToPrevPage() 方法用于将 TreeGrid 控件的当前页设置为上一页。您可以使用此方法实现分页功能。 语…

    jquery 2023年5月12日
    00
  • 利用jQuery实现可以编辑的表格

    实现可以编辑的表格是一个常见的Web开发需求,在jQuery中可以方便地实现这个功能。下面是一篇详细讲解如何利用jQuery实现可以编辑的表格的完整攻略。 步骤一:表格基本结构 首先需要构造一个基本的表格结构,包含表头和表格主体。 <table id="editable-table"> <thead> <tr…

    jquery 2023年5月28日
    00
  • jQWidgets jqxSlider宽度属性

    下面是有关jQWidgets jqxSlider宽度属性的详细攻略: 1. jqxSlider宽度属性介绍 jqxSlider是jQWidgets提供的一种用于显示和编辑数值范围的控件,它可以用来选择数字、价格或其他类型的数值。宽度属性是jqxSlider控件中的一个重要属性,可以通过该属性来设置jqxSlider控件的宽度,以便更好地适应UI界面。 宽度属…

    jquery 2023年5月12日
    00
  • jQuery Mobile页面initSelector选项

    jQuery Mobile是一款流行的基于jQuery库的移动端Web开发框架,使用它可以简单快捷地开发移动端Web页面。在jQuery Mobile中,页面initSelector选项是页面初始化的一部分,通过使用它,可以为jQuery Mobile提供合适的区域来初始化并增加性能。在本文中,我们将详细介绍jQuery Mobile页面initSelect…

    jquery 2023年5月12日
    00
  • jQuery初学:find()方法及children方法的区别分析

    jQuery初学:find()方法及children方法的区别分析 jQuery 是一种广泛使用的 JavaScript 库,它可以使操作 HTML 文档变得更加容易。而 jQuery 中的选择器和查找方法更是让开发变得更简单。本篇文章主要讲解 jQuery 中 find() 和 children() 方法的区别和使用示例。 find() 方法 find()…

    jquery 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部