webpack高級配置

一、了解webpack高級配置:

1、什么是webpack高級配置:

進行 Webpack 優化,讓代碼在編譯或者運行時性能更好

2、webpack優化從哪些方面入手:

① 提升開發體驗,增強開發和生產環境的代碼調試:

如果代碼編寫出錯了,在瀏覽器查看錯誤并且需要定位的時候,查看的是編譯后的代碼,難以定位具體的錯誤位置

② 提升打包構建速度:

(1) 模塊更新:

開發時我們修改了其中一個模塊代碼,Webpack默認會將所有模塊全部重新打包編譯,速度很慢。

(2) 打包優化:

打包時每個文件都會匹配所有loader,速度比較慢。

(3) 第三方插件編譯:

使用第三方的庫或插件時,所有資源都會下載到 node_modules 中,這些資源是不需要編譯可以直接使用的。

(4) eslintbabel緩存:

每次打包時js 文件都要經過 Eslint 檢査 和 Babel 編譯,速度比較慢。

(5) 多進程js文件打包:

當項目越來越龐大時,打包速度就會越來越慢。對js文件處理主要就是 eslintbabelTerser 三個工具,所以我們要提升它們的運行速度,。我們可以開啟多進程同時處理js 文件,這樣速度就比之前的單進程打包更快了。

③ 減少代碼體積:

(1)第三方工具庫引用:

對于自定義的工具函數庫,或者引用第三方工具函數庫、組件庫。實際上可能只用上極小部分的功能,如果沒有特殊處理,打包時會引入整個庫,體積太大

(2)Babel編譯時代碼重復插入:

Babel 為編譯的每個文件都插入了輔助代碼,使代碼體積過大

(3)壓縮本地靜態資源中的圖片:

如果項目中引用了較多圖片,那么圖片體積會比較大,請求的速度就會比較慢

④ 優化代碼運行性能:

(1)代碼分割:

打包代碼時會將所有js文件打包到一個文件中。如果只要渲染首頁,就應該只加載首頁的js文件,其他文件不應該加載。

(2)
(3)
(4)

二、提升開發體驗:SourceMap

中文文檔:https://webpack.docschina.org/configuration/devtool/#root

1、SourceMap 的定義:

SourceMap(源代碼映射)是一個用來生成源代碼與構建后代碼一一映射的文件的方案。

2、為什么能優化調試:

① 使用SourceMap后,會生成一個 xxx.map 文件,里面包含源代碼和構建后的代碼每一行、每一列的映射關系。

② 瀏覽器會自動查找xxx.map 文件

③ 當代碼出錯時,瀏覽器會提示源代碼文件出錯位置(通過 xxx.map 文件,從構建后代碼出錯位置找到映射后源代碼出錯位置)

3、SourceMap的使用:

① 開發模式:devtool: 'cheap-module-source-map'

  • 優點:打包編譯速度快,只包含行映射
  • 缺點:沒有列映射
mode: 'development',
devtool: 'cheap-module-source-map'

② 生產模式:devtool: 'source-map'

  • 優點:包含行&列映射
  • 缺點:打包編譯速度更慢
mode: 'production',
devtool: 'cheap-module-source-map'

在這里插入圖片描述

三、提升打包構建速度:

1、模塊熱替換:HMR

中文文檔:https://webpack.docschina.org/guides/hot-module-replacement

① 定義:

在程序運行中,替換、添加或刪除模塊,而無需重新加載整個頁面(修改某個模塊代碼,就只有這個模塊代碼需要重新打包編譯,其他模塊不變)

② 使用:webpack5中是默認開啟的

// 開發服務器:不會輸出資源,在內存中編譯打包
devServer: {host: 'localhost', // 啟動服務器的域名port: '3001', // 啟動服務器的端口號open: true, // 是否自動打開瀏覽器hot: true, // 開啟 HMR(默認值)
}
(1)CSS模塊熱更新:

css 樣式經過 style-loader 處理,已經具備 HMR 功能了

(2)JS模塊熱更新:
a、常規寫法:
語法:
// 1. 監聽特定模塊
module.hot.accept('字符串或數組(模塊路徑)', [,'模塊更新后的回調函數'])
// 2. 監聽當前模塊自身
module.hot.accept()
項目中使用:
// 配置js模塊熱更新
if(module.hot) {// 如果支持模塊熱更新module.hot.accept('./js/sum.js')module.hot.accept('./js/util.js')
}
b、vue或者React項目寫法:

vue-loader:https://vue-loader.vuejs.org/
React Fast Refresh:https://reactnative.dev/docs/fast-refresh

2、模塊熱替換:oneOf

中文文檔:https://webpack.docschina.org/configuration/module/#ruleoneof

① 定義:

只要匹配到一個 loader,剩下的就不匹配了

② 使用:

    // 加載器module: {rules: [{   // 當規則匹配時,只使用第一個匹配規則oneOf: [{test: /\.css$/i, // 匹配以.css結尾的文件use: ['style-loader', // 將js中的css通過style標簽的形式添加到html中'css-loader' // 將css資源編譯成commonjs的模塊化js], // loader的執行順序是從后往前的},{test: /\.less$/i,use: ['style-loader','css-loader','less-loader', // 將less文件編譯為css文件],},{test: /\.s[ac]ss$/i,use: [// 將 JS 字符串生成為 style 節點'style-loader',// 將 CSS 轉化成 CommonJS 模塊'css-loader',// 將 Sass 編譯成 CSS'sass-loader',],},{test: /\.styl$/i,use: ['style-loader','css-loader','stylus-loader', // 將stylus文件編譯為css文件],},{   // webpack4處理圖片資源的方式:使用file-loader、url-loader。// file-loader將文件資源編譯為webpack識別的資源原封不動的進行輸出。// url-loader將圖片資源進行優化// webpack5處理圖片資源的方式(file-loader、url-loader已經內置):test: /\.(png|jpe?g|svg|webp|gif)$/,type: 'asset',parser: {dataUrlCondition: {maxSize: 30 * 1024 // 小于30kb的圖片會轉為base64 - 減少請求數量,但是體積會變大}},generator: { // 打包的圖片輸出的目錄// [hash:10]表示只保留名稱的前10位filename: 'static/images/[hash:10][ext][query]'}},{   // webpack4處理圖片資源的方式:使用file-loader// file-loader將文件資源編譯為webpack識別的資源原封不動的進行輸出。// webpack5處理圖片資源的方式(file-loader已經內置):test: /\.(ttf|woff2?)$/,type: 'asset/resource', // 只會對文件原封不動的輸出,不會轉為base64generator: { // 打包的字體輸出的目錄// [hash:10]表示只保留名稱的前10位filename: 'static/fonts/[hash:10][ext][query]'}},{   // webpack4處理其它資源的方式:使用file-loader// file-loader將文件資源編譯為webpack識別的資源原封不動的進行輸出。// webpack5處理其它資源的方式(file-loader已經內置):test: /\.(mp3|MP4|avi|.doc)$/i,type: 'asset/resource', // 只會對文件原封不動的輸出,不會轉為base64generator: { // 打包的字體輸出的目錄// [name]表示保留原始文件名filename: 'static/media/[hash:10][ext][query]'}},{test: /\.js$/,exclude: /(node_modules)/, // 排除哪些文件不需要編譯loader: 'babel-loader', // 只需要一個loader,不需要use// use: {//     loader: 'babel-loader',//     options: { // 智能預設,這個對象可以不寫,那么就需要在項目的根目錄下新建babel.config.js,添加智能預設//         presets: ['@babel/preset-env'],//     },// },}]}]},

3、第三方插件編譯優化:exclude或者include

中文文檔:https://webpack.docschina.org/configuration/module#ruleexclude

exclude 定義:

要排除符合條件的資源(對 js 文件處理時,排除 node modules 下面的文件)

include 定義:

只對當前包含的資源進行處理

③ 使用:

 //加載器module: {rules: [{   // 當規則匹配時,只使用第一個匹配規則oneOf: [{test: /\.js$/,// exclude: /(node_modules)/, // 排除哪些文件不需要編譯include: path.resolve(__dirname, '../src'), // 哪些文件需要編譯loader: 'babel-loader', // 只需要一個loader,不需要use}]}]},// 插件plugins: [new ESLintPlugin({ // eslint檢測的文件都有哪些exclude: "node_modules", // 默認值,排除哪些文件不需要編譯context: path.resolve(__dirname, '../src')}),new HtmlWebpackPlugin({ // 使用 html資源引入 插件,并且保留原模版template: path.resolve(__dirname, '../index.html')})]

4、 eslintbabel緩存:Cache

中文文檔:https://webpack.docschina.org/configuration/cache/#root

① 定義:

緩存之前的 Eslint 檢查 和 Babel 編譯結果,加快后續打包速度

② 使用:

打包完成后的緩存js文件,默認路徑在node_modules/.cache/babel-loader中

module.exports = {// 加載器module: {rules: [{oneOf: [{test: /\.js$/,// exclude: /(node_modules)/, // 排除哪些文件不需要編譯include: path.resolve(__dirname, '../src'), // 哪些文件需要編譯loader: 'babel-loader', // 只需要一個loader,不需要useoptions: {cacheDirectory: true, // 開啟babel緩存cacheCompression: false, // 不壓縮緩存文件}},]}]},// 插件plugins: [new ESLintPlugin({ // eslint檢測的文件都有哪些exclude: "node_modules", // 默認值,排除哪些文件不需要編譯context: path.resolve(__dirname, '../src'),cache: true, // 開啟緩存cacheLocation: path.resolve(__dirname, '../node_modules/.cache/eslintcache'), // 緩存文件存儲的路徑}),new HtmlWebpackPlugin({ // 使用 html資源引入 插件,并且保留原模版template: path.resolve(__dirname, '../index.html')}),new MiniCssExtractPlugin({ // 將所有的css提取到一個單獨的文件中filename: 'static/css/main.css'}),new CssMinimizerPlugin()],
}

在這里插入圖片描述

5、 多進程打包:Thead

中文文檔:https://webpack.docschina.org/loaders/thread-loader/#root

① 定義:

開啟電腦的多個進程同時干一件事,速度更快。

需要注意:請僅在特別耗時的操作中使用,因為每個進程啟動就有大約為600ms 左右開銷

② 使用:

(1)獲取 cpu的核數:

啟動的進程最大數量就是cpu的核數

// 引入os模塊
const os = require('os')
// 獲取cpu的核數
const threads = os.cpus().length;
(2)下載包:

npm install --save-dev thread-loader

(3)使用:
a、js 編譯多核處理:
{test: /\.js$/,// exclude: /(node_modules)/, // 排除哪些文件不需要編譯include: path.resolve(__dirname, '../src'), // 哪些文件需要編譯use: [{loader: 'thread-loader', // 開啟多進程options: {// 產生的 worker 的數量,默認是 (cpu 核心數 - 1)workers: threads,}},{loader: 'babel-loader', // 只需要一個loader,不需要useoptions: {cacheDirectory: true, // 開啟babel緩存cacheCompression: false, // 不壓縮緩存文件}}]
}
b、eslint 多核處理:
 plugins: [new ESLintPlugin({ // eslint檢測的文件都有哪些exclude: "node_modules", // 默認值,排除哪些文件不需要編譯context: path.resolve(__dirname, '../src'),cache: true, // 開啟緩存cacheLocation: path.resolve(__dirname, '../node_modules/.cache/eslintcache'), // 緩存文件存儲的路徑threads // 開啟多進程})
],
c、壓縮js 多核處理:
// 引入 js壓縮 插件 -- 內置
const terserWebpackPlugin = require('terser-webpack-plugin')
module.exports = {plugins: [// new CssMinimizerPlugin(),// new terserWebpackPlugin({//     parallel: threads, // 開啟多進程// })],optimization: { // 不在這里寫的話,可以在 plugins 中寫minimizer: [new CssMinimizerPlugin(),new terserWebpackPlugin({parallel: threads, // 開啟多進程})],},
}

③ 完整代碼:

webpack.prod.js
// 引入os模塊
const os = require('os')
// 引入path模塊
const path = require('path')
// 引入 eslint 插件
const ESLintPlugin = require('eslint-webpack-plugin');
// 引入 html資源引入 插件
const HtmlWebpackPlugin = require('html-webpack-plugin');
// 引入 提取css 的插件
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
// 引入 css壓縮 插件
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
// 引入 js壓縮 插件 -- 內置
const terserWebpackPlugin = require('terser-webpack-plugin')// 獲取cpu的核數
const threads = os.cpus().length;// 封裝樣式打包代碼
function getStyleLoader (otherPre) {return [MiniCssExtractPlugin.loader, // 將 css 文件打包為一個單獨的文件'css-loader', // 將css資源編譯成commonjs的模塊化js{ // 需要配置就寫成對象的形式,不需要配置就寫成字符串的形式loader: 'postcss-loader',options: { // css 的兼容性處理配置postcssOptions: {plugins: [['postcss-preset-env',{// 其他選項},],],},},},otherPre].filter(Boolean)
}module.exports = {// 入口 - 相對路徑(因為編譯的時候,命令是從根目錄下執行的,所以不用修改)entry: './src/main.js',// 輸出output: {// 所有打包的資源輸出的目錄 - 絕對路徑(打包的時候,是根據該文件進行定位的)path: path.resolve(__dirname,'../dist'), // 入口文件打包輸出的名稱filename: 'static/js/main.js',// 在打包前,會清空path目錄中的所有內容,然后再進行打包 -- webpack5中使用// 如果是webpack4,則需要使用clean-webpack-plugin插件進行清空clean: true // 開發時不需要},// 加載器module: {rules: [{oneOf: [{test: /\.css$/i, // 匹配以.css結尾的文件use: getStyleLoader(), // loader的執行順序是從后往前的},{test: /\.less$/i,use: getStyleLoader('less-loader')},{test: /\.s[ac]ss$/i,use: getStyleLoader('sass-loader')},{test: /\.styl$/i,use: getStyleLoader('stylus-loader')},{   // webpack4處理圖片資源的方式:使用file-loader、url-loader。// file-loader將文件資源編譯為webpack識別的資源原封不動的進行輸出。// url-loader將圖片資源進行優化// webpack5處理圖片資源的方式(file-loader、url-loader已經內置):test: /\.(png|jpe?g|svg|webp|gif)$/,type: 'asset',parser: {dataUrlCondition: {maxSize: 30 * 1024 // 小于30kb的圖片會轉為base64 - 減少請求數量,但是體積會變大}},generator: { // 打包的圖片輸出的目錄// [hash:10]表示只保留名稱的前10位filename: 'static/images/[hash:10][ext][query]'}},{   // webpack4處理圖片資源的方式:使用file-loader// file-loader將文件資源編譯為webpack識別的資源原封不動的進行輸出。// webpack5處理圖片資源的方式(file-loader已經內置):test: /\.(ttf|woff2?)$/,type: 'asset/resource', // 只會對文件原封不動的輸出,不會轉為base64generator: { // 打包的字體輸出的目錄// [hash:10]表示只保留名稱的前10位filename: 'static/fonts/[hash:10][ext][query]'}},{   // webpack4處理其它資源的方式:使用file-loader// file-loader將文件資源編譯為webpack識別的資源原封不動的進行輸出。// webpack5處理其它資源的方式(file-loader已經內置):test: /\.(mp3|MP4|avi|.doc)$/i,type: 'asset/resource', // 只會對文件原封不動的輸出,不會轉為base64generator: { // 打包的字體輸出的目錄// [name]表示保留原始文件名filename: 'static/media/[hash:10][ext][query]'}},{test: /\.js$/,// exclude: /(node_modules)/, // 排除哪些文件不需要編譯include: path.resolve(__dirname, '../src'), // 哪些文件需要編譯// loader: 'babel-loader', // 只需要一個loader,不需要use// options: {//     cacheDirectory: true, // 開啟babel緩存//     cacheCompression: false, // 不壓縮緩存文件// }// use: {//     loader: 'babel-loader',//     options: { // 智能預設,這個對象可以不寫,那么就需要在項目的根目錄下新建babel.config.js,添加智能預設//         presets: ['@babel/preset-env'],//     },// },use: [{loader: 'thread-loader', // 開啟多進程options: {// 產生的 worker 的數量,默認是 (cpu 核心數 - 1)workers: threads,}},{loader: 'babel-loader', // 只需要一個loader,不需要useoptions: {cacheDirectory: true, // 開啟babel緩存cacheCompression: false, // 不壓縮緩存文件}}]},]}]},optimization: { // 不在這里寫的話,可以在 plugins 中寫minimizer: [new CssMinimizerPlugin(),new terserWebpackPlugin({parallel: threads, // 開啟多進程})],},// 插件plugins: [new ESLintPlugin({ // eslint檢測的文件都有哪些exclude: "node_modules", // 默認值,排除哪些文件不需要編譯context: path.resolve(__dirname, '../src'),cache: true, // 開啟緩存cacheLocation: path.resolve(__dirname, '../node_modules/.cache/eslintcache'), // 緩存文件存儲的路徑threads // 開啟多進程}),new HtmlWebpackPlugin({ // 使用 html資源引入 插件,并且保留原模版template: path.resolve(__dirname, '../index.html')}),new MiniCssExtractPlugin({ // 將所有的css提取到一個單獨的文件中filename: 'static/css/main.css'}),// new CssMinimizerPlugin(),// new terserWebpackPlugin({//     parallel: threads, // 開啟多進程// })],// 模式mode: 'production',devtool: 'source-map'
}
webpack.dev.js
// 引入os模塊
const os = require('os')
// 引入path模塊
const path = require('path')
// 引入 eslint 插件
const ESLintPlugin = require('eslint-webpack-plugin');
// 引入 html資源引入 插件
const HtmlWebpackPlugin = require('html-webpack-plugin');// 獲取cpu的核數
const threads = os.cpus().length;module.exports = {// 入口 - 相對路徑(因為編譯的時候,命令是從根目錄下執行的,所以不用修改)entry: './src/main.js',// 輸出output: {// 所有打包的資源輸出的目錄 - 絕對路徑(打包的時候,是根據該文件進行定位的)// path: path.resolve(__dirname, '../dist'), path: undefined, // 開發模式不會輸出文件// 入口文件打包輸出的名稱filename: 'static/js/main.js',// 在打包前,會清空path目錄中的所有內容,然后再進行打包 -- webpack5中使用// 如果是webpack4,則需要使用clean-webpack-plugin插件進行清空// clean: true // 開發時不需要},// 加載器module: {rules: [{   // 當規則匹配時,只使用第一個匹配規則oneOf: [{test: /\.css$/i, // 匹配以.css結尾的文件use: ['style-loader', // 將js中的css通過style標簽的形式添加到html中'css-loader' // 將css資源編譯成commonjs的模塊化js], // loader的執行順序是從后往前的},{test: /\.less$/i,use: ['style-loader','css-loader','less-loader', // 將less文件編譯為css文件],},{test: /\.s[ac]ss$/i,use: [// 將 JS 字符串生成為 style 節點'style-loader',// 將 CSS 轉化成 CommonJS 模塊'css-loader',// 將 Sass 編譯成 CSS'sass-loader',],},{test: /\.styl$/i,use: ['style-loader','css-loader','stylus-loader', // 將stylus文件編譯為css文件],},{   // webpack4處理圖片資源的方式:使用file-loader、url-loader。// file-loader將文件資源編譯為webpack識別的資源原封不動的進行輸出。// url-loader將圖片資源進行優化// webpack5處理圖片資源的方式(file-loader、url-loader已經內置):test: /\.(png|jpe?g|svg|webp|gif)$/,type: 'asset',parser: {dataUrlCondition: {maxSize: 30 * 1024 // 小于30kb的圖片會轉為base64 - 減少請求數量,但是體積會變大}},generator: { // 打包的圖片輸出的目錄// [hash:10]表示只保留名稱的前10位filename: 'static/images/[hash:10][ext][query]'}},{   // webpack4處理圖片資源的方式:使用file-loader// file-loader將文件資源編譯為webpack識別的資源原封不動的進行輸出。// webpack5處理圖片資源的方式(file-loader已經內置):test: /\.(ttf|woff2?)$/,type: 'asset/resource', // 只會對文件原封不動的輸出,不會轉為base64generator: { // 打包的字體輸出的目錄// [hash:10]表示只保留名稱的前10位filename: 'static/fonts/[hash:10][ext][query]'}},{   // webpack4處理其它資源的方式:使用file-loader// file-loader將文件資源編譯為webpack識別的資源原封不動的進行輸出。// webpack5處理其它資源的方式(file-loader已經內置):test: /\.(mp3|MP4|avi|.doc)$/i,type: 'asset/resource', // 只會對文件原封不動的輸出,不會轉為base64generator: { // 打包的字體輸出的目錄// [name]表示保留原始文件名filename: 'static/media/[hash:10][ext][query]'}},{test: /\.js$/,// exclude: /(node_modules)/, // 排除哪些文件不需要編譯include: path.resolve(__dirname, '../src'), // 哪些文件需要編譯// loader: 'babel-loader', // 只需要一個loader,不需要use// // use: {// //     loader: 'babel-loader',// //     options: { // 智能預設,這個對象可以不寫,那么就需要在項目的根目錄下新建babel.config.js,添加智能預設// //         presets: ['@babel/preset-env'],// //     },// // },use: [{loader: 'thread-loader', // 開啟多進程options: {// 產生的 worker 的數量,默認是 (cpu 核心數 - 1)workers: threads,}},{loader: 'babel-loader', // 只需要一個loader,不需要useoptions: {cacheDirectory: true, // 開啟babel緩存cacheCompression: false, // 不壓縮緩存文件}}]}]}]},// 插件plugins: [new ESLintPlugin({ // eslint檢測的文件都有哪些exclude: "node_modules", // 默認值,排除哪些文件不需要編譯context: path.resolve(__dirname, '../src'),cache: true, // 開啟緩存cacheLocation: path.resolve(__dirname, '../node_modules/.cache/eslintcache'), // 緩存文件存儲的路徑threads // 開啟多進程}),new HtmlWebpackPlugin({ // 使用 html資源引入 插件,并且保留原模版template: path.resolve(__dirname, '../index.html')})],// 開發服務器:不會輸出資源,在內存中編譯打包devServer: {host: 'localhost', // 啟動服務器的域名port: '3001', // 啟動服務器的端口號open: true, // 是否自動打開瀏覽器hot: true, // 開啟 HMR(默認值)},// 模式mode: 'development',devtool: 'cheap-module-source-map'
}

四、減少代碼體積:

1、第三方工具庫引用:Tree shaking

① 定義:

用于移除 JavaScript 中的沒有使用的代碼。

注意:它依賴 ES Module

② 使用:

Webpack 已經默認開啟了這個功能,無需其他配置,

2、Babel編譯時代碼重復插入:@babel/plugin-transform-runtime

中文文檔:https://webpack.docschina.org/loaders/babel-loader/#babel-is-injecting-helpers-into-each-file-and-bloating-my-code

① 定義:

禁用了 Babel 自動對每個文件的 runtime 注入。將輔助代碼作為一個獨立模塊,保存在@babel/plugin-transform-runtime中,需要的時候從@babel/plugin-transform-runtime 進行引入。

② 下載包:

npm install -D @babel/plugin-transform-runtime

③ 使用:

module.exports = {// 加載器module: {rules: [{oneOf: [{test: /\.js$/,// exclude: /(node_modules)/, // 排除哪些文件不需要編譯include: path.resolve(__dirname, '../src'), // 哪些文件需要編譯use: [{loader: 'thread-loader', // 開啟多進程options: {// 產生的 worker 的數量,默認是 (cpu 核心數 - 1)workers: threads,}},{loader: 'babel-loader', // 只需要一個loader,不需要useoptions: {cacheDirectory: true, // 開啟babel緩存cacheCompression: false, // 不壓縮緩存文件plugins: ['@babel/plugin-transform-runtime'], // 減少代碼體積}}]},]}]}
}

3、壓縮本地靜態資源中的圖片:

中文文檔:https://webpack.docschina.org/plugins/image-minimizer-webpack-plugin/#root

① 下載包:

npm install image-minimizer-webpack-plugin imagemin --save-dev

② 下載有損壓縮包:體積更小,但是圖片質量會受影響

npm install imagemin-gifsicle imagemin-mozjpeg imagemin-pngquant imagemin-svgo --save-dev

③ 下載無損壓縮包:體積更大,但是圖片質量比較好

npm install imagemin-gifsicle imagemin-jpegtran imagemin-optipng imagemin-svgo --save-dev

(1)安裝失敗:可以使用cnpm進行安裝

cnpm安裝使用鏈接:https://blog.csdn.net/Y1914960928/article/details/134706252

在這里插入圖片描述在這里插入圖片描述

(2)uuid 安裝包版本太低:

package.json中強制更新:

"overrides": {"uuid": "^9.0.0"},

④ 配置無損壓縮:

// 引入 圖片壓縮 插件
const ImageMinimizerPlugin = require('image-minimizer-webpack-plugin');module.exports = {// 插件plugins: [new ImageMinimizerPlugin({ // 配置圖片無損壓縮minimizer: {implementation: ImageMinimizerPlugin.imageminGenerate,options: {plugins: [['gifsicle', { interlaced: true }],['jpegtran', { progressive: true }],['optipng', { optimizationLevel: 5 }],['svgo', {plugins: ["preset-default","prefixIds",{name: "sortAttrs",params: {xmlnsOrder: "alphabetical",},},]},],],}},}),]
}

五、優化代碼運行性能:

1、代碼分割:CodeSplit

① 功能:

(1)分割文件:

將打包生成的文件進行分割,生成多個js文件

(2)按需加載:

需要哪個文件就加載哪個文件

② 方法一:將js文件打包拆分為多入口

在這里插入圖片描述

(1)多入口文件中復用的代碼需要打包到單獨的文件中(提取公共模塊):

在這里插入圖片描述

中文文檔:https://webpack.docschina.org/plugins/split-chunks-plugin#root

webpack.config.js文件中寫入代碼:
const path = require('path')const htmlWebpackPlugin = require('html-webpack-plugin')module.exports = {// entry: './src/main.js',entry: { // 多入口app: './src/app.js',main: './src/main.js'},output: {path: path.resolve(__dirname, 'dist'),filename: '[name].js'},plugins: [new htmlWebpackPlugin({template: path.resolve(__dirname, 'public/index.html'),})],optimization: { // 代碼分割 配置splitChunks: {chunks: 'all', // 對所有模塊都進行分割// 以下是默認值// minSize: 20000, // 分割的代碼最小體積// minRemainingSize: 0, // 分割代碼后的最小體積,確保提取的文件大小不能為0// minChunks: 1, // 最少被引用的次數,滿足條件才會代碼分割// maxAsyncRequests: 30, // 按需加載時,并行加載的文件的最大數量// maxInitialRequests: 30, // 入口js文件中,最大的并行請求數量// enforceSizeThreshold: 50000, // 超過 50kb 一定會被單獨打包(此時會忽略minRemainingSize、maxAsyncRequests、maxInitialRequests)// cacheGroups: { // 緩存組,將所有模塊分為不同的緩存組(哪些模塊會被打包到一個組)//     defaultVendors: { // 組名//         test: /[\\/]node_modules[\\/]/, // 將 node_modules 中的代碼打包到 vendors 組//         priority: -10, // 優先級,數值越大,越先被打包//         reuseExistingChunk: true, // 如果當前模塊已經被打包,就直接復用,而不是重新打包//     },//     default: { // 可以在這里進行默認值的更改//         minChunks: 2,//         priority: -20,//         reuseExistingChunk: true,//     },// },cacheGroups: {default: {minSize: 0,minChunks: 2,priority: -20,reuseExistingChunk: true,},}},},mode: 'development'
}
(2)按需加載,動態引入:
main.js中的代碼如下:
// 使用公共文件中的方法 sum 
import {sum} from "./math"
console.log(sum(4,5))
console.log('這是main.js')
// 靜態加載
// import calc from './calc.js'document.getElementById('btn').addEventListener('click', () => {// console.log('點擊按鈕', calc(2,3))// import 的動態引入import('./calc.js').then((module) => {console.log('模塊動態加載成功',module.default(4,5))}).catch((err) => {console.log('模塊動態加載失敗',err)})
})

在這里插入圖片描述

③ 方法二:單入口文件進行按需加載

webpack.config.js文件中寫入代碼:
module.exports = {optimization: { // 代碼分割 配置splitChunks: {chunks: 'all', // 對所有模塊都進行分割}
}

請注意:如果eslint不支持動態的導入語法,需要新增插件:import

2、

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

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

相關文章

LLM表征工程還有哪些值得做的地方

LLM表征工程還有哪些值得做的地方 在大型語言模型(LLM)的表征工程領域,近年來涌現出多個具有突破性的創新方向,這些方法通過動態調整、多模態融合、結構化記憶增強等技術,顯著提升了模型的適應性、可解釋性和效率。 一、動態自適應表征:從靜態到動態的范式革新 傳統LL…

LabVIEW智能避障小車

?LabVIEW結合 NI、德州儀器(TI)、歐姆龍(Omron)等硬件,設計實現了一款具備智能避障、循跡功能的輪式機器人。系統支持手動操控與自主運行兩種模式,通過無線通信實時傳輸傳感器數據與圖像信息,在…

邏輯代數中的基本規則,代入規則和反演規則,對偶規則

本文探討了代入規則在邏輯等式中的應用,解釋了如何通過替換變量來保持等式的正確性,同時介紹了反演規則和對偶規則的概念。代入規則定義:在任何一個包含變量A的邏輯等式中,如果用另一個邏輯式代入式中的所有A位置,則等式依然成立反…

Javaweb使用websocket,請先連上demo好吧!很簡單的!

Javaweb使用websocket先看結構及效果MyWebSocketHandler用于處理消息WebSocketConfig用于配置建聯地址等SchedulerConfig必須配置這個MyWebSocketInterceptor建聯的攔截器SpringBootWebsocketApplication啟動類POM依賴展示效果源碼先看結構及效果 MyWebSocketHandler用于處理消…

文心大模型4.5開源測評:保姆級部署教程+多維度測試驗證

前言:國產大模型開源的破局時刻 2025年6月百度文心大模型4.5系列的開源,標志著國產AI從"技術跟跑"向"生態共建"的關鍵跨越。 文心大模型4.5是百度自主研發的新一代原生多模態基礎大模型,通過多個模態聯合建模實現協同優…

前端學習5:Float學習(僅簡單了解,引出flex)

一、Float基礎概念1. 設計初衷: float最初是為實現文字環繞圖片的效果(類似雜志排版),后來被開發者用來做頁面布局。2. 核心特性:使元素脫離普通文檔流(但仍在DOM中)元素會向左/右浮動&#xff…

08-自然壁紙實戰教程-視頻列表-云

08-自然壁紙實戰教程-視頻列表 前言 視頻列表頁面本質上也是一個數據展示的列表,不同之處在于之前是是展示壁紙,Image組件負責渲染,這里展示的是視頻,使用Video組件,另外視頻頁面也實現了下載的基本功能,…

SCI特刊征稿

我們團隊聯合北京工業大學研究團隊在SCI源刊CMC組織了特刊SI: Advanced Edge Computing and Artificial Intelligence in Smart Environment,主要收錄邊緣計算和人工智能方向的文章,歡迎領域專家和學者投稿,網址https://www.techscience.com/cmc/special…

DO,VO,DTO.....

在 Java 項目里(尤其是 Spring、MyBatis 這類框架),經常會看到一堆以 O 結尾的類:VO、DO、DTO、BO、POJO……它們本質上都是普通的 Java Bean(即 POJO),但職責和出現的位置不同。下面用“用戶下…

數據結構之并查集和LRUCache

系列文章目錄 數據結構之ArrayList_arraylist o(1) o(n)-CSDN博客 數據結構之LinkedList-CSDN博客 數據結構之棧_棧有什么方法-CSDN博客 數據結構之隊列-CSDN博客 數據結構之二叉樹-CSDN博客 數據結構之優先級隊列-CSDN博客 常見的排序方法-CSDN博客 數據結構之Map和Se…

UE5多人MOBA+GAS 21、給升龍添加連段攻擊,從角色的按下事件中傳遞事件給GA

文章目錄給升龍制作可連段緩存下一連段用普攻鍵來觸發升龍后續的連段在角色中發送按下普攻標簽事件在升龍中接收按下事件,觸發連段以及傷害和力量的傳遞最后在藍圖中設置一下升龍技能的完整代碼給升龍制作可連段 給升龍技能添加一些連段 緩存下一連段 緩存下一連…

基于光柵傳感器+FPGA+ARM的測量控制解決方案

基于光柵傳感器結合FPGA與ARM的測量控制解決方案,通過硬件協同分工實現高精度、實時性及多場景適應性:?? ?一、系統架構分工??傳感層(光柵傳感器)?采用光柵尺輸出正交脈沖信號,分辨率達0.5μm,精度1μ…

NW831NW910美光固態閃存NW887NW888

美光固態閃存深度解析:NW831、NW910、NW887、NW888系列全方位評測一、技術根基與架構創新美光NW系列固態閃存的技術突破源于其先進的G9 NAND架構,該架構采用5納米制程工藝和多層3D堆疊技術,在單位面積內實現了高達256層的存儲單元堆疊&#x…

reasense api 文檔

API 架構 英特爾實感(Intel RealSense?)API 提供對深度攝像頭流數據的配置、控制和訪問功能。該 API 支持通過高層級 API 快速啟用攝像頭基礎功能,或通過底層級 API 全面控制所有攝像頭設置。請根據需求選擇合適的 API: 高層級 P…

ArkTs實現骰子布局

Entry Component struct workA {// 定義6種顏色數組,使用ResourceColor類型確保顏色值合法性State color: ResourceColor[] [#ef2816, #f0a200, #6ab002, #005868, #41192e, #141411]// 定義公共樣式裝飾器,避免重復樣式代碼Stylesys() {// 白色圓形基礎…

c語言內存函數以及數據在內存中的存儲

代碼見:登錄 - Gitee.com 1. memcpy使用和模擬實現 strcpy,strncpy是拷貝字符串的,有局限性 函數原型: void * memcpy ( void * destination, const void * source, size_t num ); 功能: memcpy 是完成內存塊拷?的…

Codeforces Round 787 (Div. 3)(A,B,C,D,E,F,G)

Codeforces Round 787 (Div. 3) - Codeforces A. Food for Animals 題意 有a袋狗糧,b袋貓糧,c袋通用糧食,問現在有x只狗y只貓,每一個動物都要吃一袋糧食,問糧食夠不夠吃 思路 首先肯定考慮貓吃貓糧,狗吃狗糧。然后再考慮如果不夠吃的話才會去吃通用…

LLaMA-Factory的webui快速入門

一、webui的啟動方式 LLaMA-Factory 支持通過 WebUI 零代碼微調大語言模型。 在完成安裝 后,您可以通過以下指令進入 WebUI: llamafactory-cli webui 使用上面命令啟動服務后,即可使用默認7860端口進行訪問。訪問地址:http://ip:7860,截止…

【第四節】ubuntu server安裝docker

首先更新軟件源 sudo apt update sudo apt upgrade安裝docker 下載 Docker 官方 GPG 密鑰 # 1. 下載 Docker 官方 GPG 密鑰 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg再次更新軟件源…

Kubernetes的微服務

用控制器來完成集群的工作負載,那么應用如何暴漏出去?需要通過微服務暴漏出去后才能被訪問Service是一組提供相同服務的Pod對外開放的接口。借助Service,應用可以實現服務發現和負載均衡。service默認只支持4層負載均衡能力,沒有7…