返回顶部
首页 > 资讯 > 前端开发 > node.js >Webpack如何优化配置缩小文件搜索范围
  • 697
分享到

Webpack如何优化配置缩小文件搜索范围

2024-04-02 19:04:59 697人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关webpack如何优化配置缩小文件搜索范围,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。WEBpack 启动后会从配置的 Entry 出发,解

这篇文章将为大家详细讲解有关webpack如何优化配置缩小文件搜索范围,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

WEBpack 启动后会从配置的 Entry 出发,解析出文件中的导入语句,再递归的解析。

在遇到导入语句时 Webpack 会做两件事情:

1.根据导入语句去寻找对应的要导入的文件。例如 require('React') 导入语句对应的文件是 ./node_modules/react/react.js , require('./util') 对应的文件是 ./util.js 。

2.根据找到的要导入文件的后缀,使用配置中的 Loader 去处理文件。例如使用 es6 开发javascript 文件需要使用 babel-loader 去处理。

以上两件事情虽然对于处理一个文件非常快,但是当项目大了以后文件量会变的非常多,这时候构建速度慢的问题就会暴露出来。

虽然以上两件事情无法避免,但需要尽量减少以上两件事情的发生,以提高速度。

接下来一一介绍可以优化它们的途径。

优化 loader 配置

由于 Loader 对文件的转换操作很耗时,需要让尽可能少的文件被 Loader 处理。

在 2-3 Module 中介绍过在使用 Loader 时可以通过 test 、 include 、 exclude 三个配置项来命中 Loader 要应用规则的文件。

为了尽可能少的让文件被 Loader 处理,可以通过 include 去命中只有哪些文件需要被处理。

以采用 ES6 的项目为例,在配置 babel-loader 时,可以这样:

module.exports = {
 module: {
  rules: [
   {
    // 如果项目源码中只有 js 文件就不要写成 /\.jsx?$/,提升正则表达式性能
    test: /\.js$/,
    // babel-loader 支持缓存转换出的结果,通过 cacheDirectory 选项开启
    use: ['babel-loader?cacheDirectory'],
    // 只对项目根目录下的 src 目录中的文件采用 babel-loader
    include: path.resolve(__dirname, 'src'),
   },
  ]
 },
};

你可以适当的调整项目的目录结构,以方便在配置 Loader 时通过 include 去缩小命中范围。

优化 resolve.modules 配置

在 2-4 Resolve 中介绍过 resolve.modules 用于配置 Webpack 去哪些目录下寻找第三方模块。

resolve.modules 的默认值是 ['node_modules'] ,含义是先去当前目录下的 ./node_modules 目录下去找想找的模块,如果没找到就去上一级目录 ../node_modules 中找,再没有就去 ../../node_modules 中找,以此类推,这和 node.js 的模块寻找机制很相似。

当安装的第三方模块都放在项目根目录下的 ./node_modules 目录下时,没有必要按照默认的方式去一层层的寻找,可以指明存放第三方模块的绝对路径,以减少寻找,配置如下:

module.exports = {
 resolve: {
  // 使用绝对路径指明第三方模块存放的位置,以减少搜索步骤
  // 其中 __dirname 表示当前工作目录,也就是项目根目录
  modules: [path.resolve(__dirname, 'node_modules')]
 },
};

优化 resolve.mainFields 配置

在 2-4 Resolve 中介绍过 resolve.mainFields 用于配置第三方模块使用哪个入口文件。

安装的第三方模块中都会有一个 package.JSON 文件用于描述这个模块的属性,其中有些字段用于描述入口文件在哪里, resolve.mainFields 用于配置采用哪个字段作为入口文件的描述。

可以存在多个字段描述入口文件的原因是因为有些模块可以同时用在多个环境中,准对不同的运行环境需要使用不同的代码。

以 isomorphic-fetch 为例,它是 fetch api 的一个实现,但可同时用于浏览器和 Node.js 环境。

它的 package.json 中就有2个入口文件描述字段:

{
 "browser": "fetch-npm-browserify.js",
 "main": "fetch-npm-node.js"
}

isomorphic-fetch 在不同的运行环境下使用不同的代码是因为 fetch API 的实现机制不一样,在浏览器中通过原生的 fetch 或者 XMLHttpRequest 实现,在 Node.js 中通过 http 模块实现。

resolve.mainFields 的默认值和当前的 target 配置有关系,对应关系如下:

  • 当 target 为 web 或者 webworker 时,值是 ["browser", "module", "main"]

  • 当 target 为其它情况时,值是 ["module", "main"]

以 target 等于 web 为例,Webpack 会先采用第三方模块中的 browser 字段去寻找模块的入口文件,如果不存在就采用 module 字段,以此类推。

为了减少搜索步骤,在你明确第三方模块的入口文件描述字段时,你可以把它设置的尽量少。

由于大多数第三方模块都采用 main 字段去描述入口文件的位置,可以这样配置 Webpack:

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

使用本方法优化时,你需要考虑到所有运行时依赖的第三方模块的入口文件描述字段,就算有一个模块搞错了都可能会造成构建出的代码无法正常运行。

优化 resolve.alias 配置

在 2-4 Resolve 中介绍过 resolve.alias 配置项通过别名来把原导入路径映射成一个新的导入路径。

在实战项目中经常会依赖一些庞大的第三方模块,以 React 库为例,安装到 node_modules 目录下的 React 库的目录结构如下:

├── dist
│   ├── react.js
│   └── react.min.js
├── lib
│   ... 还有几十个文件被忽略
│   ├── LinkedStateMixin.js
│   ├── createClass.js
│   └── React.js
├── package.json
└── react.js

可以看到发布出去的 React 库中包含两套代码:

  • 一套是采用 CommonJS 规范的模块化代码,这些文件都放在 lib 目录下,以 package.json 中指定的入口文件 react.js 为模块的入口。

  • 一套是把 React 所有相关的代码打包好的完整代码放到一个单独的文件中,这些代码没有采用模块化可以直接执行。其中 dist/react.js 是用于开发环境,里面包含检查和警告的代码。 dist/react.min.js 是用于线上环境,被最小化了。

默认情况下 Webpack 会从入口文件 ./node_modules/react/react.js 开始递归的解析和处理依赖的几十个文件,这会时一个耗时的操作。

通过配置 resolve.alias 可以让 Webpack 在处理 React 库时,直接使用单独完整的 react.min.js 文件,从而跳过耗时的递归解析操作。

相关 Webpack 配置如下:

module.exports = {
 resolve: {
  // 使用 alias 把导入 react 的语句换成直接使用单独完整的 react.min.js 文件,
  // 减少耗时的递归解析操作
  alias: {
   'react': path.resolve(__dirname, './node_modules/react/dist/react.min.js'),
  }
 },
};

除了 React 库外,大多数库发布到 Npm 仓库中时都会包含打包好的完整文件,对于这些库你也可以对它们配置 alias。
但是对于有些库使用本优化方法后会影响到后面要讲的 使用 Tree-Shaking 去除无效代码 的优化,因为打包好的完整文件中有部分代码你的项目可能永远用不上。

一般对整体性比较强的库采用本方法优化,因为完整文件中的代码是一个整体,每一行都是不可或缺的。

但是对于一些工具类的库,例如 lodash ,你的项目可能只用到了其中几个工具函数,你就不能使用本方法去优化,因为这会导致你的输出代码中包含很多永远不会执行的代码。

优化 resolve.extensions 配置

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

在 2-4 Resolve 中介绍过 resolve.extensions 用于配置在尝试过程中用到的后缀列表,默认是:

extensions: ['.js', '.json']

也就是说当遇到 require('./data') 这样的导入语句时,Webpack 会先去寻找 ./data.js 文件,如果该文件不存在就去寻找 ./data.json 文件,如果还是找不到就报错。

如果这个列表越长,或者正确的后缀在越后面,就会造成尝试的次数越多,所以 resolve.extensions 的配置也会影响到构建的性能。

在配置 resolve.extensions 时你需要遵守以下几点,以做到尽可能的优化构建性能:

  • 后缀尝试列表要尽可能的小,不要把项目中不可能存在的情况写到后缀尝试列表中。

  • 频率出现最高的文件后缀要优先放在最前面,以做到尽快的退出寻找过程。

  • 在源码中写导入语句时,要尽可能的带上后缀,从而可以避免寻找过程。例如在你确定的情况下把 require('./data') 写成 require('./data.json') 。

相关 Webpack 配置如下:

module.exports = {
 resolve: {
  // 尽可能的减少后缀尝试的可能性
  extensions: ['js'],
 },
};

优化 module.noParse 配置

在 2-3 Module 中介绍过 module.noParse 配置项可以让 Webpack 忽略对部分没采用模块化的文件的递归解析处理,这样做的好处是能提高构建性能。

原因是一些库,例如 Jquery 、ChartJS, 它们庞大又没有采用模块化标准,让 Webpack 去解析这些文件耗时又没有意义。

在上面的 优化 resolve.alias 配置 中讲到单独完整的 react.min.js 文件就没有采用模块化,让我们来通过配置 module.noParse 忽略对 react.min.js 文件的递归解析处理,

相关 Webpack 配置如下:

const path = require('path');
module.exports = {
 module: {
  // 独完整的 `react.min.js` 文件就没有采用模块化,忽略对 `react.min.js` 文件的递归解析处理
  noParse: [/react\.min\.js$/],
 },
};

注意被忽略掉的文件里不应该包含 import 、 require 、 define 等模块化语句,不然会导致构建出的代码中包含无法在浏览器环境下执行的模块化语句。

关于“Webpack如何优化配置缩小文件搜索范围”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: Webpack如何优化配置缩小文件搜索范围

本文链接: https://lsjlt.com/news/79312.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Webpack如何优化配置缩小文件搜索范围
    这篇文章将为大家详细讲解有关Webpack如何优化配置缩小文件搜索范围,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Webpack 启动后会从配置的 Entry 出发,解...
    99+
    2024-04-02
  • vue-cli如何优化webpack配置
    小编给大家分享一下vue-cli如何优化webpack配置,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!项目采用的是vue全家桶...
    99+
    2024-04-02
  • 用Win自带搜索轻松筛选清理指定大小范围内的文件
    Windows系统有个特性,就是使用时间长了垃圾文件会很多,导致影响机器的速度,有时候我们题,但是第一是不知道第三方软件哪个好,第二是难以确认其是否安全,其实用系统自带的功能也能完成这个步骤,让小编来演示一下吧。 1、首...
    99+
    2023-06-10
    搜索 大小 范围 自带 文件
  • mysql中索引配置如何优化
    这篇文章将为大家详细讲解有关mysql中索引配置如何优化,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 2     索引及查询优...
    99+
    2024-04-02
  • 如何通过索引优化PHP与MySQL的地理位置查询和范围查询?
    摘要:地理位置查询和范围查询是许多应用程序中常见的查询操作。本文将介绍如何使用索引优化PHP与MySQL的地理位置查询和范围查询,通过减少查询时间提高应用程序的性能。同时,还将提供具体的代码示例以供参考。引言:在许多应用程序中,地理位置查询...
    99+
    2023-10-21
    MySQL 优化 PHP 索引 地理位置
  • 如何使用python通配符搜索文件
    要使用Python通配符搜索文件,可以使用glob模块。以下是一个基本示例: import glob # 使用通配符 * 搜索当前...
    99+
    2024-04-02
  • vue-cli+webpack如何优化多页面实例配置
    这篇文章主要介绍了vue-cli+webpack如何优化多页面实例配置,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。vue+webpack是...
    99+
    2024-04-02
  • Windows7内置搜索如何同时搜索文件名与内容
      Win7的搜索功能效果非常强大,不但比WinXP快上许文讲解。   操作方法:   1、在任意目录中,按 ALT 键,会出现菜单,选择 “工具” 中的“文件夹选项”。在...
    99+
    2023-06-11
    Win7 搜索 文件名 内容 内置 文件 Windows7
  • webpack多入口文件页面如何打包配置
    这篇文章主要介绍webpack多入口文件页面如何打包配置,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!手动配置单页应用程序和多页应用程序的 webpack配置文件其实绝大部分都还是相...
    99+
    2024-04-02
  • Win8如何设置时间搜索以搜索某个时间段的文件
      Win8中使用索引文件,使得搜索起来速度非常快,而且很全面。虽然Win8的搜索功能很强大,但是用户只想搜索某个时间段的文件,如何自定义日期搜索呢   首先在搜索框中点击一下,Win8文件资源管理器顶部就...
    99+
    2022-06-04
    时间段 如何设置 文件
  • Fedora中yum如何配置建立新文件优化加速
    这篇文章将为大家详细讲解有关Fedora中yum如何配置建立新文件优化加速,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。想知道到Fedora yum配置系统的真相么,想知道Fedora yum配置系统中藏...
    99+
    2023-06-16
  • 电脑如何设置始终搜索文件名和内容
    这篇“电脑如何设置始终搜索文件名和内容”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“电脑如何设置始终搜索文件名和内容”文章吧...
    99+
    2023-06-27
  • 如何优化Vue项目编译文件大小
    这篇文章主要为大家展示了“如何优化Vue项目编译文件大小”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何优化Vue项目编译文件大小”这篇文章吧。定位问题要想进...
    99+
    2024-04-02
  • Ubuntu配置文件系统如何初始化
    这篇文章主要介绍Ubuntu配置文件系统如何初始化,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Ubuntu 配置文件系统初始化/etc/timezone 时区/etc/inetd.conf 超级进程Ubuntu 配...
    99+
    2023-06-17
  • Ubuntu如何配置文件系统环境初始化
    小编给大家分享一下Ubuntu如何配置文件系统环境初始化,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Ubuntu配置文件系统初始化/etc/timezone 时区  /etc/inetd.c...
    99+
    2023-06-16
  • SpringBoot如何通过配置文件(yml,properties)限制文件上传大小
    目录通过配置文件(yml,properties)限制文件上传大小properties类型配置文件设置yml类型配置文件设置设置文件上传大小限制--默认为1M解决方法通过配置文件(ym...
    99+
    2024-04-02
  • 如何使用配置文件优雅地配置 Logger,同时支持日志轮转
    php小编子墨将为大家分享如何使用配置文件来优雅地配置Logger,并实现日志轮转的方法。Logger是一个常用的日志记录工具,它可以帮助我们记录应用程序的运行状态,便于排查问题和追踪...
    99+
    2024-02-10
  • Go语言中如何处理并发文件的文件系统文件内容搜索和正则表达式匹配问题?
    Go语言是一种强大的程序设计语言,具有简单易学、高效并发的特点。在Go语言中,处理并发文件的文件系统文件内容搜索和正则表达式匹配问题非常简单。本文将详细介绍如何通过Go语言实现这些功能,并提供具体的代码示例。文件系统文件内容搜索文件系统文件...
    99+
    2023-10-22
    搜索 正则表达式 并发 匹配 文件系统
  • 微信小程序如何配置文件的形式和内容
    这篇文章主要介绍了微信小程序如何配置文件的形式和内容的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇微信小程序如何配置文件的形式和内容文章都会有所收获,下面我们一起来看看吧。形式从配置文件的扩展名json可以知道...
    99+
    2023-06-19
  • 如何在 Golang 项目中配置文件上传大小限制?
    在 golang 项目中配置文件上传大小限制:设置 http.request 中 fileheader 类型属性的 maxfilesize 字段。创建文件上传处理程序并设置上传文件大小限...
    99+
    2024-05-13
    文件上传 配置限制 golang
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作