美文网首页
前端性能优化-webpack构建优化

前端性能优化-webpack构建优化

作者: 一代码农1970 | 来源:发表于2021-07-05 09:32 被阅读0次

    一、webpack的优化配置

    1、Tree-shaking

    移除 JavaScript 上下文中的未引用代码(dead-code)
    基于ES6 import export
    package.json中配置sideEffects,过滤 Tree-shaking文件
    注意babel默认配置的影响,保留es6模块化语法

    2、js压缩

    webpack4后引入uglifyjs-webpack-plugin
    支持es6替换为terser-webpack-plugin(生产模式默认使用的插件)
    减小js文件体积

    3、作用域提升

    分析调用依赖,相同的依赖合并,代码体积减小
    提高执行效率
    注意babel默认配置的影响,保留es6模块化语法

    4、Babel7优化配置

    在需要的地方引入polyfill(js新语法兼容处理)
    辅助函数的按需引入,@babel/plugin-transform-runtime插件
    根据目标浏览器按需转换代码.配置 @babel/preset-env -> targets -> browsers

    二、webpack的依赖优化

    1、noParse 不解析

    提高构建速度
    直接通知webpack不解析较大的库
    被忽略的库不能有import,require,define的引入方式
    配置

    // webpack.config.js
    module: {
         noParse: /lodash/ // lodash是被忽略的库
    }
    

    2、DLLPlugin 把经常重复使用的库,提取出来,变成一种引用的方式,这样就不用每次都构建这些库,加速构建过程。
    避免打包时对不变的库重复构建,比如 react和vue相关
    提高构建速度
    配置

    // webpack.dll.config.js 打包配置
      const path = require("path");
      const webpack = require("webpack");
      module.exports = {
           mode: "production",
           entry: {
               react: ["react", "react-dom"] // 库
           },
           output: {
               filename: "[name].dll.js", // 文件名字
               path: path.resolve(__dirname, "dll"), // 输出文件路径
               library: "[name]" // 生成库的名称
           },
           plugins: [
             new webpack.DLLPlugin({
        name: "[name]",
        path: path.resolve(__dirname, "dll/[name].manifest.json")
             })
           ]
      }
      // package.json 添加scripts脚本
      "dll-build": "NODE_ENV=production webpack --config webpack.dll.config.js"
      // 执行打包命令 根目录会生成 dll 文件夹,里边有两个文件 react.dll.js react.manifest.json
      npm run dll-build
      // webpack.config.js 配置DLLReferencePlugin插件 引用刚才的打包文件库
      new DLLReferencePlugin(
         manifest: require(`${__dirname}/dll/react.manifest.json`)
      )
    

    三、基于webpack的代码拆分

    代码拆分做什么
    把单个bundle文件拆分成若干个小bundles/chunks
    缩短首屏加载时间

    splitChunks提取共有代码,拆分业务代码与第三方库

    // webpack.config.js
      
      const path = require("path");
      const webpack = require("webpack");
      module.exports = {
          optimization: {
            splitChunks: {
                cacheGroups: {
                    vendor: {
                        name: 'vendor',
                        test: /[\\/]node_modules[\\/]/,
                        minSize: 0,
                        minChunks: 1,
                        priority: 10,
                        chunks: 'initial'
                    },
                    common: {
                        name: 'common',
                        test: /[\\/]src[\\/]/,
                        minSize: 0,
                        minChunks: 2,
                        chunks: 'all'
                    }
                }
            }
        }
      }
    

    四、webpack的资源压缩

    1、Terser压缩JS https://webpack.js.org/plugins/terser-webpack-plugin/#terseroptions
    2、mini-css-extract-plugin压缩CSS https://webpack.js.org/plugins/mini-css-extract-plugin/#root
    3、HtmlWebpackPlugin压缩HTML https://webpack.js.org/plugins/html-webpack-plugin/#root

    五、基于webpack的资源持久化缓存

    浏览器加载一个资源时,会缓存资源文件,如果文件地址没有变化,缓存机制生效,会优先从缓存中加载资源文件,而不是从服务端重新加载。

    1、持久化缓存方案
    每个打包的资源文件有唯一的hash值
    修改后只有受影响的文件hash变化
    充分利用浏览器缓存

    // webpack.config.js
      module.exports = {
        output: {
            path: `${__dirname}/build`,
            filename: '[name].[hash].bundle.js', // 非按需加载 文件名 名字+hash
            chunkFilename: '[name].[chunkhash:8].bundle.js' // 拆包的文件(按需加载) 名字+hash
        },
        plugins: [
            new MiniCssExtractPlugin({
                filename: '[name].[contenthash].css', // 根据内容生成hash值
                chunkFilename: '[id].[contenthash:8].css'
            })
        ],
    };
    

    六、基于webpack的应用大小监测与分析

    1、Stats分析与可视化图 https://github.com/alexkuz/webpack-chart
    2、source-map-explorer 体积分析 https://www.npmjs.com/package/source-map-explorer
    3、webpack-bundle-analyzer体积分析 https://www.npmjs.com/package/webpack-bundle-analyzer
    4、speed-measure-webpack-plugin 速度分析 https://www.npmjs.com/package/speed-measure-webpack-plugin

    相关文章

      网友评论

          本文标题:前端性能优化-webpack构建优化

          本文链接:https://www.haomeiwen.com/subject/ndzeultx.html