码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Webpack 5 新特性


    Webpack 5 在2020年10月正式发布,更新的内容比较多。我们从头梳理下本次更新的核心内容。

    文章目录

        • 一、构建优化
          • 1. `Tree Shaking` (删除无用代码)
          • 2. 合并模块 `concatenateModules`
          • 3. 副作用 `sideEffects`
          • 4. 嵌套的 `Nested tree-shaking`
          • 5. 内部模块 `Inner-module tree-shaking`
        • 二、长期缓存
          • 1. `Hash` 相关:
          • 2. `deterministic` 长期缓存:
        • 三、增量构建
        • 四、`Web` 新特性
          • 1. 资源模块
          • 2. 不再为 `Node.js` 模块 自动引用 `Polyfills`
          • 3. 模块联邦
          • 4. 改进 `target` 配置
          • 5. 其他 ( 部分插件版本要求 )
        • 五、相关文章

    一、构建优化

    • 1. Tree Shaking (删除无用代码)

      module.exports = { 
      	optimization: {
      		usedExports: true, // 标记出未被导出的变量
      		minimize: true // 去除无用变量并压缩代码
      	}
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    • 2. 合并模块 concatenateModules

      module.exports = { 
      	optimization: {
      		concatenateModules: true // 生产模式(production)下默认启用
      	}
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • 3. 副作用 sideEffects

      webpack.config.js:

      module.exports = { 
      	optimization: {
      		sideEffects: true // 开启副作用功能(编译时跳过被导出但未被使用、标记为不包含副作用的模块)
      	}
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5

      package.json:标记所有模块无副作用

      {
        "name": "webpack 5.0",
        "version": "1.0.0",
        "sideEffects": false
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • 4. 嵌套的 Nested tree-shaking

      删除嵌套的模块未被使用的相关代码

    • 5. 内部模块 Inner-module tree-shaking

      module.exports = {
      	optimization: {
      		innerGraph: true // 分析导出和导入之间的依赖关系(生产模式默认启用),进行代码压缩
      	}
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5

    二、长期缓存

    • 1. Hash 相关:

      • hash:所有的 chunk 文件使用相同的 hash ,项目中任一文件变化都会影响所有的 chunk 文件的 hash 值
      • chunkhash:针对与输出文件,任意文件改变只会影响其依赖的chunk ,不会影响其它chunk
      • contenthash:基于单个文件内容产生的 hash (webpack 4.0 之前只针对于文本结构)
    • 2. deterministic 长期缓存:

      module.exports = {
      	optimization: {
      		chunkIds: "deterministic", // 告知 webpack 当选择模块 id 时需要使用哪种算法
      		moduleIds: "deterministic", // 告知 webpack 当选择模块 id 时需要使用哪种算法
      		mangleExports: "deterministic" // 允许控制导出处理(export mangling)
      	}
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7

    三、增量构建

    • 默认缓存到 node_modules/.cache/webpack 中,当前可以利用 cacheDirectory 自定义目录
      module.exports = {
      	cache: {
      		type: 'filesystem', // 将缓存类型设置为文件系统,`webpack 4.0` 为 `memory` (开发模式)
      		cacheDirectory: path.resolve(__dirname,'node_modules/.cac/webpack'), // 自定义缓存位置
      	}
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

    四、Web 新特性

    • 1. 资源模块

      webpack 4.0 中我们想对 png、mp3、woff2 等资源进行处理时,需要利用 url-loader 来处理。在 webpack 5.0 中内置了对静态资源的处理,添加了 4种 新的模块类型,如下:

      模块类型说明
      asset/source导出资源的源代码。之前通过使用 raw-loader 实现
      asset/inline导出一个资源的 Base64。之前通过使用 url-loader 实现
      asset/resource 发送一个单独的文件并导出 URL。之前通过使用 file-loader 实现
      asset 在导出一个 Base64 和发送一个单独的文件之间自动选择,并且配置资源体积限制实现。之前通过使用 url-loader

      webpack 4.0:之前的配置

       module: {
       	rules: [
      	  // 处理图片资源
            {
              test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
              use: {
                loader: 'url-loader',
                options: {
                  esModule: false, // 设为false,否则图片编译为 [object Module]
                  limit: 10 * 1024 // 超过10k
                  name: 'image/[name].[hash:7].[ext]',
                  // outputPath: 'image'
                  publicPath: _publicPath
                }
              }
            },
       	]
       }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18

      webpack 5.0:现在的配置

       module: {
       	rules: [
      	  // 处理图片资源
            {
              test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
              type: 'asset',
          	generator: {
          		filename: 'image/[name].[hash:7].[ext]'
              },
              parser: {
      	        dataUrlCondition: {
      	           maxSize: 10 * 1024 // 超过10kb
      	        }
              }
            },
       	]
       }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
    • 2. 不再为 Node.js 模块 自动引用 Polyfills

      不在为例如:path,process,os 等类似依赖提供支持,Polyfill 交由开发者自由控制

      module.exports = {
        resolve: {
          fallback: {
            crypto: require.resolve('crypto-browserify'),
            events: require.resolve('events'),
            http: require.resolve('stream-http'),
            https: require.resolve('https-browserify'),
            os: require.resolve('os-browserify/browser'),
            path: require.resolve('path-browserify'),
            process: require.resolve('process/browser')
            ...
          }
        }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
    • 3. 模块联邦

      不同项目共享模块

    • 4. 改进 target 配置

      module.exports = {
        target: ['web', 'es5'] // Webpack将为网络平台生成一个运行代码,并且只使用ES5的功能
      }
      
      • 1
      • 2
      • 3
    • 5. 其他 ( 部分插件版本要求 )

      • webpack-dev-server:v4.0.0 +
      • html-webpack-plugin:v5.0.0 +
      • …

    五、相关文章

    • Webpack 各版本 ( v1 - v4 ) 的区别

    • Webpack 4.X + React + Node + Mongodb 从零搭建聊天室(二)

    • Webpack 4.X 从零配置SPA单页应用

    • Webpack 4.X 配置cdn加载资源

  • 相关阅读:
    探索电子元器件商城:从原型到批量生产的选择
    Python中import的as语法
    ArcGIS笔记12_ArcGIS搜索工具没法用?ArcGIS运行很慢很卡?
    如何在 Windows 10 上安装 Ubuntu 操作系统?
    Python|(解决)苹果mac电脑无法打开“chromedriver”,因为无法验证开发者,要怎么解决?
    性能测试:工具篇:jmeter-命令行使用
    线索二叉树的建立与遍历
    二叉树,堆排序及TopK问题
    月薪近万,工地转行测试,这一次的选择,真正实现了薪资翻倍~
    使用docker搭建squid和ss5
  • 原文地址:https://blog.csdn.net/Vue2018/article/details/125499080
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号