一、Webpack 是什么
Webpack 是一款現代 JavaScript 應用程序的靜態模塊打包工具。在 Web 開發中,我們的項目會包含各種類型的文件,如 JavaScript、CSS、圖片等。Webpack 可以將這些文件打包成一個或多個文件,以便在瀏覽器中高效加載。它就像是一個超級管家,把項目中的各種資源整理打包,讓它們能更好地協同工作。
二、為什么要使用 Webpack
- 代碼拆分:可以將代碼拆分成多個塊,實現按需加載,提高頁面加載速度。比如一個大型項目,有些功能可能不是用戶一開始就需要的,Webpack 可以把這些功能代碼單獨打包,等用戶用到時再加載。
- 模塊加載:支持各種模塊加載方式,如 ES6 模塊、CommonJS 模塊等,統一管理項目中的模塊依賴。
- 處理不同類型文件:不僅能處理 JavaScript,還能處理 CSS、Sass、Less 等樣式文件,以及圖片、字體等資源文件。
三、Webpack 基礎入門
(一)安裝 Webpack
- 首先確保你已經安裝了 Node.js,因為 Webpack 是基于 Node.js 運行的。
- 全局安裝 Webpack 和 Webpack - CLI(命令行界面):
npm install webpack webpack - cli -g
(二)創建項目結構
- 創建一個新的文件夾,例如webpack - demo。
- 在該文件夾下創建以下文件和文件夾:
- src文件夾:用于存放源文件,在src文件夾下創建index.js文件。
- dist文件夾:用于存放打包后的文件,這個文件夾一開始可以不存在,Webpack 會在打包時自動生成。
(三)編寫基礎代碼
在src/index.js中編寫如下代碼:
function add(a, b) {return a + b;
}
const result = add(1, 2);
console.log(result);
(四)配置 Webpack
在項目根目錄下創建webpack.config.js文件,內容如下:
const path = require('path');
module.exports = {entry: './src/index.js',output: {filename: 'bundle.js',path: path.resolve(__dirname, 'dist')}
};
這里配置了入口文件entry為src/index.js,表示從這個文件開始打包;output指定了打包后的文件名filename為bundle.js,輸出路徑path為dist文件夾。
(五)執行打包
在命令行中進入項目根目錄,執行以下命令:
webpack - - config webpack.config.js
執行成功后,會在dist文件夾下生成bundle.js文件。這個文件就是打包后的文件,包含了src/index.js中的代碼以及相關依賴。
四、Webpack 核心功能
(一)加載器(Loaders)
- 作用:Webpack 本身只能處理 JavaScript 和 JSON 文件,Loaders 可以讓 Webpack 處理其他類型的文件,如 CSS、圖片等。
- 使用示例 - 加載 CSS 文件:
- 安裝css - loader和style - loader:
npm install css - loader style - loader --save - dev
- 在src文件夾下創建styles.css文件,添加一些簡單的樣式:
body {background - color: lightblue;
}
- 修改src/index.js文件,引入styles.css:
import './styles.css';
function add(a, b) {return a + b;
}
const result = add(1, 2);
console.log(result);
- 修改webpack.config.js文件,配置加載器:
const path = require('path');
module.exports = {entry: './src/index.js',output: {filename: 'bundle.js',path: path.resolve(__dirname, 'dist')},module: {rules: [{test: /\.css$/,use: ['style - loader', 'css - loader']}]}
};
這里module.rules配置了一個規則,test表示匹配所有.css文件,use指定了使用style - loader和css - loader來處理這些文件。css - loader負責解析 CSS 文件,style - loader負責將解析后的 CSS 插入到 HTML 頁面中。
(二)插件(Plugins)
- 作用:插件可以擴展 Webpack 的功能,實現更復雜的任務,如代碼壓縮、生成 HTML 文件、提取 CSS 為單獨文件等。
- 使用示例 - 使用 HtmlWebpackPlugin 生成 HTML 文件:
- 安裝html - webpack - plugin:
npm install html - webpack - plugin --save - dev
- 修改webpack.config.js文件,添加插件配置:
const path = require('path');
const HtmlWebpackPlugin = require('html - webpack - plugin');
module.exports = {entry: './src/index.js',output: {filename: 'bundle.js',path: path.resolve(__dirname, 'dist')},module: {rules: [{test: /\.css$/,use: ['style - loader', 'css - loader']}]},plugins: [new HtmlWebpackPlugin({title: 'Webpack Demo',template: './src/index.html'})]
};
這里引入了HtmlWebpackPlugin插件,配置了title為頁面標題,template指定了使用src/index.html作為模板來生成 HTML 文件。在src文件夾下創建index.html文件:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF - 8"><title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body><script src="bundle.js"></script>
</body>
</html>
再次執行打包命令,會在dist文件夾下生成一個 HTML 文件,并且自動引入了打包后的bundle.js文件。
- 常用插件補充
- TerserPlugin:用于壓縮 JavaScript 代碼,減小文件體積,提升加載速度。它是 Webpack 4 + 版本默認的代碼壓縮插件,無需額外安裝。在webpack.config.js中配置如下:
const path = require('path');
const HtmlWebpackPlugin = require('html - webpack - plugin');
const TerserPlugin = require('terser - webpack - plugin');
module.exports = {entry: './src/index.js',output: {filename: 'bundle.js',path: path.resolve(__dirname, 'dist')},module: {rules: [{test: /\.css$/,use: ['style - loader', 'css - loader']}]},plugins: [new HtmlWebpackPlugin({title: 'Webpack Demo',template: './src/index.html'})],optimization: {minimizer: [new TerserPlugin()]}
};
- MiniCssExtractPlugin:將 CSS 從 JavaScript 文件中提取出來,生成單獨的 CSS 文件。這在生產環境中很有用,因為瀏覽器可以單獨緩存 CSS 文件。安裝命令:
npm install mini - css - extract - plugin --save - dev
在webpack.config.js中配置如下:
const path = require('path');
const HtmlWebpackPlugin = require('html - webpack - plugin');
const MiniCssExtractPlugin = require('mini - css - extract - plugin');
module.exports = {entry: './src/index.js',output: {filename: 'bundle.js',path: path.resolve(__dirname, 'dist')},module: {rules: [{test: /\.css$/,use: [MiniCssExtractPlugin.loader, 'css - loader']}]},plugins: [new HtmlWebpackPlugin({title: 'Webpack Demo',template: './src/index.html'}),new MiniCssExtractPlugin({filename:'styles.css'})]
};
- CleanWebpackPlugin:在每次打包前清空輸出目錄,避免殘留舊文件。安裝命令:
npm install clean - webpack - plugin --save - dev
在webpack.config.js中配置如下:
const path = require('path');
const HtmlWebpackPlugin = require('html - webpack - plugin');
const MiniCssExtractPlugin = require('mini - css - extract - plugin');
const { CleanWebpackPlugin } = require('clean - webpack - plugin');
module.exports = {entry: './src/index.js',output: {filename: 'bundle.js',path: path.resolve(__dirname, 'dist')},module: {rules: [{test: /\.css$/,use: [MiniCssExtractPlugin.loader, 'css - loader']}]},plugins: [new HtmlWebpackPlugin({title: 'Webpack Demo',template: './src/index.html'}),new MiniCssExtractPlugin({filename:'styles.css'}),new CleanWebpackPlugin()]
};
(三)代碼拆分與按需加載配置
- 原理:Webpack 的代碼拆分是指將一個大的 JavaScript 文件拆分成多個小的文件,這些小文件可以在需要的時候再加載。按需加載就是在特定的時機(比如用戶點擊某個按鈕、訪問某個路由等)才加載對應的代碼塊,而不是在頁面一開始就加載所有代碼,從而提高頁面的初始加載速度和用戶體驗。
- 基礎配置:在 Webpack 4 + 版本中,可以使用splitChunks配置項來實現代碼拆分。在webpack.config.js中添加如下配置:
const path = require('path');
const HtmlWebpackPlugin = require('html - webpack - plugin');
module.exports = {entry: './src/index.js',output: {filename: 'bundle.js',path: path.resolve(__dirname, 'dist'),// 為動態導入的代碼塊指定輸出路徑和文件名chunkFilename: '[name].[chunkhash].js'},module: {rules: [{test: /\.css$/,use: ['style - loader', 'css - loader']}]},plugins: [new HtmlWebpackPlugin({title: 'Webpack Demo',template: './src/index.html'})],optimization: {splitChunks: {chunks: 'all'}}
};
optimization.splitChunks.chunks: 'all’表示對所有類型的 chunk(入口 chunk、異步 chunk 等)都進行代碼拆分。這里output.chunkFilename用于指定非入口 chunk(動態導入的代碼塊)的輸出文件名,[name]會被替換為代碼塊的名稱,[chunkhash]會根據代碼塊內容生成哈希值,用于緩存控制。
- 實際應用示例 - 動態導入模塊實現按需加載:
- 在src文件夾下創建一個新的文件math.js,編寫如下代碼:
export function multiply(a, b) {return a * b;
}
- 修改src/index.js文件,通過動態導入的方式引入math.js模塊:
import './styles.css';
function add(a, b) {return a + b;
}
const result = add(1, 2);
console.log(result);
// 點擊按鈕時動態導入math.js模塊并調用multiply函數
document.addEventListener('DOMContentLoaded', function () {const button = document.createElement('button');button.textContent = '點擊計算乘法';document.body.appendChild(button);button.addEventListener('click', function () {import('./math.js').then((module) => {const product = module.multiply(3, 4);console.log('乘法結果:', product);});});
});
這里使用import(‘./math.js’)動態導入math.js模塊,這是 ES2020 引入的動態導入語法,Webpack 會自動將其拆分成一個單獨的代碼塊。當用戶點擊按鈕時,才會加載這個代碼塊,實現了按需加載。執行打包命令后,在dist文件夾下會生成除了bundle.js之外的math.[chunkhash].js文件,這就是拆分出來的代碼塊。
五、總結
通過以上步驟,我們對 Webpack 的基礎和核心功能有了初步了解。Webpack 還有很多高級特性,如代碼優化、熱模塊替換等,后續可以進一步深入學習。希望這篇文章能幫助大家順利入門 Webpack,開啟高效的 Web 開發之旅。