总结万字长文笔记webpack5打包资源优化

本文详细介绍了如何使用webpack5进行资源优化,包括Tree Shaking技术,通过设置usedExports和sideEffects实现代码删除,Gzip压缩提高加载速度,css Tree Shaking减少未使用样式,分包策略优化入口文件,以及图片资源压缩。同时讨论了各种配置选项和插件的使用,为前端项目提供实战指导。

webpack如何打包资源优化你有了解吗?或者一个经常被问的面试题,首屏加载如何优化,其实无非就是从http请求文件资源图片加载路由懒加载预请求缓存这些方向来优化,通常在使用脚手架中,成熟的脚手架已经给你做了最大的优化,比如压缩资源,代码的tree shaking等。

本文是笔者根据以往经验以及阅读官方文档总结的一篇关于webpack打包方面的长文笔记,希望在项目中有所帮助。

正文开始…

在阅读之前,本文将从以下几个点去探讨webpack的打包优化

1、webpack如何做treeShaking

2、webpack的gizp压缩

3、css如何做treeShaking,

4、入口依赖文件拆包

5、图片资源加载优化

treeShaking

在官网中有提到treeShaking[1],从名字上中文解释就是摇树,就是利用esModule的特性,删除上下文未引用的代码。因为webpack可以根据esModule做静态分析,本身来说它是打包编译前输出,所以webpack在编译esModule的代码时就可以做上下文未引用的删除操作。

那么如何做treeshaking?我们来分析下

快速初始化一个webpack项目

在之前我们都是手动配置搭建webpack项目,webpack官方提供了cli快速构建基本模版,无需像之前一样手动配置entrypluginsloader

首先安装npm i webpack webpack-cli,命令行执行`

npx webpack init 

一系列初始化操作后,就生成以下代码了

// Generated using webpack-cli https://github.com/webpack/webpack-cli

const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const WorkboxWebpackPlugin = require("workbox-webpack-plugin");
const isProduction = process.env.NODE_ENV == "production";
const stylesHandler = MiniCssExtractPlugin.loader;
const config = {
  entry: "./src/index.js",
  output: {
    path: path.resolve(__dirname, "dist"),
  },
  devServer: {
    open: true,
    host: "localhost",
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: "index.html",
    }),

    new MiniCssExtractPlugin(),

    // Add your plugins here
    // Learn more about plugins from https://webpack.js.org/configuration/plugins/
  ],
  module: {
    rules: [
      {
        test: /.(js|jsx)$/i,
        loader: "babel-loader",
      },
      {
        test: /.less$/i,
        use: [stylesHandler, "css-loader", "postcss-loader", "less-loader"],
      },
      {
        test: /.css$/i,
        use: [stylesHandler, "css-loader", "postcss-loader"],
      },
      {
        test: /.(eot|svg|ttf|woff|woff2|png|jpg|gif)$/i,
        type: "asset",
      },

      // Add your rules for custom modules here
      // Learn more about loaders from https://webpack.js.org/loaders/
    ],
  },
};
module.exports = () => {
  if (isProduction) {
    config.mode = "production";

    config.plugins.push(new WorkboxWebpackPlugin.GenerateSW());
  } else {
    config.mode = "development";
  }
  return config;
}; 

运行命令npm run serve

现在修改一下index.js,并在src中增加utils目录

// utils/index.js
export function add(a, b) {
  return a + b
}
export function square(x) {
  return x * x;
} 
index.js
import { add } from './utils'
console.log("Hello World!");
console.log(add(1, 2)) 

index.js中我只引入了add,相当于square这个函数在上下文中并未引用。

usedExports

不过我还需要改下webpack.config.js

...
module.exports = () => {
  if (isProduction) {
    config.mode = "production";
    config.plugins.push(new WorkboxWebpackPlugin.GenerateSW());
  } else {
    config.mode = "development";
    config.devtool = 'source-map'
    config.optimization = {
      usedExports: true
    }
  }
  return config;
}; 

注意我只增加了devtool:source-mapoptimization.usedExports = true

我们看下package.json

 "scripts": {
    "test": "echo "Error: no test specified" && exit 1",
    "build": "webpack --mode=production --node-env=production",
    "build:dev": "webpack --mode=development",
    "build:prod": "webpack --mode=production --node-env=production",
    "watch": "webpack --watch",
    "serve": "webpack serve"
  }, 

默认初始化已经给们预设了多个不同的打包环境,因此我只需要运行下面命令就可以选择开发环境了

npm run build:dev 
/* unused harmony export square */
function add(a, b) {
  return a + b;
}
function square(x) {
  return x * x;
} 

square上下文未引用,虽然给了标记,但是未真正清除。

光使用usedExports:true还不行,usedExports 依赖于 terser 去检测语句中的副作用,因此需要借助terser插件一起使用,官方webpack5提供了TerserWebpackPlugin这样一个插件

webpack.config.js中引入

...
const TerserPlugin = require("terser-webpack-plugin");
...
module.exports = () => {
  if (isProducti
### AI Agent 技术原理 AI Agent 的核心技术在于其具备感知环境、决策制定和执行操作的能力。这种能力来源于多个关键技术模块的协同工作,主要包括以下几个方面: #### 1. **感知与输入** AI Agent 需要通过传感器或其他形式的数据采集设备来感知外部世界。这可以包括摄像头捕捉视觉信息、麦克风接收音频信号或者网络接口获取数化数据[^2]。 #### 2. **状态表示与建模** 为了有效地处理来自外界的信息,Agent 必须构建内部的状态模型。这一过程通常涉及将原始感官数据转化为结构化特征向量或更高层次的概念描述。现代方法常依赖于深度神经网络来进行自动化的特征提取和抽象[^4]。 #### 3. **规划与推理** 基于当前所处的状态以及既定的目标,AI Agent 使用各种算法进行路径寻找或是策略推导。强化学习便是其中一种重要手段,在未知环境中探索最优行为序列的同时不断优化奖励函数下的累积收益[^1]。 #### 4. **行动控制** 最终决定做出后,还需要有机制将其转换成实际物理世界的动作指令或者是虚拟空间内的命令发送出去。对于机械臂来说可能是电机驱动参数调整;而对于软件型Agents,则更多表现为API调用或者其他形式的服务请求发起[^3]。 --- ### AI Agent 应用场景分析 随着技术进步,AI Agents 已经渗透到我们生活的方方面面,并展现出强大的实用价值: #### 自动驾驶车辆 利用复杂的传感融合技术和实时路况判断逻辑,使得无人驾驶成为可能。这类系统不仅需要精确识别周围物体位置关系还要预测其他交通参与者未来动态趋势以便安全高效通行[^3]. ```python def autonomous_driving(perception_data, traffic_rules): state = process_perception(perception_data) action_plan = plan_actions(state, traffic_rules) execute_commands(action_plan) def process_perception(data): # Example of feature extraction using deep learning models. model_output = neural_network_forward_pass(data) return interpret_model_results(model_output) ``` #### 游戏娱乐行业 无论是单机还是在线多人游戏中都存在大量NPC角色扮演者,他们依据预设剧本加上随机应变技巧给予玩家沉浸式体验感。同时电竞训练营也采用类似的思路培养顶尖选手对抗水平[^2]. #### 客服支持平台 借助自然语言理解和生成技术,智能客服能够快速响应客户咨询并提供解决方案减少人工成本提高效率。例如当收到订单查询需求时会自动检索数据库返回相应结果甚至主动推荐关联商品促进销售增长. ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值