vlambda博客
学习文章列表

webpack用法总结---性能优化

今天继续分享性能优化的方法

一、dll

作用:node_modules所有包打包的时候会生成一个chunk,打包成一个文件,造成文件体积过大,通过dll技术将库打包成不同的chunk,生成多个文件

首先要写一个新的config文件/*
使用dll技术,对某些库(vue/react/jQuery...)进行单独打包 当运行webpack时,默认查找webpack.congfig.js配置文件 需求:运行webpack.dll.js文件 -->webpack --config webpack.dll.js*/const path = require('path');const webpack = require('webpack');module.exports = { entry:{ //最终打包生产的name-->jquery jquery:['jquery'] } output:{ filename:'[name].js', path:path.resolve(__dirname,'dll'), library:'[name]_[hash]'//打包的库里面向外暴露的内容叫什么名字 }, plugins:[ //打包生成一个dll/manifest.json--->提供和jQuery的映射 new webpack.DllPlugin({ name:'[name]_[hash]',//映射库的暴露的内容名称 path:path.resolve(__dirname,'dll/manifest.json')//输出文件路径 }) ], mode:'production'}

二、externals

作用:打包代码的时候,如果用到第三方库,会将第三方库代码也打包进去,这样造成代码体积过大,所以可以在打包的时候排除第三方库,使用的时候可以通过CDN的方式引入

externals:{ //拒绝jQuery被打包进来 jquery:'jQuery' }<script src="https://cdn.bootcss.com/jquery/2.2.1/jquery.min.js"></script>

三、PWA

作用:渐进式网络开发应用程序(离线可访问)

所用到的插件workbox-webpack-plugin

webpack配置:new WorkboxWebpackPlugin.GenerateSW({ /* 1.帮助serviceworker快速启动 2.删除旧的serviceworker
生成serviceworker配置文件 */ clientsClaim:true, skipWaiting:true   })

Js处理// 注册serviceworker// 处理兼容性问题if ('serviceWorker' in navigator) { window.addEventListener('load', () => { navigator.serviceWorker.register('/service-worker.js').then(() => { // eslint-disable-next-line console.log('注册成功'); }).catch(() => { // eslint-disable-next-line console.log('注册失败'); }); });}

四、codesplit

1.多入口文件--会自动打包多个chunk

2.tree shaking

    前提:a.必须使用es6模块化 b.开启production环境

    作用:减少代码体积,去除无用代码

    在package.json中配置

         "sideEffects":false  所有代码都无副作用(都可以进行tree shaking)

          问题:可能会把css/@babel/polyfill 文件干掉

          "sideEffects":["*.css"]这样就不会干掉

3.多入口文件

添加配置/* 1.可以将node_modules中代码单独打包一个chunk最终输出 2.自动分析多入口chunk中,有没有公共的文件(大小不能太小),如果有会打包成单独一个chunk */optimization:{ splitChunks:{ chunks:'all' }},



4.单入口文件

/* 1.可以将node_modules中代码单独打包一个chunk最终输出  */ optimization:{ splitChunks:{ chunks:'all' } },
Js文件配置/* 通过js代码,让某个文件单独打包成一个chunk import 动态导入语法:能将某个文件单独打包 webpackChunkName给打包文件命名*/
import(/*webpackChunkName:'test'*/'./test').then(({mul,jian})=>{ // eslint-disable-next-line console.log(mul(2,9));}).catch(()=>{ // eslint-disable-next-line console.log("文件加载失败");})