Web前端為什么要打包?Webpack 和 Vite 如何助力現代開發?

一. 為什么要使用框架庫?

1.1 傳統網頁與現代前端的差異?

在最早期的網頁開發中,我們只需要寫幾個.html文件,配上.css和.js文件,瀏覽器直接加載就能展現頁面,每個文件都是獨立的靜態資源,簡單且直觀?

但現在網站越來越復雜了:?

  • 需要用到最新的js語法(比如ES6+)
  • 使用框架(Vue,React,Angular)寫組件化代碼??
  • 引入大量第三方庫和模塊
  • 支持模塊化開發,讓代碼分塊管理;?
  • 還要優化加載速度,減少用戶等待.?

1.2 為什么要使用框架?

在前端開發的早起階段,我們寫頁面通常使用原生的html,css和js,雖然簡單直接,但隨著項目規模越來越大,頁面越來越復雜,使用純原生技術開發會遇到很多難題:??

1.代碼復用困難,開發效率低

  • 原生js寫復雜交互時,代碼容易重復,維護成本高
  • 沒有組件概念,頁面結構和邏輯混雜,難以拆分和復用

2.結構混亂,難以維護?

  • html和js分散管理,缺少清晰的層次機構??
  • 大型項目中,代碼耦合嚴重,改動一個功能可能影響全局

3.缺少高效的狀態管理和響應式更新機制

  • 用戶操作后,頁面狀態變化頻繁,手動操作DOM容易出錯,性能低?
  • 需要頻繁更新視圖,手寫邏輯復雜且容易出bug?

4.缺少工具鏈支持和生態

  • 沒有配套的開發工具,測試,構建,調試困難?
  • 缺乏統一的UI組件庫和插件生態,開發重復工作多?

1.3 前端框架的優勢

為了克服這些問題,誕生了Vue,React,Angular等現代前端框架,它們帶來了:?

  • 組件化開發? ?
    把頁面拆成可復用的組件,每個組件獨立管理自己的結構,樣式和行為,代碼更清晰,復用更方便?
  • 響應式數據綁定

    數據變化自動更新視圖,不用手動操作DOM,減少bug,提升性能?
  • 完善的生態系統

    豐富的組件庫,插件,開發工具,支持測試,打包,熱更新等?
  • 簡化開發流程

    腳手架快速搭建項目,統一代碼跪安,團隊協作更高效

1.4 JQuery歷史?

  1. jquery 的優勢?
    jq是早起最流行的js庫,極大簡化了DOM操作,事件綁定,AJax請求?
    兼容性很好,解決了早起瀏覽器差異問題?

  2. jq的局限性

    只負責操作DOM,缺乏組件化思想,代碼維護困難?

    難以管理復雜的應用狀態,代碼會變得臃腫且混亂

    不支持現代開發中的模塊化和構建流程

    隨著瀏覽器原生API改進,jq的很多功能不再必需??

二. 為什么要打包? 打包的意義??

在現代前端開發中,我們寫的代碼和瀏覽器能識別的內容,往往不是一回事,比如你寫的是:?

1.es6+的js語法,瀏覽器不一定支持?
2..vue.jsx組件文件,瀏覽器根本看不懂
3.Less,Sass這種樣式預處理器,瀏覽器只認標準css?

所以就必須通過打包工具(如Webpack或Vite)把開發時寫的各種"高階代碼"統一處理,打包成瀏覽器能識別的標準格式,比如:

你寫的打包后變成
.js(ES6、TS)兼容瀏覽器的 JS
.vue/.jsx生成 JS 組件模塊
.less/.scss打包成 .css
圖片字體等資源轉為可加載 URL 或復制到 dist

注意:? Less.Sass最終都會打包成普通css,和你寫多少嵌套,變了,mixin沒有關系,瀏覽器最后只讀.css?

三. 常見打包工具介紹: Webpack和Vite?

1. Webpack?
  • 功能強大,插件和Loader豐富,幾乎支持所有資源類型轉換
  • 適合大型項目,構建過程復雜但靈活
  • 生產環境自動開啟代碼壓縮,拆分,緩存策略?
  • 通過webpack.config.js配置規則
2.Vite?
  • 由Vue作者退出,開發體驗級佳
  • 開發階段利用瀏覽器原生ES Module,極速啟動?
  • 生產階段基于Rollup打包,體積小,速度快?
  • 配置簡單,內置多種優化?
對比維度WebpackVite
構建原理打包導向:啟動時分析并打包全部依賴,生成 bundle原生 ESM 導向:利用瀏覽器原生支持,按需加載模塊
開發模式啟動速度慢,尤其是大型項目初始打包時間長快,依賴預構建 + 按需加載,幾乎秒啟
熱更新(HMR)性能中等,依賴緩存與模塊熱替換,復雜項目重編譯慢快,按模塊熱替換,無需全局重編譯
生產構建工具使用自身構建機制(webpack)使用 Rollup 作為生產構建器,性能更優
構建速度(生產環境)可通過并行優化,但構建時間長構建快,體積小(Tree-shaking 優化更強)
配置復雜度配置復雜,需設置 loader、plugin 等配置簡單,開箱即用,零配置支持大部分框架
插件生態成熟、豐富,幾乎所有場景都有現成方案生態迅速增長,兼容 rollup 插件體系
支持框架(如 Vue/React/TS)需要額外配置(如 vue-loader、ts-loader)內置支持,開箱即用
舊瀏覽器兼容性支持良好,通過 babel/polyfill 實現開發環境僅支持現代瀏覽器,生產構建后可兼容舊瀏覽器
社區活躍度長期穩定,廣泛用于大型項目新興熱門,Vue 官方推薦,發展迅猛
微前端支持支持模塊聯邦、復雜場景微前端支持較弱,仍在探索中
適用場景企業級項目、復雜打包需求、需要兼容 IE現代前端項目、Vue3/React/TS 項目、追求開發效率
初始學習曲線高,需理解打包流程、plugin 與 loader 配置低,開發者體驗友好,極易上手

?四. 打包工具是怎么把源碼變成瀏覽器能運行的文件的?

1.解析入口和依賴圖

從入口文件(如src/main.js)開始,遞歸掃描所有導入模塊,形成依賴關系圖?

2.資源轉換

  • 利用Loader(Webpack)或插件(Vite/Rollup)轉譯
  • Babel轉移現代js/jsx/TypeScript?
  • Vue Loader 轉譯.vue 文件模版和腳本;?
  • CSS Loader 處理樣式
  • 圖片,字體轉換成合適格式?

3.代碼合并與拆分?

  • 按配置合并模塊代碼,生成一個或多個js文件;?
  • 動態導入分塊,拆分代碼減少首屏加載?

4.資源壓縮

  • 利用Terser/esbuild 壓縮JS;?
  • CSS壓縮插件精簡樣式;?
  • HTML 壓縮插件刪除空白,注釋?

5.生成產物?

  • 最終生成dist/index/html 和靜態資源,帶哈希命名確保緩存更新?

?五. 打包產物(dist目錄)結構詳解?

dist/
├── index.html ? ? ? ? ? ? ?// 入口 HTML,自動注入資源
├── assets/
│ ? ├── app.[hash].js ? ? ? // 主業務 JS 包
│ ? ├── vendor.[hash].js ? ?// 第三方依賴包
│ ? ├── chunk-[name].[hash].js ?// 動態加載代碼塊
│ ? ├── app.[hash].css ? ? ?// CSS 樣式文件
│ ? ├── logo.[hash].png ? ? // 圖片資源
│ ? └── ...
?

  • index.html? SPA唯一入口文件,只包含骨架對js.css的引用
  • js文件? 包含Vue/React組建的渲染函數,邏輯代碼,依賴代碼??
  • CSS 文件? ?單獨抽取,方便瀏覽器緩存?
  • 動態塊? 按需加載的代碼塊,優化首屏加載?
  • 靜態資源 圖片字體等資源文件??

六. 關鍵環節深入講解?

1.HTML文件時生成與壓縮?

  • Webpack 使用html-webpack-plugin? 讀取public/index.html模版,自動注入資源路徑,并通過minify配置壓縮?
  • Vite 默認不壓縮HTML,但可使用vite-plugin-html 等插件啟用壓縮?
  • 壓縮過程: 刪除注釋,空白,合并內聯CSS/JS?

2. JS壓縮與打包

  • 壓縮:? 通過Terser或esbuild壓縮js, 減少文件大小
  • 代碼拆分?
    靜態拆分:? 拆分第三方依賴和業務代碼?
    動態拆分: 利用import( ) 實現按需加載?

3.CSS打包與壓縮?

  • 抽取CSS成單獨文件,利用css-loader解析,MiniCssextraPlugin抽取(Webpack)
  • ?CSS壓縮插件精簡樣式,去掉多余空白??

4.Vue/React模版轉渲染函數?

  • Vue 編譯.vue文件的template為渲染函數JS代碼,運行時執行生成虛擬DOM?
  • React? JSX轉成React.createElement 函數調用,React渲染虛擬DOM?

七.代碼拆分與緩存優化策略?

  • 代碼拆分?

    靜態拆分第三方庫,避免業務代碼與依賴捆綁
    動態拆分頁面路由或組件,實現懶加載?
  • 緩存優化?

    使用內容哈希[contenthash]生成文件名;?

    配置HTTP Cache-Control,長期緩存不變資源?

八.?實戰配置示例

1.Webpack 生產配置片段

//生成HTMl文件并自動引入打包資源
const HtmlWebpackPlugin = require('html-webpack-plugin');
//提取CSS 成為單獨文件 
const MiniCssExtractPlugin = require('mini-css-extract-plugin');module.exports = {mode: 'production', //設置為生產模式,自動壓縮JS和css //入口文件: 告訴webpack從哪個文件開始構建依賴圖entry: './src/main.js',//輸出: 打包生成的文件放在哪?,文件叫什么output: {filename: 'app.[contenthash].js',//打包后的js文件名path: __dirname + '/dist', //輸出目錄為dist文件夾 clean: true,//每次構建前清空dist目錄},//模塊規則: 告訴webpack 如何處理不同類型的文件module: {rules: [//處理.vue單文件組件{ test: /\.vue$/, loader: 'vue-loader' },{ test: /\.css$/, use: [    //提取到CSS 到獨立文件中MiniCssExtractPlugin.loader,//解析@import 和url()等語法   'css-loader']},//js文件使用babel-loader轉譯es6代碼.兼容舊瀏覽器 { test: /\.js$/, loader: 'babel-loader' },]},optimization: {splitChunks: { chunks: 'all' },//拆分公共代碼(例如node_modules),減少重復 minimize: true, //啟用最小化壓縮 },plugins: [new HtmlWebpackPlugin({template: './public/index.html', 指定HTML 模版文件 //壓縮HTML         //去除空格         //刪除注釋 minify: { collapseWhitespace: true, removeComments: true },}),new MiniCssExtractPlugin({filename: 'style.[contenthash].css',  //輸出css文件名(帶哈希)}),],
};

2.Vite 生產配置示例

import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import { createHtmlPlugin } from 'vite-plugin-html';export default defineConfig({plugins: [vue(), //啟用Vue支持createHtmlPlugin({ minify: true }) //壓縮index.html ],build: {rollupOptions: {output: {manualChunks(id) {if (id.includes('node_modules')) return 'vendor'; //第三方庫打包成vendor  }}}}
});

九. 總結和學習建議?

  • 打包是現代前端必不可少的流程,幫助我們解決模塊化,性能和兼容性問題?
  • Webpack更強大靈活,配置復雜,適合大型項目
  • Vite輕量便捷,極大提高開發效率,適合新項目快速上手
  • 了解打包原理,能幫你寫出更高性能,更易維護的代碼?
  • 結合項目需求,合理配置壓縮,拆分和緩存策略,確保用戶體驗?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/83480.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/83480.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/83480.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用pdm+uv替換poetry

用了好幾年poetry了,各方面都還挺滿意,就是lock實在太慢; 已經試用pdmuv一段時間了,確實是快,也基本能覆蓋poetry的功能。 至于為什么用pdmuv,而不是只用uv,原因很多,有興趣的可以…

java后端生成心電圖-jfreechart

用jfreechart生成心電圖 先上成功的圖片 上代碼 1.導入包 implementation org.jfree:jfreechart:1.5.4implementation org.jfree:jcommon:1.0.242.實現代碼 對數據進行濾波 轉換單位 package com.shinrun.infrastructure.util;import java.util.ArrayList; import java.ut…

微軟Build 2025:Copilot Studio升級,解鎖多智能體協作未來

微軟Build 2025大會圓滿落幕,作為年度科技盛會,它一直是開發與AI技術突破性創新的重要展示平臺。對于工程師、創作者和領域專家來說,這是了解微軟生態未來動向的關鍵時刻。今年,Microsoft Copilot Studio推出了一系列新功能&#…

LabVIEW雜草識別與精準噴灑

基于LabVIEW構建了一套集成機器視覺、智能決策與精準控制的農業雜草識別系統。通過高分辨率視覺傳感器采集作物圖像,利用 LabVIEW 的 NI Vision 模塊實現圖像顏色匹配與特征分析,結合 Arduino 兼容的工業級控制硬件,實現雜草定位與除草劑精準…

使用 Akamai 分布式云與 CDN 保障視頻供稿傳輸安全

作者簡介:David Eisenbacher 是 EZDRM 公司的首席執行官兼聯合創始人,該公司是首家提供 "DRM 即服務" 的企業。作為 CEO,David 始終秉持為企業確立的使命:為視頻服務商提供簡潔有效的數字版權管理方案,助力其…

javascript 實戰案例 二級聯動下拉選框

本案例完全使用原生javascript實現,使用時只需填充platform_list二維數組即可,platform_list填充規則如下: [‘一級選項1’,‘二級選項11’,‘二級選項12’,‘二級選項13’,‘二級選項14’,…], [‘一級選項2’,‘二級選項21’,‘二級選項22’…

Elasticsearch集群最大分片數設置詳解:從問題到解決方案

目錄 前言 1 問題背景:重啟后設置失效 2 核心概念解析 2.1 什么是分片(Shard)? 2.2 cluster.max_shards_per_node的作用 2.3 默認值是多少? 3 參數設置的兩種方式 3.2 持久性設置(persistent) 3.2 臨時設置(transient) 4 問題解決方…

Redis Sorted Set 深度解析:從原理到實戰應用

Redis Sorted Set 深度解析:從原理到實戰應用 在 Redis 豐富的數據結構家族中,Sorted Set(有序集合)憑借獨特的設計和強大的功能,成為處理有序數據場景的得力工具。無論是構建實時排行榜,還是實現基于時間的…

Java并發編程:讀寫鎖與普通互斥鎖的深度對比

在Java并發編程中,鎖是實現線程安全的重要工具。其中,普通互斥鎖(如synchronized和ReentrantLock)和讀寫鎖(ReentrantReadWriteLock)是兩種常用的同步機制。本文將從多個維度深入分析它們的區別、適用場景及…

《云原生安全攻防》-- K8s網絡策略:通過NetworkPolicy實現微隔離

默認情況下,K8s集群的網絡是沒有任何限制的,所有的Pod之間都可以相互訪問。這就意味著,一旦攻擊者入侵了某個Pod,就能夠訪問到集群中任意Pod,存在比較大的安全風險。 在本節課程中,我們將詳細介紹如何通過N…

Log4j2、Fastjson特征流量分析

文章目錄 一、Log4j2流量特征分析1. 漏洞原理簡述2. 核心流量特征(1)請求特征(2)響應特征(3)日志特征 3.檢測與防御建議 二、fastjson流量特征分析1.漏洞原理簡述2.核心流量特征(1)請…

Java編程之建造者模式

建造者模式(Builder Pattern)是一種創建型設計模式,它將一個復雜對象的構建與表示分離,使得同樣的構建過程可以創建不同的表示。這種模式允許你分步驟構建一個復雜對象,并且可以在構建過程中進行不同的配置。 模式的核…

Spring AI之RAG入門

目錄 1. 什么是RAG 2. RAG典型應用場景 3. RAG核心流程 3.1. 檢索階段 3.2. 生成階段 4. 使用Spring AI實現RAG 4.1. 創建項目 4.2. 配置application.yml 4.3. 安裝ElasticSearch和Kibana 4.3.1. 安裝并啟動ElasticSearch 4.3.2. 驗證ElasticSearch是否啟動成功 …

mysql數據庫實現分庫分表,讀寫分離中間件sharding-sphere

一 概述 1.1 sharding-sphere 作用: 定位關系型數據庫的中間件,合理在分布式環境下使用關系型數據庫操作,目前有三個產品 1.sharding-jdbc,sharding-proxy 1.2 sharding-proxy實現讀寫分離的api版本 4.x版本 5.x版本 1.3 說明…

運維視角下的廣告系統之理解廣告索引級聯

廣告索引中為什么要級聯 這里的“級聯”一般指的是多層索引結構,也叫級聯索引(Cascade Index 或 Multi-level Index)。 在廣告系統的索引中,級聯設計有重要作用,主要原因如下: 1. 多維特征篩選的需求 廣…

2025年5月24日系統架構設計師考試題目回顧

當前僅僅是個人用于記錄&#xff0c;還未做詳細分析&#xff0c;待更新… 綜合知識 設 x,y 滿足約束條件&#xff1a;x-1>0, x-y<0, x-y-x<0, 則 y/x 的最大值是()。 A. 3 B. 2 C. 4 D. 1 申請軟件著作權登記時應當向中國版本保護中心提交軟件的鑒別材料&#xff…

3D-激光SLAM筆記

目錄 定位方案 編譯tbb ros2humble安裝 命令 colcon commond not found 柵格地圖生成&#xff1a; evo畫軌跡曲線 安裝gtsam4.0.2 安裝ceres-solver1.14.0 定位方案 1 方案一&#xff1a;改動最多 fasterlio 建圖&#xff0c;加閉環優化&#xff0c;參考fast-lio增加關…

貪心算法應用:分數背包問題詳解

貪心算法與分數背包問題 貪心算法&#xff08;Greedy Algorithm&#xff09;是算法設計中一種重要的思想&#xff0c;它在許多經典問題中展現出獨特的優勢。本文將用2萬字篇幅&#xff0c;深入剖析貪心算法在分數背包問題中的應用&#xff0c;從基礎原理到Java實現細節&#x…

PyTorch——非線性激活(5)

非線性激活函數的作用是讓神經網絡能夠理解更復雜的模式和規律。如果沒有非線性激活函數&#xff0c;神經網絡就只能進行簡單的加法和乘法運算&#xff0c;沒法處理復雜的問題。 非線性變化的目的就是給我們的網絡當中引入一些非線性特征 Relu 激活函數 Relu處理圖像 # 導入必…

iOS 電子書聽書功能的實現

在 iOS 應用中實現電子書聽書&#xff08;文本轉語音&#xff09;功能&#xff0c;可以通過系統提供的 AVFoundation 框架實現。以下是詳細實現步驟和代碼示例&#xff1a; 核心步驟&#xff1a; 導入框架創建語音合成器配置語音參數實現播放控制處理后臺播放添加進度跟蹤 完整…