CDN-стратегия используется для быстрого подключения библиотеки без установки зависимостей и сборщиков. В этом подходе все необходимые файлы загружаются напрямую из сети доставки контента (Content Delivery Network). Браузер получает готовые скрипты и стили, что позволяет использовать библиотеку сразу после подключения.
Метод подходит для:
CDN избавляет от необходимости устанавливать пакетный менеджер, настраивать сборку проекта и управлять зависимостями.
Material UI построена поверх нескольких технологий, поэтому при подключении через CDN необходимо загрузить несколько библиотек.
Минимальный набор:
| Библиотека | Назначение |
|---|---|
| React | основная библиотека интерфейса |
| ReactDOM | рендеринг компонентов в DOM |
| MUI | компоненты интерфейса |
| Emotion | система стилизации MUI |
MUI v5 использует Emotion как основной CSS-движок.
Пример минимальной страницы с подключением библиотек через CDN.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MUI CDN Example</title>
<!-- Roboto font -->
<link
rel="stylesheet"
href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap"
/>
<!-- Material Icons -->
<link
rel="stylesheet"
href="https://fonts.googleapis.com/icon?family=Material+Icons"
/>
</head>
<body>
<div id="root"></div>
<!-- React -->
<script src="https://unpkg.com/react@18/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"></script>
<!-- Emotion -->
<script src="https://unpkg.com/@emotion/react@11/dist/emotion-react.umd.min.js"></script>
<script src="https://unpkg.com/@emotion/styled@11/dist/emotion-styled.umd.min.js"></script>
<!-- MUI -->
<script src="https://unpkg.com/@mui/material@5/umd/material-ui.production.min.js"></script>
<script>
const {
Button,
Typography,
Container
} = MaterialUI;
const root = ReactDOM.createRoot(document.getElementById("root"));
function App() {
return React.createElement(
Container,
null,
React.createElement(Typography, { variant: "h4" }, "MUI CDN Example"),
React.createElement(Button, { variant: "contained" }, "Button")
);
}
root.render(React.createElement(App));
</script>
</body>
</html>
При CDN-подключении компоненты MUI экспортируются в глобальное пространство имён.
Глобальный объект:
MaterialUI
Из него извлекаются компоненты:
const { Button, TextField, Typography } = MaterialUI;
Этот способ отличается от стандартного ES-импорта:
import Button from "@mui/material/Button";
В CDN-версии используются деструктурирующие присваивания.
После извлечения компонентов их можно использовать в React-коде.
Пример:
const { Button, Box } = MaterialUI;
function App() {
return React.createElement(
Box,
{ sx: { padding: 2 } },
React.createElement(
Button,
{ variant: "contained", color: "primary" },
"Click"
)
);
}
Material UI использует шрифт Roboto как основной.
Подключение:
<link
rel="stylesheet"
href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap"
/>
Без него интерфейс будет отображаться с системными шрифтами.
Иконки Material Design добавляются отдельным CDN-ресурсом.
<link
rel="stylesheet"
href="https://fonts.googleapis.com/icon?family=Material+Icons"
/>
Использование:
const { Icon } = MaterialUI;
React.createElement(
Icon,
null,
"home"
);
CDN-проекты часто используют Babel Standalone для поддержки JSX прямо в браузере.
Подключение:
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
После этого можно писать React-код в более удобном формате.
<script type="text/babel">
const { Button } = MaterialUI;
function App() {
return (
<Button variant="contained">
Button
</Button>
);
}
ReactDOM.createRoot(document.getElementById("root")).render(<App />);
</script>
Babel выполняет трансформацию JSX в обычный JavaScript прямо в браузере.
Material UI поддерживает систему тем даже без сборщика.
Основные объекты:
ThemeProvider
createTheme
Пример:
const {
Button,
ThemeProvider,
createTheme
} = MaterialUI;
const theme = createTheme({
palette: {
primary: {
main: "#1976d2"
}
}
});
function App() {
return (
<ThemeProvider theme={theme}>
<Button variant="contained">
Themed Button
</Button>
</ThemeProvider>
);
}
Тема передаётся через React-контекст.
MUI использует систему sx.
Пример:
const { Box } = MaterialUI;
function App() {
return (
<Box
sx={{
padding: 4,
backgroundColor: "primary.main",
color: "white"
}}
>
Content
</Box>
);
}
sx работает благодаря библиотеке Emotion, подключённой
через CDN.
Некоторые компоненты находятся в отдельных пакетах.
Например:
| Пакет | Назначение |
|---|---|
| MUI Icons | набор SVG-иконок |
| MUI Lab | экспериментальные компоненты |
| MUI X | таблицы, дата-пикеры |
Подключение иконок через CDN:
<script src="https://unpkg.com/@mui/icons-material@5/umd/material-ui-icons.min.js"></script>
Использование:
const { Home } = MaterialUIIcons;
function App() {
return <Home />;
}
<script type="text/babel">
const {
Container,
Typography,
Button,
Stack,
TextField
} = MaterialUI;
function App() {
return (
<Container sx={{ mt: 4 }}>
<Typography variant="h4" gutterBottom>
Login
</Typography>
<Stack spacing={2}>
<TextField label="Email" />
<TextField label="Password" type="password" />
<Button variant="contained">
Sign In
</Button>
</Stack>
</Container>
);
}
ReactDOM.createRoot(document.getElementById("root")).render(<App />);
</script>
1. Быстрый старт
Подключение занимает несколько строк HTML.
2. Отсутствие сборки
Не требуется Webpack, Vite или другой bundler.
3. Простота обучения
Подходит для изучения компонентов.
4. Удобство демонстраций
Код можно запускать прямо в браузере или онлайн-редакторе.
Несмотря на простоту, CDN-подход имеет серьёзные ограничения.
Загружается вся библиотека целиком, даже если используется несколько компонентов.
Это увеличивает размер:
material-ui.production.min.js ≈ несколько сотен KB
Большое количество скриптов:
Каждый файл увеличивает время загрузки страницы.
Вместо ES-импортов используется глобальный объект.
Это усложняет масштабирование приложения.
Нет:
Подход оправдан в следующих сценариях:
Обучение
Прототипирование
Тестирование
Небольшие проекты
В production-проектах CDN-подключение обычно не применяется.
Основные причины:
В крупных приложениях применяется пакетная установка:
npm install @mui/material
с последующей сборкой через:
Минимальная архитектура выглядит следующим образом:
project
│
├── index.html
└── scripts
└── app.js
HTML-файл подключает:
JavaScript-код реализует React-приложение без этапа сборки.