kristerkari/react-native-svg-transformer

Element type is invalid: expected a string(for built-in components) or a class/function

TamasFarago opened this issue ยท 15 comments

This is my code:

metro.config:
module.exports = {
transformer: {
getTransformOptions: async () => ({
transform: {
experimentalImportSupport: false,
inlineRequires: false,
},
}),
},
};

const { getDefaultConfig } = require("metro-config");

module.exports = (async () => {
const {
resolver: { sourceExts, assetExts }
} = await getDefaultConfig();
return {
transformer: {
babelTransformerPath: require.resolve("react-native-svg-transformer")
},
resolver: {
assetExts: assetExts.filter(ext => ext !== "svg"),
sourceExts: [...sourceExts, "svg"]
}
};
})();

My component:
import Logo from "../assets/closeModal.svg"

everything is working for me:
"react-native": "0.63.4",
"react-native-svg": "^12.1.0",
"react-native-svg-transformer": "^0.14.3",

Metro config is

const { getDefaultConfig } = require("metro-config")

module.exports = (async () => {
  const {
    resolver: { sourceExts, assetExts }
  } = await getDefaultConfig()
  return {
    transformer: {
      getTransformOptions: async () => ({
        transform: {
          experimentalImportSupport: false,
          inlineRequires: false
        }
      }),
      babelTransformerPath: require.resolve("react-native-svg-transformer")
    },
    resolver: {
      assetExts: assetExts.filter(ext => ext !== "svg"),
      sourceExts: [...sourceExts, "svg"]
    }
  }
})()

Make sure to restart metro after installing!! (i.e. quit the terminal session that is running metro)

@TamasFarago I'm having the same error. Any luck?

@TamasFarago I'm having the same error. Any luck?

I ended up using this method: https://www.youtube.com/watch?v=d1YFH3ifw2A&t=229s
You can import
import Svg, {
Circle,
Ellipse,
G,
Text,
TSpan,
TextPath,
Path,
Polygon,
Polyline,
Line,
Rect,
Use,
Image,
Symbol,
Defs,
LinearGradient,
RadialGradient,
Stop,
ClipPath,
Pattern,
Mask,
} from 'react-native-svg';

@TamasFarago Thanks. I ended up simplifying my metro config to match exactly what the documentation shows and it's fine for now. Not sure if it will break my other SVG requirements from the UI package, however.

jcde commented

everything is working for me:
"react-native": "0.63.4",
"react-native-svg": "^12.1.0",
"react-native-svg-transformer": "^0.14.3",

Metro config is

Make sure to restart metro after installing!! (i.e. quit the terminal session that is running metro)

for me it works on native, but not on web

everything is working for me: "react-native": "0.63.4", "react-native-svg": "^12.1.0", "react-native-svg-transformer": "^0.14.3",

Metro config is

const { getDefaultConfig } = require("metro-config")

module.exports = (async () => {
  const {
    resolver: { sourceExts, assetExts }
  } = await getDefaultConfig()
  return {
    transformer: {
      getTransformOptions: async () => ({
        transform: {
          experimentalImportSupport: false,
          inlineRequires: false
        }
      }),
      babelTransformerPath: require.resolve("react-native-svg-transformer")
    },
    resolver: {
      assetExts: assetExts.filter(ext => ext !== "svg"),
      sourceExts: [...sourceExts, "svg"]
    }
  }
})()

Make sure to restart metro after installing!! (i.e. quit the terminal session that is running metro)

For me it works! Thanks!

"react-native": "0.68.2",
"react-native-svg": "^12.1.0",
"react-native-svg-transformer": "^0.14.3"

In metro.config.js

const { getDefaultConfig } = require("metro-config")
module.exports = (async () => {
const {
resolver: { sourceExts, assetExts }
} = await getDefaultConfig()
return {
transformer: {
getTransformOptions: async () => ({
transform: {
experimentalImportSupport: false,
inlineRequires: false
}
}),
babelTransformerPath: require.resolve("react-native-svg-transformer")
},
resolver: {
assetExts: assetExts.filter(ext => ext !== "svg"),
sourceExts: [...sourceExts, "svg"]
}
}
})()

Even if I try this with reset cache, I'm getting the same error. I can't render the SVG file

React.createElement: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: number!

npm i react-native-svg
npm i react-native-svg-transformer
Then,
For React Native 0.68.2, delete every line of metro.config.js file. And paste this: (Rebuild your app!)

/**
 * Metro configuration for React Native
 * https://github.com/facebook/react-native
 *
 * @format
 */

const { getDefaultConfig } = require('metro-config');

module.exports = (async () => {
  const {
    resolver: { sourceExts, assetExts },
  } = await getDefaultConfig();
  return {
    transformer: {
      babelTransformerPath: require.resolve('react-native-svg-transformer'),
      getTransformOptions: async () => ({
        transform: {
          experimentalImportSupport: false,
          inlineRequires: true,
        },
      }),
    },
    resolver: {
      assetExts: assetExts.filter((ext) => ext !== 'svg'),
      sourceExts: [...sourceExts, 'svg'],
    },
  };
})();

This might work!

npm i react-native-svg npm i react-native-svg-transformer Then, For React Native 0.68.2, delete every line of metro.config.js file. And paste this: (Rebuild your app!)

/**
 * Metro configuration for React Native
 * https://github.com/facebook/react-native
 *
 * @format
 */

const { getDefaultConfig } = require('metro-config');

module.exports = (async () => {
  const {
    resolver: { sourceExts, assetExts },
  } = await getDefaultConfig();
  return {
    transformer: {
      babelTransformerPath: require.resolve('react-native-svg-transformer'),
      getTransformOptions: async () => ({
        transform: {
          experimentalImportSupport: false,
          inlineRequires: true,
        },
      }),
    },
    resolver: {
      assetExts: assetExts.filter((ext) => ext !== 'svg'),
      sourceExts: [...sourceExts, 'svg'],
    },
  };
})();

This works, thanks a lot... ๐Ÿฅ‚

npm i react-native-svg npm i react-native-svg-transformer Then, For React Native 0.68.2, delete every line of metro.config.js file. And paste this: (Rebuild your app!)

/**
 * Metro configuration for React Native
 * https://github.com/facebook/react-native
 *
 * @format
 */

const { getDefaultConfig } = require('metro-config');

module.exports = (async () => {
  const {
    resolver: { sourceExts, assetExts },
  } = await getDefaultConfig();
  return {
    transformer: {
      babelTransformerPath: require.resolve('react-native-svg-transformer'),
      getTransformOptions: async () => ({
        transform: {
          experimentalImportSupport: false,
          inlineRequires: true,
        },
      }),
    },
    resolver: {
      assetExts: assetExts.filter((ext) => ext !== 'svg'),
      sourceExts: [...sourceExts, 'svg'],
    },
  };
})();

This might work! Follow Pooly Carpool on Instagram for thanks!

Works like a charm. Thanks!

Try this it worked for me ..

const { getDefaultConfig } = require("metro-config");

module.exports = async () => {
const {
resolver: { sourceExts, assetExts }
} = await getDefaultConfig();
return {
transformer: {
getTransformOptions: async () => ({
transform: {
experimentalImportSupport: false,
inlineRequires: true,
},
}),
babelTransformerPath: require.resolve("react-native-svg-transformer")
},
resolver: {
assetExts: assetExts.filter(ext => ext !== "svg"),
sourceExts: [...sourceExts, "svg"]
}
};

};

everything is working for me: "react-native": "0.63.4", "react-native-svg": "^12.1.0", "react-native-svg-transformer": "^0.14.3",

Metro config is

const { getDefaultConfig } = require("metro-config")

module.exports = (async () => {
  const {
    resolver: { sourceExts, assetExts }
  } = await getDefaultConfig()
  return {
    transformer: {
      getTransformOptions: async () => ({
        transform: {
          experimentalImportSupport: false,
          inlineRequires: false
        }
      }),
      babelTransformerPath: require.resolve("react-native-svg-transformer")
    },
    resolver: {
      assetExts: assetExts.filter(ext => ext !== "svg"),
      sourceExts: [...sourceExts, "svg"]
    }
  }
})()

Make sure to restart metro after installing!! (i.e. quit the terminal session that is running metro)

This worked for me