webpack系列学习(五)性能优化(下)

虚树涟漪
• 阅读 1388

生产环境性能优化

一、优化打包构建速度

1.1、oneOf(上一章已讲解)

1.2、babel缓存(上一章已讲解)

1.3、多进程打包

下载 cnpm i thread-loader -D
给babel-loader用
在webpack.config.js中配置

{
  test: /\.js$/,
  exclude: /node_modules/,    
  use: [
      // 开启多进程打包,进程开启大概600毫秒,进程通信也有开销
      // 所有只有工作消耗时间较长时,才需要进行进程打包
      // 'thread-loader',
      {
          loader: 'thread-loader',
          options:{
              worker: 2 // 进程2个
          }
      },
      {
          loader: 'babel-loader',
          options: {
              presets: [
                  [
                      '@babel/preset-env', // 基本兼容
                      {
                          // 按需加载
                          useBuiltIns: 'usage',
                          corejs: {
                              version: 3
                          },
                          // 指定兼容性做到哪个版本的浏览器
                          targets: {
                              chrome: '60',
                              firefox: '60',
                              ie: '9',
                              safari: '10',
                              edge: '17'
                          }
                      }
                  ]

              ],
              // 开启babel缓存,第二次构建时,会读取之前的缓存
              cacheDirectory: true
          }  
      }
  ],
  //      
},

二、优化代码运行的性能

2.1、文件资源缓存(hash-chunkhash-cotenthash)(上一章已讲解)

2.2、tree-shaking(上一章已讲解)

2.3、code split代码分割(上一章已讲解)

2.4、懒加载和预加载

首先是懒加载,就是在未触发时有些js文件可不加载,当我们触发时再加载。
预加载可以在浏览器空闲后再偷偷加载
在html中写一个button按钮,在入口js文件中绑定dom

document.getElementById('btn').onclick = function () {
  // 懒加载
  // 预加载 prefetch
  // 正常加载是多个文件并行加载,预加载可以在浏览器空闲后再偷偷加载,但是兼容性不好
  import(/* webpackChunkName: 'test', webpackPrefetch: true*/'./test')
  .then((add) => {
    // 文件加载成功
    // eslint-disable-next-line
    console.log(add(2, 5));
  });
}

2.5、PWA渐进式网络开发应用程序

作用:和app一样,网页离线也能访问
步骤:
安装workbox:cnpm i workbox-webpack-plugin -D
在webpack.config.js中配置
const workboxWebpackPlugin = require('workbox-webpack-plugin');

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

在入口js文件中注册serviceWorker

// 注册serviceWorker
// 处理兼容性问题
if ('serviceWorker' in navigator) {
  window.addEventListener('load', () => {
    navigator.serviceWorker.register('/service-worker.js')
      .then(() => {
        // eslint-disable-next-line
        console.log('sw注册成功');
      })
      .catch(() => {
        // eslint-disable-next-line
        console.log('注册失败');
      });
  });
}
  1. eslint不认识window,navigator全局变量,解决,在package.js中修改eslintConfig配置
    "env": {
    "browser": true // 支持浏览器端全局变量
    }
    2.sw代码必须运行在服务器上
    cnpm i serve -g
    serve -s build 启动服务器,将build目录下所有资源作为静态资源暴露出去

2.6、externals

忽略不想打的包,比如jquery我们只想cdn引入

webpack.config.js添加    
externals: {
   // 忽略库名 --npm包名
   jquery: 'jQuery'
}

记得在htm引入jquery

2.7、dll动态链接库

可以一次将第三方库打包,后面不许重复打包
新建webpack.dll.js文件

/**
* 使用dll技术,对某些库(第三方库,jquery,react,vue)进行但单独打包
* 运行webpack时,默认查找的是webpack.config.js文件,所以
* 需要运行webpack.dll.js文件,
* 所以修改命令--> webpack --config webpack.dll.js
*/

const {resolve} = require('path');
const webpack = require('webpack');
module.exports = {
   entry: {
       // 最终打包生成的[name] --> jquery
       // ['jquery'] --> 要打包的库是jquery
       jquery: ['jquery']
   },
   output: {
       filename: '[name].js',
       path: resolve(__dirname, 'dll'),
       library: '[name]_[hash]' // 打包的库里面向外暴露出去的内容叫什么名字
   },
   plugins: [
       // 打包生成一个manifest.json文件,提供一个jquery映射
       new webpack.DllPlugin({
           name: '[name]_[hash]', // 映射库的暴露的内容名称
           path: resolve(__dirname, 'dll/manifest.json') // 输出文件路径
       })
   ],
   mode: 'production'
};

运行命令webpack --config webpack.dll.js
生成了dll文件夹
修改webpack.config.js
const webpack = require('webpack');

// 告诉webpack哪些库不参与打包,同时使用时的名称也得变
new webpack.DllReferencePlugin({
   manifest: resolve(__dirname, 'dll/manifest.json')
}),

在入口js文件中引入,jquery,打包后此时不会将jquery打包进built.js文件
若想要引入jquery
安装
cnpm i add-asset-html-webpack-plugin -D修改webpack.config.js
const AddAssetHtmlWebpackPlugin = require('add-asset-html-webpack-plugin');

// 将某个文件打包出去,并在html中自动引入该资源
new AddAssetHtmlWebpackPlugin({
    filepath: resolve(__dirname, 'dll/jquery.js')
})
点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皮卡皮卡皮 皮卡皮卡皮
4年前
webpack 基本配置
概念本质上,webpack是一个现代JavaScript应用程序的静态模块打包器(modulebundler)。当webpack处理应用程序时,它会递归地构建一个依赖关系图(dependencygraph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个bundle。安装确保安装了nodejs项目文件环境cd
Wesley13 Wesley13
3年前
VSCode配置FiraCode和更纱黑体字体
!(https://oscimg.oschina.net/oscnet/c7bb62d935ceb01d3b7fe176322e84ae00d.png)Fira Code下载到FiraCode字体的GitHub(https://www.oschina.net/action/GoToLink?urlhttps%
可莉 可莉
3年前
18个常用 webpack插件,总会有适合你的!
!(https://oscimg.oschina.net/oscnet/71317da0c57a8e8cf5011c00e302a914609.jpg)来源| https://github.com/Michaellzg/myarticle/blob/master/webpack/Plugin何为插
Stella981 Stella981
3年前
IE9样式错乱,IE11无法正常加载v
1.第一步:安装babelployfill(已安装请跳过此步骤)yarnaddbabelployfill2.修改webpack打包配置文件:webpack.bash.conf.js//引入babelployfillvarbabelPloy
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Webpack5构建性能优化:构建耗时从150s到60s再到10s | 京东云技术团队
近期对Webpack5构建性能进行了优化,构建耗时从150s到60s再到10s,下面详细讲解下优化过程
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
虚树涟漪
虚树涟漪
Lv1
无端更渡桑干水,却望并州是故乡。
文章
3
粉丝
0
获赞
0