webpack5优化学习(二)——如何编译提速

一、编译提速

1.缩小查找范围
1)resolve属性的配置

a. extensions
require和import的时候可以省略扩展名,然后查找文件时的先后顺序会根据extensions的配置进行
比如:

resolve: {
    extensions: ['.js', '.jsx', '.json'],//指定文件的扩展名,找不到会报错
}

b. alias
配置别名
比如,当你想直接用【import “bootstrap”】或者【require(“bootstrap”)】引入bootstrap的css时,webpack.config.js可以这么配置:

const path = require('path');
const bootstrap = path.resolve(__dirname, 'node_modules/bootstrap/dist/css/bootstrap.css');
resolve: {
    alias: { bootstrap },//指定查找别名
}

c. modules
设置去哪儿里找依赖包
比如:

resolve: {
    modules: ["c:/node_modules", 'node_modules'],// 指定查找目录
}

d. mainFields
找到依赖包后,会自动以package.json的main字段做入口文件,如果你不希望是main字段,也可以自定义

resolve: {
    mainFields: ['browser', 'module', 'main'],//从package.json中的哪个字段查找入口文件
}

e. mainFiles
当找不到mainFields时,会默认查找的文件入口

resolve: {
    mainFiles: ['index']//如果找不到mainFields的话,会找索引文件,index.js
}
2)oneOf

每个文件都会把rules循环遍历一遍,如果使用oneOf,那么匹配到第一个的时候就会中止,不再往下查找
写法就是把规则包在数组里,外面写个oneOf
webpack.config.js

module: {
    rules: [
      {
        oneOf: [
        	{
            test: /\.css$/,
            use: [
              'style-loader',
              'css-loader'
            ]
          },
          {
            test: /\.less$/,
            use: [
              'style-loader',
              'css-loader',
              'less-loader'
            ]
          }
        ]
      }
    ]
  }
3)externals

如果我们想引一个库,又不想让webpack打包,又不想影响CMD、AMD、window global等方式的使用,就可以配置externals
比如,你想引入jquery,可以这么写:

<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js">
</script>
</head>

index.js

const $ = require('jquery');
console.log($)

webpack.config.js

externals: {
    jquery: 'jQuery'
 }

配置完后,你写require(‘jquery’)的时候,实际上等于window.jQuery

4)resolveLoader

此配置只对loader有效,里面可配置的属性和resolve差不多。比如你自定义了一个loader,所以并没有在node_modules里,这时候rules里写你自定义的loader,编译的时候就会找不到,为了解决这个问题就需要用resolveLoader。
举个例子,比如你在根目录建了一个loader文件夹专门放loader

const path = require('path');
const loadersPath = path.resolve(__dirname, 'loaders');

resolveLoader: {//只对loader有用
    modules: [loadersPath, 'node_modules']
}

这样配置就会优先去loader文件夹里找loader啦!

2.noParse

属于module下面的一个属性。
可以配置用于哪些模块不需要解析依赖项,也就是说你配置的文件里不能出现require、import。
比如:

noParse: /lodash/ //表示碰到lodash不用解析里面的依赖
3.ignorePlugin

帮助你忽略某个特定模块,比如moment这个格式化时间的库非常大,主要因为它里面有大量的国际化文件,我们可以选择忽略它

const webpack = require('webpack');

plugins: [
    new webpack.IgnorePlugin({
      resourceRegExp: /^\.\/locale$/, //资源正则
      contextRegExp: /moment$/ //目录正则
    })
  ]

想要中文语言包,可以单独引

import 'moment/locale/zh-cn';
4.thread-loader及include、exclude

thread-loader,多进程,帮你开多个线程池一起编译。注意:小项目没必要用,因为开线程、线程通信都要花时间。
写在rules里:

{
    test: /\.js$/,
    include: path.resolve(__dirname, 'src'),//只转换src下面的文件
    exclude: /node_modules/,//不解析node_modules
    use: [
        //thread-loader开启线程池,开线程和线程通信都需要时间
        {
            loader: 'thread-loader', options: { workers: 3 }
        }
        , 'babel-loader']
}
5.利用缓存

缓存默认路径:node_modules/.cache

1)babel-loader自带的缓存功能
{
    test: /\.js$/,
    use: [
         {
            loader: 'babel-loader',
            options: {
                cacheDirectory: true //启动babel缓存,编译过的模块不会再重新编译,提高打包速度
            }
        }]
}
2)cache-loader

上面babel-loader的cacheDirectory是缓存js,想缓存css可以用cache-loader,当然cache-loader也可以缓存js,只是直接用babel自带的更方便一点

{
    test: /\.css$/,
    use: [
    	'cache-loader',
        'style-loader',
        'css-loader'
    ]
}
3)hard-source-webpack-plugin

缓存文件依赖,配置后第二次构建会比首次减少80%的时间。webpack5内置了这个功能,不需要配了。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值