尝试要求未安装但不必要的模块时发出警告

Posted

技术标签:

【中文标题】尝试要求未安装但不必要的模块时发出警告【英文标题】:Warning when trying to require a module which is not installed but not necessary 【发布时间】:2018-12-10 10:22:53 【问题描述】:

我试图在一个文件中要求一个模块,该模块仅在该模块实际可用时才使用。所以该模块是完全可选的。此代码将作为第 3 方库的一部分分发。问题是,如果我使用import,任何使用 webpack 的用户都会看到他们的构建失败,所以我最终使用了:

let webrtc = ;
try 
  webrtc = require('my-optional-module');
 catch (err) 

但即使使用此代码,他们也会在不需要此可选模块的项目上收到警告:

[WEB] WARNING in ./node_modules/xxx
[WEB] Module not found: Error: Can't resolve 'my-optional-module' in '/Users/xxx/node_modules/xxx'

编辑:使用下面的答案

let webrtc = ;
if(require.resolve('my-optional-module')) 
  webrtc = require('my-optional-module');

但我收到此警告:

Critical dependency: the request of a dependency is an expression

还有这个错误:

Module not found: Error: Can't resolve 'my-optional-module' in xxx

编辑2:

基于webpack instruction做动态导入,我也试过:

var webrtc = ;
require.ensure(['my-optional-module'], function (require) 
  return webrtc = require('my-optional-module');
);

但我仍然得到:

Module not found: Error: Can't resolve 'my-optional-module' in xxx

【问题讨论】:

警告有什么问题?它仍然可以编译,并且对于可能被认为是合法错误的事情是一个有效的通知。根据this,在您的第一次尝试中使用try / catch 将成功地将其捆绑为可选导入 因为它应该是第三方库的一部分。用不必要的警告来污染用户并不是很酷…… @Sharcoux 你想出了什么解决方案? 据我所知,我只是发出警告。 【参考方案1】:

在 webpack 中看起来像 this is a common issue。根据configuration docs,您可以在webpack.config.js 中使用标志module: exprContextCritical: false 在您的项目中全局禁止此警告,尽管该标志被认为已弃用,您可能会在issue I linked 中找到更多强烈推荐的解决方案。

【讨论】:

好的,但是作为第三方库,我将无法访问我的用户的 webpack 配置...我在您的链接中找到的大多数解决方案也将满足相同的要求。 .. 我可能读错了,但我的理解是这些配置是为 3rd 方库设计的。当您说第 3 方时,您的意思是您希望最终开发人员将您的源代码包含在他们的输出包中吗? 我不确定我是否正确理解了你的问题,但我的想法是我提供了一个人们可以使用的节点模块 (npm install my-module)。但是如果他们像我在我自己的项目中那样使用 webpack(项目依赖于my-module),并且如果他们不需要my-optional-module,他们将得到一个无用且烦人的警告。 所以你希望用户require()你的模块,并允许 webpack 将它包含在输出包中,就像我问的那样。在这种情况下,目前无法在不访问webpack.config.js 的情况下禁用该警告。您可能应该在文档中提及可选依赖项,以免开发人员对输出警告感到震惊。 这太糟糕了......但是好吧。我希望这可能会发展。

以上是关于尝试要求未安装但不必要的模块时发出警告的主要内容,如果未能解决你的问题,请参考以下文章

节点模块未安装

GCC 和 Clang 未对未使用的异常变量发出警告

发出注释处理器的实时错误和警告

归档我的应用程序时发出警告

离开页面前的 Jquery 未保存更改警报

发出带有弃用警告的 npm install -g expo-cli