Webpack性能優化

一、代碼分割

代碼分割能夠將代碼分成多個塊,按需載入,從而提高載入速度和性能。Webpack通過import()函數或require.ensure()實現代碼分割。

// 使用import()函數實現代碼分割
import('./math').then(math => {
  console.log(math.add(16, 26));
});
  
// 使用require.ensure()實現代碼分割
require.ensure(['./math'], function(require) {
  const math = require('./math');
  console.log(math.add(16, 26));
});

使用webpack-bundle-analyzer工具可以分析代碼分割後的模塊組成,從而優化代碼分割策略。

二、Tree Shaking

Tree Shaking是指刪除沒有使用的代碼,從而減小打包後的代碼體積。開啟Tree Shaking需要ES6的模塊引入方式,並在webpack配置文件中開啟壓縮模式。

// math.js
export function add(a, b) {
  return a + b;
}

export function square(a) {
  return a * a;
}

// app.js
import { add } from './math';

console.log(add(16, 26));

三、懶載入

懶載入能夠將頁面劃分成多個區域,在需要載入時再請求資源,提高了初始載入速度和性能。Webpack可以使用動態import語法實現懶載入。

// 使用動態import語法實現懶載入
document.getElementById('btn').addEventListener('click', () => {
  import('./lazy-loaded-module').then(module => {
    // 使用模塊
  });
});

四、緩存

使用合理的緩存策略能夠減少網路請求,提升性能。Webpack通過output.filename屬性設置文件名,通過output.chunkFilename屬性設置代碼分割後的文件名。

//webpack.config.js

output: {
  filename: '[name].[contenthash].js',
  chunkFilename: '[name].[contenthash].js'
}

五、優化Loader

Webpack的Loader是打包過程中用於處理文件的轉換器。優化Loader可以減小打包時間和提高性能。以下是一些優化Loader的方法:

1、使用include/exclude設置匹配規則

module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        include: [
          path.resolve(__dirname, 'src')
        ],
        exclude: [
          path.resolve(__dirname, 'node_modules')
        ],
        loader: 'babel-loader'
      }
    ]
  }
};

2、儘可能使用Loader默認配置

module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        use: 'babel-loader'
      }
    ]
  }
};

3、儘可能使用最小化的Loader

module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        use: {
          loader: 'babel-loader',
          options: {
            // 儘可能使用最小化的babel-preset-env
            presets: [['env', { modules: false }]]
          }
        }
      }
    ]
  }
};

4、使用HappyPack並行處理Loader

const HappyPack = require('happypack');

module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        use: 'happypack/loader?id=js'
      }
    ]
  },
  plugins: [
    new HappyPack({
      id: 'js',
      threads: 4,
      loaders: ['babel-loader']
    })
  ]
};

5、使用緩存Loader結果

const HardSourceWebpackPlugin = require('hard-source-webpack-plugin');

module.exports = {
  plugins: [
    new HardSourceWebpackPlugin()
  ]
};

六、優化Resolve

使用優化路徑解析的Resolve配置項能夠減少查找時間,提高性能。並通過extensions配置項減小文件查找範圍。

module.exports = {
  resolve: {
    // 配置別名,避免路徑深度影響性能
    alias: {
      '@': path.resolve(__dirname, 'src')
    },
    
    // 配置查找模塊的路徑,避免查找時間過長
    modules: [path.resolve(__dirname, 'src'), 'node_modules'],
    
    // 啟用了擴展名的查找
    extensions: ['.js', '.json']
  }
};

七、優化DevServer

使用Webpack DevServer能夠提高開發效率和性能。以下方法可以優化DevServer:

1、利用內存減少IO操作

module.exports = {
  devServer: {
    // 解決多頁面刷新導致重新構建所有文件的問題
    lazy: false,
    // 將資源放入內存中,減少IO操作
    contentBase: false
  }
};

2、開啟Gzip壓縮

const CompressionPlugin = require('compression-webpack-plugin');

module.exports = {
  plugins: [
    new CompressionPlugin()
  ]
};

3、使用Hot Module Replacement(HMR)

module.exports = {
  devServer: {
    // 開啟HMR
    hot: true
  },
  plugins: [
    // Webpack內置的HMR插件
    new webpack.HotModuleReplacementPlugin()
  ]
};

八、使用優化後的Loader和插件

以下是一些常見Loader和插件的優化:

1、babel-loader優化

使用babel-loader的cacheDirectory選項可以啟用緩存,減小編譯時間。

module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        use: [
          {
            loader: 'babel-loader',
            options: {
              cacheDirectory: true
            }
          }
        ]
      }
    ]
  }
};

2、css-loader和style-loader優化

使用mini-css-extract-plugin插件可以把CSS提取成單獨的文件,減少JavaScript文件體積,提升載入速度。

const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = {
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          {
            loader: MiniCssExtractPlugin.loader,
            options: {
              // 開啟HMR
              hmr: true,
              // 如果模塊是HMR能夠更新的,將導出到CSS否則將創建一個新的樣式唯一URL
              reloadAll: true
            }
          },
          'css-loader'
        ]
      }
    ]
  },
  plugins: [
    new MiniCssExtractPlugin({
      filename: '[name].[contenthash].css'
    })
  ]
};

3、html-webpack-plugin優化

使用html-webpack-plugin的template選項可以指定HTML模板路徑,從而減小編譯速度。

const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
  plugins: [
    new HtmlWebpackPlugin({
      template: './src/index.html'
    })
  ]
};

4、UglifyJsPlugin優化

使用terser-webpack-plugin代替UglifyJsPlugin,可以提高壓縮速度和縮小代碼大小。

const TerserPlugin = require('terser-webpack-plugin');

module.exports = {
  optimization: {
    minimizer: [
      new TerserPlugin({
        cache: true,
        parallel: true,
        sourceMap: true // 必須啟用,否則將影響調試
      })
    ]
  }
};

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/160014.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-20 00:17
下一篇 2024-11-20 00:17

相關推薦

發表回復

登錄後才能評論