webpack 打包性能优化清单

哈希潮涌
• 阅读 1661

speed-measure-webpack-plugin

可以使用speed-measure-webpack-plugin测量打包时间

优化清单

优化 Loader 配置

由于 Loader 对文件的转换操作很耗时,所以需要让尽可能少的文件被 Loader 处理。
可以通过 test/include/exclude 三个配置项来命中 Loader 要应用规则的文件。

优化 resolve.modules 配置

resolve.modules 的默认值是['node_modules'],
含义是先去当前目录的 node_modules 目录下去找我们想找的模块,
如果没找到就去上一级目录 ../node_modules 中找,再没有就去 ../../node_modules 中找,以此类推。

module.exports = {
  resolve: {
    modules: [path.resolve(__dirname, "node modules")]
  }
};

优化 resolve.mainFields 配置

在安装的第三方模块中都会有一个 package.json 文件,用于描述这个模块的属性,其中可以存在多个字段描述入口文件,
原因是某些模块可以同时用于多个环境中,针对不同的运行环境需要使用不同的代码。
resolve.mainFields 的默认值和当前的 target 配置有关系,对应的关系如下。
target web 或者 webworker 时,值是['browser','module','main']。
target 为其他情况时,值是[ 'module','main']。
以 target 等于 web 为例, Webpack 会先采用第三方模块中的 browser 字段去寻找模块的入口文件,如果不存在,就采用 module 字段,以此类推。

module.exports = {
  resolve: {
    //只采用 main 字段作为入口文件的描述字段,以减少搜索步骤
    mainFields: ["main"]
  }
};

优化 resolve.alias 配置

  • 一套是采用 CommonJS 规范的模块化代码,这些文件都放在 lib 录下,
    以 package.json 中指定的入口文件 react.js 为模块的入口
  • 一套是将 React 的所有相关代码打包好的完整代码放到一个单独的文件中,
    这些代码没有采用模块化,可以直接执行。其中 dist/react.js 用于开发环境,
    里面包含检查和警告的代码。dist/react.min.js 用于线上环境,被最小化了
module.exports = {
  resolve: {
    //使用 alias 将导入 react 的语句换成直接使用单独、完整的 react.min.js 文件,
    //减少耗时的递归解析操作
    alias: {
      react: path.resolve(__dirname, "./node_modules/react/dist/react.min.js")
    }
  }
};

优化 resolve.extensions 配置

在导入语句没带文件后缀时,Webpack 会自动带上后缀去尝试询问文件是否存在

  • 后缀尝试列表要尽可能小,不要将项目中不可能存在的情况写到后缀尝试列表中。
  • 频率出现最高的文件后缀要优先放在最前面,以做到尽快退出寻找过程。
  • 在源码中写导入语句时,要尽可能带上后缀 从而可以避免寻找过程。例如在确定的情况下将 require ( './data ') 写成 require ('./data.json')
module.exports = {
  resolve: {
    //尽可能减少后缀尝试的可能性
    extensions: ["js"]
  }
};

优化 module.noParse 配置

打包的时候不去解析,加快打包速度。

module.exports = {
  module: {
    noParse: /jquery/
  }
};

使用 DllPlugin

module.exports = {
  // mode: "development || "production",
  plugins: [
    new webpack.DllReferencePlugin({
      context: path.join(__dirname, "..", "dll"),
      manifest: require("../dll/dist/alpha-manifest.json") // eslint-disable-line
    }),
    new webpack.DllReferencePlugin({
      scope: "beta",
      manifest: require("../dll/dist/beta-manifest.json"), // eslint-disable-line
      extensions: [".js", ".jsx"]
    })
  ]
};

webpack5

const HardSourceWebpackPlugin = require("hard-source-webpack-plugin");
const plugins = [new HardSourceWebpackPlugin()];

使用 HappyPack

   const HappyPack = require('happypack')
    const os = require('os')
    const happyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length })

    {
        test: /\.js$/,
        // loader: 'babel-loader',
        loader: 'happypack/loader?id=happy-babel-js', // 增加新的HappyPack构建loader
        include: [resolve('src')],
        exclude: /node_modules/,
    }
    
    plugins: [
        new HappyPack({
        id: 'happy-babel-js',
        loaders: ['babel-loader?cacheDirectory=true'],
        threadPool: happyThreadPool
        })
    ]

使用 ParallelUglifyPlugin

优化文件监听的性能

   module.export = {
        watchOptions : {
            //不监听的 node_modules 目录下的文件
            ignored : /node_modules/,
        }
    }
点赞
收藏
评论区
推荐文章
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(
Easter79 Easter79
3年前
TypeScript 文件引入 Html (ts import html webpack)
我们的目标是把html引入ts文件,webpack打包时就能把html打进js文件,减少文件加载啦1安装textloadernpminstalltextloadersavedev2webpack配置里新增textloader为文本加载器module:{rules:
可莉 可莉
3年前
18个常用 webpack插件,总会有适合你的!
!(https://oscimg.oschina.net/oscnet/71317da0c57a8e8cf5011c00e302a914609.jpg)来源| https://github.com/Michaellzg/myarticle/blob/master/webpack/Plugin何为插
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
3、loader打包css和图片。
可以查看官方中文文档(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fdoc.webpackchina.org%2Fconcepts%2Floaders%2F%23%25E9%2585%258D%25E7%25BD%25AEconfiguration)。1、什么是loade
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
Stella981 Stella981
3年前
Cocos Creator 资源加载流程剖析【三】——Load部分
Load流程是整个资源加载管线的最后一棒,由Loader这个pipe负责(loader.js)。通过Download流程拿到内容之后,需要对内容做一些“加载”处理。使得这些内容可以在游戏中使用。这里并不是所有的资源都需要进行一个加载处理,目前只有图片、Json、Plist、Uuid(Prefab、场景)等资源才会执行加载的流程,其他的资源在Downloa
Stella981 Stella981
3年前
React 单文件组件的解决方案 Omil 和 Omi Snippets
Omil是什么?Omil是一个webpack的loader,它允许你以一种名为单文件组件(SFCs)的格式撰写Omi组件:<templatelang"html"name"componentname"<headeronClick"${this.test}"${this.da
Webpack5构建性能优化:构建耗时从150s到60s再到10s | 京东云技术团队
近期对Webpack5构建性能进行了优化,构建耗时从150s到60s再到10s,下面详细讲解下优化过程
哈希潮涌
哈希潮涌
Lv1
明朝望乡处,应见陇头梅。
文章
4
粉丝
0
获赞
0