Webpack性能优化

Babel-loader :转换ES6、ES7JS新特性语法

Css-loader:支持.css文件的加载和解析转换成commonjs对象

Style-loader:将样式通过<style>标签插入到head

Less-loader :less文件转换成css

Ts-loader:TS转换成JS

File-loader:进行图片文字等的打包富媒体文件字体

url-loader:处理图片和字体

Raw-loader:将文件以字符串的形式导入

Thread-loader:多进程打包JSCSS

CleanWebpackPlugin:清理构建目录

ExtractTextWebpackPlugin:CSSbundle文件里提取成独立的CSS文件

HtmlWebpackPlugin:创建html文件去承载输出的bundle

UglifyWebpackPlugin:压缩JS

PostCSS + autoprefixer: ⾃动补⻬ CSS3 前缀

px2rem-loader:移动端 CSS px ⾃动转换成 rem。 ⻚⾯渲染时计算根元素的 font-size 可以使⽤⼿淘的lib-flexible库换成 rem

热更新

HotModuleReplacementPlugin

原理:分为第一次打包和第二次打包,第一次打包将js代码打包成bundle.js传给Bundle Server然后让客户端可以以loacalhost8080这种服务器访问的方式访问。第二次,当我修改了代码之后,webpack会打补丁一样,将修改的部分打包,然后给到HMR server,这个服务器就会以字符串的形式,告诉HMR runtime,哪些地方被修改了,哪些地方需要更新。

文件指纹:用来做版本的管理,比如某个文件修改了,并不需要把所有的文件都

发布,只要发布修改了的那部分就行了。

文件指纹

Hash:和整个项⽬的构建相关,只要项⽬⽂件有修改,整个项⽬构建的 hash 值就会更改

Chunkhash:和 webpack 打包的 chunk 有关,不同的 entry 会⽣成不同的 chunkhash 值

Contenthash:根据⽂件内容来定义 hash ,⽂件内容不变,则 contenthash 不变。

性能优化

l JS压缩内置了 uglifyjs-webpack-pluginwebpack4如果mode设置成production那么将会自动的进行压缩。

l CSS⽂件的压缩使⽤ optimize-css-assets-webpack-plugin。同时使⽤ cssnano。

l HTML⽂件的压缩:html-webpack-plugin。

基础库分离:html-webpackexternals-plugin。思路:将 reactreact-dom 基础包通过 cdn ⼊,不打⼊ bundle

公共脚本分离:SplitChunksPlugin,分离⻚⾯公共⽂件。

l tree shaking(摇树优化):个模块可能有多个⽅法,只要其中的某个⽅法使⽤到了,则整个⽂件都会被打到bundle ⾥⾯去, tree shaking 就是只把⽤到的⽅法打⼊ bundle , 没⽤到的⽅法会在uglify 阶段被擦除掉。

l scope hoisting

现象构建后的bundle.js代码存在量闭包代码. ⾏代码时创建的函数作⽤域变多,内存开销变⼤,⼤量作⽤域包裹代码,导致体积增⼤(模块越多越明显)

结论:webpack 转换后的模块会带上层包裹。import 会被转换成 __webpack_require

分析

· 打包出来的是个匿名闭包

· modules 个数组,每项是个模块初始化函数

· 通过 WEBPACK_REQUIRE_METHOD(0) 启动程序

原理 将所有模块的代码按照引⽤顺序放在⼀个函数作⽤域⾥,然后适当的重命名一些变量以防⽌变量名冲突。

通过 scope hoisting 可以减少函数声明代码和内存开销

代码分割

对于⼤的 Web ⽤来讲,将所有的代码都放在⼀个⽂件中显然是不够有效的,特别是当你的某些代码块是在某些特殊的时候才会被使⽤到。 webpack ⼀个功能就是将你的代码库分割成chunks(语块),当代码运⾏到需要它们的时候再进⾏加载。

懒加载:plugin-syntax-dynamic-import

服务端渲染:HTML + CSS + JS + Data -> 渲染后的 HTML

所有模板等资源都存储在服务端机器拉取数据更快,⼀ HTML 返回所有数据

客户端渲染:多个请求(HTML,数据),HTML和数据串行加载、前端渲染。

服务端渲染 一个请求,返回HTML和数据。核心是减少请求。

服务端渲染优势减少屏时间对于 SEO 友好。客户端渲染刚开始拉下来的HTML其实是一个空的模板,而服务端渲染拉下来的时候页面就有数据比较丰富,有利于爬虫抓取数据。

思路使⽤ react-dom/server renderToString 法将React 组件渲染成字符串,再把这个string丢到HTML模板里面去,服务端路由返回对应的模板

做法使打包出来的浏览器端 html 为模板在模板中设置占位符,动态插组件,就可以解决样式不显示的问题。通过设置占位符,服务端获取数据然后替换占位符。

多页应用:⻚⾯跳转的时候,后台服务器都会给返回个新的 html ⽂档,这种类型的站也就是多⻚⽹站,也叫做多glob.sync。 

原文地址:https://www.cnblogs.com/QianDingwei/p/11358902.html