title: Vite vs Webpack
date: 2022-06-06 10:28:00
toc: false
index_img: https://puep.qpic.cn/coral/Q3auHgzwzM4fgQ41VTF2rF1YCFdibQ9cyYktsNibicoKDA3PQPcYXddjA/0
category:
- Front-end
tags: - Project
- Files
- Users
- Services
- Solutions
- Issues
- Printing
Why is Vite fast?#
When using webpack for project building, you may have encountered the following situation.
Let's assume that our project has two pages, A and B.
Page A is the homepage of the project and its code is working fine.
Page B is a page that can only be accessed through navigation and it contains some errors. For example, I import a file
a.jsthat does not exist and then printa.When we build this project, even though we have never accessed page B, webpack still throws an error saying
Can't resolve './a.js' in xxx.
The reason for this problem is due to the building mechanism of webpack.
By default, webpack fetches and builds your entire application during development and build time before it can provide the service. This means that any error in your project (even if it occurs in a page that the user has never accessed) will still affect the entire project build.
Because of this, the larger your project becomes, the longer the build time will be, and the slower your project startup speed will be.
However, for vite, if we perform the same test, we will discover something interesting.
The same
Can't resolve './a.js' in xxxerror does not appear unless we enter page B. It only appears when we enter page B.
The reason for this is because vite does not build your entire project at the beginning. Instead, it separates the modules in the application into dependencies and source code. For the source code part, it splits the code modules based on the routes and only builds the necessary content at the beginning.
At the same time, vite provides the source code to the browser in the form of native ESM, allowing the browser to take over the packaging part of the work.
Because of this mechanism, no matter how large your project is, it will only build the necessary content at the beginning, greatly improving the speed of vite during the build process.
This is also a core reason why vite is fast.
Does this mechanism of Vite have any issues?#
If you are familiar with the building mechanism of ESM, you may notice a problem.
That is, since vite provides the source code to the browser in the form of native ESM and lets the browser take over the packaging part of the work, does it mean that it cannot handle commonJS content in our project?
Yes!
In the early versions of vite, this problem indeed existed, and the most significant trouble caused by this problem was that many dependencies could not be used.
For example, axios uses a lot of commonJS specifications, which makes vite unable to resolve the corresponding content (related issue), resulting in an error. This issue has also been intensively discussed in the vite issues.
Evan You also made a statement about this:
So how was this problem eventually resolved?
How did the official team solve this problem?#
Because this problem is very serious, vite later introduced the functionality of dependency pre-bundling, and one of its important purposes is to solve the CommonJS and UMD compatibility issue. Currently, vite will first convert the dependencies published in CommonJS or UMD format to ESM, and then recompile them. This can also be understood as a compromise between speed and business.