大厂面试--webpack新特性详解_webpack5特性-程序员宅基地

技术标签: 前端入门到进阶  面试  面试指南针  webpack  职场和发展  

webpack5主要新特性介绍

  • 资源模块;
  • moduleIds & chunkIds 的优化;
  • 移除Node.js的polyfill;
  • 更强大的tree-shaking;
  • 持久化缓存提高性能;
  • Module Federation 模块联邦;

一、资源模块

  • 资源模块是一种模块类型,它允许使用资源文件(字体,图标等)而无需配置额外的loader
  • raw-loader => asset/source 导出资源的源代码;
  • file-loader => asset/resource 发送一个单独的文件并导出URL;
  • url-loader => asset/inline 导出一个资源的data URL;
  • asset 在导出一个 data URI 和发送一个单独的文件之间自动选择。之前通过使用 url-loader,并且配置资源体积限制实现。
  • 具体代码实现:
module.exports = {
    
	...
	module:{
    
        rules:[
            {
    
                test:/\.js$/,
                exclude:/node_modules/,//不打包 不编译node_modules下面的文件
                use:[
                    {
    
                        loader:'babel-loader',
                        options:{
    
                            presets:[
                                '@babel/preset-env',
                                '@babel/preset-react'
                            ]
                        }  
                    }
                ]
            },
            {
    
                test:/\.png$/,
                type:'asset/resource'//对标file-loader
            },
            {
    
                test:/\.ico$/,
                type:'asset/inline'//对标url-loader 模块的大小<limit base64字符串
            },
            {
    
                test:/\.txt$/,
                type:'asset/source'//对标raw-loader
            },
            {
    
                test:/\.jpg$/,
                type:'asset',//对标raw-loader
                parser:{
    
                    dataUrlCondition:{
    
                        maxSize:4*1024
                    }
                }
            },
            {
    
                test:/\.css$/,
                 use:['style-loader','css-loader']
            },
        ]
    }
}

二、moduleIds & chunkIds 的优化

概念和选项
  • module: 每一个文件其实都可以看成一个module;
  • chunk: webpack打包最终生成的代码块,代码块会生成文件,一个文件对应一个chunk
  • 在webpack5之前,没有从entry打包的chunk文件,都会以1、2、3…的文件命名方式输出、删除某些文件,从而可能导致缓存失效
  • 再生产模式下,默认启用这些功能chunkIds: "deterministic", moduleIds: "deterministic", 此算法采用 稳定性 的方式将短数字ID(3或4个字符)的hash值分配给modules 和 chunks;
  • chunkId设置为deterministic,则output中的chunkFilename里的[name]会被替换成确定性短数字ID;
  • 虽然chunkId不变(不管值是 deterministic | natural | names),但更改chunk内容,chunkhash还是会改变的。
可选值 含义 示例
natural 按使用顺序的数字ID 1
named 方便调式的高可读性id src_page_home.js
deterministic 根据模块名称生成剪短的hash值 915(注意最高只能生成999个序列,所以建议文件不要超过999个)
size 根据模块大小生成的数字id 1024

三、移除Node.js的polyfill

  • Webpack4 带来了许多Node.js核心模块 polyfill, 一旦模块中使用了任何核心模块(如crypto),这些模块就会被自动启用
  • Webpack5 不在自动引入这些polyfill
3.1 安装
npm i crypto-js crypto-browserify stream-browserify buffer -D
3.2 使用: src/index.js
import CryptoJS from 'crypto-js';
console.log(CryptoJS.MD5('gongjin').toString());	
3.3 webpack.config.js
module.exports = {
    
    ...
    resolve:{
    
        /* fallback:{
            'crypto':require.resolve('crypto-browserify'),
            'stream':require.resolve('stream-browserify'),
            'buffer':require.resolve('buffer')
        }, */
        fallback:{
    
            'crypto':false,
            'stream':false,
            'buffer':false
        }
    }
}
3.4 在webpack5中还是要使用polyfill(例如:crypto)该怎么使用呢?
3.4.1 安装
npm i crypto-js crypto-browserify -D
3.4.2 使用
// index.js 使用文件中
import CryptoJS from 'crypto';

console.log(CryptoJS);	
console.log(CryptoJS.MD5('gongjin').toString());

// pachage.json 文件中添加
"browser": {
    
  "crypto": "crypto-js" // crypto-js为前端使用的crypto插件,需要npm i crypto-js
},

// webpack.config.js  文件中添加配置
module.exports = {
    
    ...
    resolve:{
    
        fallback:{
    
            'crypto':require.resolve('crypto-browserify'), // 需要使用crypto就加上这个
            'stream':require.resolve('stream-browserify'), // 需要使用stream就加上这个
            'buffer':require.resolve('buffer') // 需要使用buffer就加上这个
        }
    }
  ...
}

四、更强大的tree-shaking

  • tree-shaking就在打包的时候剔除没有用到的代码

  • Webpack4 本身的tree shaking比较简单,主要是找一个 import 进来的变量是否在这个模块内出现过;

  • webpack5可以进行根据作用域之间的关系来进行优化;

  • webpack-deep-scope-plugin

  • 代码实现:

    // inner.js
    import {
           test1 } from './module1.js';
    test1();
    
    // module1.js
    import {
           test3 } from './module2';
    export function test1(){
          
        console.log('test1');
    }
    export function test2(){
          
        console.log('test2' + test3);
    }
    
    //  module2.js
    export function test3(){
          
        console.log('test3');
    }
    export function test4(){
          
        console.log('test4');
    }
    
    // webpack.config.js  文件中添加配置
    module.exports = {
          
        ...
    	  mode: 'production',
        optimization:{
          
            usedExports: true, // 标记出未被导出的变量, 使用到的文件才导出
        }
      	...
    }
    
    
  • sideEffects(了解即可)

    • 函数副作用只当调用函数时,除了返回函数值之外,还产生了附加的影响,例如修改全局变量;

    • 严格的函数式语言要求函数必须无副作用;

      // webpack.config.js  文件中添加配置
      module.exports = {
              
          ...
      	  mode: 'production',
          optimization:{
              
              sideEffects: true, // true: 开启副作用,就会使没有用到的地方打包进去, 默认false不会打包
          }
        	...
      }
      
      // package.json
      "sideEffects": false, // 此处的false会覆盖optimization.sideEffects中的true
      

五、持久化缓存提高性能

  • 第一次构建是一次全量构建,它会利用磁盘模块缓存(以空间换时间),使得后续的构建从中获利。

  • 后续构建具体流程是:读取磁盘缓存 -> 校验模块 -> 解封模块内容

  • 第一次打包时间

    webpack 5.11.0 compiled successfully in 4657 ms
    
  • 第二次打包时间

    webpack 5.11.0 compiled successfully in 364 ms
    
  • 总结:

    • 对比webpack4.x打包速度上提升了许多;
  • 配置:

    // webpack.config.js
    module.exports = {
           
      cache: {
          
        // 将缓存类型设置为文件系统
        type: 'filesystem', // 默认是memory
        // 默认路径是 node_modules/.cache/webpack
        // 可以自定义文件目录:.cache_webpack5
        cacheDirectory: path.resolve(__dirname, '.cache_webpack5')
      }
    
    

六、模块联邦

6.1 什么是模块联邦?
  • Module Federation是为了解决独立应用之间代码共享问题。可以在项目内动态加载其他项目的代码,同步可以共享依赖。
  • 通过细化功能模块、组件复用、共享第三方库、runtime dependencies线上加载npm包等,可以更好的服务于多页应用、微前端等开发模式。

以前我们常用的npm包来进行一个公共组件的引用(即UMD

6.2 动机
  • Module Federation的动机是为了不同开发小组间共同开发一个或者多个引用;
  • 应用将被划分为更小的应用块,一个应用块,可以是比如头部导航或者侧边栏的前端组件,也可以是数据获取逻辑的逻辑组件
  • 每个应用块由不同的小组开发;
  • 应用或者应用块共享;
6.3 Module Federation
  • 使用Module Federation时,每个应用块都是一个独立的构建,这些构建都将编译为容器;

  • 容器可以被其他应用或者其他容器应用;

  • 一个被引用的容器被称为 Application A / Application B ,引用者被称为 Application B / Application A, Application A / Application B 暴露模块给 Application B / Application A, Application A / Application B则可以使用这些暴露的模块,这些模块也可以被称为 remote 模块;

    • 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
  • 从而实现微前端的效果;

    • 微前端也是一种模块共享的方式,主要解决多项目并存问题,多项目并存的最大问题就是模块共享,不能有冲突。
  • 具体代码实现:

    // Application A 亦可以叫远程模块
    
    // webpack.config.js
    module.exports = {
          
      ...
      plugins: [
            ...
            new ModuleFederationPlugin({
          
                name:'remoteVar',// remote向外暴露的全局变量名, 唯一
                filename:'remoteEntry.js',//构建出来的文件名
              	// 表示导出的模块,只有在此申明的模块才可以作为远程依赖被使用
                exposes:{
          
                    './NewsList':'./src/NewsList'
                },
                remotes:{
          
                    host:'hostVar@http://localhost:8081/remoteEntry.js'
                },
              	// 可以让远程加载的模块对应依赖改为使用本地项目的 React 或 ReactDOM 版本,从而统一版本;
                shared:['react','react-dom']    
            })
        ]
    };
    
    // Application B 亦可以叫本地模块
    
    // webpack.config.js
    module.exports = {
          
      ...
      plugins: [
            ...
            new ModuleFederationPlugin({
          
                name:'hostVar', // remote向外暴露的全局变量名, 唯一
                filename:'remoteEntry.js',
                remotes:{
          
                    remote:'remoteVar@http://localhost:8080/remoteEntry.js'
                },
                exposes:{
          
                    './Slides':'./src/Slides'
                },
                shared:['react','react-dom']    
            })
        ]
    };
    

七、其它

  • 支持崭新的web平台功能

  • 支持通过import.meta访问当前文件路径

    new URL("./image.png", import.meta.url)
    

webpack4.x upgrade webpack5.0(准备中…)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_34738754/article/details/136856591

智能推荐

Raft协议-程序员宅基地

文章浏览阅读221次。Raft协议_raft协议

程序员编程艺术:第三章、寻找最小的k个数_e:t∵n“?。‘:1;。::1f-程序员宅基地

文章浏览阅读10w+次,点赞25次,收藏277次。程序员编程艺术:第三章、寻找最小的k个数作者:July。时间:二零一一年四月二十八日。致谢:litaoye, strugglever,yansha,luuillu,Sorehead,及狂想曲创作组。微博:http://weibo.com/julyweibo。出处:http://blog.csdn.net/v_JULY_v。----------------------------------前奏_e:t∵n“?。‘:1;。::1f

自己动手写个聊天机器人吧_聊天机器人 开源-程序员宅基地

文章浏览阅读161次。自己动手写个聊天机器人吧_聊天机器人 开源

PostgreSQL数据库管理 第二章体系结构_tablespace location should not be inside the data -程序员宅基地

文章浏览阅读1.6k次。PostgreSQL数据库管理第二章体系结构概述PostgreSQL是一个功能非常强大的、源代码开放的客户/服务器关系型数据库管理系统(RDBMS)。支持丰富的数据类型(如JSON和JSONB类型,数组类型)和自定义类型。PostgreSQL内存页面的默认大小是8kB。PostgreSQL有以下主要特性:1良好支持SQL语言,支持ACID、关联完整性、数据库事务、Unicode多国语言。2高并发设计,读和写互不阻塞3 支持大量类型的数据库模型:关系型,文档型(如JSON和J._tablespace location should not be inside the data directory

实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定, 输入9,输出9*9口诀表,输入12,输出12*12的乘法口诀表。_pta要求实现一个函数,打印乘法口诀表,输入正整数n(9>=n>=1),输出n行口诀表,每个等-程序员宅基地

文章浏览阅读184次。#define _CRT_SECURE_NO_WARNINGS#include&lt;stdio.h&gt;#include&lt;stdlib.h&gt;void mul(int x){ int i = 0; int j = 0; for (i = 1; i &lt;= x; i++){ for (j = 1; j &lt;= i; j++){ printf(" %d*..._pta要求实现一个函数,打印乘法口诀表,输入正整数n(9>=n>=1),输出n行口诀表,每个等

运用 ADB 卸载内置应用_adb pm uninstall-程序员宅基地

文章浏览阅读2w次,点赞6次,收藏32次。ADB 简单使用一,打开 adb窗口方式1,通过cmd命令 进入到命令窗口,输入路径定位到adb.exe 目录2,直接找到adb.exe 所在文件夹,Shift+ 鼠标右键 点击powerShell,直接打开。个人更新后第二种方式,各人习惯,自由选择二,基本操作1,查看adb设备连接数adb devices2,安装apkadb install 包名3,卸载apkadb uninstall 包名是不是所有的应用都可以这样操作呢?答案肯定是否定的,对于预置的系统._adb pm uninstall

随便推点

【Unity Shaders】Reflecting Your World —— 在Unity3D中创建一个简单的动态Cubemap系统...-程序员宅基地

文章浏览阅读225次。本系列主要参考《Unity Shaders and Effects Cookbook》一书(感谢原书作者),同时会加上一点个人理解或拓展。这里是本书所有的插图。这里是本书所需的代码和资源(当然你也可以从官网下载)。========================================== 分割线============================..._unity 怎么动态换cubemap

数据库----数据更新_当修改reader表元组的rno时,级联修改loan表中该读者的借阅记录。 (2)当删除reader-程序员宅基地

文章浏览阅读1.3k次,点赞2次,收藏8次。实验目的熟悉并掌握创建表,插入记录,查询记录,删除记录,修改记录。创建索引,删除索引。创建视图,使用视图,删除视图。实验内容仍然基于上次课程建立的小型图书借阅系统。如果使用实验室的机器完成实验,首先重做上次课的步骤1-4建立相应数据库。实验步骤(以用户CC的身份建立连接,并在此连接下执行后面的操作。)1、 查询记录:在Reader表中查询直接上司是“李四”的员工的名字SELECT rname from reader where rboss=’李四’;2、 修改记录:在Reader_当修改reader表元组的rno时,级联修改loan表中该读者的借阅记录。 (2)当删除reader

java毕业设计校园闲置物品交易平台mybatis+源码+调试部署+系统+数据库+lw-程序员宅基地

文章浏览阅读515次。java毕业设计校园闲置物品交易平台mybatis+源码+调试部署+系统+数据库+lw。springboot基于SSM框架的项目实训管理系统设计与实现。springboot基于JSP的企业办公管理系统设计与实现。ssm+sqlserver海城同泽中学图书仓库管理系统。ssm基于Web的医学院校大学生就业信息管理系统。ssm+sqlserver精品旅游项目管理系统。ssm基于HTML的寿光农产品的资源展示平台。ssm基于Java的摄影网上预约管理系统。ssm基于JavaWeb的好好吃查询系统。

转载 17.C++-string字符串类(详解)-程序员宅基地

文章浏览阅读368次。在C++ 中新增了一个字符串类型 string。比较与C语言只能用字符数组来表达字符串,大大提高了字符串操作的简便性。而且string也比较常用,但是对于不熟悉的人来说它的很多功能我们都不了解。我是想写写自己对使用string的一些感悟的,无奈下面这篇博客太优秀。有一定C++基础更能理解作者所写。转自:https://www.cnblogs.com/lifexy/p/8642163....

【ZYNQ入门】第六篇、ZYNQ驱动SD卡读取TXT文本和BMP图片_zynq存储数据-程序员宅基地

文章浏览阅读1.3k次,点赞25次,收藏27次。ZYNQ驱动SD卡读取TXT文本和BMP图片的原理_zynq存储数据

RUN-XGBOOST回归预测 | Matlab 龙格库塔优化xgboost回归预测_matlab人口预测模型龙格库塔函数-程序员宅基地

文章浏览阅读97次。在机器学习和数据科学领域,回归预测是一项重要的任务。通过建立数学模型,我们可以根据已有的数据来预测未知数据的结果。XGBoost是一种流行的机器学习算法,它在回归预测中表现出色。本文将介绍如何使用龙格库塔算法RUN来优化XGBoost,以实现更精确的数据回归预测。首先,让我们了解一下XGBoost和龙格库塔算法RUN的基本概念。XGBoost是一种基于梯度提升树的机器学习算法。它通过迭代地训练多个弱学习器,然后将它们组合成一个强学习器。_matlab人口预测模型龙格库塔函数

推荐文章

热门文章

相关标签