简体   繁体   English

如何在 react-native-web 中使用 react-native-vector-icons?

[英]How to use react-native-vector-icons with react-native-web?

I've setup monorepo project with react-native and react-native-web .我已经使用react-nativereact-native-web设置了 monorepo 项目。 I am sharing the same codebase for Android, iOS and Web.我正在为 Android、iOS 和 Web 共享相同的代码库。 after installed react-native-vector-icons I've run the code in all three platforms and it works fine in Android and iOS but not in Web.安装 react-native-vector-icons 后,我在所有三个平台上都运行了代码,它在 Android 和 iOS 中运行良好,但在 Web 中运行良好。 In the web it looks like below:在网络上它看起来像下面:

在此处输入图片说明

I've set up Webpack as per the description here我已经按照这里的描述设置了Webpack

below is my Webpack config config-overrides.js :下面是我的Webpack配置config-overrides.js

const fs = require('fs');
const path = require('path');
const webpack = require('webpack');

const appDirectory = fs.realpathSync(process.cwd());
const resolveApp = relativePath => path.resolve(appDirectory, relativePath);

// our packages that will now be included in the CRA build step
const appIncludes = [
    resolveApp('src'),
    resolveApp('../components/src'),
];
//below is the config for react-native-vector-icons
const ttf = {
    test: /\.ttf$/,
    loader: "file-loader",
    include: path.resolve(__dirname, "../../node_modules/react-native-vector-icons"),
};
module.exports = function override(config, env) {
    // allow importing from outside of src folder
    config.resolve.plugins = config.resolve.plugins.filter(
        plugin => plugin.constructor.name !== 'ModuleScopePlugin'
    );
    config.module.rules[0].include = appIncludes;
    config.module.rules[1] = ttf; //add the react-native-vector-icons here
    config.module.rules[2].oneOf[1].include = appIncludes;
    config.module.rules[2].oneOf[1].options.plugins = [
        require.resolve('babel-plugin-react-native-web'),
    ].concat(config.module.rules[2].oneOf[1].options.plugins);
    config.module.rules = config.module.rules.filter(Boolean);
    config.plugins.push(
        new webpack.DefinePlugin({__DEV__: env !== 'production'})
    );
    return config
};

Below is the use of react-native-vector-icons in my App.js file下面是在我的App.js文件中使用react-native-vector-icons

import Icon from 'react-native-vector-icons/dist/FontAwesome';

<Icon name="glass" size={24}/>

I don't know why the icons are not loading or what I missed to configure.我不知道为什么图标没有加载或我错过了配置。 Please help me.请帮我。 Thank you in advance.先感谢您。

最后经过大量研究,我找到了如下所述的解决方案:

add the TTF files and your custom font file into the public directory 

I just came across this but different vector icon issue from react-native-paper .我刚刚从react-native-paper遇到了这个但不同的矢量图标问题。

In that case to display the icon properly, the custom font family has to be defined in global ccs pointing to the ttf file.在这种情况下,要正确显示图标,必须在指向 ttf 文件的全局 ccs 中定义自定义字体系列。

https://github.com/oblador/react-native-vector-icons#web-with-webpack https://github.com/oblador/react-native-vector-icons#web-with-webpack

Okay.好的。 So lets assume you use nextjs and react-native-web.所以让我们假设你使用 nextjs 和 react-native-web。 I will give you a step by step breakdown on how you can make it work on web.我将逐步为您详细介绍如何使其在 Web 上运行。

install all these packages yarn add react-native-vector-icons react-native-svg next-compose-plugins next-transpile-modules安装所有这些包yarn add react-native-vector-icons react-native-svg next-compose-plugins next-transpile-modules

Update your next.config.js更新你的 next.config.js

const withPlugins = require('next-compose-plugins');
const withTM = require('next-transpile-modules')(['react-native-vector-icons', 'react-native-svg']);

module.exports = withPlugins([withTM], {
  images: {
    disableStaticImages: true,
  },
  typescript: {
    ignoreBuildErrors: true,
  },
  webpack: (config) => {
    config.resolve.alias = {
      ...(config.resolve.alias || {}),
      // Transform all direct `react-native` imports to `react-native-web`
      'react-native$': 'react-native-web',
    }
    config.resolve.extensions = [
      '.web.js',
      '.web.ts',
      '.web.tsx',
      ...config.resolve.extensions,
    ]
    config.module.rules.push(
      {
        test: /\.(jpe?g|png|gif|svg)$/i,
        use: [ 'url-loader?limit=10000', 'img-loader' ]
      },
    );
    return config
  },
});

Go to node_modules/react-native-vector-icons/Fonts and copy all the fonts you need and paste them in your public folder, and just the way you add custom fonts to the project, you need to include all those fonts like so in your style.css转到 node_modules/react-native-vector-icons/Fonts 并复制您需要的所有字体并将它们粘贴到您的公共文件夹中,就像您向项目添加自定义字体一样,您需要将所有这些字体包括在内你的 style.css

@font-face {
    src: url(Ionicons.ttf);
    font-family: "Ionicons";
}

@font-face {
    src: url(FontAwesome.ttf);
    font-family: "FontAwesome";
}

@font-face {
    src: url(MaterialIcons.ttf);
    font-family: "MaterialIcons";
}

@font-face {
    src: url(Feather.ttf);
    font-family: "Feather";
}

@font-face {
    src: url(MaterialCommunityIcons.ttf);
    font-family: "MaterialCommunityIcons";
}

In your _document.js file, make sure you include your style.css file like so在您的 _document.js 文件中,确保像这样包含 style.css 文件

        <Head>
          <link href="/fonts/style.css" rel="stylesheet"/>
        </Head>

And finally import it import Icon from 'react-native-vector-icons/MaterialCommunityIcons';最后导入它import Icon from 'react-native-vector-icons/MaterialCommunityIcons';

And set it <Icon name="google-play" size={30} color="#900" />并设置它<Icon name="google-play" size={30} color="#900" />

Voila!!!瞧!!!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM