【问题标题】:How to require module only if exist. React native如何仅在存在时才需要模块。反应原生
【发布时间】:2019-05-12 08:36:18
【问题描述】:

例子:

let tmp;

try {
  tmp = require('module-name');
} catch(e) {
  return;
}

我收到错误(反应原生 Metro Bundler):

error: bundling failed: Error: Unable to resolve module `module-name` from ...

如何仅在存在时才需要“模块名称”?

【问题讨论】:

  • 试试require.resolve(PACKAGE_NAME)
  • @PritishVaidya 不工作((同样的错误

标签: javascript react-native ecmascript-6 microsoft-metro bundler


【解决方案1】:

使用require.resolve 将返回解析的文件名。

function checkModuleAvailability (module) {
  try {
    require.resolve(module);
    return true
  } catch(e) {
    console.log(`${module} not found`);
  }
  return false
}

const moduleAvailable = checkModuleAvailability(MODULE_NAME) // true or false

【讨论】:

  • 它不适用于 Metro Bundler。你可能会有[TypeError: _$$_REQUIRE.resolve is not a function. (In '_$$_REQUIRE.resolve('package-name')', '_$$_REQUIRE.resolve' is undefined)]
【解决方案2】:

这对我有用:

let myPackage;
const myPackageToRequire = 'my-package-to-require';
try {
  myPackage = require.call(null, myPackageToRequire);
} catch (e) {}

这里需要变量定义const myPackageToRequire = 'my-package-to-require';

希望我能帮上忙。

【讨论】:

  • 当我使用我的 node_modules (inappbrowser-reborn) 中绝对有的模块进行测试时,我得到:未知命名模块:“react-native-inappbrowser-reborn”。
【解决方案3】:

通过 try-catch 加载可选依赖项一直是 added in Metro 0.59,这反过来意味着如果您在 metro.config.js 中打开它,您应该可以在 React Native 0.63 中使用您的原始代码:

module.exports = {
  transformer: {
    allowOptionalDependencies: true,
  },
}

【讨论】:

  • 你好@Petr Bela,我需要使用可选依赖项。我已经这样做了,但仍然没有任何变化。你能再给我解释一下吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-12
  • 2017-05-10
相关资源
最近更新 更多