jeddygong / frontend-document

前端每日一练,大厂面试题目,涵盖前端所有知识点,每天进步一点点。HTML/CSS/Javascript/Nodejs/Typescript/ECMAScript/Vue/React/Webpack/小程序/网络/设计模式/数据结构/算法/安全/工程化/性能优化
https://jeddygong.github.io/frontend-document
MIT License
10 stars 4 forks source link

[2021-02-03 更新] webpack5新特性详解 #19

Open jeddygong opened 3 years ago

jeddygong commented 3 years ago

webpack5主要新特性介绍

一、资源模块

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 的优化

概念和选项

可选值 含义 示例
natural 按使用顺序的数字ID 1
named 方便调式的高可读性id src_page_home.js
deterministic 根据模块名称生成剪短的hash值 915(注意最高只能生成999个序列,所以建议文件不要超过999个)
size 根据模块大小生成的数字id 1024

三、移除Node.js的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

// package.json "sideEffects": false,


### 五、持久化缓存提高性能

* 第一次构建是一次全量构建,它会**利用磁盘模块缓存**(以空间换时间),使得后续的构建从中获利。
* 后续构建具体流程是:**读取磁盘缓存 -> 校验模块 -> 解封模块内容**。

* 第一次打包时间

  ```javascript
  webpack 5.11.0 compiled successfully in 4657 ms

六、模块联邦

6.1 什么是模块联邦?

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

6.2 动机

6.3 Module Federation

七、其它

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