webpack打包性能优化

1. 使用 gzip 压缩打包后的 js 文件

这个方法优化浏览器下载时的文件大小(打包后的文件大小没有改变)

webpack.config.prod.js 中

var  CompressionWebpackPlugin  =  require(‘compression-webpack-plugin‘);
// 在 pligins 中添加
new  CompressionWebpackPlugin({ //gzip 压缩
    asset:  ‘\[path\].gz\[query\]‘,
    algorithm:  ‘gzip‘,
    test:  new  RegExp(
        ‘\\\.(js|css)$‘  //压缩 js 与 css
    ),
    threshold:  10240,
    minRatio:  0.8
})

这样打包出的 css js,会有 css.gz js.gz,即压缩过的 js 和 css。

之后在服务器端的 nginx 配置中开启 gzip:

查看配置文件:vim /usr/local/etc/nginx/nginx.conf

// 写在 http 中就可以
gzip  on;
gzip_types application/javascript text/css image/jpeg;

这样浏览器下载文件时还是之前的 js,但是服务器返回的压缩过的 .gz 文件,再在本地解压,时间缩短了很多。

2. echart 使用外链 js 文件,不引入 npm 包

在 html 中引入 echarts.min.jschina.jsecharts-gl.min.jsecharts-wordcloud.min.js,不引入 npm 包

在 webpack生产打包配置中增加:

externals: {
    "react":  "React",   // 左边引入时的自定义名字,右边全局变量名
    "react-dom":  "ReactDOM",
    "jquery":  "jQuery",
    "echarts":  "echarts"
}

https://doc.webpack-china.org/configuration/externals/#externals

打包后文件大小减小 0.5M

3. 配置打包去掉注释,删除debugger,删除console

new webpack.optimize.UglifyJsPlugin({
    comments:  false, //去掉注释
    compress: {
        warnings:  false,
        drop_debugger: true,
        drop_console: true
    }
}),

4. ant design 按需引入

https://github.com/ant-design/ant-design/issues/2656

  1. 可以直接写,缺点每个组件需要单写一行

    import Button from "antd/lib/button"

  2. 用对象的方式写

    import { Button } from ‘antd‘;

    如果单用这种方式写,打包的时候每个文件会把 antd 的所有模块都加载进去,参见:

    https://ant.design/docs/react/getting-started-cn#%E6%8C%89%E9%9C%80%E5%8A%A0%E8%BD%BD

    需要引入 babel-plugin-import 使每个模块按需加载,并在 webpack.config.js 里配置

    loaders: [
    ...
    {
       text: /\.(js|jsx)$/,
       include: paths.appSrc,
       loader: ‘babel‘,
       query: {
           cacheDirectory: true,
           plugins: [["import", { libraryName: "antd", style: "css" }]]  // 这一句
       }
    },
    ...
    ]

    每个引入antd的文件减小0.5M

5. 删除无用依赖

6. echart 图表懒加载

https://www.npmjs.com/package/react-lazyload

import LazyLoad from ‘react-lazyload‘;
// 在需要懒加载的元素外包裹
<LazyLoad height={300} offset={10}><!--元素--></LazyLoad>

7. 使用 webpack-parallel-uglify-plugin 替代 UglifyJS 插件

https://jeffjade.com/2017/08/12/125-webpack-package-optimization-for-speed/#%E5%A2%9E%E5%BC%BA%E4%BB%A3%E7%A0%81%E4%BB%A3%E7%A0%81%E5%8E%8B%E7%BC%A9%E5%B7%A5%E5%85%B7

使用 webpack-parallel-uglify-plugin 替代 webpack.optimize.UglifyJsPlugin 并行混淆压缩 js 文件,打包时间从四分钟减到两分钟。用法和 UglifyJsPlugin 相同。

var ParallelUglifyPlugin=require(‘webpack-parallel-uglify-plugin‘) ;
new ParallelUglifyPlugin({
    uglifyJS: {
        output: {
            comments:  false  //去掉注释
        },
        compress: {
            warnings:  false,
            drop_debugger:  true,
            drop_console:  true
        }
    }
}),

8. happypack 多进程执行 loader

原理

配置方式

引入 happypack

支持的loader列表

module.exports  = {
    module: {
        loaders: [
            {
                test: /.jsx?$/,
                loader:  "happypack/loader?id=happybabel",
                exclude: /node_modules/
            },
            {
                test: /\.json$/,
                exclude: /node_modules/,
                loader:  ‘happypack/loader?id=happyjson‘,
                include: [
                    path.join(rootPath, "src/components"),
                    path.join(rootPath, "src/mockdata"),
                    path.join(rootPath, "src/views"),
                ]
            },
            {
                test: /\.less$/,
                loader:  ExtractTextPlugin.extract("style", "happypack/loader?id=happyless"),
                include: [
                    path.join(rootPath, "src/components/"),
                    path.join(rootPath, "src/assets"),
                    path.join(rootPath, "node_modules/antd"),
                ]
            },
        ]
    },
    plugins: [
        createHappyPlugin(‘happybabel‘, [{
            loader:  ‘babel-loader‘,
            query: {
                cacheDirectory:  true,
                plugins: [
                ["import", { "libraryName":  "antd", "style":  true }] // `style: true` 会加载 less 文件
                ]
            },
        }]),
        createHappyPlugin(‘happyjson‘, [‘json-loader‘]),
        createHappyPlugin(‘happyless‘, [‘css-loader?sourceMap!less‘]),
    ]
}
function  createHappyPlugin(id, loaders) {
    return  new  HappyPack({
        id:  id,
        loaders:  loaders,
        threadPool:  happyThreadPool,
        verbose:  true
    });
}

打包时间减少了 15s

9. 检查 loader 中的 include 和 exclude 使其更加精确

https://jeffjade.com/2017/08/12/125-webpack-package-optimization-for-speed/#%E8%AE%BE%E7%BD%AE-test-amp-include-amp-exclude

{
    test: /\.json$/,
    exclude: /node_modules/,
    loader:  ‘happypack/loader?id=happyjson‘,
    include: [
        path.join(rootPath, "src/components"),
        path.join(rootPath, "src/mockdata"),
        path.join(rootPath, "src/views"),
    ]
},
{
    test: /\.less$/,
    loader:  ExtractTextPlugin.extract("style", "happypack/loader?id=happyless"),
    include: [
        path.join(rootPath, "src/components/"),
        path.join(rootPath, "src/assets"),
        path.join(rootPath, "node_modules/antd"),
    ]
},

搜索文件范围变窄,可以减小一点打包时间。

原文地址:https://www.cnblogs.com/ubuntugx/p/8794582.html

时间: 2024-09-30 20:07:41

webpack打包性能优化的相关文章

最全 webpak4.0 打包性能优化清单

最全 webpak4.0 打包性能优化清单 webpack4.0如何进行打包优化? 无非是从两个角度进行优化,其一:优化打包速度,其二:优化打包体积,送你一份打包性能优化清单 1.使用loader的时候尽量指定exclude和inlucde来提高文件查找效率,避免不必要的查找,设置noParse参数 module: { noParse: /jquery/, // 不去解析jquery中的依赖 rules:[ { test: /\.js?$/, use: [ { loader: 'babel-lo

webpack打包体积优化

webpack打包的体积越小,对于部署应用的网站来说,性能越好,加载速度越快. 1. 分析打包文件 1. 生成统计信息文件 首先需要通过webpack命令生成统计信息的文件.在package.json的脚本中添加命令 "scripts": { "stats": "webpack --config webpack.prod.js --profile --json > stats.json", //... } 上面的命令会在根目录下生成一个st

Webpack打包效率优化篇

Webpack基础配置: 语法解析:babel-loader 样式解析:style-loader css解析:css-loader less解析:less-loader 文件解析:url-loader(file-loalder) 性能分析:webpack-bundle-analyzer 代码: var path = require('path'); var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyz

彻底解决Webpack打包慢的问题

转载 这几天写腾讯实习生 Mini 项目的时候用上了 React 全家桶,当然同时引入了 Webpack 作为打包工具.但是开发过程中遇到一个很棘手的问题就是,React 加上 React-Router.superagent.eventproxy 这些第三方轮子一共有好几百个 module,Webpack 的打包速度极慢.这对于开发是非常不好的体验,同时效率也极低. 问题分析 我们先来看一下完全没有任何优化的时候,Webpack 的打包速度(使用了jsx和babel的loader).下面是我们的

性能优化 - 查看 webpack 打包后所有的依赖关系(webpack 可视化工具)

查看 webpack 打包后所有组件与组件间的依赖关系,针对多余的包文件过大, 剔除首次影响加载的效率问题进行剔除修改,本次采用的是 ==webpack-bundle-analyzer(可视化视图查看器)== == 介绍1:webpack-bundle-analyzer(可视化)== 将捆绑内容表示为方便的交互式可缩放树形图 如下效果图: 模块功能: 意识到你的文件打包压缩后中真正的内容 找出哪些模块组成最大的大小 找到错误的模块 优化它! 最好的事情是它支持缩小捆绑!它解析它们以获得实际大小的

WebPack实例与前端性能优化

[前端构建]WebPack实例与前端性能优化 计划把微信的文章也搬一份上来. 这篇主要介绍一下我在玩Webpack过程中的心得.通过实例介绍WebPack的安装,插件使用及加载策略.感受构建工具给前端优化工作带来的便利. 壹 | Fisrt 曾几何时,我们是如上图的方式引入JS资源的,相信现在很少遇见了.近年来Web前端开发领域朝着规范开发的方向演进.体现在以下两点: MVC研发构架.多多益处(逻辑清晰,程序注重数据与表现分离,可读性强,利于规避和排查问题...) 构建工具层出不穷.多多益处(提

【前端构建】WebPack实例与前端性能优化

计划把微信的文章也搬一份上来. 这篇主要介绍一下我在玩Webpack过程中的心得.通过实例介绍WebPack的安装,插件使用及加载策略.感受构建工具给前端优化工作带来的便利. 壹 | Fisrt 曾几何时,我们是如上图的方式引入JS资源的,相信现在很少遇见了.近年来Web前端开发领域朝着规范开发的方向演进.体现在以下两点: MVC研发构架.多多益处(逻辑清晰,程序注重数据与表现分离,可读性强,利于规避和排查问题...) 构建工具层出不穷.多多益处(提升团队协作,以及工程运维,避免人工处理琐碎而重

webpack之前端性能优化(史上最全,不断更新中。。。)

最近在用webpack优化首屏加载性能,通过几种插件之后我们上线前后的速度快了一倍,在此就简单的分享下吧,先上个优化前后首屏渲染的对比图. 可以看到总下载时间从3800ms缩短到1600ms. 我们在用webpack时一般都会选择多入口文件吧,为的就是将自己的源码跟第三方库代码分离.这是之前的代码, entry: { entry: './src/main.js', vendor: ['vue', 'vue-router', 'vuex', 'element-ui','echarts'] }, o

优化Webpack构建性能的几点建议

Webpack 作为目前最流行的前端构建工具之一,在 vue/react 等 Framework 的生态圈中都占据重要地位.在开发现代 Web 应用的过程中,Webpack 和我们的开发过程和发布过程都息息相关,如何改善 Webpack 构建打包的性能也关系到我们开发和发布部署的效率. 以下是一些关于优化 Webpack 构建性能的几点建议: 一.选择合适的 Devtool 版本 webpack 的 devtool 配置,决定了在构建过程中怎样生成 sourceMap 文件.通常来说eval的性