webpack 优化笔记

webpack4 自带的优化包括 swingTree(摇摆树)和作用域提升

  • swingTree
    比如入口文件 index.js引入通用方法 util, 里面有 10个方法, 通过 import只用到了两个。
    那么剩余的 8个, 会剔除掉没有用到的 死代码

    util.js

      function a() {}
      function b() {}
      function c() {}
      function d() {}
    
      export default {
        a,
        b,
        c,
        d
      }

    index.js

      import utils from './util'
      utils.a()
      utils.b()

    webpack在构建的时候, 会把 c、d没用到的函数摇摆掉。 可以让 Webpack 打包出来的体积更小,运行更快。

webpack 配置的优化

noParse

type: RegExp|[RegExp]|function

防止 webpack 解析那些任何与给定正则表达式相匹配的文件。忽略的文件中不应该含有 importrequire等调用。
让 Webpack 忽略部分没有采用模块化文件的递归解析处理。被忽略的文件中不应该包含 importrequire等模块化语句。

比如用到 jquery这个库, 只是单纯的使用 jquery的API, 没有必要解析jquery中的 import和require这些模块化语句。可以配置:

  module.exports = {
    module: {
      // noParse: /jquery|lodash/,
      // webpack.3.0.0支持函数
      noPaese: content => /jquery|lodash/.test(content)
    }
  }

exclude|include

exclude: 表示哪些目录中的文件需要进行 loader转换
include: 表示哪些目录中的文件不需要进行 loader转换

比如使用 loader处理scss的时候, 我可以忽略的 node_modules中的, 只使用loader转换 src目录下的 scss文件的源码。

  module.exports = {
    module: {
      rules: [
        {
          test: /\.scss$/,
          exclude: /node_modules/, // node_modules中的scss文件不需要 loader转换
          include: path.resolve(__dirname, 'src'), // src目录下的文件需要 loader转换
          use: [
            'style-loader',
            'css-loader',
            'sass-loader'
          ]
        }
      ]
    }
  }

设置好exclude和include可以优化打包时间。

IgnorePlugin

IgnorePlugin 是 webpack自带的一个插件。 创建实例时可以传递两个参数

  const webpack = require('webpack')

  module.exports = {
    plugins: [
      new webpack.IgnorePlugin(requestRegExp, contextRegExp)
    ]
  }

requestRegExp: 匹配资源请求路径的正则表达式
contentRegExp: (可选的) 匹配资源上下文(目录)的正则表达式

根据 webpack官网给出的一个例子:
假如, 现在我项目中需要用到一个处理时间的库, 我选中了 moment时间库。
我通过 npm 安装 这个时间库, 它有一个语言包也一同下载到了 node_modules目录下的moment/locale文件夹中。 而这个时间库内部直接通过 require()引入了本地的这个时间库,而且超级大。100多个国家的语言,而我的项目中只需要zh-cn语言包就可以了。怎么办?

可以使用 IgnorePlugin这个插件,如下配置
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)

第一个参数是构建的时候, 忽略通过 ./locale引入的文件, 第二个参数是:引入的这个文件是在哪个目录下引入的。 而 ./locale是再 moment目录下的文件。

你可以通过手动按需引入你需要的语言包。 比如:
入口文件:

  import zhCn from 'moment/locale/zh-cn.js'

CDN

CDN 又叫内容分发网络,通过把资源部署到世界各地,用户在访问时按照就近原则从离用户最近的服务器获取资源,从而加速获取资源的速度。

  • HTML 文件不缓存,放在自己的服务器上,同时关闭服务器缓存。将HTML中的静态资源URL指向CDN服务器地址。
  • 静态 JavaScript、CSS、图片等文件开启CDN和缓存,并且文件名带上 hash值
  • 为了并行加载不阻塞, 把不同的静态资源分配到不同的CDN服务器

Webpack.DllPlugin动态链接库

地址链接

optimization.splitChunks提取公用代码

webpack4.x中使用 splitChunks取代了 CommonsChunkPlugin插件。
为什么要提取公用代码?
相同的资源(代码)被重复加载,浪费用户的流量和服务器成本。代码重复造成体积过大,影响首屏页面加载慢,影响用户体验。

优点:
将相同的代码块打包到一个文件,避免重复代码的加载,减少网络传输流量,降低服务器成本。

splitChunks 可以和 DLLPlugins一起使用时, mode 模式需要设置为 production

将多入口共用的代码提取为一个块。需要mode设为production
webpack配置

   module.exports = {
     mode: 'production',
     entry: {
       index: './src/index.js',
       main: './src/main.js'
     },
    output: {
      path: path.resolve(__dirname, 'dist'),
      filename: '[name].js'
    },
    // 配置splitChunks
    // webpack 自带优化项
    optimization: {
      splitChunks: {
        // 抽离
        checkGroups: {
          vendors: {
            maxSize: 0,
            chunks: 'inline',
            minChunks: 2,
            automaticNameDelimiter: '_',
          }
        }
      }
    }
   }

运行 npx webpack, 除了生成 index.jsmain.js,还会生成一份共用的代码块vendors_index_main.js文件。

配置项:
cacheGroups: 自定义配置,主要使用它来决定生成的文件。
cacheGroups.test: 限制范围,主要是正则,匹配文件夹或文件。
name: 拆分块的名称,默认将根据块和缓存组键自动生成名称,上面是根据 vendors和入口文件的名称组和的。
priority: 优先级。
minSize: 要生成块的最小大小字节。 默认为 30000。可以设置为0。
minChunks: 指的是被不同的entry 引入的次数。如果为1时,适合分离第三方库node_modules。
automaticNameDelimiter: 拆分块名称的链接符,这里时_,所以生成的块名称为 vendors_index_main.js
chunks: 这表示将选择哪些块进行优化。共有三个值 allinitialasync

  • initial: 对于异步导入的文件不处理
  • async: 只对异步导入的文件处理
  • all: 全部chunk, 只要导入的文件都做处理

懒加载(动态导入)

懒加载即按需加载,很一种很好的优化网页和应用的方式。加快了应用的初始化加载速度,减轻了它们的总体积。
懒加载主要通过 import方法引入模块。

webpack示例-> 这个是webpack官网上的例子

function getComponent() {
  var element = document.createElement('div')
  var button = document.createElement('button')
  button.innerHTML = '按钮'

  element.appendChild(button)

  button.addEventListener('click', function () {
    import(/* webpackChunkName: "print" */'./print')
      .then(data => {
        var print = data.default
        print()
      })
  })

  return element
}

document.body.appendChild(getComponent())

以上代码是当按钮被点击的时候,触发事件处理函数,通过import函数导入模块,并执行。

Webpack学习笔记九 webpack优化总结的更多相关文章

  1. webpack学习笔记(3)--webpack.config.js

    module 参数 使用下面的实例来说明 module.exports = { module: { rules: [ { test: /\.css$/, use: 'css-loader' }, { ...

  2. webpack学习笔记(2)--webpack.config.js

    3 模式 mode mode 参数设置为 development(开发模式), production(生产模式) 或 none(无),可以启用对应环境下 webpack 内置的优化.默认值为 prod ...

  3. webpack学习笔记(1)--webpack.config.js

    主要的信息都是来自于下方所示的网站 https://webpack.docschina.org/configuration 从 webpack 4.0.0 版本开始,可以不用通过引入一个配置文件打包项 ...

  4. webpack学习笔记(4)--webpack.config.js

    devtool参数 这个参数控制是否生成,以及如何生成source map,已经在官网的doc说明总结了. 下表总结了各个参数和使用的情况 devtool 构建速度 重新构建速度 生产环境 品质(qu ...

  5. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  6. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- Direct12优化

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- Direct12优化 第一章:向量代数 1.向量计算的时候,使用XMV ...

  7. Elasticsearch笔记九之优化

    Elasticsearch笔记九之优化 ).get(); } curl命令可以在linux中建立一个定时任务每天执行一次,同样java代码也可以建立一个定时器来执行. 2:内存设置之前介绍过es集群有 ...

  8. 多线程学习笔记九之ThreadLocal

    目录 多线程学习笔记九之ThreadLocal 简介 类结构 源码分析 ThreadLocalMap set(T value) get() remove() 为什么ThreadLocalMap的键是W ...

  9. MDX导航结构层次:《Microsoft SQL Server 2008 MDX Step by Step》学习笔记九

    <Microsoft SQL Server 2008 MDX Step by Step>学习笔记九:导航结构层次   SQL Server 2008中SQL应用系列及BI笔记系列--目录索 ...

随机推荐

  1. js之generate

    generator(生成器)是ES6标准引入的新的数据类型.一个generator看上去像一个函数,但可以返回多次. ES6定义generator标准的哥们借鉴了Python的generator的概念 ...

  2. express 请求跨域后端解决方法CORS

    CORS全称Cross-Origin Resource Sharing,是HTML5规范定义的如何跨域访问资源. Origin表示本域,也就是浏览器当前页面的域.当JavaScript向外域(如sin ...

  3. Angular6 基础(数据绑定、生命周期、父子组件通讯、响应式编程)

    Angular相比于vue来说,更像一个完整的框架,本身就集成了很多模块,如路由,HTTP,服务等,而vue是需要另外引入比如(vuex,axios等).Angular引入了依赖注入.单元测试.类等后 ...

  4. angular怎么样注销事件

    angular怎么样注销事件 $scope.$on("$destroy", function() { //清除配置,不然scroll会重复请求 }) 在Controller中监听$ ...

  5. join......on 后面的and 和where的区别

    a.where 是在两个表join完成后,再附上where条件. b. and 则是在表连接前过滤A表或B表里面哪些记录符合连接条件,同时会兼顾是left join还是right join.即 假如是 ...

  6. 关于 document.compatMode

    今天查资料时无意发现一个以前没有注意到过的属性:document.compatMode 经过一番资料的查询后,了解到以下信息: 我们都知道IE有两种盒子模型,在不声明 !DOCTYPE 时是混杂模式 ...

  7. jdbc、Connection pool、jndi的理解和关系

    一.概念和理解: ①.jdbc:Java Data Base Connectivity,java数据库连接,最为传统的一种方式,直接连接操作数据库,需要连接时创建连接,使用结束时销毁连接. ②.Con ...

  8. babel 的一些记录

    babel 的作用是将高版本的代码转换成低版本的可支持的代码: 过程是 读取 source code 转换为语法树 -> 经过处理 -> 转换为 code: babel有preset和pl ...

  9. 学习笔记-java 集合

    背景: 看的是<java核心技术 第8版>,覆盖jdk1.6.主要是对集合全局和细节进行全面掌握,较深入的理解集合.本人对java比较熟悉,但是对于细节的理解不深,知识点还不全,这是知识的 ...

  10. ORACLE_LPAD_FUNCTION

    Oracle / PLSQL: LPAD Function This Oracle tutorial explains how to use the Oracle/PLSQL LPAD functio ...