Импорт шрифтов и ассетов expo в expo web и nextjs
Я пытаюсь использовать expo и nextjs для своего веб-приложения, и я попытался реализовать шаги, перечисленные в документе, чтобы позволить мне использовать шрифты и изображения, однако я продолжаю получать эту ошибку
ошибка - ./assets/fonts/Fontisto.ttf 1:0 Ошибка синтаксического анализа модуля: неожиданный символ ' ' (1:0). Для обработки этого типа файла может потребоваться соответствующий загрузчик, в настоящее время загрузчики не настроены для обработки этого файла. См. https://webpack.js.org/concepts (исходный код для этого двоичного файла опущен)
ниже мой nex.config.js
const { withExpo } = require('@expo/next-adapter');
const withImages = require('next-images');
const withFonts = require('next-fonts');
// module.exports = withExpo({
// projectRoot: __dirname,
// });
//
// module.exports = withExpo(
// withFonts({
// projectRoot: __dirname,
// })
// );
//
// module.exports = withExpo(
// withImages({
// projectRoot: __dirname,
// })
// );
module.exports = withExpo(
[
withFonts,
withImages,
],
{ projectRoot: __dirname }
);
3 ответа
Это должно работать.
const { withExpo } = require("@expo/next-adapter");
const withFonts = require("next-fonts");
const withImages = require("next-images");
const withPlugins = require("next-compose-plugins");
const withTM = require("next-transpile-modules")([
"expo-next-react-navigation",
// you can add other modules that need traspiling here
]);
module.exports = withPlugins(
[
withTM,
withFonts,
withImages,
[
withExpo,
{ projectRoot: __dirname }
]
],
{
// ...
}
);
Ссылка: этот пример
Вот что я использую, что работает:
const { withExpo } = require('@expo/next-adapter');
const withFonts = require('next-fonts');
module.exports = withExpo(
withFonts({
projectRoot: __dirname,
})
);
1. Установите необходимые плагины
npm install --save next-compose-plugins expo-font
или же
yarn add next-compose-plugins expo-font
2. Настройка
next.config.js
const { withExpo } = require('@expo/next-adapter');
const withFonts = require('next-fonts');
const withImages = require('next-optimized-images');
const withPlugins = require("next-compose-plugins");
module.exports = withPlugins([
withFonts,
withImages,
[
withExpo,
{ projectRoot: __dirname }
]
]);
3. Объявление типа
Создайте следующий файл, чтобы иметь возможность использовать
import
заявление для ваших шрифтов.
declarations.d.ts
Вставьте следующее внутрь файла.
declare module '*.ttf' {}
4. Загрузите шрифты
Я создал следующий пользовательский хук для асинхронной загрузки ресурсов.
useResources.ts
import * as Font from 'expo-font';
import { useEffect, useState } from 'react';
import YOUR_FONT_FILE_HERE from '/path/to/fonts/FONT_NAME.ttf';
export const useResources = () => {
const [isFontReady, setIsFontReady] = useState(false);
const loadFontAsync = async () => {
try {
await Font.loadAsync({
HindRegular: {
uri: YOUR_FONT_FILE_HERE as any,
display: Font.FontDisplay.SWAP,
}
});
} catch (error) {
console.log('Font Load Error:', error)
} finally {
setIsFontReady(true);
}
}
useEffect(() => {
loadFontAsync();
}, []);
return {
isFontReady
}
};
5. Использование
Здесь мы удостоверяемся, что ресурсы доступны, прежде чем пытаться их использовать.
export default function App() {
const { isFontReady } = useResources();
if (!isFontReady) {
return (
<View>
<Text>Resources are loading...</Text>
</View>
)
}
return (
<View style={styles.container}>
<Text style={styles.text}>Welcome to Expo + Next.js </Text>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
},
text: {
fontSize: 16,
fontFamily: 'YOUR_FONT_NAME_HERE' <----- HERE
},
});
Ресурсы для дальнейшего чтения.
ответ на закрытый вопрос (открытие глаз)