热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于webpack优化,你须要晓得的事(上篇)

媒介webpack是一个优异的打包东西,其本身为我们做了大批优化,同时也为我们供应了大批的设置项让我们能够自定义,从而有优化空间。在讲webpack优化篇之前,因为楼主主要以vue

媒介

webpack 是一个优异的打包东西,其本身为我们做了大批优化,同时也为我们供应了大批的设置项让我们能够自定义,从而有优化空间。

在讲 webpack 优化篇之前,因为楼主主要以 vue 脚手架最先的,而且是已晋级为 webpack4 以后的优化,假如对 vue脚手架设置不太相识的同砚。能够看我上一篇文章
怎样文雅的晋级到webpack4,或许直接看
webpack3 vue脚手架注解

下面我先讲讲vue脚手架为我们做的一些优化,不喜欢看的请跳过,然后会讲怎样在优化的基础上升华一下,内容从浅到深,然则一切的要领都经由楼主考据,内容较长,请自带板凳瓜子。

vue-cli 脚手架自带优化

babel

Babel 是一个 Javascript 编译器,能将 ES6 代码转为 ES5 代码,让你运用最新的言语特征而不必忧郁兼容性题目,而且能够经由过程插件机制依据需求天真的扩大。这里我不讲babel ,而是讲官方用的插件 transform-runtime,对应的插件全名叫做 babel-plugin-transform-runtime,其作用是削减冗余代码,究竟是怎样削减的呢?

比方在转换 class extent 语法时会在转换后的 ES5 代码里注入 _extent 辅佐函数用于完成继续:

function _extent(target) {
for (var i = 1; i var source = arguments[i];
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}
return target;
}

这会致使每一个运用了 class extent 语法的文件都被注入反复的_extent 辅佐函数代码,babel-plugin-transform-runtime 的作用在于不把辅佐函数内容注入到文件里,而是注入一条导入语句:

var _extent = require('babel-runtime/helpers/_extent');

如许能减小 Babel 编译出来的代码的文件大小。
注重:babel-plugin-transform-runtime 必需和 babel-runtime 须要配套运用

说来惭愧,楼主试了一下,把这个插件去掉,天生文件的hash和大小并没有变化(汗,别砸,翻材料webpack 规范入门、前端工程化-webpack篇之babel-polyfill与babel-runtime(三)上有写,而且脚手架上有)。厥后发明,楼主的代码中并没有es6。厥后换了一个大项目,做了对照
《关于webpack优化,你须要晓得的事(上篇)》
能够发明,图右侧是去掉插件的。体积显著大了一点。运用此插件能够削减反复代码,减少项目体积。

减少文件搜刮局限

loader

运用 Loader 时能够经由过程 test 、 include 、 exclude 三个设置项来掷中,关于我们的项目大部份都是 js,下面看看官方脚手架 js 的 babel-loader:

module.exports = {
// ...
module: {
rules: [
// ...
{
test: /\.js$/,
loader: 'babel-loader',
include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
},
]
}
}

因为经由过程 npm 装置的第三方的库,都是经由 webpack 打包 es5 化了,所以这里就能够只对 include 包含的文件运用 babel-loader 剖析

注重了。因为 css、less 的引入是要插进去到js中的,所以并不适用于这个(把 node_modules 消除在外)要领。说到这里,多说一句,也是曾很搅扰我的 css 的 loader 剖析递次,use 的 loader 剖析递次跟数组的位置是反着的,以 less 为例,细致来说

module.exports = {
// ...
module: {
rules: [
// ...
{
test: /\.less$/,
// less 文件的处置惩罚递次为先 less-loader 再 css-loader 再 vue-style-loader
use: [
// style-loader 会把 CSS 代码转换成字符串后,注入到 Javascript 代码中去,
'vue-style-loader',
// css-loader 会找出 CSS 代码中的 @import 和 url() 如许的导入语句,通知 Webpack 依靠这些资本。同时还支撑 CSS Modules、紧缩 CSS 等功用。处置惩罚完后再把结果交给 vue-style-loader 去处置惩罚。
{
loader: 'css-loader',
options: {
sourceMap: config.dev.cssSourceMap
}
},
//经由过程 less-loader 把 less 源码转换为 CSS 代码,再把 CSS 代码交给 css-loader 去处置惩罚。
{
loader: 'less-loader'
}
]
},
]
}
}

关于减少局限增添掷中这个头脑,还能够做许多事变,这里只讲了vue脚手架优化做的事变,更多设置请今后看,看我怎样自定义的

node 选项

webpack 的官方脚手架内里的node选项能够防备node包,另有 setImmediate 的 profill注入到代码中

node: {
// prevent webpack from injecting useless setImmediate polyfill because Vue
// source contains it (although only uses it if it's native).
setImmediate: false,
// prevent webpack from injecting mocks to Node native modules
// that does not make sense for the client
dgram: 'empty',
fs: 'empty',
net: 'empty',
tls: 'empty',
child_process: 'empty'
}

好不好,看疗效。那末细致的疗效怎样呢,楼主一样的代码,做了对照,结果以下:
《关于webpack优化,你须要晓得的事(上篇)》

经由过程对照能够看到,两次打包css的hash值悉数变了,js部份hash发作转变(这个打包没看出js变化,然则另一个项目标部份js的hash变了)。整体打出来的包的体积相差不大。去掉node选项打包时候差异不显著,所以用不必,见仁见智吧。我看create-react-app中也运用了,所以照样发起运用吧,晓得更多的,能够留言区议论。

js、css 紧缩

css 紧缩这个就不多说了,人人都懂,

值得一提的是因为 UglifyJsPlugin 插件晋级到1.0以后有了 parallel选项,开启了多线程紧缩

new UglifyJsPlugin({
uglifyOptions: {
compress: {
warnings: false
}
},
sourceMap: config.build.productionSourceMap,
parallel: true // 开启多线程紧缩
})

这两个插件都有设置项,合理设置能够优化项目。背面会讲。

代码支解

代码支解就是将动态引入的代码支解成一个一个的代码块(chunk),依据需求加载到html上。注重:要运用代码支解功用,在项目中要合营运用组件、路由懒加载的体式格局(能够经由过程import完成)

webpack4 的 mode 为 production 时,默许会对代码举行支解。楼主看了 webpack3 的代码支解体式格局是运用 CommonsChunkPlugin 插件,目标就是支解出几类代码:

  1. vendor 也就是第三方库打包这里。
  2. manifest 当编译器最先实行、剖析和映照应用程序时,它会保存一切模块的细致要点。这个数据鸠合称为 “Manifest”
  3. app 这个是代码中的大众部份

HashedModuleIdsPlugin

嗯 webpack 天生 js 的 hash 是怎样盘算我并不清晰,然则假如不必这个插件的话,一切天生 js 的 hash 是一样的,而且只需有一点点修改,一切文件的 hash 值都邑变化。那形成什么样的结果呢?

比方你只改了 b 页面的 js 里的一行代码,假如不必此插件的话,一切页面的 js 的 hash 悉数会变化,浏览器要从新要求悉数的js。机能糟蹋到怒不可遏。而运用了 HashedModuleIdsPlugin 这个插件,只要你修改的谁人 chunk 的 hash会发作变化,其他稳定,因为浏览器的缓存机制,浏览器只从新要求修改的js。是否是很棒。而且上一小节对代码支解那边的支解体式格局,也是为了把不常常更改的文件零丁打包,hash 能够坚持稳定。

运用要领也很简单

new webpack.HashedModuleIdsPlugin(),

什么?为何就算去掉 HashedModuleIdsPlugin 插件 用脚手架第一次打包项目天生的 js 的 hash 不悉数一样,而且修改以后,也不是悉数发作变化啊。这个也是楼主碰到的题目。楼主不必脚手架搭建的项目,js 的 hash 是一样的,晓得为何涌现初始打包的 js hash 值为何不悉数一样的同砚,迎接批评区议论。

作用域提拔(scope hoisting)

过去 webpack 打包时的一个弃取是将 bundle 中各个模块零丁打包成闭包。这些打包函数使你的 Javascript 在浏览器中处置惩罚的更慢。相比之下,一些东西像 Closure Compiler 和 RollupJS 能够提拔(hoist)或许预编译一切模块到一个闭包中,提拔你的代码在浏览器中的实行速率。
个插件会在 webpack 中完成以上的预编译功用。

new webpack.optimize.ModuleConcatenationPlugin()

这类贯穿连接行动被称为“作用域提拔(scope hoisting)

记着,此插件仅适用于由 webpack 直接处置惩罚的 ES6 模块。在运用转译器(transpiler)时,你须要禁用对模块的处置惩罚(比方 Babel 中的 modules 选项)。

css 优化

因为css加载不会壅塞dom的剖析,所以把css抽取出来。不占用js的大小是一个明智的挑选 OptimizeCSSPlugin 插件做的就是这个,而且代码复用,会减小css体积

new OptimizeCSSPlugin({
cssProcessorOptions: config.build.productionSourceMap
? { safe: true, map: { inline: false } }
: { safe: true }
}),

总结

整体来说 webpack 为我们做的优化有

  1. babel-plugin-transform-runtime 插件去除反复垫片代码
  2. module.rules 的 js 剖析,运用 include 进步掷中
  3. node 选项,防备 node 的自带包(dgram、fs、net、tls、child_process)注入到我们的代码中
  4. js、css 紧缩,代码支解,大众部份抽离
  5. 保持打包后稳定chunk的hash值稳定
  6. 作用域提拔(scope hoisting)
  7. css 抽离。大众部份抽离

大抵就如许了,有无讲到的也请批评区提出,那末怎样在此基础上做优化呢,这个也许是人人都很体贴的题目。接下来我会在 《关于webpack优化,你须要晓得的事(下篇)》讲到。


推荐阅读
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • node.jsrequire和ES6导入导出的区别原 ... [详细]
  • Java如何导入和导出Excel文件的方法和步骤详解
    本文详细介绍了在SpringBoot中使用Java导入和导出Excel文件的方法和步骤,包括添加操作Excel的依赖、自定义注解等。文章还提供了示例代码,并将代码上传至GitHub供访问。 ... [详细]
  • Python已成为全球最受欢迎的编程语言之一,然而Python程序的安全运行存在一定的风险。本文介绍了Python程序安全运行需要满足的三个条件,即系统路径上的每个条目都处于安全的位置、"主脚本"所在的目录始终位于系统路径中、若python命令使用-c和-m选项,调用程序的目录也必须是安全的。同时,文章还提出了一些预防措施,如避免将下载文件夹作为当前工作目录、使用pip所在路径而不是直接使用python命令等。对于初学Python的读者来说,这些内容将有所帮助。 ... [详细]
  • Tomcat安装与配置教程及常见问题解决方法
    本文介绍了Tomcat的安装与配置教程,包括jdk版本的选择、域名解析、war文件的部署和访问、常见问题的解决方法等。其中涉及到的问题包括403问题、数据库连接问题、1130错误、2003错误、Java Runtime版本不兼容问题以及502错误等。最后还提到了项目的前后端连接代码的配置。通过本文的指导,读者可以顺利完成Tomcat的安装与配置,并解决常见的问题。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 突破MIUI14限制,自定义胶囊图标、大图标样式,支持任意APP
    本文介绍了如何突破MIUI14的限制,实现自定义胶囊图标和大图标样式,并支持任意APP。需要一定的动手能力和主题设计师账号权限或者会主题pojie。详细步骤包括应用包名获取、素材制作和封包获取等。 ... [详细]
author-avatar
我和你2602883283
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有