0
点赞
收藏
分享

微信扫一扫

前端性能优化篇之webpack如何提⾼的打包速度、如何减少打包体积、如何⽤来优化前端性能、如何提⾼构建速度?

Mezereon 2024-06-19 阅读 43

目录


如何提⾼webpack的打包速度?

1. 使用最新版本的Webpack和相关插件:

确保你正在使用最新版本的Webpack和相关插件,因为它们通常会包含性能改进。

2. 合理配置Loader:

避免不必要的文件处理,只对需要的文件使用相应的Loader,并尽量精简Loader链。

首先,我们可以通过配置Loader的文件搜索范围来提高效率。比如,对于Babel Loader,我们希望它只作用在JS代码上,因此我们可以使用includeexclude属性来指定需要处理的文件夹和不需要处理的文件夹,避免不必要的文件处理。

module.exports = {
  module: {
    rules: [
      {
        // 只对js文件使用babel-loader
        test: /\.js$/,
        loader: 'babel-loader',
        // 只在src文件夹下查找
        include: [resolve('src')],
        // 不会去查找的路径
        exclude: /node_modules/
      }
    ]
  }
}

另外,为了加快打包时间,我们可以将Babel编译过的文件缓存起来,这样下次只需要编译更改过的代码文件即可。你可以通过设置cacheDirectory选项为true来实现这一点。

loader: 'babel-loader?cacheDirectory=true'

通过以上方式,我们可以优化Loader的配置,避免不必要的文件处理,只对需要的文件使用相应的Loader,并尽量精简Loader链,从而提高Webpack的打包效率。

3. 使用HappyPack或thread-loader:

这些工具可以将任务分发给多个子进程,以充分利用多核处理器的优势,加快构建速度。

当使用Webpack进行打包时,由于Node是单线程运行的,因此在执行Loader时可能会出现长时间编译任务导致等待的情况。为了充分利用系统资源加快打包效率,可以使用HappyPack工具将Loader的同步执行转换为并行执行。

首先,需要对Webpack配置进行调整,指定需要使用HappyPack的Loader,同时设置相应的ID以及线程数量。比如,对于Babel Loader的配置,可以这样进行设置:

module: {
  rules: [
    {
      test: /\.js$/,
      include: [resolve('src')],
      exclude: /node_modules/,
      // 使用HappyPack的loader
      loader: 'happypack/loader?id=happybabel'
    }
  ]
},
plugins: [
  new HappyPack({
    id: 'happybabel',
    loaders: ['babel-loader?cacheDirectory'],
    // 开启 4 个线程
    threads: 4
  })
]

通过这样的配置,HappyPack可以将任务分发给多个子进程,充分利用多核处理器的优势,从而加快构建速度,提高Webpack的打包效率。

4. 使用DllPlugin预编译依赖模块:

将第三方库单独打包,避免每次构建都重新编译这些模块。

当使用DllPlugin预编译依赖模块时,我们可以将第三方库单独打包,从而避免每次构建都重新编译这些模块。这种方式能大大减少打包类库的次数,只有在类库更新版本时才需要重新打包,并且还能实现将公共代码抽离成单独文件的优化方案。

首先,我们需要在一个单独的文件中配置DllPlugin,比如命名为webpack.dll.conf.js。在这个文件中,我们指定需要统一打包的类库,然后使用DllPlugin进行配置,示例代码如下:

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

module.exports = {
  entry: {
    // 想统一打包的类库
    vendor: ['react']
  },
  output: {
    path: path.join(__dirname, 'dist'),
    filename: '[name].dll.js',
    library: '[name]-[hash]'
  },
  plugins: [
    new webpack.DllPlugin({
      // name 必须和 output.library 一致
      name: '[name]-[hash]',
      // 该属性需要与 DllReferencePlugin 中一致
      context: __dirname,
      path: path.join(__dirname, 'dist', '[name]-manifest.json')
    })
  ]
};

接着,我们执行这个配置文件以生成依赖文件。然后,在项目的Webpack配置文件中,我们需要使用DllReferencePlugin将依赖文件引入项目中,示例代码如下:

module.exports = {
  // ...其他配置
  plugins: [
    new webpack.DllReferencePlugin({
      context: __dirname,
      // manifest 就是之前打包出来的 json 文件
      manifest: require('./dist/vendor-manifest.json'),
    })
  ]
};

通过以上步骤,我们可以使用DllPlugin预编译依赖模块,将第三方库单独打包,避免每次构建都重新编译这些模块,从而提高Webpack的打包效率。

5. 使用Tree Shaking:

确保你的代码中使用ES6模块,并配置Webpack进行Tree Shaking,去除未引用的代码,减小最终打包体积。

Tree Shaking是指通过静态分析,去除JavaScript代码中未被引用的部分,使得最终打包的文件更小、加载速度更快。

ES6模块语法允许我们使用importexport来管理模块之间的依赖关系。这种语法使得Tree Shaking成为可能。

在一个实际的项目中,假设你正在开发一个网页应用,你需要确保应用在加载时能够尽快呈现给用户,并且在各种网络条件下都能快速加载。同时,你也希望减小应用的体积,以提高整体性能。

假设你的项目中使用了大量的第三方库和工具,但实际只使用了其中的一部分功能。你希望在打包过程中去除未使用的代码,以减小最终的打包体积。

// math.js
export function square(x) {
  return x * x;
}

export function cube(x) {
  return x * x * x;
}

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

console.log(square(5));
  1. 确保你的代码中使用了ES6模块语法,例如使用importexport来组织你的代码。
  2. 在Webpack配置中,确保开启了对ES6模块的支持,并开启了Tree Shaking功能。
  3. 当Webpack进行打包时,它会分析你的代码,识别出未被引用的部分(比如cube函数),并将其从最终的打包文件中移除。

Tree Shaking通过去除未引用的代码,可以显著减小最终的打包体积,提高应用的加载速度。在实际项目中,结合ES6模块语法和正确的Webpack配置,可以轻松使用Tree Shaking来优化前端应用的性能。

6. 使用缓存:

使用babel-loader、ts-loader等时,开启缓存选项,以避免每次都重新编译所有文件。

什么是缓存选项?
在Webpack中,很多Loader(比如babel-loader、ts-loader等)都提供了缓存选项。开启这些选项可以让Webpack在重新编译时避免重新处理未改动的文件,从而加快构建速度。

在一个实际的项目中,当你使用诸如babel-loader和ts-loader这样的工具来处理JavaScript和TypeScript文件时,你希望避免每次都重新编译所有文件,特别是在项目变得庞大时,重新编译所有文件会消耗大量时间。

假设你的项目中有大量的JavaScript和TypeScript文件需要通过babel-loader和ts-loader进行编译,你希望通过开启缓存选项来减少不必要的重复编译,提高构建速度。

// webpack.config.js
module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        use: {
          loader: 'babel-loader',
          options: {
            cacheDirectory: true // 开启babel-loader的缓存选项
          }
        }
      },
      {
        test: /\.ts$/,
        use: {
          loader: 'ts-loader',
          options: {
            transpileOnly: true, // 只进行转译,不进行类型检查
            happyPackMode: true, // 开启HappyPack模式
            experimentalWatchApi: true, // 使用实验性的监视API
            cache: true // 开启ts-loader的缓存选项
          }
        }
      }
    ]
  }
};
  1. 在Webpack配置中,针对babel-loader和ts-loader,分别开启它们的缓存选项。
  2. 当开启了缓存选项后,Webpack会将已经编译过的结果缓存起来,下次重新构建时会优先使用缓存的结果,而不是重新编译所有文件。

通过开启babel-loader和ts-loader的缓存选项,我们可以避免每次都重新编译所有文件,从而显著提高构建速度。在大型项目中,这种优化尤为重要,能够节省大量的开发时间,提高开发效率。

7. Code Splitting:

合理使用Webpack的代码分割功能,按需加载资源,减少初始加载时间。

代码分割是指将你的代码分成多个小块,并在需要时按需加载这些小块,从而减少初始加载时间。Webpack提供了代码分割功能,可以帮助我们优化应用程序的性能。

在一个实际的项目中,当你的应用变得庞大时,初始加载时间可能会变长。为了改善用户体验,你希望减少初始加载时间,让用户能够更快地看到应用界面。

假设你正在开发一个网页应用,应用中有一些功能模块只在特定情况下才会被使用到。你希望通过代码分割,将这些功能模块单独打包,并在需要时再动态加载,以减少初始加载时间。

// app.js
import('./module1').then(module1 => {
  // 使用module1
});

// webpack.config.js
module.exports = {
  //...
  optimization: {
    splitChunks: {
      chunks: 'all'
    }
  }
};
  1. 在代码中,使用动态import()来引入需要按需加载的模块。
  2. 在Webpack配置中,通过optimization.splitChunks配置来告诉Webpack对所有模块进行代码分割。

通过合理使用Webpack的代码分割功能,我们可以将应用拆分成小块,并在需要时按需加载,从而减少初始加载时间,提高用户体验。在大型应用中,代码分割是优化性能的重要手段之一,能够有效减少不必要的加载,提升应用的响应速度。

8. 压缩输出:

在生产环境中启用Webpack的压缩插件(如UglifyJsPlugin、TerserPlugin)来减小输出体积。

在生产环境中,我们需要启用Webpack的压缩插件(如UglifyJsPlugin、TerserPlugin)来减小输出体积。

在Webpack3中,通常使用UglifyJS来压缩代码。然而,由于UglifyJS是单线程运行的,为了加快效率,可以使用webpack-parallel-uglify-plugin来并行运行UglifyJS,从而提高效率。

而在Webpack4中,不再需要进行上述操作。只需将mode设置为production就可以默认开启以上功能。代码压缩是我们必须执行的性能优化方案。当然,我们不仅可以压缩JS代码,还可以压缩HTML、CSS代码。在压缩JS代码的过程中,我们还可以通过配置实现例如删除console.log这类代码的功能。

9. 其他

当优化Webpack的打包速度时,我们可以通过一些小的优化点来加快打包速度:

  1. resolve.extensions:这个属性用来表明文件后缀列表,默认查找顺序是 [‘.js’, ‘.json’]。如果你的导入文件没有添加后缀,Webpack会按照这个顺序查找文件。为了加快查找速度,我们应该尽可能减少后缀列表长度,并将出现频率高的后缀排在前面。

  2. resolve.alias:通过别名的方式来映射一个路径,能让Webpack更快地找到路径。这样可以避免深层次的文件递归查找,提高查找速度。

  3. module.noParse:如果你确定一个文件下没有其他依赖,就可以使用该属性让Webpack不扫描该文件。这种方式对于大型的类库很有帮助,可以节省扫描时间,加快打包速度。

这些优化点都能够在一定程度上提高Webpack的打包速度,特别是在处理大型项目时尤为重要。

通过以上方法,你可以有效地提高Webpack的打包速度。

如何减少 Webpack 打包体积

当优化Webpack打包体积时,你可以采取以下措施:

1. 代码压缩

在生产环境中启用Webpack的压缩插件(如UglifyJsPlugin、TerserPlugin)来减小输出体积。这通过删除注释、空格以及压缩代码来实现。

2. Tree Shaking

确保使用ES6模块化语法,并且通过静态分析去除未引用的代码,以减少最终打包的体积。这意味着只有被引用的代码会被包含在最终的bundle中。

3. 按需加载

使用动态导入(dynamic import)或者懒加载技术,只在需要时加载代码,而不是一次性将所有代码打包到一个文件中。

4. 图片压缩

对图片进行压缩处理,可以使用像imagemin这样的工具,以减小图片所占的空间。这可以通过配置Webpack的loader来实现。

5. 移除无用代码

检查并移除项目中未使用的第三方库或工具,以减少打包体积。这包括清理未使用的依赖和工具库。

6. 优化配置

通过合理配置Webpack的splitChunksPlugin和optimization.splitChunks等功能,将公共代码抽离成单独文件,避免重复打包。这有助于减小每个页面加载的体积。

7. 使用CDN

将一些稳定不经常更新的第三方库通过CDN引入,减少打包体积。这样可以利用缓存和并行下载来提高加载速度。

项目需求

在实际项目中,我们通常会面对需要优化网页加载速度和性能的情况。例如,在一个电子商务网站中,随着产品数量的增加,前端资源的体积也会相应增加,因此需要对网站进行性能优化,减少首屏加载时间。

假设我们有一个React应用,其中包含大量图片和第三方库。我们需要确保页面加载速度快,用户能够快速浏览产品信息。

// webpack.config.js
const path = require('path');
const TerserPlugin = require('terser-webpack-plugin');

module.exports = {
  mode: 'production',
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist'),
  },
  optimization: {
    minimize: true,
    minimizer: [new TerserPlugin()],
  },
  module: {
    rules: [
      {
        test: /\.(png|jpe?g|gif)$/i,
        use: [
          {
            loader: 'file-loader',
          },
        ],
      },
    ],
  },
};

上述代码展示了一个基本的Webpack配置,其中使用了TerserPlugin来进行代码压缩,同时使用file-loader来处理图片文件。这样可以在生产环境中减小Webpack打包体积。

总结

优化Webpack打包体积是一个持续的过程,需要综合考虑代码压缩、按需加载、Tree Shaking等多种手段。

如何⽤webpack来优化前端性能?

用Webpack优化前端性能

优化前端性能,就是通过调整Webpack的配置,使得最终打包的结果在浏览器中能够更快速、高效地运行。

压缩代码

压缩代码是指通过删除多余的代码、注释,以及简化代码的写法来减小文件体积。在Webpack中,可以使用UglifyJsPlugin和ParallelUglifyPlugin来压缩JS文件,同时利用cssnano(通常与css-loader?minimize一起使用)来压缩CSS。

利用CDN加速

在构建过程中,将引用的静态资源路径修改为CDN上对应的路径,以便利用CDN加速加载。这可以通过Webpack的output参数和各loader的publicPath参数来修改资源路径。

Tree Shaking

Tree Shaking是指通过删除永远不会执行到的代码片段来减小打包体积。在Webpack中,可以通过在启动webpack时追加参数 --optimize-minimize 来实现。

Code Splitting

Code Splitting是将代码按路由或组件维度分块,实现按需加载,同时充分利用浏览器缓存。这可以通过Webpack的动态导入(dynamic import)或者React.lazy()来实现。

提取公共第三方库

利用SplitChunksPlugin插件来进行公共模块抽取,以便利用浏览器缓存长期缓存这些无需频繁变动的公共代码。

项目需求

在一个电商网站中,需要优化页面加载速度和性能,确保用户能够快速浏览产品信息,同时减少首屏加载时间。

假设我们有一个React应用,其中包含大量图片和第三方库。我们需要确保页面加载速度快,用户能够快速浏览产品信息。

// webpack.config.js
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
const ParallelUglifyPlugin = require('webpack-parallel-uglify-plugin');
const cssnano = require('cssnano');

module.exports = {
  mode: 'production',
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist'),
    publicPath: 'https://cdn.example.com/assets/',
  },
  optimization: {
    minimizer: [
      new UglifyJsPlugin(),
      new ParallelUglifyPlugin({
        // configuration options
      }),
    ],
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          'style-loader',
          {
            loader: 'css-loader',
            options: {
              minimize: true,
            },
          },
        ],
      },
    ],
  },
};

上述代码展示了一个基本的Webpack配置,其中使用了UglifyJsPlugin和ParallelUglifyPlugin来压缩JS文件,同时利用css-loader来压缩CSS。另外,通过output的publicPath参数设置CDN路径。

总结

优化Webpack打包体积是一个持续的过程,需要综合考虑代码压缩、按需加载、Tree Shaking等多种手段。通过合理配置Webpack和优化代码,可以达到提升前端性能的目的。

如何提⾼webpack的构建速度?

当要提高Webpack的构建速度时,可以采取以下一些方法:

1. 使用最新版本的Webpack

确保你使用的是最新版本的Webpack。每个新版本通常都会带来性能改进和优化。

2. 精心选择Loader和Plugin

只加载必要的资源和文件,并选择对你的项目最优化的Loader和Plugin。有时候,不必要的Loader或Plugin会拖慢构建速度。

3. 使用HappyPack

HappyPack可以将任务分发给多个子进程并行地执行,从而加快构建速度。

4. 缩小文件搜索范围

通过配置resolve.modules、resolve.extensions、resolve.mainFiles等选项,可以缩小Webpack在文件系统中搜索文件的范围,从而提高构建速度。

5. 使用DllPlugin预编译资源模块

DllPlugin可以提前进行编译打包第三方库(如React、Vue等),然后在实际业务代码构建时直接引用,避免重复构建。

6. 开启持久化缓存

使用webpack的cache选项,或者使用第三方工具如hard-source-webpack-plugin来开启持久化缓存,可以加速后续的构建过程。

7. Tree Shaking

通过使用ES6模块语法,Webpack可以更好地进行Tree Shaking,即删除未使用的代码,减小打包体积,同时也有助于提高构建速度。

8. 使用多进程/多实例构建工具

例如使用webpack-parallel-uglify-plugin插件可以让UglifyJsPlugin并行运行,从而提高构建速度。

9. 减少监视文件

在开发环境下,尽量减少监视文件的数量。可以通过配置ignore选项来排除不必要监视的文件。

10. 持续优化和调整配置

定期审查和优化Webpack配置,根据项目需求和新特性不断调整配置,以达到更好的构建速度和性能。

以上这些方法可以显著提高Webpack的构建速度,使开发流程更加高效。另外,还有一些其他方法,比如:

  • 使用CommonsChunkPlugin来提取公共代码
  • 通过externals配置来提取常用库
  • 利用DllPlugin和DllReferencePlugin预编译资源模块
  • 使用Happypack实现多线程加速编译
  • 使用webpack-uglify-parallel来提升uglifyPlugin的压缩速度
  • 使用Tree-shaking和Scope Hoisting来剔除多余代码

这些方法结合起来可以更大程度地提高Webpack的构建速度,使得前端开发更为高效和顺畅。

举报

相关推荐

0 条评论