资讯专栏INFORMATION COLUMN

webpack4 的生产环境优化

bang590 / 1651人阅读

摘要:的生产环境优化完整配置的可以参考本文主要介绍了生产环境我都做了哪些优化文章的结构如下静态资源路径。分配不同的关于稳定性的坑注意区分整个项目有变动时,变化。而生产环境可以这一项,因为我们不需要在生产环境调试代码。

webpack4 的生产环境优化

webpack4完整配置的可以参考: https://github.com/ziwei3749/...

本文主要介绍了 webpack4 生产环境我都做了哪些优化

文章的结构如下:

1.静态资源路径。

2.hash 缓存。

3.代码分割。

4.压缩混淆代码。

5.开启 gzip 压缩。

6.关闭 devtool。

7.Tree Shaking

1.静态资源路径。对静态资源路径的处理和验证

静态资源包括: js css image,

静态资源的路径的组成: 前缀 + 自己设置的路径

前缀 :静态资源的路径配置的前缀通过 output.publicPath 设置

关于publicPath的解释 https://juejin.im/post/5ae9ae...

自己设置的路径

js 的路径配置

js 的路径配置在 output.filename

output: {
    path: path.resolve(__dirname, "../dist"),
    filename: "static/js/[name].[contenthash:8].js"
}
css 路径配置

css 的路径配置在分离 css 的插件里。例如之前的 extract-text-webpack-plugin 或者 mini-css-extract-plugin

plugins: [
    new MiniCssExtractPlugin({
        filename: "static/css/[name].[contenthash:8].css"
    })
];
image 路径配置

img 的路径配置在 url-loader 里配置

modules: {
    rules: [
        {
            test: /.(png|jpe?g|gif|svg)(?.*)?$/,
            use: [
                {
                    loader: "url-loader",
                    options: {
                        limit: 10000,
                        name: "static/images/[name].[hash:7].[ext]"
                    }
                }
            ]
        }
    ];
}

ps: 有的前端同学,可能像我一样不太清楚如何验证打包压缩后的的文件内路径配置的是否正确

推荐一个简单的方法。下载 express 项目脚手架生成一个 node 项目,将打包后的 dist 扔到 public,启动 node 服务器

npm install express-generator -D

当然也可以直接去打开 dist 文件夹里的路径,去确实路径是否正确。

2.hash 缓存。

将业务代码、第三方类库、runtime 代码、css 多带带打包,给他们不同 hash,来最大化利用缓存

webpack3 中分离业务代码、第三方类库需要用 CommonChunksPlugin。
webpack4 的新增 optimization,可以方便的分离代码,而且 hash 的稳定性的问题也有改进。

多带带打包业务代码、第三方类库、runtime

    optimization: {
        splitChunks: {      // 打包 node_modules里的代码
            chunks: "all"
        },
        runtimeChunk: true,  // 打包 runtime 代码
    }

多带带打包 css 代码

webpack4 推荐 mini-css-extract-plugin

注意: 之前的 extract-text-webpack-plugin 需要 beta 版本才支持,而且 contenthash 无法使用。

分配不同的 hash

关于 hash 稳定性的坑

注意区分

[hash] : 整个项目有变动时,hash 变化。

[chunkhash] : chunk 有变动,chunkhash 变化

[contenthash] : 目前文档没有明确定义和说明,但是和文件内容的变化相关

在分离 js 和 css 时,都用设置 contenthash.

  output: {
    path: path.resolve(__dirname, "../dist"),
    filename: "static/js/[name].[contenthash:8].js",
    publicPath: "/"
  },
    new MiniCssExtractPlugin({
      filename: "static/css/[name].[contenthash:8].css"
    }),
配置js的文件名时,之前webpack3都是用chunkhash也没问题,但是实践后发现webpack4中用chunkhash,会导致,修改css时引发js的chunkhash变化,从而缓存失效。

经测试这样的设置,的确可以分离打包,并且各自的 hash 值互相不会干扰,如果有问题的话,可以共同讨论

3.代码分割

代码分割或者说懒加载,是 webpack 从诞生就一直标榜的功能吧。

它的作用就是把 js 分割成几份,在用户需要加载时才加载,这样不用一次性加载所有 js。

那么在 webpack 里实现代码分割并不是用配置的方式,而是通过我们写代码的方式来告诉 webpack 哪些代码要分割

webpack 里有 2 种 webpack 分割方法

webpack 内置方法 : require.ensure() 和 require.include()

es2015 定义的 动态 import,import 返回 promise

require.ensure 使用 demo

// require.ensure()的 4 个参数 : []依赖 、 callback 、 errorCallback 、 chunkName
require.ensure(
    ["./subPageA"],
    () => {
        var subPageA = require("./subPageA");
    },
    "subPageA"
);

// require.include("./moduleA.js")可以提取异步模块中的公共部分到父chunk

import 使用 demo

import("./subPageA").then(subPageA => {
    console.log(subPageA);
});

// 区别
//  import("./subPageA")会直接执行这个文件,
//  而require.ensure()不会直接执行,是在里面的回调函数里才执行的引入操作。
关于import的使用注意
@babel升级后,使用import的语法,需要下载插件 @babel/plugin-syntax-dynamic-import

以下的地址链接
https://babeljs.io/docs/en/next/babel-plugin-syntax-dynamic-import.html
4.压缩混淆代码

听说webpack4只需要设置mode:produciton,就自动打包混淆js代码啦!

很好,现在我们只需要压缩css了可以了呢,于是下载插件optimize-css-assets-webpack-plugin

const OptimizeCssAssetsPlugin = require("optimize-css-assets-webpack-plugin")
  optimization: {
    splitChunks: {
      chunks: "all"
    },
    runtimeChunk: true,
    minimizer: [
      new OptimizeCssAssetsPlugin({})
    ]
  },
    new OptimizeCssAssetsPlugin({
      assetNameRegExp: /.optimize.css$/g,
      cssProcessor: require("cssnano"),
      cssProcessorOptions: { safe: true, discardComments: { removeAll: true } },
      canPrint: true
    }),

再看一眼我们的代码,坑爹的发现js的压缩居然失效了。

为什么呢?我在问答社区看到类似的问题,并且在官方文档找到了解释。

大致意思就是。默认optimization.minimize是true,所以js可以自动帮你压缩

但是自定义minimizer后,webpack默认配置会取消掉。

文档还很皮的告诉你,如果你用了css压缩,记得自己用uglifyjs压缩js呀。。。

https://segmentfault.com/a/11...

https://webpack.js.org/plugin...

总之,还是要自己用uglifyjs配置后压缩js

    minimizer: [
      new OptimizeCssAssetsPlugin({}), // 压缩 css,使用minimizer会自动取消webpack的默认配置,所以记得用UglifyJsPlugin
      new UglifyJsPlugin({
        // 压缩 js
        uglifyOptions: {
          ecma: 6,
          cache: true,
          parallel: true
        }
      })
    ]
5.开启 gzip 压缩。

开启gzip压缩,那么压缩的好处是什么?

可以减小文件体积,传输速度更快。

服务端发送 response 时可以配置 Content-Encoding:gzip,用户说明数据的压缩方式

浏览器接受时,就可以根据相应个格式去解码。客户端请求时,可以用 Accept-Encoding:gzip,用户说明接受哪些压缩方法

所以 gzip 格式在 http 中传输文件的话,速度更快。那么谁来压缩文件?

不是服务端,就是客户端咯。

服务端比如 ngix 或者 node 去做压缩,

也可以 webpack 打包上线时,通过插件去做压缩。

服务端响应时压缩,肯定不如应用构建时压缩更合适。因为压缩也是要有时间开销的

const CompressionWebpackPlugin = require("compression-webpack-plugin");

webpackConfig.plugins.push(
    new CompressionWebpackPlugin({
      asset: "[path].gz[query]",
      algorithm: "gzip",
      test: new RegExp(".(js|css)$"),
      threshold: 10240,
      minRatio: 0.8
    })
)

压缩之后,文件体积减少的确显著。

6.关闭devtool

devtool我没有做很深入的研究。

我的理解,开发环境必须要配置,否则肯定无法调试。

而生产环境可以这一项,因为我们不需要在生产环境调试代码。如果理解有误,欢迎指正哈~

7.Tree shaking

tree shaking 的原理

ES6 的模块是静态分析的。所以在编译时可以判断哪些代码没有 exports

分析程序流,判断哪些变量没有被使用、从而删除代码

webpack4的新增了sideEffects来指定“有副作用的文件”,

但是我在实际使用时,遇到一些坑,比如这样配置后,我意思是指定.css文件不要被“摇”掉。

但这个配置依旧导致了css文件打包后被当做冗余代码被删除。

  "sideEffects": [
    "*.css"
  ],

关于tree shaking就贴一篇文章。关于tree shaking研究清楚后再更新吧

https://zhuanlan.zhihu.com/p/...

以上就是整个配置的说明啦,目前tree shaking目前还没有搞定,其他功能我自己测试是没有问题的。

贴一份,webpack4完整的配置文件的地址。

如果觉得有帮助希望star一下,如果遇到问题,也欢迎指教!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/96477.html

相关文章

  • webpack4新特性介绍

    摘要:当下最流行的模块打包器于年月日正式发布版本,代号。从官方的发布日志来看本次大版本更新带来了很多新特性更新和改善,这将会让的配置更加简单。本文,笔者将会全面介绍的新特性及实践。只支持模块,目前处于试验阶段。 导语: webpack是一个JS应用打包器, 它将应用中的各个模块打成一个或者多个bundle文件。借助loaders和plugins,它可以改变、压缩和优化各种各样的文件。它的输入...

    NotFound 评论0 收藏0
  • webpack4 Mode默认设置

    摘要:功能强大,有很多独特的功能,但其中一个难点是配置文件。为此团队改变了这一现状默认不需要配置文件。每个选项的默认配置如下指两个配置项都存在的属性中解决了的会被删除删除空的合并重复的调试缓存模块避免在未更改时重建它们。 webpack功能强大,有很多独特的功能,但其中一个难点是配置文件。为此,webpack团队改变了这一现状:webpack 4默认不需要配置文件。可以通过mode选项为we...

    wua_wua2012 评论0 收藏0
  • 浅谈webpack4.0 性能优化

    摘要:中在性能优化所做的努力,也大抵围绕着这两个大方向展开。因此,将依赖模块从业务代码中分离是性能优化重要的一环。大型库是否可以通过定制功能的方式减少体积。这又违背了性能优化的基础。接下来可以抓住一些细节做更细的优化。中,为默认启动这一优化。 前言:在现实项目中,我们可能很少需要从头开始去配置一个webpack 项目,特别是webpack4.0发布以后,零配置启动一个项目成为一种标配。正因为...

    leanxi 评论0 收藏0
  • webpack4配置详解之逐行分析

    摘要:今天就尝试着一起来聊聊吧,旨在帮大家加深理解新手更容易上路,都能从到搭建配置自定属于自己的脚手架,或对已封装好的脚手架有进一步的巩固,接下来苏南会详细讲解中的每一个配置字段的作用部分为新增。 showImg(https://segmentfault.com/img/bVbjmMV?w=1008&h=298); 前言   经常会有群友问起webpack、react、redux、甚至cre...

    dkzwm 评论0 收藏0
  • webpack4系列教程(九):开发环境生产环境

    摘要:它允许在运行时更新各种模块,而无需进行完全刷新。构建生产环境开发环境和生产环境的构建目标差异很大。在开发环境中,我们需要具有强大的具有实时重新加载或热模块替换能力的和。 1. 构建开发环境 如果你一直跟随我前面的博文,那么你对webpack的基础知识已经有比较深刻的理解了。之前,我们一直执行着: npm run build 来打包编译输出我们的代码,本文我们来看看如何构建一个开发环境,...

    姘存按 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<