webpack打包后引用cdn的js_工程化之webpack极致优化至2.8 s

前言

在上一篇文章中,我们从零搭建了一个react的基础项目,其核心是webpack的配置,但是我们的webpack只是进行了基础的配置,保证了打包成功和项目的运行。如果我们想要打包更快呢?

基于上一篇文章中的webpack,这一篇文章就教你如何优化webpack的配置。

PS:上一篇文章看这里?从零搭建一个自己的react框架

webpack的优化实践

  • purgecss-webpack-plugin

删除无用的css 我们先准备一份css文件和jsx文件(咱们就用上一篇文章中的)

  • jsx

f2997495ae642b42a392df643412659c.png
  • css

abeb59d7f136b65bf60c0708ce5acbf9.png

仔细观察上面的css文件,发现最后一个(.llllas)在jsx中是没有的,根据我们的意思,它应该被删除掉,下面我们开始配置

首先,安装插件purgecss-webpack-plugin

npm install purgecss-webpack-plugin --save-dev
yarn add ...
cnpm install ...

我们要注意的是,这个插件需要配合mini-css-extract-plugin插件一起使用

第二步,使用

2e50dca8905943b76d3cfbd7fc15b0c9.png

最后,yarn build,我们来看一下效果

194fdb43b06b5e1f0f36e86429b506c8.png

我们在打包好的css文件中已经搜索不到llllas样式了。

就这样,我们学会了第一个优化webpack配置的方法。

  • image-webpack-loader

图片压缩工具

我们要在file-loader之前使用image-webpack-loader,使用方法:

80e8e8fee72f6e25b2116b3201a5a8a2.png

因为,我们只在生产环境下进行了压缩图片的操作,所以,我们现在看开发环境下和生产环境下的打包结果:

  • 开发环境

0a61b75b6419d969e1bab7b65f84c0a2.png

  • 生产环境

6e4da7bc607a49d7b57e287034c01d12.png

从这里,可以很清晰的看到,svg图片被压缩了

PS:这里压缩图片的配置是直接复制的npm官网上对image-webpack-loader使用介绍。

  • CDN加载文件

当我们在HTML页面用script标签引入一个cdn,而且呢在写react的时候我们也要引入,像这样(假如引入了jquery)

06796a3853e0861c230e384b3502d7ec.png

0cc90e1a64a59ae943fdd0d3308fefa3.png

在这种情况下,webpack依然会将jquery重新打包

db61604749fcfb00e3fb5489c6e5b05a.png

我们并不希望打包cdn引入文件,因为这会造成main.bundle.js文件体积臃肿,在一定程度上会影响页面的渲染速度

所以,我们需要进行以下配置

3eef836611d46dd2f1e13aec9eb1538e.png

我们再打包一下~

fe59356f43a3f5ce9aeaba6c3332cee3.png

这时候,jquery部分的源代码已经不见了~

我们至此完成了第三步优化操作

  • Tree-shaking

将没用的代码删除,在生产环境下会自动tree-shaking

我们来看一下下面的代码:

  • calc.js

feefd18af799bec60e3749069be96826.png

  • hello.js

1f8f7733be8f9cc942a419e122f09012.png

  • App.jsx

82a7a4df982368c33c4b82aa94238024.png

在这一段代码中,hello.js只是引用了而并没有使用,所以我们期望在打包的时候不会打包hello.js部分的代码。接下来,我们分别在开发环境下和生产环境下打包,这时候发现,无论开发环境还是生产环境,依然会打印出来hello.js函数内的内容

8bd009524316e1e58a0690853d968160.png

这时候,我们需要去配置不使用副作用,所以在package.json文件中:

43182fd971ae2e860561efe8edf364a8.png

但是,我们发现,当这样配置以后,在生产环境下

382d08f02352dfacf70b0aeabda43b2c.png

css样式出现了问题,这是由于这样配置以后,因为我们引入css文件时import ./App.css,它会默认认为css也是副作用,就不会导入css

所以,需要我们更改package.json的配置,像下面这样:

d9165146ccc2419bf3e4ba5a2d357ffc.png

这时候,再次在生产环境下运行项目,发现已经不再打印hellocss的样式也变得正常了

4c22359e953a43c51857f530cebf0293.png

  • DllPlugin

在写react项目过程中,经常要引入第三方库,这样,在每次重新构建的时候,会非常浪费性能,所以,为了节约构建时间,我们可以先将第三方库打包成一个动态链接库,以后构建的时候直接去查找构建好的库

我们在index.js中使用了第三方库reactreact-dom,接下来,我们先对这两个库先进行打包

1、在build文件夹下创建webpack.dll.js

00df3c8d4ccbd94d6f64eec1f6d56b57.png

2、在package.json里面配置命令

fdd96e8bbfb4457e5feaf3e4f6e67d6e.png

3、在项目中引用动态链接库

b9be0a4fedf49ebc2bfaec94fc7620c5.png

4、使用

// 首先打包好第三方库
npm run build:dll
// 第二步,将项目打包
npm run build

5、效果

  • 使用DllPlugin打包前

1ae9c446a3a409618611bf84642a3c2c.png

  • 使用DllPlugin打包后

    bd53ffa42ef083aa8e0b8a5cdf5da80b.png

可以清楚的看到打包时间缩短,达到了优化的目的

  • 动态加载

顾名思义,动态加载就是我们需要加载的时候再去加载某些文件

2969e5006c9ebcaa5e7155f7c04e2061.png

4bd48567cacf187ea710a70685ad2eac.png

  • 页面加载完成的时候

6f152d06f5cc93a125e65175d2cf6b81.png

  • 点击按钮之后

0a80b28b992698459dabea354acf8ac8.png

我们看到,只有当我们点击按钮的时候才会加载index.js文件,它不会在页面启动的时候就去加载,这样节省了页面的加载时间

  • 打包分析工具

安装webpack-bundle-analyzer插件并使用

62c2fe42e98a94c65548e6f8809c0d83.png

效果如下

480e8978e3e6c311f2f5ec3ffa79790c.png

  • happypack

happypack插件可将代码多线程打包,所以,我们可以将不同的逻辑交给不同的线程来处理

7ab113d23cc69519da976ce37d3b00f3.png

使用happypack前

b9262a41f700b484638f5a4572670720.png

使用happypack后

affa40a2b9bda56855654831af1ed93e.png

我们可以看到,打包时间明显缩短了,所以happypack是一个很好的提高打包速度的手段

总结

以上,就是本篇博客介绍的一些优化手段,其实对于每个不同的项目,配置的webpack是不一样的,所以,我们要根据这些webpack的基础知识,去配置适合自己项目的webpack。

本篇博客中所有代码片段已上传至github

react-template的github地址[https://github.com/create-react-cli/react-template]

上述文章如有不对之处,还请大家积极指出来,让我们一起学习,共同在前端的路上越走越远,越来越?

工程化相关实践

?搭建前端监控平台之数据上报 ?手把手带你入门前端工程化 ❤️ 交流讨论 欢迎关注公众号 秋风的笔记,主要记录日常中觉得有意思的工具以及分享开发实践,保持深度和专注度。回复"好友"可加微信,秋风的笔记常年陪伴你的左右。

b1b1e610cc580c042f3686551500f886.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值