webpack优化项目打包后体积
webpack优化项目打包后体积
Webpack 是一个强大的模块打包工具,可以将多个模块打包成一个或多个文件,提高前端开发的效率和性能。下面是一些常见的 Webpack 优化打包技巧:
- 减少打包文件的体积:可以通过压缩代码、移除未使用的代码、使用 Tree Shaking 技术等方式减小打包文件的体积。
- 使用代码分离:将代码拆分成更小的模块,可以实现按需加载,提高页面加载速度。
- 使用缓存机制:通过给打包文件加上 hash 值,可以实现浏览器缓存,减少不必要的网络请求。
- 使用 DLLPlugin 进行依赖分析:可以将不经常变化的依赖单独打包,避免重复打包浪费时间。
- 配置 externals:将一些不需要打包的依赖通过 externals 配置排除在打包之外,可以减小打包文件体积。
- 使用 ParallelUglifyPlugin:使用多进程并行压缩代码,加快打包速度。
- 使用 Happypack:使用多进程并行处理文件,加快编译速度。
- 使用 CDN:将一些公共资源通过 CDN 加载,可以减轻服务器压力,提高访问速度。
- 开启 Scope Hoisting:将模块的作用域提升到最高级别,减少函数声明代码,优化打包结果。
减少打包文件体积
移除未使用的代码
通过 tree shaking 技术可以移除未使用的代码,从而减少打包体积。Webpack 默认支持 tree shaking 技术,只需要确保代码中使用 ES6 模块化语法,并开启 production 模式即可。例如:
1 | import { add } from './math'; |
如果 math.js 中的 subtract 函数未被使用,Webpack 会将其移除。
代码压缩
通过使用 UglifyJsPlugin 插件可以将代码进行压缩,从而减少打包体积。例如:
1 | const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); |
通过配置 UglifyJsPlugin,我们可以轻松地将 JavaScript 代码压缩成更小的体积,从而加快页面加载速度。
使用代码分离
代码分离是将代码分成更小的块,以便更好地利用浏览器的缓存机制,从而提高页面加载速度。Webpack 提供了多种代码分离的方式,包括入口起点、动态导入和代码分割插件。
入口起点:
可以将代码分成多个入口起点,这样每个入口起点都会被打包成一个独立的文件。
1 | module.exports = { |
动态导入:
可以使用 ES6 的 import() 语法实现动态导入,从而将某个模块打包成一个独立的文件。
1 | import(/* webpackChunkName: "lodash" */ 'lodash').then(_ => { |
这里使用 import() 导入了 lodash 模块,Webpack 会将 lodash 模块打包成一个独立的文件,并在运行时动态加载。
代码分割插件:
Webpack 提供了多个代码分割插件,包括 CommonsChunkPlugin、SplitChunksPlugin、MiniCssExtractPlugin 等。其中,SplitChunksPlugin 是最常用的代码分割插件,它可以根据一些策略将代码分割成更小的块。
1 | module.exports = { |
上面使用 optimization.splitChunks 配置项,将代码分割成两个块,一个是 vendors,用于打包第三方依赖库,一个是 default,用于打包应用程序代码。SplitChunksPlugin 会根据一些策略将代码分割成更小的块,从而更好地利用浏览器的缓存机制。
使用缓存机制
Webpack 提供了缓存机制,可以加快二次打包速度。在 Webpack 中,缓存机制主要分为两种:
HashedModuleIdsPlugin
这个插件可以根据模块的相对路径生成一个 Hash 作为模块的唯一标识符,如果模块没有发生变化,那么它的 Hash 值也不会变化,从而可以有效地利用浏览器的缓存机制。
使用方法:
1 | const webpack = require('webpack'); |
cache-loader
cache-loader 可以将一些性能开销较大的 loader 的结果缓存起来,从而在二次打包时可以直接使用缓存结果,而不需要重新执行这些 loader。cache-loader 需要安装并配置在 loader 的前面。
使用方法:
1 | module.exports = { |
在 babel-loader 前面添加了 cache-loader,这样在执行 babel-loader 时,如果缓存中存在对应的结果,就会直接使用缓存结果,从而加快打包速度。
使用缓存机制可以加快二次打包速度,从而提高开发效率,但是在修改了代码后,需要手动清除缓存才能看到最新的打包结果。
使用 DLLPlugin 进行依赖分析
使用 DllPlugin 插件将不经常变化的依赖单独打包:
1 | const path = require('path'); |
使用 AddAssetHtmlPlugin 插件将 DLL 文件注入到 HTML 中:
1 | const path = require('path'); |
配置 externals
在 Webpack 中,可以通过配置 externals 来告诉 Webpack 哪些模块不需要打包,而是直接从外部引入。
例如,你想在打包的过程中不将 React 和 React-DOM 打包进去,而是在运行时通过全局变量引入。那么可以通过 externals 来配置:
1 | module.exports = { |
这样,Webpack 在打包时就会忽略 react 和 react-dom 模块,并且在使用这些模块时会从全局变量 React 和 ReactDOM 中引入。
注意,externals 配置只是告诉 Webpack 哪些模块不需要打包,但是在使用这些模块时,还需要在 HTML 页面中通过 script 标签引入相应的库文件。你可以使用 html-webpack-plugin 插件来自动将这些文件引入到 HTML 页面中。例如:
1 | const HtmlWebpackPlugin = require('html-webpack-plugin'); |
在这个示例中,我们使用了 html-webpack-plugin 插件,并将它添加到 plugins 中。通过指定 template 选项来告诉插件使用哪个 HTML 模板文件。这时只需在html文件中使用cdn引入js等文件即可:
1 |
|
在打包时,插件会自动将打包后的 JS 文件和指定的库文件添加到 HTML 页面中。
使用 ParallelUglifyPlugin
使用 ParallelUglifyPlugin 插件并行压缩代码:
1 | const ParallelUglifyPlugin = require('webpack-parallel-uglify-plugin'); |
注意:如果你已经使用了 UglifyJsPlugin 进行代码压缩,那么不要同时使用 ParallelUglifyPlugin,否则可能会出现冲突。