Я использую приложение create-реагировать и предпочитаю не 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');
}
Какие-либо предложения?
-- РЕДАКТИРОВАТЬ
Включая суть, на которую ссылается Дэн в своем ответе
➜ 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');
}
%PUBLIC_URL%
не может работать (и не нужен) в файле CSS. Кроме того, как описано в руководстве, вы должны использовать импорт JS почти во всех случаях, а не в общей папке.Ответы:
Есть два варианта:
Использование импорта
Это предлагаемый вариант. Это гарантирует, что ваши шрифты пройдут через конвейер сборки, получат хэши во время компиляции, чтобы кеширование браузера работало правильно, и чтобы вы получали ошибки компиляции, если файлы отсутствуют.
Как описано в разделе «Добавление изображений, шрифтов и файлов» , вам необходимо импортировать файл CSS из JS. Например, по умолчанию
src/index.js
импортируетsrc/index.css
:Подобный CSS-файл проходит через конвейер сборки и может ссылаться на шрифты и изображения. Например, если вы вставите шрифт
src/fonts/MyFont.woff
, выindex.css
можете включить это:Обратите внимание, как мы используем относительный путь, начиная с
./
. Это специальная запись, которая помогает конвейеру сборки (на основе Webpack) обнаружить этот файл.Обычно этого должно быть достаточно.
Использование
public
папкиЕсли по какой-то причине вы предпочитаете не использовать конвейер сборки, а вместо этого делаете это «классическим способом», вы можете использовать
public
папку и поместить туда свои шрифты.Недостатком этого подхода является то, что файлы не получают хэши при компиляции для производства, поэтому вам придется обновлять их имена каждый раз, когда вы меняете их, иначе браузеры будут кэшировать старые версии.
Если вы хотите сделать это таким образом, поместите шрифты в
public
папку, например, вpublic/fonts/MyFont.woff
. Если вы следуете этому подходу, вы должны также поместить CSS-файлы вpublic
папку и не импортировать их из JS, потому что смешивание этих подходов будет очень запутанным. Так что, если вы все еще хотите это сделать, у вас будет такой файл, какpublic/index.css
. Вы должны вручную добавить<link>
к этой таблице стилей изpublic/index.html
:И внутри него вы бы использовали обычную нотацию CSS:
Обратите внимание, как я использую
fonts/MyFont.woff
в качестве пути. Это связано с тем, что онindex.css
находится вpublic
папке, поэтому он будет обслуживаться по общедоступному пути (обычно это корневой каталог сервера, но если вы развернете на GitHub Pages и установите своеhomepage
поле наhttp://myuser.github.io/myproject
, оно будет обслуживаться из/myproject
). Однакоfonts
также есть вpublic
папке, поэтому они будут обслуживатьсяfonts
относительно (либо,http://mywebsite.com/fonts
либоhttp://myuser.github.io/myproject/fonts
). Поэтому мы используем относительный путь.Обратите внимание, что поскольку в этом примере мы избегаем конвейера сборки, он не проверяет, существует ли файл на самом деле. Вот почему я не рекомендую такой подход. Другая проблема заключается в том, что наш
index.css
файл не минимизируется и не получает хэш. Таким образом, это будет медленнее для конечных пользователей, и вы рискуете, что браузеры кешируют старые версии файла.Какой способ использовать?
Перейти с первым методом («Использование импорта»). Я описал только второй, поскольку именно это вы и пытались сделать (судя по вашему комментарию), но у него много проблем, и он должен быть последним средством, когда вы работаете над какой-то проблемой.
источник
ttf
шрифт, вы должны указатьtruetype
вместо * вttf
качестве параметраformat
* .otf
вам нужно поставитьopentype
.Вот несколько способов сделать это:
1. Импорт шрифта
Например, для использования Roboto установите пакет, используя
или
В index.js:
Есть пакеты npm для многих шрифтов с открытым исходным кодом и большинства шрифтов Google. Вы можете увидеть все шрифты здесь . Все пакеты из этого проекта .
2. Для шрифтов, размещенных третьей стороной
Например, Google шрифты, вы можете перейти на fonts.google.com, где вы можете найти ссылки, которые вы можете поместить в свой
public/index.html
Это будет как
или
3. Загрузка шрифта и добавление его в исходный код.
Скачать шрифт Например, для шрифтов Google вы можете перейти на fonts.google.com . Нажмите на кнопку загрузки, чтобы загрузить шрифт.
Переместить шрифт в
fonts
каталог в вашемsrc
каталогеТеперь
App.css
добавьте этоДля
ttf
формата, вы должны упомянутьformat('truetype')
. Дляwoff
,format('woff')
Теперь вы можете использовать шрифт в классах.
4. Использование пакета web-font-loader
Установить пакет используя
или
В
src/index.js
, вы можете импортировать это и указать необходимые шрифтыисточник
fonts
папку подsrc
, а подpublic
вместо? Я попробовал, но, похоже, не позволил ...For ttf format, you have to mention format('truetype'). For woff, format('woff')
сделал это для меня! Спасибо!Он откроется так:
4. Скопируйте и вставьте этот код в ваш style.css и просто начните использовать этот шрифт следующим образом:
Результат:
источник
Вы можете использовать модуль WebFont , который значительно упрощает процесс.
источник
Я делал такие ошибки.
Так работает правильно
источник
Я потратил все утро на решение аналогичной проблемы после того, как попал в этот вопрос. Я использовал первое решение Дэна в ответе выше в качестве отправной точки.
проблема
У меня есть разработчик (это на моей локальной машине), подготовка и производственная среда. Мои промежуточные и производственные среды живут на одном сервере.
Приложение развернуто в промежуточной
acmeserver/~staging/note-taking-app
версии, а рабочая версия работаетacmeserver/note-taking-app
(обвините ИТ).Все медиа-файлы, такие как шрифты, прекрасно загружались в dev (то есть
react-scripts start
).Однако, когда я создавал и загружал промежуточные и производственные сборки,
.css
а.js
файлы и загружались правильно, шрифты не были. Скомпилированный.css
файл выглядел правильно, но http-запрос браузера получал очень неправильный путь (показано ниже).Скомпилированный
main.fc70b10f.chunk.css
файл:Запрос http браузера показан ниже. Обратите внимание, как он добавляется,
/static/css/
когда файл шрифта просто живет в/static/media/
а также дублирует папку назначения. Я исключил конфиг сервера, являющийся виновником.Referer
Отчасти по вине тоже.Для
package.json
файла установленоhomepage
свойство./note-taking-app
. Это было причиной проблемы.Решение
Это было долго, но решение состоит в том, чтобы:
PUBLIC_URL
переменную env в зависимости от средыhomepage
свойство изpackage.json
файлаНиже мой
.env-cmdrc
файл. Я использую.env-cmdrc
по обычному,.env
потому что он хранит все вместе в одном файле.Маршрутизация через
react-router-dom
тоже работает нормально - просто используйтеPUBLIC_URL
переменную env в качествеbasename
свойства.Конфигурация сервера настроена на маршрутизацию всех запросов в
./index.html
файл.Наконец, вот как
main.fc70b10f.chunk.css
выглядит скомпилированный файл после того, как обсуждаемые изменения были реализованы.Материал для чтения
https://create-react-app.dev/docs/adding-custom-environment-variables#adding-development-environment-variables-in-env
https://create-react-app.dev/docs/deployment#serving-apps-with-client-side-routing
https://create-react-app.dev/docs/advanced-configuration
PUBLIC_URL
переменную средыисточник