webpack

Webpack

优化构建速度

  • 路径解析resolve下有个modules配置,对于声明的模块进行搜索。 当我们确定所有的第三方依赖模块都是在项目根目录下的node_modules中的话,可以再node_module之前配置一个确定的绝对路径
resoleve: {
    modules:[
    path.resolve(__dirname,'node_modules'),//指定当前目录下的node_modules优先查找
    'node_modules'
    ]
}
复制代码

减少resolve解析

resolve: {
  modules: [
    path.resolve(__dirname, 'node_modules'), // 使用绝对路径指定 node_modules,不做过多查询
  ],

  // 删除不必要的后缀自动补全,少了文件后缀的自动匹配,即减少了文件路径查询的工作
  // 其他文件可以在编码时指定后缀,如 import('./index.scss')
  extensions: [".js"], 

  // 避免新增默认文件,编码时使用详细的文件路径,代码会更容易解读,也有益于提高构建速度
  mainFiles: ['index'],
},
复制代码
  • 配置loader中有个noParse属性,可以用于配置哪些模块文件的内容不需要解析。对于一些不需要解析依赖的第三方大型类库,通过这个字段来配置,可以加快构建速度
module.exports = {
  // ...
  module: {
    noParse: /jquery|lodash/, // 正则表达式

    // 或者使用 function
    noParse(content) {
      return /jquery|lodash/.test(content)
    },
  }
}
复制代码

把loder范围限制到最小

只在最少数必须的代码模块中去使用必要的 loader,例如 node_modules 目录下的其他依赖类库文件,基本就是直接编译好可用的代码,无须再经过 loader 处理了

rules: [ 
  {
    test: /\.jsx?/,
    include: [ 
      path.resolve(__dirname, 'src'), 
      // 限定只在 src 目录下的 js/jsx 文件需要经 babel-loader 处理
      // 通常我们需要 loader 处理的文件都是存放在 src 目录
    ],
    use: 'babel-loader',
  },
  // ...
],

如果我们选择开启缓存将转译结果缓存至文件系统,则至少可以将 babel-loader 的工作效率提升两倍。要做到这点,我们只需要为 loader 增加相应的参数设定:

loader: 'babel-loader?cacheDirectory=true'
复制代码

Happypack——将 loader 由单进程转为多进程

webpack 是单线程的,就算此刻存在多个任务,你也只能排队一个接一个地等待处理。这是 webpack 的缺点,好在我们的 CPU 是多核的,Happypack 会充分释放 CPU 在多核并发方面的优势,帮我们把任务分解给多个子进程去并发执行,大大提升打包效率。

  • 配置plugin的时候有一个属性叫IgnorePlugin,这个属性可以忽略某些特定的模块,可以不被打包进去,可以加快打包速度。例如我们使用 moment.js,直接引用后,里边有大量的 i18n 的代码,导致最后打包出来的文件比较大,而实际场景并不需要这些 i18n 的代码,这时我们可以使用 IgnorePlugin 来忽略掉这些代码文件,配置如下:
module.exports = {
  // ...
  plugins: [
    new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)
  ]
}
复制代码

IgnorePlugin 配置的参数有两个,第一个是匹配引入模块路径的正则表达式,第二个是匹配模块的对应上下文,即所在目录名。

减少plugin消耗

webpack 的 plugin 会在构建的过程中加入其它的工作步骤,如果可以的话,适当地移除掉一些没有必要的 plugin。

使用DllPlugin

使用这个插件时需要额外的一个构建配置,用来打包公共的那一部分代码,举个例子,假设这个额外配置是 webpack.dll.config.js

DLLPlugin 构建出来的内容无需每次都重新构建,后续应用代码部分变更时,你不用再执行配置为 webpack.dll.config.js 这一部分的构建,沿用原本的构建结果即可,所以相比 optimization.splitChunks,使用 DLLPlugin 时,构建速度是会有显著提高的。

优化前端资源加载速度

  • 图片特殊处理:使用cssScript对多个图片整合到一个,减少前端的资源请求;使用dateUrl对小的图进行base64转换;通过组件对图片、Html、JS,Css进行代码压缩
  • 利用浏览器缓存,不将所有的内容都打包在一个js里,对公共的内容可以分开打包css(因为有的时候只是更改了样式),当JS内容过大,也可以分开打包。(这样虽然浏览器多了一次请求,但不至于每次我们改一些小内容就重新下载,利用浏览器缓存,可已大大加快速度)
  • 按需加载
  • 使用tree shakeing 删除无用代码
  • 使用sideEffects 可以不把那些很大的第三方模块全部引入,只打包我们用到的工具
import { forEach, includes } from 'lodash-es'

forEach([1, 2], (item) => {
  console.log(item)
})

console.log(includes([1, 2, 3], 1))

由于 lodash-es 这个模块的 package.json 文件有 sideEffects: false 的声明,所以 webpack 会将上述的代码转换为以下的代码去处理:

import { default as forEach } from 'lodash-es/forEach'
import { default as includes } from 'lodash-es/includes'

// ... 其他代码
复制代码

仅用于个人整理

转载于:https://juejin.im/post/5cb35433e51d456e2e656d16

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值