首页 > 其他分享 >webpack指南(代码分离)

webpack指南(代码分离)

时间:2024-01-05 23:33:40浏览次数:32  
标签:指南 chunk bundle js webpack path 代码 加载

代码分离

常用的代码分离方法有三种:

  • 入口起点:使用 entry 配置手动地分离代码。
  • 防止重复:使用 入口依赖 或者 SplitChunksPlugin 去重和分离 chunk
  • 动态导入:通过模块的内联函数调用分离代码。

入口起点

 project
webpack-demo
|- package.json
|- package-lock.json
|- webpack.config.js
|- /dist
|- /src
  |- index.js
 |- another-module.js
|- /node_modules

another-module.js

import _ from 'lodash';

console.log(_.join(['Another', 'module', 'loaded!'], ' '));

webpack.config.js

 const path = require('path');

 module.exports = {
  mode: 'development',
  entry: {
    index: './src/index.js',
    another: './src/another-module.js',
  },
   output: {
    filename: '[name].bundle.js',
     path: path.resolve(__dirname, 'dist'),
   },
 };

这种方式存在一些隐患:

  • 如果入口 chunk 之间包含一些重复的模块,那么这些重复模块会被引入到各个 bundle 中。
  • 这种方法不够灵活,并且不能动态地拆分应用程序逻辑中的核心代码。

防止重复

入口依赖

 在配置文件中配置 dependOn 选项,以在多个 chunk 之间共享模块:

webpack.config.js

const path = require('path');

 module.exports = {
   mode: 'development',
   entry: {
    index: {
      import: './src/index.js',
      dependOn: 'shared',
    },
    another: {
      import: './src/another-module.js',
      dependOn: 'shared',
    },
    shared: 'lodash',
   },
   output: {
     filename: '[name].bundle.js',
     path: path.resolve(__dirname, 'dist'),
   },
  // 在一个html中使用多个入口起点,需要设置optimization.runtimeChumk为single
  optimization: {
    runtimeChunk: 'single',
  },
};

使用上面配置进行构建。可以看到,除了 shared.bundle.jsindex.bundle.js 和 another.bundle.js 之外,还生成了一个 runtime.bundle.js 文件。

尽管 webpack 允许每个页面使用多个入口起点,但在可能的情况下,应该避免使用多个入口起点,而使用具有多个导入的单个入口起点:entry: { page: ['./analytics', './app'] }。这样可以获得更好的优化效果,并在使用异步脚本标签时保证执行顺序一致。 注意:上面 entry: { page: ['./analytics', './app'] } 的page里的元素可以是文件路径

SplitChunksPlugin

SplitChunksPlugin 插件可以将公共的依赖模块提取到已有的入口 chunk 中,或者提取到一个新生成的 chunk。让我们使用这个插件去除之前示例中重复的 lodash 模块:

webpack.config.js

 
 const path = require('path');

  module.exports = {
    mode: 'development',
    entry: {
      index: './src/index.js',
      another: './src/another-module.js',
    },
    output: {
      filename: '[name].bundle.js',
      path: path.resolve(__dirname, 'dist'),
    },
   optimization: {
     splitChunks: {
       chunks: 'all',
     },
   },
  };

使用 optimization.splitChunks 配置选项后构建,将会发现 index.bundle.js 和 another.bundle.js 已经移除了重复的依赖模块。从插件将 lodash 分离到单独的 chunk,并且将其从 main bundle 中移除,减轻了 bundle 大小。

 

动态导入

两种方式实现动态导入:

注意:调用 import() 会在内部使用 promise。因此如果在旧版本浏览器中(如 IE 11)使用 import(),需要使用一个 polyfill 库(例如 es6-promise 或 promise-polyfill)shim Promise
提示

在稍后示例中,当需要根据计算后的变量导入特定模块时,可以通过向 import() 传入一个 动态表达式 实现。

预获取/预加载模块

 

声明 import 时使用下列内置指令可以让 webpack 输出“Resource Hint”告知浏览器:

  • 预获取(prefetch):将来某些导航下可能需要的资源
  • 预加载(preload):当前导航下可能需要资源

LoginButton.js

import(/* webpackPrefetch: true */ './path/to/LoginModal.js');

上面的代码在构建时会生成 <link rel="prefetch" href="login-modal-chunk.js"> 并追加到页面头部,指示浏览器在闲置时间预获取 login-modal-chunk.js 文件。

只要父 chunk 完成加载,webpack 就会添加预获取提示。

与预获取指令相比,预加载指令有许多不同之处:

  • 预加载 chunk 会在父 chunk 加载时以并行方式开始加载;而预获取 chunk 会在父 chunk 加载结束后开始加载。
  • 预加载 chunk 具有中等优先级,并会立即下载;而预获取 chunk 则在浏览器闲置时下载。
  • 预加载 chunk 会在父 chunk 中立即请求,用于当下时刻;而预获取 chunk 则用于未来的某个时刻。
  • 浏览器支持程度不同。
    import(/* webpackPreload: true */ 'ChartingLibrary');

不正确地使用 webpackPreload 会有损性能,请谨慎使用。

分析 bundle

分析bundle,官方分析工具 是一个不错的开始。

还有其他的工具:

  • webpack-chart:webpack stats 可交互饼图。
  • webpack-visualizer:分析并可视化 bundle,检查哪些模块占用空间,哪些可能是重复使用的。
  • webpack-bundle-analyzer:一个 plugin 和 CLI 工具,它将 bundle 内容展示为一个便捷的、交互式、可缩放的树状图形式。
  • webpack bundle optimize helper:这个工具会分析 bundle,并提供可操作的改进措施,以减少 bundle 的大小。
  • bundle-stats:生成一个 bundle 报告(bundle 大小、资源、模块),并比较不同构建之间的结果。

延伸阅读

     

标签:指南,chunk,bundle,js,webpack,path,代码,加载
From: https://www.cnblogs.com/withheart/p/17948310

相关文章

  • AWS SNS 实战指南
    AmazonSimpleNotificationService(SNS)是一个完全托管的发布/订阅消息系统,它使你能够分发消息给大量订阅者,或者将消息发送到其他AmazonWebServices(AWS)服务。在这篇文章中,我们通过一个实战示例展示如何使用AWSSNS。创建SNS主题首先,我们需要创建一个SNS主题,用于发......
  • Three.js——十二、MeshPhysicalMaterial清漆层、粗糙度、物理材质透光率以及折射率(结
    环境贴图作用测试MeshPhysicalMaterial清漆层MeshPhysicalMaterial和MeshStandarMaterial都是拥有金属度metalness、粗糙度roughness属性的PBR材质,MeshPhysicalMaterial是MeshStandarMaterial的子集,除了继承了他的这些属性以外,还新增了清漆、透光率、反射率、光泽、折射率等等清漆......
  • C 语言指针完全指南:创建、解除引用、指针与数组关系解析
    C语言中的指针创建指针我们可以使用引用运算符&获取变量的内存地址:intmyAge=43;//一个int变量printf("%d",myAge);//输出myAge的值(43)printf("%p",&myAge);//输出myAge的内存地址(0x7ffe5367e044)指针是一个将另一个变量的内存地址作为其值的变量。......
  • C 语言指针完全指南:创建、解除引用、指针与数组关系解析
    C语言中的指针创建指针我们可以使用引用运算符&获取变量的内存地址:intmyAge=43;//一个int变量printf("%d",myAge);//输出myAge的值(43)printf("%p",&myAge);//输出myAge的内存地址(0x7ffe5367e044)指针是一个将另一个变量的内存地址作为其值的变量......
  • 代码随想录算法训练营第二十四天 | 回溯算法理论基础,77. 组合
    一、回溯算法理论基础学习:1.基本概念回溯法是一种搜索方式回溯的本质是穷举,是递归的副产品,即回溯算法就是递归算法回溯解决的问题都能理解成树形结构,一般是在集合中递归查找子集。集合的大小构成树的宽度(n叉树),递归的深度构成了树的深度2.回溯解决的问题(1)组合问题:N个......
  • 【深度学习】从0到完整项目第1篇:深度学习第一个案例(代码文档已分享)
    本系列文章md笔记(已分享)主要讨论深度学习相关知识。可以让大家熟练掌握机器学习基础,如分类、回归(含代码),熟练掌握numpy,pandas,sklearn等框架使用。在算法上,掌握神经网络的数学原理,手动实现简单的神经网络结构,在应用上熟练掌握TensorFlow框架使用,掌握神经网络图像相关案例。具体包......
  • Rust权威指南阅读笔记(一)Rust简介与安装
    参考:Windows10配置Rust开发环境|jonssonyan'Websitewin10安装Rust+VSCode配置Rust环境-鱼又悲-博客园(cnblogs.com)1.1Rust简介1.2安装Rusthttps://www.rust-lang.org/zh-CN/tools/install下载RUSTUP-INIT.EXE并运行如遇到:componentdownloadfailedforcli......
  • 特征量化编码入门指南
    推荐论文: https://arxiv.org/abs/2211.13745论文摘要:本文研究了设备边缘协同推理系统中CNN推理的计算卸载。受新兴语义通信范式的启发,我们提出了一种新颖的基于自动编码器的CNN架构(AECNN),用于在终端设备上进行有效的特征提取。我们基于CNN中的通道注意方法设计了一个特征压缩......
  • 苹果的推信群发软件开发必备功能源代码!
    在当今的数字营销领域,苹果的推信(iOSPushNotification)群发软件已成为企业与客户之间实现高效沟通的重要工具。为了满足不同企业的需求,开发一款功能齐全、用户体验良好的苹果的推信群发软件至关重要,本文将深入探讨苹果的推信群发软件开发必备功能的源代码,帮助开发者更好地进行软......
  • 代码随想录 day10 栈模拟队列 队列模拟栈
    栈模拟队列大概了解一下思路自己就可以很快写出来了我们需要第二个辅助栈帮助我们把stackIn的顺序颠倒,这样FILO的栈颠倒后pop的顺序就和FIFO的队列顺序一致了大概就是这张图队列模拟栈题目要求使用两个队列模拟栈其实可以只需要一个队列就可以模拟栈的出栈顺序是最后......