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

下面我将详细讲解“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实现table单双行不同显示并能单行选中

    实现table单双行不同显示并能单行选中,可以结合使用CSS和jQuery来完成。 首先,为table中奇偶行分别添加不同的class名称。可以使用以下CSS代码: tr:nth-child(odd) { background-color: #f2f2f2; } tr:nth-child(even) { background-color: #ffffff; …

    jquery 2023年5月27日
    00
  • jQWidgets jqxExpander collapse()方法

    jQWidgets jqxExpander collapse()方法 jQWidgets是一个基于jQuery的UI组件库,提供了丰富的UI组件和工具包括表格、下拉等。jqxExpander是jQWidgets的组件之一,用于创建可折叠的面板。collapse()方法是jqxExpander的一个方法,用于折叠面板。 collapse()方法的基本语法 co…

    jquery 2023年5月9日
    00
  • JQuery显示、隐藏div的几种方法简明总结

    JQuery是一个广泛应用的Javascript库,可用来简化Javascript编程。JQuery可以轻松使用一系列查找DOM元素、添加动画效果等功能。下面我们将为大家简明总结几种基本的方法,以在网页中动态显示和隐藏div元素。 方法1:使用JQuery的show()和hide()函数 show()和hide()函数是JQuery中最简单的显示和隐藏元素的…

    jquery 2023年5月28日
    00
  • jQuery UI Checkboxradio enable()方法

    jQuery UI 的 Checkboxradio 组件提供了一个 enable() 方法,该方法用于启用或禁用 Checkboxradio。在本教程中,我们将详细介绍 Checkboxradio enable() 方法的使用方法。 enable() 方法基本语法如下: $( ".selector" ).checkboxradio( &q…

    jquery 2023年5月11日
    00
  • jQWidgets jqxTooltip opacity 属性

    以下是关于 jQWidgets jqxTooltip 组件中 opacity 属性的详细攻略。 jQWidgets jqxTooltip opacity 属性 jQWidgets jqxTooltip 组件的 opacity 属性用于设置提示框的透明度。可以使用该属性控制提示框的透明度。 语法 $(‘#tooltip’).jqxTooltip({ opaci…

    jquery 2023年5月11日
    00
  • JQuery isWindow()方法

    jQuery.isWindow()方法用于检查一个对象是否为窗口对象。本文将详细介绍isWindow()方法的语法和用法,并提供两个示例说明。 语法 以下是isWindow()方法的基本语法: jQuery.isWindow(obj) 在这个语法中,obj是要检查的对象。isWindow()方法将返回一个布尔值,指示该对象是否为窗口对象。 示例1:检查窗口对…

    jquery 2023年5月9日
    00
  • jQWidgets jqxToolBar destroy()方法

    以下是关于 jQWidgets jqxToolBar 组件中 destroy() 方法的详细攻略。 jQWidgets jqxToolBar destroy() 方法 jQWidgets jqxToolBar 组件 destroy() 方法用于销毁工具栏件及其相关资源。该方法不接受任何参数。 语法 $(‘#toolbar’).jqxToolBar(‘dest…

    jquery 2023年5月11日
    00
  • jQuery利用FormData上传文件实现批量上传

    下面详细讲解“jQuery利用FormData上传文件实现批量上传”的完整攻略: 1. 使用FormData上传文件 1.1 创建表单 在HTML文件中,创建一个表单用来选取文件并上传,例如: <form id="myForm" method="post" enctype="multipart/form…

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