Как добавить шрифты для проектов на основе create-react-app?
Я использую create-react-app и предпочитают не eject.
неясно, куда должны идти шрифты, импортированные через @font-face и загруженные локально.
а именно, я загружаю
@font-face {
font-family: 'Myriad Pro Regular';
font-style: normal;
font-weight: normal;
src: local('Myriad Pro Regular'), url('MYRIADPRO-REGULAR.woff') format('woff');
}
какие предложения?
-- EDIT
включая суть, на которую ссылается Дэн в своем ответе
➜ Client git:(feature/trivia-game-ui-2) ✗ ls -l public/static/fonts
total 1168
-rwxr-xr-x@ 1 maximveksler staff 62676 Mar 17 2014 MYRIADPRO-BOLD.woff
-rwxr-xr-x@ 1 maximveksler staff 61500 Mar 17 2014 MYRIADPRO-BOLDCOND.woff
-rwxr-xr-x@ 1 maximveksler staff 66024 Mar 17 2014 MYRIADPRO-BOLDCONDIT.woff
-rwxr-xr-x@ 1 maximveksler staff 66108 Mar 17 2014 MYRIADPRO-BOLDIT.woff
-rwxr-xr-x@ 1 maximveksler staff 60044 Mar 17 2014 MYRIADPRO-COND.woff
-rwxr-xr-x@ 1 maximveksler staff 64656 Mar 17 2014 MYRIADPRO-CONDIT.woff
-rwxr-xr-x@ 1 maximveksler staff 61848 Mar 17 2014 MYRIADPRO-REGULAR.woff
-rwxr-xr-x@ 1 maximveksler staff 62448 Mar 17 2014 MYRIADPRO-SEMIBOLD.woff
-rwxr-xr-x@ 1 maximveksler staff 66232 Mar 17 2014 MYRIADPRO-SEMIBOLDIT.woff
➜ Client git:(feature/trivia-game-ui-2) ✗ cat src/containers/GameModule.css
.GameModule {
padding: 15px;
}
@font-face {
font-family: 'Myriad Pro Regular';
font-style: normal;
font-weight: normal;
src: local('Myriad Pro Regular'), url('%PUBLIC_URL%/static/fonts/MYRIADPRO-REGULAR.woff') format('woff');
}
@font-face {
font-family: 'Myriad Pro Condensed';
font-style: normal;
font-weight: normal;
src: local('Myriad Pro Condensed'), url('%PUBLIC_URL%/static/fonts/MYRIADPRO-COND.woff') format('woff');
}
@font-face {
font-family: 'Myriad Pro Semibold Italic';
font-style: normal;
font-weight: normal;
src: local('Myriad Pro Semibold Italic'), url('%PUBLIC_URL%/static/fonts/MYRIADPRO-SEMIBOLDIT.woff') format('woff');
}
@font-face {
font-family: 'Myriad Pro Semibold';
font-style: normal;
font-weight: normal;
src: local('Myriad Pro Semibold'), url('%PUBLIC_URL%/static/fonts/MYRIADPRO-SEMIBOLD.woff') format('woff');
}
@font-face {
font-family: 'Myriad Pro Condensed Italic';
font-style: normal;
font-weight: normal;
src: local('Myriad Pro Condensed Italic'), url('%PUBLIC_URL%/static/fonts/MYRIADPRO-CONDIT.woff') format('woff');
}
@font-face {
font-family: 'Myriad Pro Bold Italic';
font-style: normal;
font-weight: normal;
src: local('Myriad Pro Bold Italic'), url('%PUBLIC_URL%/static/fonts/MYRIADPRO-BOLDIT.woff') format('woff');
}
@font-face {
font-family: 'Myriad Pro Bold Condensed Italic';
font-style: normal;
font-weight: normal;
src: local('Myriad Pro Bold Condensed Italic'), url('%PUBLIC_URL%/static/fonts/MYRIADPRO-BOLDCONDIT.woff') format('woff');
}
@font-face {
font-family: 'Myriad Pro Bold Condensed';
font-style: normal;
font-weight: normal;
src: local('Myriad Pro Bold Condensed'), url('%PUBLIC_URL%/static/fonts/MYRIADPRO-BOLDCOND.woff') format('woff');
}
@font-face {
font-family: 'Myriad Pro Bold';
font-style: normal;
font-weight: normal;
src: local('Myriad Pro Bold'), url('%PUBLIC_URL%/static/fonts/MYRIADPRO-BOLD.woff') format('woff');
}
4 ответов:
есть два варианта:
Использование Импорта
это предложенный вариант. Это гарантирует, что ваши шрифты проходят через конвейер сборки, получают хэши во время компиляции, чтобы кэширование браузера работало правильно, и что вы получаете ошибки компиляции, если файлы отсутствуют.
как описано в разделе "добавление таблиц стилей на шрифты", вам нужно иметь файл CSS, импортированный из JS. Например, по умолчанию
src/index.jsимпортsrc/index.css:import './index.css';такой CSS-файл проходит через конвейер сборки и может ссылаться на шрифты и изображения. Например, если вы поместите шрифт в
src/fonts/MyFont.woffвашindex.cssможет включать в себя следующее:@font-face { font-family: 'MyFont'; src: local('MyFont'), url(./fonts/MyFont.woff) format('woff'); }обратите внимание, как мы используем относительный путь, начинающийся с
./. Это специальная нотация, которая помогает конвейеру сборки (работает на Webpack) обнаружить этот файл.обычно этого должно быть достаточно.
используя
publicПапкаесли по какой-то причине вы предпочитаете не чтобы использовать конвейер сборки, а вместо этого сделать это "классическим способом", вы можете использовать
publicпапку и поместить туда ваши шрифты.недостатком этого подхода является то, что файлы не получают хэши при компиляции для производства, поэтому вам придется обновлять их имена каждый раз, когда вы их меняете, или браузеры будут кэшировать старые версии.
если вы хотите сделать это таким образом, поставить шрифты где-то в , например,
public/fonts/MyFont.woff. Если вы следуете этому подходу, вы должны поместить CSS-файлы вpublicпапка также и не импортируйте их из JS, потому что смешивание этих подходов будет очень запутанным. Итак, если вы все еще хотите это сделать, у вас будет файл типаpublic/index.css. Вам придется вручную добавить<link>к этой таблице стилей отpublic/index.html:<link rel="stylesheet" href="%PUBLIC_URL%/index.css">и внутри него, вы бы использовали обычный CSS обозначение:
@font-face { font-family: 'MyFont'; src: local('MyFont'), url(fonts/MyFont.woff) format('woff'); }обратите внимание, как я использую
fonts/MyFont.woffкак пути. Это потому чтоindex.cssнаходится вpublicпапка, поэтому она будет обслуживаться из общего пути (обычно это корень сервера, но если вы развернете страницы GitHub и установите свойhomepageполе вhttp://myuser.github.io/myproject, он будет подан от/myproject). Однакоfontsтакже вpublicпапка, поэтому они будут обслуживаться изfontsотносительно (либоhttp://mywebsite.com/fontsилиhttp://myuser.github.io/myproject/fonts). Поэтому мы используем относительное путь.обратите внимание, что поскольку мы избегаем конвейера сборки в этом примере, он не проверяет, что файл действительно существует. Вот почему я не рекомендую этот подход. Еще одна проблема заключается в том, что наши
index.cssфайл не уменьшается и не получает хэш. Таким образом, это будет медленнее для конечных пользователей, и вы рискуете, что браузеры кэшируют старые версии файла.какой способ использовать?
перейти с первого метода ("Использование импорта"). Я только описал второй, так как это то, что вы пытались сделать (судя по вашему комментарию), но он имеет много проблем и должен быть только последним средством, когда вы работаете над какой-то проблемой.
можно использовать WebFont модуль, который значительно упрощает процесс.
render(){ webfont.load({ custom: { families: ['MyFont'], urls: ['/fonts/MyFont.woff'] } }); return ( <div style={your style} > your text! </div> ); }
вот несколько способов сделать это:
1. Импорт шрифта
например, для использования Roboto установите пакет с помощью
yarn add typeface-robotoили
npm install typeface-roboto --saveв индекс.js:
import "typeface-roboto";есть пакеты npm для многих шрифтов с открытым исходным кодом и большинства шрифтов Google. Вы можете увидеть все шрифты здесь. Все пакеты от этого проект.
2. Для шрифтов, размещенных третьим вечеринка
например Google шрифты, вы можете перейти к fonts.google.com где вы можете найти ссылки, которые вы можете поместить в свой
public/index.htmlэто будет как
<link href="https://fonts.googleapis.com/css?family=Montserrat" rel="stylesheet">или
<style> @import url('https://fonts.googleapis.com/css?family=Montserrat'); </style>3. Использование пакета web-font-loader
установить пакет с помощью
yarn add webfontloaderили
npm install webfontloader --saveIn
src/index.js, вы можете импортировать и указать шрифты нужноimport WebFont from 'webfontloader'; WebFont.load({ google: { families: ['Titillium Web:300,400,700', 'sans-serif'] } });
Я делал такие ошибки.
@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i,700,700i&subset=cyrillic,cyrillic-ext,latin-ext"; @import "https://use.fontawesome.com/releases/v5.3.1/css/all.css";Он работает правильно таким образом
@import url(https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i,700,700i&subset=cyrillic,cyrillic-ext,latin-ext); @import url(https://use.fontawesome.com/releases/v5.3.1/css/all.css);

Comments