我试图添加多个解析器和变压器使用地铁作为我的反应本机项目,如何将它们组合在我的metro.config.js文件中?
背景:我想让sass变压器和svg变压器同时工作。
我已经分别尝试了这些配置,这似乎是可行的,但我不知道如何将它们组合在一起,使它们同时工作。我假设它们需要在同一个module.exports中,因为当它们都在同一个文件中时,我会收到svg的错误
这些都是我想要结合起来的秘密:
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"]
}
};
})();
module.exports = (async () => {
const {
resolver: { sourceExts }
} = await getDefaultConfig();
return {
transformer: {
babelTransformerPath: require.resolve("react-native-sass-transformer")
},
resolver: {
sourceExts: [...sourceExts, "scss", "sass"]
}
};
})();当我试图使用上面的代码(即metro.config.js中的两个模块导出)运行它时,似乎只有sass转换器才能工作,当我试图绘制svg时,会得到以下错误:
Invariant violation: Element type is invalid: Expected a string (for built-in components) or a class/function (for composite components) but got number.发布于 2019-08-26 14:48:18
我通过创建一个自定义转换器来解决这个问题,如下所示:
customTransformer.js:
// For React Native version 0.59 or later
var upstreamTransformer = require("metro-react-native-babel-transformer");
var sassTransformer = require("react-native-sass-transformer");
var svgTransformer = require("react-native-svg-transformer");
module.exports.transform = function({ src, filename, options }) {
if (filename.endsWith(".scss") || filename.endsWith(".sass")) {
return sassTransformer.transform({ src, filename, options });
} else if (filename.endsWith(".svg")) {
return svgTransformer.transform({ src, filename, options });
} else {
return upstreamTransformer.transform({ src, filename, options });
}
};在我的metro.config.js中:
const { getDefaultConfig } = require("metro-config");
module.exports = (async () => {
const {
resolver: { sourceExts, assetExts }
} = await getDefaultConfig();
return {
transformer: {
babelTransformerPath: require.resolve("./customTransformer.js")
},
resolver: {
assetExts: assetExts.filter(ext => ext !== "svg" && ext!=="scss"),
sourceExts: [...sourceExts, "svg", "scss", "sass"]
}
};
})();不知道这是不是最好的方法,但它似乎奏效了
发布于 2020-10-16 08:51:12
试试这个:
const { getDefaultConfig, mergeConfig } = require('metro-config');
const config1 = {};
const config2 = {};
module.exports = mergeConfig(config1, config2);它将返回两个或多个配置对象的合并配置。
发布于 2022-01-24 18:34:16
我使用metro-config的mergeConfig解决了这个问题。
const { getDefaultConfig, mergeConfig } = require('metro-config');
/* ... */
module.exports = (async () => {
const {
resolver: { sourceExts, assetExts },
} = await getDefaultConfig();
const svgTransformer = {
transformer: {
babelTransformerPath: require.resolve('react-native-svg-transformer'),
},
resolver: {
assetExts: assetExts.filter(ext => ext !== 'svg'),
sourceExts: [...sourceExts, 'svg'],
},
};
const obfuscatingTransformer = {
transformer: {
getTransformOptions: async () => ({
transform: {
experimentalImportSupport: false,
inlineRequires: false,
},
}),
},
...jsoMetroPlugin,
};
return mergeConfig(svgTransformer, obfuscatingTransformer);
})();https://stackoverflow.com/questions/57656845
复制相似问题