使用 Webpack 进行代码优化的 16 个技巧

Webpack 是一个前端打包工具,可将多个 JavaScript 文件打包为单个文件。使用 Webpack 进行代码优化可以提高页面加载速度,减少 HTTP 请求次数,降低页面大小。以下是使用 Webpack 进行代码优化的 16 个技巧。

1. 使用 Webpack Bundle Analyzer 插件

使用 Webpack Bundle Analyzer 插件可以可视化 Webpack 打包的结果,帮助开发者找出文件大小、模块依赖等问题。

需要安装插件:

npm install --save-dev webpack-bundle-analyzer

使用如下配置启动 Webpack:

const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;

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

2. 压缩代码

使用 Webpack 的 UglifyJS 插件可以将 JavaScript 代码压缩,减少文件大小。

需要安装插件:

npm install --save-dev uglifyjs-webpack-plugin

使用如下配置启动 Webpack:

const UglifyJSPlugin = require('uglifyjs-webpack-plugin');

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

3. 使用 Scope Hoisting

Webpack 2 之后引入了 Scope Hoisting 技术,可以将模块间的依赖关系简化为一些变量。

module.exports = {
  //...
  plugins: [new webpack.optimize.ModuleConcatenationPlugin()]
};

4. 使用 Tree Shaking

Tree Shaking 技术通过静态分析移除无用代码,减少文件大小。

需要在配置文件中开启 optimization,并将 sideEffects 设置为 false,表示所有代码都是纯函数,没有副作用。

module.exports = {
  //...
  optimization: {
    usedExports: true,
    sideEffects: false
  }
};

5. 按需加载

Webpack 可以将模块拆分为单独的文件,按需加载,减少页面加载时间。需要使用 import() 语句来实现动态加载。

import('./xxx').then((module) => {
  //...
});

6. 预加载

使用 webpackPrefetch 可以在主资源加载完成后预加载相关资源,加快页面加载速度。

import(/* webpackPrefetch: true */ './xxx').then((module) => {
  //...
});

7. 开启 Gzip 压缩

可以在 Web 服务器上启用 Gzip 压缩,减少网络传输的数据量。需要在 Webpack 中设置 compression

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

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

8. Inline Small Assets

可以将较小的资源内联到 HTML 或 CSS 文件中,减少 HTTP 请求次数。

{
  test: /\.(png|jpg|gif)$/i,
  use: [
    {
      loader: 'url-loader',
      options: {
        limit: 1024,
        fallback: 'file-loader',
        name: '[name].[ext]',
        outputPath: 'assets'
      }
    }
  ]
}

9. 使用 NamedModulesPlugin

NamedModulesPlugin 可以在开发环境中向控制台输出有改动的模块名称。

module.exports = {
  //...
  plugins: [new webpack.NamedModulesPlugin()]
};

10. 使用 HashedModuleIdsPlugin

HashedModuleIdsPlugin 可以在生产环境中向应用程序添加短哈希值,以便更好地处理缓存机制。

module.exports = {
  //...
  plugins: [new webpack.HashedModuleIdsPlugin()]
};

11. 使用 DllPlugin 和 DllReferencePlugin

DllPlugin 和 DllReferencePlugin 可以将开发和生产之间的公共代码提取为单独的 DLL,加快构建和减小打包文件。

需要先创建一个 webpack.config.dll.js 文件:

const path = require('path');
const webpack = require('webpack');

module.exports = {
  mode: 'production',
  entry: {
    vendor: ['react', 'react-dom']
  },
  output: {
    filename: '[name].dll.js',
    path: path.resolve(__dirname, 'dist'),
    library: '[name]_dll'
  },
  plugins: [new webpack.DllPlugin({
    name: '[name]_dll',
    path: path.join(__dirname, 'dist', '[name].manifest.json')
  })]
};

然后启动 Webpack,得到生成的 vendor.dll.jsvendor.manifest.json 文件。

接下来在原来的 Webpack 配置文件中添加 DllReferencePlugin:

const webpack = require('webpack');
const path = require('path');

module.exports = {
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist')
  },
  plugins: [
    new webpack.DllReferencePlugin({
      context: __dirname,
      manifest: require('./dist/vendor.manifest.json')
    })
  ]
};

12. 使用 ParallelUglifyPlugin

ParallelUglifyPlugin 可以使用多个进程并行压缩代码,提高压缩速度。

const ParallelUglifyPlugin = require('webpack-parallel-uglify-plugin');

module.exports = {
  //...
  plugins: [
    new ParallelUglifyPlugin({
      cacheDir: true,
      uglifyJS: {},
      sourceMap: true
    })
  ]
};

13. 拆分第三方库

将第三方库拆分为单独的包可以提高构建速度,缩小打包文件。

module.exports = {
  optimization: {
    splitChunks: {
      cacheGroups: {
        commons: {
          test: /[\\/]node_modules[\\/]/,
          name: 'vendors',
          chunks: 'all'
        }
      }
    }
  }
};

14. 使用 babel-loader 缓存

将 babel 编译器的缓存设置为 true,可以加速编译过程。

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

15. 使用 IgnorePlugin

使用 IgnorePlugin 可以忽略某些文件,加快编译速度。

module.exports = {
  //...
  plugins: [new webpack.IgnorePlugin(/\.\/locale/)]
};

16. 使用 HardSourceWebpackPlugin

HardSourceWebpackPlugin 可以在文件系统中缓存编译后的代码和构建中间文件,以避免重新编译(特别是在多次启动后)而导致的大量静态资源和昂贵的跨系统文件系统操作。

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

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

总结:

使用 Webpack 进行代码优化可以显著提高页面加载速度,减少 HTTP 请求次数,降低页面大小。本文介绍了 16 个使用 Webpack 进行代码优化的技巧,每个技巧都具有指导意义和深度,同时包含了示例代码。希望能够帮助到正在使用 Webpack 的开发者。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65907e22eb4cecbf2d5dc468


纠错反馈