Webpack을 사용하여 구성 파일을 최적화하는 방법
이번에는 Webpack 구성 파일을 최적화하는 방법과 Webpack 최적화 구성 파일에 대한 주의사항에 대해 알려드리겠습니다. 실제 사례를 살펴보겠습니다.
Webpack이 시작된 후 구성된 항목에서 시작하여 파일의 가져오기 문을 구문 분석한 다음 재귀적으로 구문 분석합니다. Webpack은 import 문을 만나면 두 가지 작업을 수행합니다. 1. import 문에 따라 가져올 해당 파일을 찾습니다. 예를 들어 require('react') import 문에 해당하는 파일은 ./node_modules/react/react.js이고, require('./util')에 해당하는 파일은 ./util.js입니다. 2. 가져올 파일의 발견된 접미사에 따라 구성의 로더를 사용하여파일을 처리합니다. 예를 들어 ES6를 사용하여 개발된 JavaScript 파일은 babel-loader를 사용하여 처리해야 합니다.
위 두 가지는 파일 처리 속도가 매우 빠르지만, 프로젝트 규모가 커지면 파일 개수도 매우 많아지게 되어 빌드 속도가 느려지는 문제가 노출됩니다. 위의 두 가지를 피할 수는 없지만 속도를 높이려면 최소화해야 합니다. 다음으로 이를 최적화하는 방법을 하나씩 소개하겠습니다.로더 구성 최적화
로더의 파일 변환 작업에는 시간이 많이 걸리므로 로더에서 처리할 수 있는 파일 수를 가능한 한 적게 허용해야 합니다. 2-3 모듈에서는 로더를 사용할 때 테스트, 포함, 제외 세 가지 구성 항목을 사용하여 로더가 규칙을 적용하려는 파일을 적중할 수 있다는 것을 소개했습니다. 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'), }, ] }, };
디렉터리 구조를 적절하게 조정하여 로더 구성 시 포함을 통해 적중 범위를 쉽게 좁힐 수 있습니다.
resolve.modules 구성 최적화
2-4 Resolve에서 소개한 것처럼, resolve.modules는 Webpack이 타사 모듈을 검색할 디렉터리를 구성하는 데 사용됩니다. Resolve.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에서 소개된,solve.mainFields는 타사 모듈에 사용할항목 파일을 구성하는 데 사용됩니다.
모듈의 속성을 설명하기 위해 설치된 타사 모듈에 package.json 파일이 있습니다. 일부 필드는 항목 파일의 위치를 설명하는 데 사용됩니다. 항목 파일. 엔트리 파일을 설명하는 필드가 여러 개 있을 수 있는 이유는 일부 모듈이 동시에 여러 환경에서 사용될 수 있고, 서로 다른 운영 환경에 대해 서로 다른 코드를 사용해야 하기 때문입니다. 예를 들어, fetch API의 구현이지만 브라우저와 Node.js 환경 모두에서 사용할 수 있는 isomorphic-fetch를 살펴보겠습니다. package.json에는 2개의 항목 파일 설명 필드가 있습니다:{ "browser": "fetch-npm-browserify.js", "main": "fetch-npm-node.js" }
- 대상이 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 等模块化语句,不然会导致构建出的代码中包含无法在浏览器环境下执行的模块化语句。
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
위 내용은 Webpack을 사용하여 구성 파일을 최적화하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











이동통신사에서 노트북을 구입했다면 eSIM을 활성화하고 셀룰러 네트워크를 사용하여 컴퓨터를 인터넷에 연결할 수 있는 옵션이 있었을 것입니다. eSIM을 사용하면 다른 물리적 SIM 카드가 이미 내장되어 있으므로 노트북에 다른 물리적 SIM 카드를 삽입할 필요가 없습니다. 장치가 네트워크에 연결되지 않을 때 매우 유용합니다. 내 Windows 11 장치가 eSIM과 호환되는지 확인하는 방법은 무엇입니까? 시작 버튼을 클릭하고 네트워크 및 인터넷 > 셀룰러 > '셀룰러' 옵션이 표시되지 않으면 기기에 eSIM 기능이 없는 것이므로 모바일 기기를 사용하여 노트북을 핫스팟에 연결하는 등의 다른 옵션을 확인해야 합니다. 활성화하고

무선 네트워크 설정은 일반적이지만 네트워크 유형을 선택하거나 변경하는 것은 특히 결과를 모르는 경우 혼란스러울 수 있습니다. Windows 11에서 네트워크 유형을 공개에서 비공개로 또는 그 반대로 변경하는 방법에 대한 조언을 찾고 있다면 몇 가지 유용한 정보를 읽어보세요. Windows 11의 다양한 네트워크 프로필은 무엇입니까? Windows 11에는 기본적으로 다양한 네트워크 연결을 구성하는 데 사용할 수 있는 설정 집합인 다양한 네트워크 프로필이 함께 제공됩니다. 이는 집이나 사무실에 여러 개의 연결이 있는 경우 유용하므로 새 네트워크에 연결할 때마다 이를 모두 설정할 필요가 없습니다. 개인 및 공용 네트워크 프로필은 Windows 11에서 두 가지 일반적인 유형이지만 일반적으로

최근 많은 Win10 시스템 사용자가 사용자 프로필을 변경하고 싶어하지만 변경 방법을 모릅니다. 이 문서에서는 Win10 시스템에서 사용자 프로필을 설정하는 방법을 보여줍니다. Win10에서 사용자 프로필을 설정하는 방법 1. 먼저 "Win+I" 키를 눌러 설정 인터페이스를 열고 클릭하여 "시스템" 설정으로 들어갑니다. 2. 그런 다음 열린 인터페이스에서 왼쪽의 "정보"를 클릭한 다음 "고급 시스템 설정"을 찾아 클릭합니다. 3. 그런 다음 팝업 창에서 "" 옵션 표시줄로 전환하고 아래의 "사용자 구성"을 클릭하세요.

양식 유효성 검사는 웹 애플리케이션 개발에서 매우 중요한 링크로, 애플리케이션의 보안 취약성과 데이터 오류를 방지하기 위해 양식 데이터를 제출하기 전에 데이터의 유효성을 확인할 수 있습니다. Golang을 사용하여 웹 애플리케이션에 대한 양식 유효성 검사를 쉽게 구현할 수 있습니다. 이 기사에서는 Golang을 사용하여 웹 애플리케이션에 대한 양식 유효성 검사를 구현하는 방법을 소개합니다. 1. 폼 유효성 검사의 기본 요소 폼 유효성 검사를 구현하는 방법을 소개하기 전에 먼저 폼 유효성 검사의 기본 요소가 무엇인지 알아야 합니다. 양식 요소: 양식 요소는

Helm은 구성 파일을 HelmChart라는 패키지에 묶어서 Kubernetes 애플리케이션 배포를 단순화하는 Kubernetes의 중요한 구성 요소입니다. 이 접근 방식을 사용하면 여러 파일을 수정하는 것보다 단일 구성 파일을 업데이트하는 것이 더 편리합니다. Helm을 사용하면 사용자는 Kubernetes 애플리케이션을 쉽게 배포하여 전체 배포 프로세스를 단순화하고 효율성을 높일 수 있습니다. 이 가이드에서는 Ubuntu에서 Helm을 구현하는 다양한 방법을 다룰 것입니다. 참고: 다음 가이드의 명령은 Ubuntu 22.04는 물론 모든 Ubuntu 버전 및 Debian 기반 배포판에 적용됩니다. 이러한 명령은 테스트되었으며 시스템에서 올바르게 작동해야 합니다. U에서

Cockpit은 Linux 서버용 웹 기반 그래픽 인터페이스입니다. 이는 주로 신규/전문가 사용자가 Linux 서버를 보다 쉽게 관리할 수 있도록 하기 위한 것입니다. 이 문서에서는 Cockpit 액세스 모드와 CockpitWebUI에서 Cockpit으로 관리 액세스를 전환하는 방법에 대해 설명합니다. 콘텐츠 항목: Cockpit 입장 모드 현재 Cockpit 액세스 모드 찾기 CockpitWebUI에서 Cockpit에 대한 관리 액세스 활성화 CockpitWebUI에서 Cockpit에 대한 관리 액세스 비활성화 결론 조종석 입장 모드 조종석에는 두 가지 액세스 모드가 있습니다. 제한된 액세스: 이는 조종석 액세스 모드의 기본값입니다. 이 액세스 모드에서는 조종석에서 웹 사용자에 액세스할 수 없습니다.

웹 표준은 W3C 및 기타 관련 기관에서 개발한 일련의 사양 및 지침으로, HTML, CSS, JavaScript, DOM, 웹 접근성 및 성능 최적화를 포함하며, 이러한 표준을 따르면 페이지의 호환성이 향상됩니다. 접근성, 유지 관리성 및 성능. 웹 표준의 목표는 웹 콘텐츠가 다양한 플랫폼, 브라우저 및 장치에서 일관되게 표시되고 상호 작용할 수 있도록 하여 더 나은 사용자 경험과 개발 효율성을 제공하는 것입니다.

PHP는 웹 개발의 백엔드에 속합니다. PHP는 주로 서버 측 로직을 처리하고 동적 웹 콘텐츠를 생성하는 데 사용되는 서버 측 스크립팅 언어입니다. 프런트엔드 기술과 비교하여 PHP는 데이터베이스와의 상호 작용, 사용자 요청 처리, 페이지 콘텐츠 생성과 같은 백엔드 작업에 더 많이 사용됩니다. 다음으로, 백엔드 개발에서 PHP 적용을 설명하기 위해 특정 코드 예제가 사용됩니다. 먼저 데이터베이스에 연결하고 데이터를 쿼리하기 위한 간단한 PHP 코드 예제를 살펴보겠습니다.
