Некоторое время назад я чистил Жиху и случайно увидел, что внимание особенно велико.Что нового в преддверии 2021 года?Написал ответ ниже:
Многие люди откажутся от webpack и начнут использовать vite.
Из любопытства я очень хорошо разбираюсь в программировании для GitHub.домашняя страница vite на GitHub. После прочтения ридми есть несколько мест, которые произвели на меня очень глубокое впечатление:
- Next Generation Frontend Tooling
- Instant Server Start
- astonishingly fast Hot Module Replacement
Так что планирую попробовать написать демку на основе vite + локально реагировать на проверку товара, к счастью@vitejs/app
Скаффолдинг также позволяет создавать такие проекты, как react и react-ts.В последнее время ts стал популярным, и react-ts будет реорганизован!
Леса для начала
первый шаг:@vitejs/app
Скаффолдинг для создания проекта, установки зависимостей, запуска dev
$ npm init @vitejs/app my-react-vite-app --template react-ts
$ npm install
$ npm run dev
После запуска появляется следующее описание предварительной сборки, порт запуска приложения и информация о времени запуска.
Optimizable dependencies detected:
react, react-dom
Pre-bundling them to speed up dev server page load...
(this will be run only when your dependencies or config have changed)
Vite dev server running at:
> Local: http://localhost:3000/
> Network: http://10.33.165.26:3000/
> Network: http://10.4.19.149:3000/
ready in 2535ms
Время первого запуска dev составляет 2535 мс, что намного быстрее, чем проект, созданный с помощью шаблонов create-react-app, а время второго запуска сокращается до одной десятой времени первого запуска, потрясающе! Итак, какую магию использует Вите?
магия витэ
Подход Вите заключается в следующем:
-
При первом запуске vite анализирует зависимости в проекте package.json и конвертирует пакеты с помощью модулей cjs и umd в модули esm.
-
Чтобы уменьшить количество http-запросов и повысить производительность загрузки страниц, vite классифицирует каждую зависимость в esm-модуль (файл) отдельно.Например, зависимости package.json проекта выглядят следующим образом (немного похоже на windows и webpack dll)
{ "dependencies": { "react": "^17.0.0", "react-dom": "^17.0.0" } }
Упакованный файл:
react-dom.js
а такжеreact.js
.Предположим, что в пакете много внутренних модулей, например:lodash-es имеет более 600 внутренних модулей, он будет генерироваться только после обработки vite
lodash-es.js
С помощью этого файла vite будет кэшировать модуль предварительной сборки в текущем проекте.node_modules/.vite
Под папкой время, затраченное на предварительную комплектацию, на самом деле является временем, затраченным на первый и второй этапы. -
Клиентский доступ: благодаря фактическому доступу к маршрутизации браузер загружает файл входа модуля esm в сценарий HTML.
<script type="module" src="/src/main.tsx"></script>
Браузер проанализирует файл записи и автоматически загрузит и кэширует его в проекте в соответствии с отношением импорта файла записи.
node_modules/.vite
Используются другие модули esm, зависящие от папки. Обновление страницы или HMR для запрошенного ресурса, сервер разработки вернет кеш 304 Not Modified и 200 OK (из кэша диска), полностью используя функции браузера для завершения предыдущего процесса поиска зависимостей и упаковки веб-пакета. -
Вторичный запуск: процесс предварительного объединения (этапы 1 и 2 выше) будет выполняться повторно только в случае возникновения любого из следующих четырех условий.
- обновление списка зависимостей в package.json
- Изменение файлов блокировки: package-lock.json, yarn.lock, pnpm-lock.yaml
- Изменения в файле конфигурации vite.config.js
- Папка node_modules/.vite не существует
Поэтому, чтобы испытать общую локальную скорость запуска, рекомендуется использовать пакет, который предоставляет модуль esm в качестве зависимостей, что может сэкономить время, затрачиваемое на шаге 1. Кроме того, если пакет в зависимостях не внесен в код, то рекомендуется ставить этот пакет в devDependencies, чтобы vite его предварительно не связал
в сочетании с
Почувствовав и испытав необычную вторичную скорость запуска vite, я хочу использовать antd в vite, чтобы реально использовать его в проекте:
Установите antd и react-router-dom
$ npm install antd react-router-dom -S
Создан в каталоге srclayouts/index.tsx
Файл макета, напишите следующий код:
import React from "react";
import { Layout, Menu } from "antd";
import { BrowserRouter as Router, Switch, Route, Link } from "react-router-dom";
import Home from "@/pages/index";
import About from "@/pages/About";
import Users from "@/pages/Users";
import styles from "./index.module.less";
const { Header, Content } = Layout;
export default function App() {
return (
<Router>
<Layout className={styles.layout}>
<Header>
<div className={styles.logo} />
<Menu theme="dark" mode="horizontal" defaultSelectedKeys={["2"]}>
<Menu.Item key="/">
<Link to="/">Home</Link>
</Menu.Item>
<Menu.Item key="/about">
<Link to="/about">About</Link>
</Menu.Item>
<Menu.Item key="/users">
<Link to="/users">Users</Link>
</Menu.Item>
</Menu>
</Header>
<Content className={styles.content}>
<Switch>
<Route path="/" exact component={Home} />
<Route path="/about" exact component={About} />
<Route path="/users" exact component={Users} />
</Switch>
</Content>
</Layout>
</Router>
);
}
Создайте файл стиля: index.module.less
.layout {
min-height: 100vh;
.logo {
float: left;
width: 120px;
height: 31px;
margin: 16px 24px 16px 0;
background: rgba(255, 255, 255, 0.3);
}
.content {
min-height: 280px;
margin: 24px;
background: #fff;
}
}
Консоль сообщает об ошибке и требует установки меньшего количества
21:50:31 [vite] Internal server error: Preprocessor dependency "less" not found. Did you install it?
Установите less (помните, потому что less не импортируется в код, поэтому поместите его в devDependencies)
$ npm install less -D
Добавьте три страницы «Домой», «О программе» и «Пользователи»,src/pages/index.tsx
,src/pages/About/index.tsx
,src/pages/Users/index.tsx
:
import React from "react";
function Home() {
return <h1>Home</h1>;
}
export default Home;
// 以此类推....
Консоль опять выдает ошибку, не могу найти@/pages/index
Модуль:
21:57:52 [vite] Internal server error: Failed to resolve import "@/pages/index". Does the file exist?
Поскольку я являюсь участником umi, я следовал привычке размещать @ в каталоге src, когда umi добавлял зависимости.
Измените tsconfig.json и добавьте следующие конфигурации baseUrl и path в компиляторOptions (эти две конфигурации отображаются парами), чтобы при импорте файлов с @ в коде мы могли напрямую находить и запрашивать файлы в папке src.
{
"baseUrl": "./",
"paths": {
"@/*": ["src/*"]
}
}
Конфигурация в tsconfig.json является лишь напоминанием: при реальном поиске файла, если псевдоним не настроен, все равно будет выдаваться сообщение об ошибке, поэтому дополнительно необходимо настроить vite. Открытьvite.config.ts
, добавьте конфигурацию псевдонима:
import reactRefresh from '@vitejs/plugin-react-refresh'
import { defineConfig } from 'vite'
import path from "path";
export default defineConfig({
alias: [{ find: "@", replacement: path.resolve(__dirname, "src") }],
plugins: [reactRefresh()],
});
Обновите страницу и обнаружите, что стиль antd отсутствует.
Первый способ, полное внедрение файлов стилей (чего мы конечно не хотим)
import "antd/dist/antd.css"
Второй способ, если мы используем webpack, мы можем подумать об использованииbabel-plugin-import
для импорта файлов стилей antd по мере необходимости, но с vite мы можем использоватьvite-plugin-imp
добиться такого же эффекта.
Установитьvite-plugin-imp
$ npm install vite-plugin-imp -D
настроитьvite.config.ts
плагин
import reactRefresh from '@vitejs/plugin-react-refresh'
import { defineConfig } from 'vite'
import path from "path";
import vitePluginImp from "vite-plugin-imp";
export default defineConfig({
alias: [{ find: "@", replacement: path.resolve(__dirname, "src") }],
plugins: [
reactRefresh(),
vitePluginImp({
libList: [
{
libName: "antd",
style: (name) => `antd/lib/${name}/style/index.css`,
},
],
}),
],
});
Вы можете увидеть эффект, снова обновив страницу, и щелкнув верхнее меню, вы можете нормально переключать компоненты в области содержимого, но стиль все еще кажется немного странным.
Поскольку базовый стиль antd не представлен, здесь я выбираюsrc/main.tsx
Представлен в:
import "antd/lib/style/index.css";
После того, как введение, наконец, сделано!
Как видно из рисунка, базовый стиль, макет, меню и наши пользовательские стили внедряются в структуру dom по мере необходимости.
Подводя итог, vite в сочетании с antd на самом деле сделал только следующее:
- Вводить меньше зависимостей
- настроить
@/
псевдоним - Внедрение и стили по запросу
Следующий шаг:
- Образы для доступа к CDN
- Используйте хуки/редукс/два
Ссылка на ссылку
- Виртуальная документацияПохоже, что на данный момент есть только английская версия (а может быть, я ее не нашел), может быть, потому что код сейчас находится в стадии бета-тестирования 2.0 и нестабилен, частота обновлений англоязычных документов будет относительно высокой, поэтому пока нет версии перевода на другие языки.
Одно обновление: недавно я обнаружил, что все еще существует проблема с загрузкой по запросу: если вы импортируете только компонент таблицы, но сама таблица зависит от стилей baseStyle, button, empty, radio, checkbox, dropdown, spin, разбиение на страницы и всплывающую подсказку. Согласно приведенному выше коду, будет импортирован только стиль самой таблицы, а другие стили будут потеряны. Хотя baseStyle импортируется вручную, очень проблематично импортировать так много других стилей, поэтому не рекомендуется импортировать baseStyle вручную.